tt dev
Open a project tunnel and optionally run an exact child command.
tt dev [project] [--port <port>] [access options]
tt dev [project] [--port <port>] [access options] -- <command> [args...]
tt dev opens a tunnel to a configured local port. With a command after --, it also runs that command as a managed child process. Turbotunnel does not discover package scripts, allocate ports, recognize frameworks, or change child arguments. For task guides, see use cases.
Select a project
tt dev dashboard
The project supplies its port, public hostname, and access policy. With one configured project, tt dev selects it automatically. With multiple projects, an interactive terminal presents a selector; non-interactive use requires the project name.
Without project configuration, pass the local port explicitly:
tt dev --port 5173
--port overrides a configured project port.
Run a child command
Everything after -- is executed directly, without a shell or argument rewriting:
tt dev dashboard -- pnpm dev
tt dev dashboard -- pnpm --filter dashboard dev
tt dev dashboard -- turbo run dev --filter=dashboard
tt dev dashboard -- vp run dashboard#dev
tt dev dashboard -- bun run --cwd workbench/dashboard dev
The command runs from the directory where you invoked tt dev and inherits the existing process environment. Turbotunnel does not inject environment variables. The child must listen on the port selected by project configuration or --port.
Child input and output remain attached to the terminal. Ctrl-C stops the child and tunnel. If the child exits, tt dev stops the tunnel and returns the child’s exit code.
Without a child command, the tunnel remains available while you run the app separately or coordinate both commands with a process supervisor.
Override tunnel access
Temporarily override the configured access policy:
tt dev dashboard --public
tt dev dashboard --password
tt dev dashboard --password chosen-password
tt dev dashboard --allow-ip 203.0.113.0/24
Configured password access and bare --password generate a fresh tt_<nanoid> password for the session. The startup output displays it once. Custom password values are also displayed. Passwords are held in memory and never written to project configuration, tt status, or tt list.
Forward requests when your app starts
The tunnel starts without waiting for the local app. While the configured target is unavailable, the public URL returns an HTTP 502 page with recovery steps. Forwarding begins automatically when the app starts and resumes after app restarts.