Quick path
- Enter or target a sandbox. In integrations, use the command endpoint to run the same setup inside the Sandbox:
- Start your app on an explicit port.
- Inside the sandbox, run
hostto start hosting your app. Programmatic integrations can execute the same command in the Sandbox:
- Open the public HTTPS URL printed by
host:
_token query parameter:
A fresh
host <port> URL is protected by default and includes _token. Pass
--public only when you want to clear the access token and return an ungated URL.If you want the process to survive after your SSH command exits, start it as a
detached process before hosting the port.
How HTTPS hosting works
When you runhost <port>, the sandbox asks the Boat backend to create a stable
public route for that sandbox and port. The backend registers a subdomain using the
Boat’s current machine address and the port you asked to expose.
The generated hostname is based on the sandbox subdomain plus the port:
on.boat.dev, then proxies each request to the target
sandbox over the exposed port. Your application still runs inside the sandbox; the public
HTTPS route sits in front of it. This is why your server must listen on 0.0.0.0:
the route connects to the sandbox from outside the application process, not through
your app’s local loopback interface.
Every hosted address is served under both
on.boat.dev and on.ascii.dev (the name from before the rename) with the same label, so SUBDOMAIN-3000.on.ascii.dev and SUBDOMAIN-3000.on.boat.dev are the same route. Links you shared as on.ascii.dev keep working until that suffix is retired (see Migrating from Box); switch what you publish to on.boat.dev whenever convenient.host CLI create, list, and remove routes.
Host CLI reference
Theboat host command runs from your local machine. The host CLI runs inside a sandbox. Both expose services from that sandbox on public HTTPS URLs.
boat host <sandbox-id> <port>
Expose a running service without opening an interactive SSH session:
Use
--json to print a machine-readable object with sandboxId, port, url, access, and isProtected.
It is a single API call, so it is also the fastest way to host a port from a script:
{"public":true} for an ungated URL.
In-sandbox host <port>
Expose a running service on a stable HTTPS URL:
ufw and use http://<sandbox-ip>:<port> directly.
By default,
host <port> creates a protected URL with an _token query parameter.
That protection is sticky: hosting the same port again returns a URL with the same
_token query parameter unless you pass --public.
host list
Show hosted ports for the current sandbox:
(gated). host list does not print the access token.
Use host url <port> to print the full URL with _token=....
host url <port>
Wait until the HTTPS URL is ready, then print it:
host hide <port>
Take down the public URL:
host <port> --public.
Firewall rules inside a sandbox
You have root, so you can add any firewall rule. Boat reaches the sandbox two ways, and a rule that blocks either one marks the sandbox degraded:
Linux tags a tunnel packet with the process that sent the data inside it, so an owner rule on
user also hits the tunnel. To block outgoing UDP for user without breaking Boat, allow the tunnel endpoint first:
error for this. It shows "health": "degraded" with a reason, and sends sandbox.degraded.