Skip to main content
tesser daemon runs a small proxy on your laptop. http://localhost:3000 shows whichever box you have selected, and switching boxes does not change the address, so bookmarks, cookies, and OAuth callbacks keep working as you move between branches. Keep the daemon running in a spare terminal. If port 3000 is already in use, tesser daemon --port 3300 moves the proxy there, and tesser dev will tell you which port to open.

Switching between boxes

The first tesser dev selects its box. After that, you choose what localhost:3000 shows in one of three ways:
  • The panel in the bottom-right corner of every page served through the proxy. It lists your boxes, and clicking one switches to it.
  • The widget page at http://localhost:4100, which is the same list outside of any page.
  • tesser use <box_id>, from a terminal or a script.
When you switch, the proxy closes the old connections first, so a hot-reload socket that was talking to one branch does not keep feeding the page after you have moved to another.

Two branches side by side

Every box also has its own address, whether or not it is selected:
Browsers resolve *.localhost to your own machine without any configuration, so you can open two tabs on two box ids and compare branches directly.

Other ports

Every port a service declares in its manifest is also available on your laptop. With ports = [3000, 9229], localhost:9229 reaches the selected box’s port 9229, and <box_id>.localhost:9229 reaches that port on a specific box. When two boxes both declare port 8080, they share a single localhost:8080 listener on the laptop and are told apart by the host name. The selected box’s dependencies are mirrored on the laptop as well. If its manifest says 5001 = "api", then localhost:5001 on your laptop reaches the same api instance the box reaches, so browser code that calls localhost:5001 behaves the same as server code on the box. See Wiring services together.

Adding a local server to the list

A server running on your laptop can appear in the switcher alongside the boxes:
Selecting it makes localhost:3000 show the server on your local port 3001.

Over Tailscale

The daemon answers requests from your own machine and from Tailscale peers, so a phone or a second laptop on your tailnet can open the proxy’s address and see the same selection. It refuses requests from the rest of your LAN unless you start it with --allow-lan.