04Selected orbits
Systemsin motion.
Each shipped system occupies its own orbit. Every entry carries the problem, the decision made against something else, and what it cost.

Problem

A school deciding on outdoor practice has one current AQI number to go on: nothing station-level for the days ahead, and public feeds that go silent without saying so.

Approach

Hourly ingestion from three sources into TimescaleDB, orchestrated by nine Airflow DAGs. Each of the next five days is graded on the official CPCB scale and served by a FastAPI API to a React dashboard, with a watchdog, tested backups and a nightly evaluation behind it.

Trade-off

Served a simple statistical rule instead of the gradient-boosted models I had already built. In block-holdout backtests no model beat "the next days look like the last 24 hours", so I kept the option that was as accurate, better calibrated and unable to learn a sensor fault.

What broke / what I'd change

A sensor reading of 2.9 million µg/m³ became a training label and the API served a forecast of 8,243. I now look at the extremes of every new data source before anything is computed from it.

Result

Live for about 80 stations. In backtests the grade is exactly right on about 6 in 10 days for tomorrow, and a missing forecast is never shown as "go".

Python / Apache Airflow / PostgreSQL + TimescaleDB / FastAPI / Docker / TypeScript / React

Open project page →Live dashboard ↗

Problem

Job applications are a long chain of small, stateful tasks that break the moment a single-prompt assistant loses context.

Approach

Graph-based multi-agent orchestration with tool calling and structured memory, persisting state between agent steps so a run can be resumed and inspected.

Trade-off

Chose an explicit state graph over a single autonomous agent loop: more wiring and more code per capability, in exchange for runs that can be replayed and debugged step by step.

What broke / what I'd change

Long runs drifted when a tool returned an unexpected shape. Next pass: schema-validate every tool result at the graph edge and fail the node instead of letting the model improvise around it.

Result

End-to-end task execution instead of one-shot suggestions.

Python / LangGraph / LLM APIs / Tool Calling

Open project page →