- frontend.py: /book was calling /book on matcher (404); fixed to
/orderbook/<symbol> with ?symbol= query param
- Order Entry: pass selected symbol to /book, reload on symbol change
- Order Entry: add β Dashboard link via onclick (not href)
- FIX UI: β Dashboard href="/" was rewritten by nginx sub_filter to
/fix/; fixed by switching to onclick so sub_filter can't touch it
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Frontend (disconnected root cause):
- All fetch('/endpoint') calls were hitting nginx '/' (dashboard) instead
of '/frontend/endpoint'. Added BASE detection at page load:
const BASE = window.location.pathname === '/' ? '' : pathname.replace(/\/$/, '');
Applied to /securities, /order, /book, /trades
FIX UI (session disrupted by reloader):
- debug=True caused Flask reloader to spawn a child process and restart
the app, breaking the QuickFIX session on startup
- Changed to debug=False, use_reloader=False
Entrypoint timing:
- FIX OEG sleep increased from 3s β 6s (allow full socket bind)
- FIX UI sleep increased from 2s β 3s (allow QuickFIX initiator to start)
Dashboard:
- Local clock added to header bar (updates every second, browser timezone)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add NBG security and restrict symbol entry to known securitiesβ
Kafka-based stock exchange simulation with:
- Order matcher engine with SQLite persistence
- FIX protocol OEG server and UI clients
- Frontend order entry with real-time book/trades
- Trading dashboard with SSE streaming and charts
- Market data feeder, consumer, and snapshot viewer
- Docker Compose orchestration for all services
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>