Koko implements a CDP-compatible runtime so standard automation clients can attach over WebSocket without custom drivers.
Starting the server
For everyday use, prefer Browser.launch() from the SDK — see Quick start. Run a standalone server when you need a long-lived CDP endpoint:
koko serve --host 127.0.0.1 --port 9222
From a dev checkout: zig build run -- serve --host 127.0.0.1 --port 9222
HTTP discovery
| Endpoint | Purpose |
|---|---|
GET /json/version | Browser metadata + WebSocket debugger URL |
GET /json/list | List open page targets |
GET /json/new | Create new page target |
WebSocket session
Clients connect to the webSocketDebuggerUrl from /json/version. Messages follow standard CDP JSON-RPC framing with method names like Page.navigate, Runtime.evaluate, DOM.getDocument.
Flattened target tracking
The Koko SDK enables flattened session routing by default on Browser.connect() — multiple targets can share one WebSocket with session IDs, matching modern Chromium CDP behavior.
Standard domains
Page— navigation, screenshots, PDFRuntime— JavaScript evaluationDOM— node queries, performSearchInput— keyboard and mouse dispatchNetwork— request tracking
Koko-specific domain
The custom LP namespace provides agent-oriented APIs. See LP CDP domain.
Third-party clients
Any CDP client can connect — including Playwright chromium.connectOverCDP(), Puppeteer, or raw WebSocket scripts. For Playwright-shaped ergonomics, prefer the Koko SDK.