> ## Documentation Index
> Fetch the complete documentation index at: https://tesser.sh/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# localhost:3000

> One address in the browser, any box behind it, switched with a click

`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:

```text theme={"theme":"css-variables"}
http://<box_id>.localhost:3000
```

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](/docs/wiring).

## Adding a local server to the list

A server running on your laptop can appear in the switcher alongside the
boxes:

```sh theme={"theme":"css-variables"}
tesser target add local 3001 --label "local next"
tesser target ls
tesser target rm local
```

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`.
