A web app is another client

A browser is not a fourth implementation. It is an HTTP client of api.routes.

The box office on the landing is that client: list bills, open one. Same BoundOp Swagger and Grok call. JSON is a detail, not the UI.

box office · a web client
GET /shows/1 is get_show

Evening bill

12 remaining

GET /shows/1 HTTP/1.1

HTTP/1.1 200 OK
content-type: application/json

{"id":1,"name":"Evening bill"}

Clone if you want the process

sbt example/run

That serves /preview, /docs, and POST /mcp from the real Api. The widget above is the same box office, replayed.

Writes still go through the Api

POST /parties is bound, documented, and (in the example) OAuth-gated. The preview UI will not invent a second create path. If you add a host later, you bind it to this Api or you are doing it wrong.