- Switch from SSE EventSource to WebSocket client connecting to btcdata's new /api/price/ws endpoint - Add automatic reconnect on connection loss (3s delay) - Update Dockerfile BTCDATA_URL to use btcdata's new Docker port 4101 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2.0 KiB
2.0 KiB
btcprice
Bitcoin price tracker UI — Clojure Kit web application. Serves the HTML/Tailwind UI. Connects to btcdata for live price data via WebSocket.
Build & Development Commands
make run— Start dev server on port 4000make repl— Start nREPLmake test— Run testsmake tailwind— Watch Tailwind CSS for changesmake uberjar— Build production JARdocker compose up -d— Start btcprice + btcdata containers
Docker
Docker runs alongside local dev on different ports:
| Service | Local dev | Docker |
|---|---|---|
| btcprice | localhost:4000 | localhost:4041 |
| btcdata | localhost:4100 | localhost:4101 |
btcprice's docker-compose includes btcdata via include: ../btcdata/docker-compose.yml.
REPL Commands
(dev-prep!) ;; Prepare dev system
(go) ;; Start system
(reset) ;; Reload code & restart
(halt) ;; Stop system
Architecture
- Framework: Kit (Integrant-based)
- Server: Undertow
- Routing: Reitit
- Templates: Hiccup + vanilla JS WebSocket
- Styling: Tailwind CSS v4
- Data backend: btcdata (separate service at BTCDATA_URL, default http://localhost:4100, WebSocket at ws://localhost:4100)
- No database — all data comes from btcdata
Source Layout
src/clj/pmagnus/btcprice/
├── core.clj # App entry point
├── config.clj # System config loader
└── web/
├── handler.clj # Ring handler + routes
├── htmx.clj # page/fragment macros
├── controllers/
│ └── health.clj # Health check
├── middleware/
│ ├── core.clj # Base middleware
│ ├── exception.clj # Exception handling
│ └── formats.clj # Content negotiation
└── routes/
├── api.clj # /api routes (JSON)
├── ui.clj # UI routes (HTML + WebSocket)
└── utils.clj # Route utilities