T3 Code
T3 Code is an open-source server for coding agents. You start threads from its web app, the T3 Code desktop app, the iOS and Android apps, or app.t3.codes, and the agents run on the server. Edka installs that server in your own Kubernetes cluster with a persistent home volume, so agents keep working when your laptop is closed.
The Edka image includes the Codex and Claude Code CLIs, git, the GitHub CLI, kubectl, build tools, and Python. T3 Code’s other providers, such as Cursor and OpenCode, install from a T3 Code terminal.
T3 Code is available on every plan, including Free.
Requirements
Section titled “Requirements”- A cluster you have write access to.
- A provider account: a ChatGPT plan or OpenAI API key for Codex, a Claude subscription or Anthropic API key for Claude Code. You sign in from T3 Code after the install, and logins stay on the home volume.
- A hostname configured under the cluster’s Domains and a Gateway traffic class. app.t3.codes and the mobile apps connect only over HTTPS. A Tailscale traffic class keeps the server off the public internet; devices then need to be on the tailnet.
Deploy T3 Code
Section titled “Deploy T3 Code”- Open a cluster, then go to Workloads → Agents.
- Select Deploy Agent and choose T3 Code.
- Under Configuration, set the Machine Name. T3 Code’s apps list the server under this name. Leave it empty to use the app’s name.
- On Access, keep Expose T3 Code via Gateway on, pick the Traffic Class, and enter the Hostname.
- Adjust Storage and Resources. Agents, builds, and test runs share the pod, so size it for the projects you work on. The defaults are a 20 GiB home volume and 2 CPUs and 4 GiB of memory at most.
- Submit and wait for the agent to show running.
Connect a device
Section titled “Connect a device”Every device pairs with a one-time link. A paired device has full access to the server: it runs agents, edits files, and opens terminals as the server’s user.
- Open the agent and go to the Devices tab.
- Enter a device name, such as
Phone, and select Create Pairing Link. If your organization requires step-up verification, Edka asks for it first. - Use the link on the device you are pairing:
- Phone: scan the QR code with the T3 Code app.
- Desktop app or app.t3.codes: choose Add environment and paste the link.
- Browser: select Open in Browser to use the web app the server serves.
The link works once and expires after 15 minutes. Once a device uses it, the link shows paired and the device appears under Paired Devices.
Dashboard on the agent page opens the web app in a new tab, already signed in, with a link created for that click.
Sign devices out
Section titled “Sign devices out”Paired Devices lists every client of the server with its device and when it last connected. Sign Out ends a device’s session. The device has to pair again to reconnect. Unused Pairing Links lists links that no device has used yet, including links created in T3 Code itself, and Revoke cancels one.
Without a public hostname
Section titled “Without a public hostname”With Expose T3 Code via Gateway off, pairing links open on a computer that forwards the server’s port. The Devices tab shows the command:
kubectl -n t3code port-forward svc/t3code 13773:3773Then open the link on that computer, in a browser or the desktop app. Phones and app.t3.codes can’t connect this way.
Sign in to Codex and Claude Code
Section titled “Sign in to Codex and Claude Code”Open Settings → Providers in T3 Code, select the server, and connect a provider:
- Codex: Continue with ChatGPT, or sign in with
codex loginfrom a T3 Code terminal. - Claude Code: Sign in, or run
claude auth loginfrom a T3 Code terminal.
To use an API key instead, add it to the provider’s environment variables on the same settings page. T3 Code keeps logins and keys on the home volume.
The home volume
Section titled “The home volume”The agent’s home directory, /home/t3, is a persistent volume:
| Path | Contents |
|---|---|
~/code | Default directory for new projects |
~/.t3 | T3 Code threads, settings, and paired sessions |
~/.codex | Codex login and sessions |
~/.claude | Claude Code login and sessions |
~/.local | CLIs and tools installed with npm -g or pipx, first on PATH |
Updating the agent keeps the volume. Uninstalling the agent deletes it,
along with any work that isn’t pushed to a remote. When T3 Code updates a
provider CLI, the new version lands in ~/.local and stays across image
updates.
Updates
Section titled “Updates”Edka tracks the T3 Code chart and image in the catalog. Update the agent from its card, or turn on Auto-update App under General. An update restarts the server and stops running agent turns; T3 Code resumes supported threads when it starts again. T3 Code’s own update button doesn’t update this server.
Kubernetes access and network policy
Section titled “Kubernetes access and network policy”Agents get no Kubernetes API access by default. Grant a scoped role from Settings → Security, and kubectl in T3 Code terminals and agent shells uses it. See Agent Kubernetes Access and Network Policy.
Network Policy is on by default. It allows DNS and the internet on ports 22, 80, and 443, and blocks other workloads in the cluster. Add egress rules on the Security tab for databases or services the agents need.
Usage data
Section titled “Usage data”T3 Code sends product usage events to T3 Code by default: provider, model, turn results, and token totals. Prompts, responses, and file contents are not sent. Turn Usage Data off under Configuration to stop them.
Troubleshooting
Section titled “Troubleshooting”Create Pairing Link is disabled or says T3 Code is not ready. The server pod is not running yet. Wait until the agent shows running, then check the Logs tab if it doesn’t.
The pod log doesn’t show a pairing token. T3 Code prints one at start; the Edka image hides it, so nobody with log access can redeem it. To create a link without the console:
kubectl -n t3code exec deploy/t3code -- \ t3 auth pairing create --ttl 15m --base-url https://t3.example.comThe port-forward fails with “address already in use”. Another process, such as T3 Code on your computer, holds local port 13773. Stop it or forward another port and change the port in the link to match.