···1919- appview (<https://tngl.boltless.dev>) (live reloading)
2020- [ncps](https://github.com/kalbasit/ncps) nix binary cache (internal, `http://ncps:8501`)
2121- pdsls (<https://pdsls.tngl.boltless.dev>)
2222+- bobbin (<https://bobbin.tngl.boltless.dev>, host `:8090`)
2323+- hydrant indexer + record/identity resolver feeding bobbin (internal)
2424+- web/ sveltekit frontend (host `127.0.0.1:5174`, live reloading)
2225- caddy reverse proxy
23262427## Setup
···53566. AppView will be running on `127.0.0.1:3000` with two test users: `alice.pds.tngl.boltless.dev` and `bob.pds.tngl.boltless.dev`. Both with password `password`.
54575558`TANGLED_APPVIEW_HOST` must be a loopback IP with the mapped port (`127.0.0.1:3000`), not `localhost`: atproto's dev OAuth client requires a loopback IP for the redirect URI. If you remap the published appview port, update `TANGLED_APPVIEW_HOST` in `docker-compose.yml` to match.
5959+6060+## bobbin stack
6161+6262+The `web` service runs `vite dev` against the local bobbin on
6363+`http://127.0.0.1:5174` (port 5174 so it doesn't clash with a host-side
6464+`pnpm dev` on 5173). For host-side `web/` dev, point the frontend at the
6565+local bobbin (e.g. in `web/.env`):
6666+6767+```bash
6868+BOBBIN_URL=http://127.0.0.1:8090
6969+VITE_HANDLE_RESOLVER_URL=https://pds.tngl.boltless.dev
7070+VITE_PLC_DIRECTORY_URL=https://plc.tngl.boltless.dev
7171+```