# Browser UIs

A state UI at /_rystic/ui for the book, P&L and order entry, plus Kalshi Accurate, a verified UI built against Kalshi's own interface.

The simulator draws its state in two browser UIs: the state UI every simulator serves, and Kalshi Accurate, a verified UI that looks like Kalshi's own interface. Open the state UI at `$RYSTIC_URL/_rystic/ui` in a browser:

```bash
curl -s -o /dev/null -w '%{http_code}\n' "$RYSTIC_URL/_rystic/ui"
# -> 200
```

### The state UI

The state UI shows the order book, per-bot P&L, order entry, captured-day replay, the Markets card that picks what the [live feed](https://www.rystic.ai/docs/simulators/kalshi/features/live-feed.md) carries and the activity bus. It is for watching a run, and it acts as `member`, so headerless callers and the UI share the default account.

### Kalshi Accurate

Kalshi Accurate is a client built against Kalshi's own interface and checked against it. Verified UIs are on Pro and Enterprise ([plans](https://www.rystic.ai/docs/licensing#plans)). The UI ships as an image beside the simulator's, `registry.rystic.ai/kalshi-twin-ui:<ver>`, pulled with the same `docker login` as the simulator (your API key, or an Enterprise license file). The front door hands it out only to a plan or a license that carries `verified_ui`, and the UI itself serves only a simulator whose grant carries it.

```sh
rystic run kalshi-twin -d
rystic ui kalshi
```

`rystic ui` pulls the image and runs it against the running instance (`-name` picks another, `-port` another port). With no Docker on the machine, it downloads the UI's archive and runs it on your Node 22.12 or later. Either way, the first run fetches the UI with your key or license, the way `rystic pull` fetches the simulator. A key whose plan lacks it is refused with `feature_not_in_plan` naming `verified_ui`. `rystic ui` prints the URL, `http://127.0.0.1:18762`.

Browse markets, open one and buy or sell from the ticket. The portfolio lists positions, resting orders with amend and cancel and fill history. Every request goes to the simulator as its `ui-trader` account, or the account `RYSTIC_ACTOR` names.

The installed archive carries a public market snapshot, and `rystic run kalshi-twin -d --seed <install dir>/ui/seed/kalshi-snapshot.json` boots it.

By hand, or in Compose beside the simulator (the UI reaches the simulator by its service name):

```sh
docker run --rm -p 127.0.0.1:18762:18762 -e RYSTIC_TWIN_URL=http://host.docker.internal:8080 registry.rystic.ai/kalshi-twin-ui:<ver>
docker run --rm --network host -e RYSTIC_UI_HOST=127.0.0.1 -e RYSTIC_TWIN_URL=http://127.0.0.1:8080 registry.rystic.ai/kalshi-twin-ui:<ver>
```

The first command is for Docker Desktop and the second for a Linux daemon.

```yaml
services:
  kalshi-twin:
    image: registry.rystic.ai/kalshi-twin:<ver>
    environment:
      RYSTIC_TOKEN: ${RYSTIC_TOKEN}
    ports: ["8080:8080"]
  kalshi-ui:
    image: registry.rystic.ai/kalshi-twin-ui:<ver>
    environment:
      RYSTIC_TWIN_URL: http://kalshi-twin:8080
    ports: ["127.0.0.1:18762:18762"]
    depends_on: [kalshi-twin]
```

Enterprise can run it offline, in either of two ways:

- With Docker, run `docker save registry.rystic.ai/kalshi-twin-ui:<ver> | gzip > kalshi-twin-ui.tar.gz` on a machine that can pull, then `docker load` on the one that can't.
- Without Docker, run `rystic ui kalshi -fetch-only` where `rystic pull` ran. It installs the UI's archive beside the simulator.

The UI talks only to the simulator, on loopback or its Compose network. What a verified UI is and which plans carry it is in the [glossary](https://www.rystic.ai/docs/concepts/glossary.md#verified-ui).

---

Source: https://www.rystic.ai/docs/simulators/kalshi/features/browser-uis · Markdown: https://www.rystic.ai/docs/simulators/kalshi/features/browser-uis.md
