A self-hosted, multi-topic analytics monitor. Tabs: Bitcoin (market, network, on-chain), Macro AR (dollar, inflation, reserves, country risk, INDEC poverty / unemployment / Gini, Di Tella confidence indices), Mercados (S&P 500, copper, gold, Brent, natural gas) and Energía AR (CAMMESA generation mix and demand). Public dashboards on top of free APIs.
- UI / server: Python Shiny
- Storage: DuckDB
- Data: Polars
- Plots: Plotly
- HTTP: httpx
- Packaging: uv (
pyproject.toml+uv.lock)
uv sync # creates .venv from uv.lock
cp .env.example .env
uv run python -m ingest.runner # one ingest pass — writes to ./data.db
uv run uvicorn app:app --host 127.0.0.1 --port 8000 --reload # http://127.0.0.1:8000The app is a Starlette parent that mounts two Shiny apps: the public dashboard at / and an admin panel at /admin (intended to sit behind Caddy Basic Auth in production).
Append-only DuckDB. Table definitions live in db.py::SCHEMA_STATEMENTS. Schema migrations are additive (ALTER TABLE ... ADD COLUMN IF NOT EXISTS or new tables) — never DROP.
general_monitor/
├── app.py # Shiny UI
├── db.py # DuckDB connection + schema
├── ingest/
│ ├── runner.py # entrypoint: runs sources, logs to ingest_runs
│ └── sources/
│ └── mempool_space/
├── pyproject.toml # dependencies (uv)
├── uv.lock
└── .env.example
TBD.