Blog
Notes on engineering, performance, and whatever else I'm building or thinking about.
The anonymous chat bot worked perfectly on my laptop and fell apart the first time I ran two processes. Here is what I changed.
A product price kept showing the old value after an update. TTL-only caching was the problem; tag-based invalidation was the fix I still use - including on this site.
The repository pattern, dependency injection, and a few sharp edges from the async path.
Routers, services, repositories, and the rules that keep a FastAPI codebase from becoming a mess as it grows.
After scaffolding the same Telegram bot three times from scratch, I stopped and turned it into a template: feature routers, FSM flows, middleware, and a Docker setup that just runs.
Most FastAPI JWT tutorials stop at 'here is a token.' The parts that actually matter show up later: refresh rotation, HTTP-only cookies, and how to log someone out.
Students, teachers, courses, grades, attendance. It sounds like a beginner CRUD app until you actually model it - and the join tables turn out to be where all the real decisions hide.
For internal tools I rarely build a custom dashboard first. A properly customized Django admin gets a working back office in an afternoon - here is how far I push it before reaching for anything else.