Libraries by layer
The concrete library choices for every layer of the hybrid TypeScript + Python stack, including the model gateway, venue adapters and job/queue layer.
The concrete choices, layer by layer. TypeScript owns the web and operational layer; Python owns research, data, the model router and execution. See the providers page for pricing, limits and official docs.
By layer
| Layer | Libraries |
|---|---|
| Web / UI | TanStack Start, Vite, React, TypeScript, Tailwind, shadcn/ui, TanStack Router/Table |
| Charts | Lightweight Charts, Apache ECharts |
| Data / real-time | Convex (self-hosted), Convex crons |
| Python platform | Python, FastAPI, Pydantic, uv |
| Agents & orchestration | LangGraph, provider-agnostic LLM gateway |
| Model gateway / router | Internal OpenAI-compatible gateway, LiteLLM (evaluated), task-level router |
| Local / OSS inference | Ollama, llama.cpp, vLLM (future dedicated GPU) |
| Quant | NumPy, pandas, SciPy, statsmodels, scikit-learn, TA-Lib / pandas-ta |
| Backtesting | vectorbt, Backtrader (optional), custom event-driven runner |
| Market / execution | CCXT / CCXT Pro, direct exchange adapters, web3.py, chain SDKs |
| Venue & routing | VenueAdapter interface, Jupiter, 0x / 1inch routers, native DEX adapters, paper adapter |
| Collectors / sources | Exchange listing feeds, on-chain RPC / indexers, DEX Screener, social APIs |
| Memory | SQLite, SQLAlchemy / SQLModel, FTS5, sqlite-vec |
| Analytics & events | Parquet, DuckDB, Valkey / Redis Streams |
| Jobs & cache | Valkey, BullMQ / Dramatiq / Celery |
| Cost & budget | usage logs, model registry, per-scope budgets, degradation policy |
| Logging | pino (web), structured JSON → Loki |
| Notifications | Telegram bot, Resend (email) |
| Infra | Docker, Docker Compose, Caddy, GitHub Actions |
| Observability | Prometheus, Grafana, Loki, Uptime Kuma, OpenTelemetry (later) |
| Backups | Restic → Cloudflare R2 |
Why CCXT, DuckDB and the gateway
CCXT unifies many exchanges and ships WebSockets, preparing the CEX/DEX layer without a rewrite (read-only first). DuckDB queries the Parquet lake directly, so historical scans never hit the operational database. The model gateway exposes one OpenAI-compatible interface so providers and local models are swappable, while Clawlas keeps the routing policy.
See the technical stack page for the at-a-glance overview, the hybrid topology and the rejected choices.