Whitelabel OpenBook V2 orderbook — polls an on-chain market, serves live bids/asks/trades via WebSocket, and displays them in a branded Next.js UI.
packages/
server/ — Solana indexer + WebSocket/REST API (Node.js / TypeScript)
frontend/ — Live orderbook UI (Next.js 14 / Tailwind CSS)
Browse markets at https://app.openbook-solana.com and copy the market address you want to mirror (e.g. a SOL/USDC market).
cp .env.example .envEdit .env:
RPC_URL=https://api.mainnet-beta.solana.com # use a private RPC in prod
MARKET_ADDRESS=<paste OpenBook V2 market address here>
BASE_SYMBOL=SOL
QUOTE_SYMBOL=USDC
Recommended RPC providers (free tiers available):
- Helius — https://helius.dev
- Triton — https://triton.one
- QuickNode — https://quicknode.com
npm install
npm run dev- Frontend: http://localhost:3000
- API snapshot: http://localhost:3001/api/snapshot
- WebSocket: ws://localhost:3001
# Edit docker-compose.yml and set your server's public IP/domain
docker compose up -d --build# Build
npm run build
# Start both processes
npx pm2 start packages/server/dist/index.js --name ob-server
npx pm2 start "npm run start --workspace=packages/frontend" --name ob-frontend
npx pm2 saveSolana RPC
│ (poll every 500ms)
▼
packages/server/src/indexer.ts — deserializes OpenBook V2 bids/asks accounts
│
▼
packages/server/src/store.ts — in-memory orderbook state + trade history
│
▼
packages/server/src/server.ts — Express REST + WebSocket server
│ (ws://…)
▼
packages/frontend — React UI, reconnects automatically
| type | payload | when |
|---|---|---|
snapshot |
{ orderbook, trades, market } |
on connect |
ob_update |
{ orderbook } |
every poll that changes the book |
trade |
{ trade } |
when mid-price shifts (fill detected) |
- Colors: edit
packages/frontend/tailwind.config.js(bid,ask,surface) - Market name: set
NEXT_PUBLIC_MARKET_NAMEin.env - Logo / fonts: edit
packages/frontend/src/app/layout.tsx
| Variable | Default | Description |
|---|---|---|
RPC_URL |
mainnet-beta public | Solana RPC endpoint |
MARKET_ADDRESS |
required | OpenBook V2 market pubkey |
BASE_SYMBOL |
BASE |
Base token label |
QUOTE_SYMBOL |
QUOTE |
Quote token label |
PORT |
3001 |
API server port |
POLL_INTERVAL_MS |
500 |
Polling frequency (≥ 400ms) |
ORDERBOOK_DEPTH |
20 |
Price levels shown |
NEXT_PUBLIC_WS_URL |
ws://localhost:3001 |
WebSocket URL (frontend) |
NEXT_PUBLIC_API_URL |
http://localhost:3001 |
REST URL (frontend) |
NEXT_PUBLIC_MARKET_NAME |
SOL/USDC |
Browser tab / header label |