<!-- https://zunderlabs.com/docs/tools/watch · Markdown version of the page -->

# Watch

Your bot's trades judged live in a browser tab. What Watch reads, how it judges, and why it can warn but never block.

Watch follows one Hyperliquid address in your browser and judges each new trade under your rules, as it happens. When a rule breaks, it tells you, with a browser notification if you allow one.

:::note[Planned]
Watch on real data arrives with the live data module (`web/live`), which is being built. Until then the page shows simulated data, labelled as such.
:::

## Watch warns. It cannot block.

A browser tab cannot receive your bot's orders: a web page has no listening socket. So Watch sees a trade only after Hyperliquid has filled it. To stop a trade before it happens, you need Guard in front of the bot.

## What it reads

All public, no wallet connection, no signature, no key:

| Source | What | How often |
|---|---|---|
| WebSocket `userFills` | the address's fills | live |
| WebSocket `orderUpdates` | its orders, including stops | live |
| WebSocket `clearinghouseState` | equity, positions, liquidation prices | live |
| `frontendOpenOrders` | open orders, when they changed and a fill needs judging | on demand |
| `portfolio` | PnL history, for the daily loss stop and drawdown halt | every 5 minutes |
| `meta` | lot sizes and minimums | once |

The address is held only while Watch runs, and dropped when you stop it. No event the page shows carries it.

## How it judges

- **Each new order's fills**, once a short grace has passed: a stop placed up to 5 s after the fill still counts as that entry's stop. Then the same nine rules as [Backtest](https://zunderlabs.com/docs/tools/backtest), with the same WebAssembly engine.
- **The account as a whole**, on every state update. A warning fires when:
  - the daily loss stop or the drawdown halt is reached (`halted_for_day`, `stopped`),
  - a position has no stop (`position_without_stop`),
  - open risk is over your cap (`open_risk_over_cap`),
  - leverage is over your cap (`leverage_over_cap`).

**Example.** Your bot opens 2 ETH and forgets its stop. Five seconds later Watch shows "would refuse · no stop", and the account-level warning "position without stop" stays until a stop appears.

## Limits

- **The tab must stay open** and the computer awake.
- **One address.** Hyperliquid lets one IP subscribe to user data of at most 10 different users; Watch uses one of them.
- **It reads state after the trade.** A second trade right after the first can blur which trade changed what.
- **Notifications** need your browser's permission.
