┌──────────────────────────────────────────────────────┐
│ Browser │
│ │
│ ┌─────────────┐ ┌──────────┐ ┌──────────────────┐ │
│ │ App Engine │ │ Store │ │ Panel Registry │ │
│ │ (app.js) │ │(pub/sub) │ │ (18 panels) │ │
│ └──────┬───────┘ └────┬─────┘ └────────┬─────────┘ │
│ │ │ │ │
│ ┌──────┴──────────────┴────────────────┴─────────┐ │
│ │ API Client (api.js) │ │
│ └──────────────────────┬─────────────────────────┘ │
└─────────────────────────┼────────────────────────────┘
│ HTTP
┌─────────────────────────┼────────────────────────────┐
│ FastAPI Proxy (proxy/) │
│ ┌──────┐ ┌──────┐ ┌──────────┐ ┌─────────────────┐ │
│ │ CORS │ │Cache │ │ Routes │ │ Scanner Engine │ │
│ └──────┘ └──────┘ └────┬─────┘ └────────┬────────┘ │
└──────────────────────────┼────────────────┼──────────┘
│ │
┌──────┴────────────────┴──────┐
│ Binance Skills Hub APIs │
│ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │Sk 1 │ │Sk 2 │ │Sk 3 │ │
│ ├─────┤ ├─────┤ ├─────┤ │
│ │Sk 4 │ │Sk 5 │ │Sk 6 │ │
│ ├─────┤ └─────┘ └─────┘ │
│ │Sk 7 │ │
│ └─────┘ │
└──────────────────────────────┘
- Central state: theme, layout, focusedToken, focusedWallet, scannerStatus
- Panels subscribe to state changes for cross-panel intelligence
- ~50 lines, zero dependencies
- Each panel extends
BasePanel(HTMLElement) - Lifecycle:
connectedCallback → render → fetchData → renderContent → afterRender - Auto-refresh on configurable interval
- Cross-panel communication via store events
- CSS Grid with preset configurations
- 6 layouts: Overview, Meme Hunter, Whale Watcher, Deep Dive, Trader, Scanner
- Dynamic panel creation/destruction on layout switch
- Keyboard shortcuts for instant switching (1-6)
- Thin FastAPI proxy — no business logic
- CORS middleware for browser access
- In-memory TTL cache (default 5s)
- httpx async client for upstream requests
- HMAC signing for authenticated Spot endpoints
- Background asyncio task
- Polls Meme Rush every N seconds (default 30)
- Scores tokens using multi-API pipeline
- Maintains sorted results in memory
- Exposed via REST endpoints
When a user clicks a token in any panel:
- Panel calls
store.focusToken({ symbol, address, chain }) - Store notifies all subscribers
- Token Profile loads meta + dynamic data
- Token Audit runs security check
- DEX Chart loads price history
- Wallet Tracker can track related wallets
This creates a unified research workflow without explicit navigation.
Adding a panel requires ONE file:
- Create
frontend/js/panels/my-panel.js - Extend
BasePanel, implementfetchData()andrenderContent() - Register with
customElements.define() - Add to panel registry in
app.js
No build step. No config changes. Works immediately.