T3 Code
Manage T3 Code without tying the setup to one machine, package source, repository layout, or private network.
Start with the surface
Identify the failing surface before changing anything:
- Desktop application state and launch method.
- T3 server state under the selected base directory.
- Project registration, title, workspace root, or favicon.
- Headless server process or user service.
- Private remote access through Tailscale.
- Update source for the desktop application and CLI.
- Multi-machine topology, saved environments, pairing, or tunnel fallback.
Record the installed version and supported flags first:
t3 --version
t3 project --help
t3 serve --help
Nightly flags and storage details can change. Prefer the installed CLI help over copied commands.
Inspect before changing
- Find the actual executable with
command -v t3.
- Identify the configured base directory. The usual default is
~/.t3, but --base-dir or T3CODE_HOME may override it.
- Determine how the desktop application was installed: package manager, AppImage, source checkout, or another channel.
- Determine whether the server runs interactively, through a wrapper, or as a user service.
- Read
references/multi-machine.md before setting up one desktop to manage projects on other hosts.
- Read
references/windows-remote.md when a remote T3 backend runs on Windows.
- Read
references/project-state.md before changing project records or icons.
- Read
references/remote-tailscale.md before exposing a headless server.
- Read
references/updates-and-launchers.md before installing T3 or changing release channels, updates, wrappers, or services.
Prefer supported commands
Use T3 project commands before considering direct database edits:
t3 project add --base-dir "$HOME/.t3" --title "Project (Workstation)" /path/to/repository
t3 project rename --base-dir "$HOME/.t3" /path/to/repository "Project (Workstation)"
t3 project remove --base-dir "$HOME/.t3" /path/to/repository
Do not use --force with t3 project remove unless the user explicitly intends to delete the project and its threads.
Use host-qualified titles only when the same repository is active on more than one machine and the distinction helps the user select the right workspace. Do not change the Git remote to solve a display-name problem.
Keep local integration outside release artifacts
Do not patch an installed AppImage, generated bundle, or package directory for a durable fix. Put local behavior in user-owned locations such as:
~/.local/bin/ for launch, update, or tunnel wrappers.
~/.local/share/ for local-only assets.
~/.config/systemd/user/ for user services and timers.
Keep machine-specific paths, hostnames, ports, and network addresses in local configuration, not in the reusable skill.
Verify the result
Run the checks that match the change:
- The T3 command exits successfully.
- The active project list shows the intended title and workspace root.
- The selected favicon exists and does not dirty the repository when it is meant to stay local.
- The desktop launcher opens the intended installed version.
- Every remote environment resolves to the intended host and uses a distinct display name.
- Each headless service is active and its logs show the expected bind address and base directory.
- Each Windows Scheduled Task reports the intended principal, launcher, listener, and restart state.
- The controller can reach each remote environment through its selected Tailnet, Tailscale Serve, or local tunnel URL.
- Desktop and server components report the expected versions after an update.
If the project documents a specific verification command, run that check as well.
Rules
- Inspect state before mutation.
- Prefer supported CLI operations over SQLite writes.
- Treat project title, workspace identity, Git remote identity, and saved backend identity as separate concerns.
- Confirm installed flags before copying nightly commands.
- Keep remote access private by default. Do not bind to a public interface unless the user explicitly asks and the authentication boundary has been reviewed.
- Give every remote environment and local tunnel a unique label and port.
- Never publish real Tailnet addresses, hostnames, credentials, pairing codes, or absolute user paths.
- Ask before deleting project threads, replacing an installation, or changing public exposure.
Common mistakes
- Renaming a project when the stale selection is actually stored in desktop browser state.
- Editing the database while T3 is running, then losing the change or corrupting state.
- Updating the CLI but leaving the desktop application on an older build, or the reverse.
- Reusing one vague title or one local tunnel port for several machines.
- Treating a successful Tailnet ping as proof that the T3 TCP port is reachable.
- Assuming Tailscale Serve and direct Tailnet binding produce the same URL and port behavior.
- Patching release artifacts instead of keeping wrappers and services in user-owned paths.
1---2name: t3-code3description: Use when configuring or troubleshooting T3 Code projects, multi-machine environments, desktop or headless servers, project names or icons, updates, launchers, or private remote access. Trigger on stale project entries, wrong workspace identity, missing favicons, update banners, saved backend setup, server reachability, Tailscale exposure, SSH tunnel fallback, or T3 service setup.4license: MIT5---67# T3 Code89Manage T3 Code without tying the setup to one machine, package source, repository layout, or private network.1011## Start with the surface1213Identify the failing surface before changing anything:14151. Desktop application state and launch method.162. T3 server state under the selected base directory.173. Project registration, title, workspace root, or favicon.184. Headless server process or user service.195. Private remote access through Tailscale.206. Update source for the desktop application and CLI.217. Multi-machine topology, saved environments, pairing, or tunnel fallback.2223Record the installed version and supported flags first:2425```bash26t3 --version27t3 project --help28t3 serve --help29```3031Nightly flags and storage details can change. Prefer the installed CLI help over copied commands.3233## Inspect before changing3435- Find the actual executable with `command -v t3`.36- Identify the configured base directory. The usual default is `~/.t3`, but `--base-dir` or `T3CODE_HOME` may override it.37- Determine how the desktop application was installed: package manager, AppImage, source checkout, or another channel.38- Determine whether the server runs interactively, through a wrapper, or as a user service.39- Read `references/multi-machine.md` before setting up one desktop to manage projects on other hosts.40- Read `references/windows-remote.md` when a remote T3 backend runs on Windows.41- Read `references/project-state.md` before changing project records or icons.42- Read `references/remote-tailscale.md` before exposing a headless server.43- Read `references/updates-and-launchers.md` before installing T3 or changing release channels, updates, wrappers, or services.4445## Prefer supported commands4647Use T3 project commands before considering direct database edits:4849```bash50t3 project add --base-dir "$HOME/.t3" --title "Project (Workstation)" /path/to/repository51t3 project rename --base-dir "$HOME/.t3" /path/to/repository "Project (Workstation)"52t3 project remove --base-dir "$HOME/.t3" /path/to/repository53```5455Do not use `--force` with `t3 project remove` unless the user explicitly intends to delete the project and its threads.5657Use host-qualified titles only when the same repository is active on more than one machine and the distinction helps the user select the right workspace. Do not change the Git remote to solve a display-name problem.5859## Keep local integration outside release artifacts6061Do not patch an installed AppImage, generated bundle, or package directory for a durable fix. Put local behavior in user-owned locations such as:6263- `~/.local/bin/` for launch, update, or tunnel wrappers.64- `~/.local/share/` for local-only assets.65- `~/.config/systemd/user/` for user services and timers.6667Keep machine-specific paths, hostnames, ports, and network addresses in local configuration, not in the reusable skill.6869## Verify the result7071Run the checks that match the change:7273- The T3 command exits successfully.74- The active project list shows the intended title and workspace root.75- The selected favicon exists and does not dirty the repository when it is meant to stay local.76- The desktop launcher opens the intended installed version.77- Every remote environment resolves to the intended host and uses a distinct display name.78- Each headless service is active and its logs show the expected bind address and base directory.79- Each Windows Scheduled Task reports the intended principal, launcher, listener, and restart state.80- The controller can reach each remote environment through its selected Tailnet, Tailscale Serve, or local tunnel URL.81- Desktop and server components report the expected versions after an update.8283If the project documents a specific verification command, run that check as well.8485## Rules8687- Inspect state before mutation.88- Prefer supported CLI operations over SQLite writes.89- Treat project title, workspace identity, Git remote identity, and saved backend identity as separate concerns.90- Confirm installed flags before copying nightly commands.91- Keep remote access private by default. Do not bind to a public interface unless the user explicitly asks and the authentication boundary has been reviewed.92- Give every remote environment and local tunnel a unique label and port.93- Never publish real Tailnet addresses, hostnames, credentials, pairing codes, or absolute user paths.94- Ask before deleting project threads, replacing an installation, or changing public exposure.9596## Common mistakes9798- Renaming a project when the stale selection is actually stored in desktop browser state.99- Editing the database while T3 is running, then losing the change or corrupting state.100- Updating the CLI but leaving the desktop application on an older build, or the reverse.101- Reusing one vague title or one local tunnel port for several machines.102- Treating a successful Tailnet ping as proof that the T3 TCP port is reachable.103- Assuming Tailscale Serve and direct Tailnet binding produce the same URL and port behavior.104- Patching release artifacts instead of keeping wrappers and services in user-owned paths.