esc
Raiders of the Lost Architecture A V3 Origin Story
The V3 Saga

Raiders of the Lost Architecture A V3 Origin Story

It started, as these things do, with hubris. "I'll just build a quick counter demo," I said, the famous last words of every developer who's ever touched a new framework. "How hard can SSE and NATS...

November 28, 2025

It started, as these things do, with hubris.

“I’ll just build a quick counter demo,” I said, the famous last words of every developer who’s ever touched a new framework. “How hard can SSE and NATS be?”

Act I: The Counter That Worked (Suspiciously)

The counter worked. Buttons clicked. Numbers incremented. SSE streamed. NATS published. I felt like a genius. For about ten minutes.

Then I looked at the code. Two nearly identical handlers. A game loop that would grow to 1500 lines. The faint smell of spaghetti wafting from the future.

“This needs architecture,” I declared to my rubber duck, who had seen this movie before.

Act II: Down the Wrong Temple

First, I studied the Northstar codebase. They used NATS KV Watch! Elegant! The model lives in a key-value store, watchers get notified, everything re-renders!

“This is it!” I exclaimed.

Then I imagined serializing 1000 chat messages to JSON on every keystroke. The duck said nothing, but I felt judged.

Next: what if every widget had its own SSE connection? Clean lifecycle! Automatic cleanup!

Safari laughed. Browsers limit SSE connections. Four tabs and you’re dead. Back to the drawing board.

Act III: The Slot Machine (Not the Fun Kind)

“Bounded slots!” I declared at 2 AM, that dangerous hour when bad ideas feel brilliant. “Five fixed slots! Signals track what’s in each slot! Explicit cleanup with fallbacks!”

I designed an elaborate system. Slot registries. Signal-based routing. Three layers of cleanup. It was beautiful. It was complete. It was… overengineered.

I slept on it.

Act IV: The Morning After

The reptile brain works in mysterious ways. I woke up and said: “Why am I tracking slots? The DOM already IS the scene.”

Components can self-register. data-init on mount. onCleanup on unmount. Rocket handles scoped signals. The browser handles the DOM lifecycle.

No registry. No slots. No framework. Just… web components doing web component things.

facepalm

Act V: The Temple of Delphi

And then it hit me. A struct that knows how to render itself AND handle its own events. Configure at instantiation. Same logic, different data.

I’ve seen this before.

  1. Borland Delphi. TComponent. Properties and event handlers on the same object. Visual design meets code. RAD development.

We spent 30 years building React and Redux and Flux and hooks and signals and stores… to arrive back at Object Pascal patterns with extra steps.

Anders Hejlsberg, you magnificent bastard.

Epilogue: The Artifact

type ToolEditor struct {
    ID string
}
func (t ToolEditor) Render() templ.Component
func (t ToolEditor) HandleSave(w, r)

That’s it. That’s the holy grail. A struct. Some methods. Type-safe all the way down.

The junior dev in me wanted a framework. The senior dev in me designed slot registries. The mass in me remembered Delphi and simplified everything.

Tomorrow we POC. Tonight, we rest.

The duck approves.