Skip to content

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.