- All services use btc-network exclusively
- Increase Frankfurter retry to 12x10s for cold start resilience
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Poll Strike API every 10s, store all rates as JSONB in strike_price table
- Move Docker env vars to .env file, use shared network for cross-project communication
- Add startup retry (5x 5s) for Frankfurter poller to handle container race condition
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Require frankfurter.rates namespace in core.clj so Integrant can find it
- Use /v1/ prefix for self-hosted Frankfurter API
- Display BTC price converted to EUR and DKK instead of raw exchange rates
- Remove unused host port mapping for Frankfurter container
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Polls self-hosted Frankfurter API hourly for USD-based EUR and DKK exchange
rates. Both the WebSocket HTML fragments and the /api/price/latest JSON
endpoint now include the currency rates alongside BTC price.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Replace SSE endpoint (/api/price/stream) with WebSocket (/api/price/ws)
using ring-undertow-adapter's built-in WebSocket support
- Change Docker internal port from 4100 to 4101 to avoid conflicts with
local dev (make run still uses 4100)
- Add free-port.sh utility script
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use Undertow dispatch for SSE handler to avoid Ring adapter conflict.
Add docker-compose.yml (port 4101 to coexist with local dev on 4100).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>