Skip to main content

Quick path

  1. Enter or target a Box. In integrations, use the command endpoint to run the same setup inside the Box:
  1. Start your app on an explicit port.
Your app must bind to 0.0.0.0. If it only listens on localhost or 127.0.0.1, the hosted HTTPS URL will not be able to reach it.
  1. Inside the Box, run host to start hosting your app. Programmatic integrations can execute the same command in the Box:
  1. Open the public HTTPS URL printed by host:
If the port is protected, the usable URL includes a _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 run host <port>, the Box asks the Ascii backend to create a stable public route for that Box and port. The backend registers a subdomain using the Box’s current machine address and the port you asked to expose. The generated hostname is based on the Box subdomain plus the port:
Ascii terminates TLS for on.ascii.dev, then proxies each request to the target Box over the exposed port. Your application still runs inside the Box; 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 Box from outside the application process, not through your app’s local loopback interface. The Box authenticates to the Ascii backend with its machine token, and the backend performs the route registration. This keeps routing credentials out of the Box environment while still letting the host CLI create, list, and remove routes.

Host CLI reference

The box host command runs from your local machine. The host CLI runs inside a Box. Both expose services from that Box on public HTTPS URLs.
The service you expose must listen on 0.0.0.0, not only on localhost or 127.0.0.1.

box host <box-id> <port>

Expose a running service without opening an interactive SSH session:
The command opens the firewall for that port, registers an HTTPS subdomain, and prints the URL. Calling it again for the same Box and port returns the same URL. Use --json to print a machine-readable object with boxId, 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:
Pass {"public":true} for an ungated URL.

In-Box host <port>

Expose a running service on a stable HTTPS URL:
The command opens the firewall for that port, registers an HTTPS subdomain, and prints the URL. Calling it again for the same port returns the same URL. A Box can host up to 50 ports. If you only need raw access without HTTPS or a subdomain, you can instead open the port yourself with ufw and use http://<box-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 Box:
Protected ports are shown as (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:
For a protected port, this prints the full token-gated URL:
This is useful when one service needs another service’s public URL:

host hide <port>

Take down the public URL:
This closes public access and unregisters the HTTPS route. It does not stop the local server process. Stop the server separately when you are done. Access tokens are preserved, so hosting the same port again keeps existing protected links valid. To get an ungated URL after a port has become protected, run host <port> --public.