Blog — Prashanth Rajagopal
Long-form writing on distributed systems, architecture, and the technology I'm currently pulling apart to understand how it works. Posts are written from experience, not from documentation.
The 100km/h build list: every part, every reason
A full custom 1/8 scale RC buggy built entirely by hand — Tekno EB48 2.2 chassis kit, Hobbywing 6S power, every bolt chosen individually.
LiteLLM and the trust chain nobody audits
A compromised security scanner, stolen PyPI credentials, and a .pth file that ran on every Python startup. Three hours, 3.4 million daily downloads.
The 10ms lie we all tell
Every cache is a bet — and the 10ms on the whiteboard only counts the wins. Why cache discipline is architecture, not a tuning pass.
What Rails taught me about supervision
Puma, Sidekiq, and the art of not staying dead — which instincts from fifteen years of Ruby carried straight into Astra's actor tree.
Sandboxes aren't security theater
WASM, Docker, Firecracker — how you pick the cage when agents run tools you didn't write.
Why Postgres stays sacred
Eventual consistency is fine until it isn't. Where I draw the line between "fast read" and "source of truth."
Scheduling without losing your mind
Shards, heartbeats, and the gap between "works on my laptop" and a graph that has to survive real load.
Chat is the easy part
What it actually took to bolt WebSocket streaming onto Astra — and why the session model matters more than the protocol.
The kernel's first 10ms
Lookup, enqueue, done — what belongs on the path from Send to Receive, and what gets kicked out.
The approval gate nobody wants (until they do)
Building dual-approval and plan gates into an autonomous agent system — the tension between speed and not letting agents terraform destroy prod.
Why Astra runs on a Mac Mini
macOS as a production deployment target for an agent OS — Metal acceleration, native binaries, no emulation. When Kubernetes isn't the answer.
Why I didn't use Kubernetes
Docker for Postgres and Redis, native Go for what moves — orchestration can wait until the architecture stops moving weekly.
Agent memory is not a vector database
Working memory, episodic memory, and semantic search are three different things. pgvector is one layer, not the whole story.
Dead letters are a feature, not a failure
Designing for task exhaustion with dead-letter queues and retry budgets makes your system more honest than pretending everything succeeds.
Why I'm building Astra
Fifteen years of shipping things that break at 2am. Agents everywhere, but nowhere serious for them to run — so I'm building an OS-shaped answer.
My first RC car build: an engineer's guide to pain in India
Approaching RC cars like a software person — choosing a platform, brushless ESCs, LiPo safety, and the uniquely Indian challenge of getting parts at all.
Ruby in 2026: still boring, still right
Rails isn't trendy and it isn't dead. Boring technology choices compound, and the Ruby ecosystem does more right than the hype cycle admits.
ESP32, MQTT, and the $4 sensor that replaced a $200 one
Building DIY air quality and environment sensors with ESP32 and ESPHome — why a ₹450 board beats a ₹15,000 Awair, and what that says about commercial IoT.
Home Assistant ruined my light switches
From smart bulbs to a full Home Assistant setup — MQTT, Zigbee, automations that work, and the ones that spectacularly don't.
What electronics taught me about debugging software
Oscilloscopes, multimeters, and tracing signals through a circuit — the hardware debugging mindset that transfers directly to distributed systems.
Coming up
Posts I'm working on. No dates — they ship when they're honest.
Agents don't need memory — they need amnesia
Everyone's building "memory for agents" as append-only context stuffing. The harder problem is forgetting — deliberately.
The task graph is not a pipeline
You hear "DAG" and think Airflow. Astra's task graph is dynamic, runtime-mutable, and evaluated under scheduling pressure. The pipeline metaphor breaks.
Routing LLM calls like you'd route traffic
Cost caps, response caching, provider failover — the same instincts from load balancing HTTP apply, and the same mistakes show up again.
Multi-tenancy is a trust boundary, not a database column
Adding org_id to every query is where multi-tenancy starts, not where it ends. Real isolation survives a confused-deputy attack.
What Go took from me (and what it gave back)
A Ruby loyalist's honest trade ledger after building a kernel in Go. Not a language war — an accounting.