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.

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.

The kernel's first 10ms

Lookup, enqueue, done — what belongs on the path from Send to Receive, and what gets kicked out.

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.

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.

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.