Justin picked up a dry-erase marker—the blue one, because the black was nearly dead and the red had been missing its cap for a week—and drew three boxes on the whiteboard.
The left box: React UI. TypeScript. Next.js. The thing humans looked at. Six thousand seven hundred lines of components, renderers, and state management that turned a DAG into something a person could navigate.
The middle box: Go Gateway. OAuth proxy. Static serving. WebSocket relay. Nine thousand five hundred lines of middleware that stood between the world and the data. Every request authenticated, every response cached, every WebSocket connection multiplexed.
The right box: Rust Server. The core. Sixteen thousand lines of storage, hashing, compression, and projection. The Turn DAG. The Blob CAS. Port 9009 for machines, port 9010 for the gateway. The thing that never forgot and never lied.
Justin drew arrows between the boxes. React to Go, HTTP and WebSocket. Go to Rust, HTTP on 9010 and binary on 9009. He added the external connections: agents hitting the Go gateway's OAuth endpoint, browsers loading the React UI's static assets through the same gateway.
The entire architecture fit on a single whiteboard. Not a wall of whiteboards. Not a Lucidchart diagram with collapsible sections and hidden layers. One whiteboard, three boxes, five arrows.
"That's it?" Navan asked. Not skeptically—reverently.
"That's it." Justin capped the marker. "Three tiers. Three languages. Each one chosen for what it's best at. TypeScript for the UI because the browser demands it. Go for the gateway because it's the best language for network middleware that needs to be boring and reliable. Rust for the server because the storage layer can't afford garbage collection pauses or undefined behavior."
"Three languages in one system sounds like a maintenance burden," Jay said, playing devil's advocate.
"Three languages with clear boundaries is less burden than one language doing things it wasn't designed for." Justin tapped the middle box. "You could write the gateway in Rust. You'd fight the borrow checker on every HTTP handler. You could write the server in Go. You'd fight the garbage collector on every hot path. Or you can pick the right tool for each job and draw clean lines between them."
Jay studied the whiteboard. Three boxes, five arrows, zero ambiguity about where any piece of code lived or what it was responsible for. A new engineer could look at this for thirty seconds and understand the entire system topology.
"Don't erase that," Jay said.
Justin set the marker down. "I wasn't planning to."
He never did. The diagram stayed on that whiteboard for months. Other whiteboards were erased and redrawn dozens of times. Conference rooms were rearranged. Desks were moved. But the three-tier diagram remained, its blue ink fading slightly but never disappearing, a quiet anchor in a room full of change.
An architecture diagram that fits on one whiteboard and stays valid for months. That's the definition of good design. If you need Lucidchart, you've already lost.