The stack

Every choice optimises for the same thing: a system one engineer can read, audit, and rebuild in a sitting — boring, proven technology arranged carefully. The architecture notes explain the shape; this page names the parts.

Backend

Python
The trading, data, and risk engines — the language of quantitative work, held to strict static typing on every money path.
FastAPI
The API layer — async-native, tiny surface, with request/response contracts validated at the boundary.
Pydantic
Every boundary — API bodies, configs, screen definitions — is a validated, typed contract, never a loose dict.
APScheduler
All recurring jobs (nightly pipelines, sweeps, syncs) run in-process — no external job cluster to babysit.
uv
Python environments built from one lockfile in seconds — deploys and disposable machines never wait on packaging.
structlog
Structured, correlation-id logging — every order's journey is one query away.

Data

PostgreSQL
One database is the single source of truth for both the trading book and market history — transactional, joinable, one backup story.
TimescaleDB
Postgres grown time-series organs: millions of ticks and candles partitioned, compressed, and rolled up in place.
Redis
The live layer — latest quotes in microseconds and real-time fan-out to every open screen.
Alembic
Every schema change is a versioned, reviewable migration — the database's history reads like the code's.

Interface

React + TypeScript
The terminal — typed end to end against the API's contracts.
Vite
Builds the app into static, content-hashed files — served plainly, cached forever, updated atomically.
Tailwind CSS
One design-token system — the whole terminal's look defined in one place, enforced by a build-time guard.
TanStack Query
Server state, polling, and cache discipline for a screen that must never show stale data as fresh.
lightweight-charts
The professional charting canvas — the open-source engine from the TradingView house, driven entirely by Atlas's own data.

Edge & operations

Caddy
The single internet-facing door — automatic TLS, static serving, and reverse proxy in a config that fits on one screen.
Docker Compose
The whole platform declared in one file, reproducible on any small server — deliberately not an orchestration cluster.
Cloud object storage
Nightly encrypted off-site backups with tiered retention — and a weekly automated restore drill that proves them.
Broker SDK
The broker's official SDK, confined behind an internal adapter — the one place broker specifics are allowed to exist.

Quality gates

pytest
A thousand-plus tests including failure injection on the money paths and a determinism gate on backtests.
mypy
Strict static typing on risk, execution, and broker code — the compiler as a second reviewer.
ruff
Formatting and linting with zero debate — one style, enforced.
import-linter
The architecture itself is a test: forbidden dependencies (UI→broker, strategy→execution) fail the build, not the code review.

Absent by design: no microservices, no message brokers, no Kubernetes, no external job queues, no third-party analytics or trackers. Every dependency is one more thing that can break at 9:15 — the bar for inclusion is high.