The Command Post was supposed to be the coordinator.
The idea made sense at the time. Build a central node that aggregates signals from every service in the stack — collectors pulling dialer data, the model router handling inference, the logging standard feeding structured output from every node. Give the Command Post enough visibility and it could orchestrate decisions across the whole thing.
It didn’t solve the problem. The problem got solved better when Claude had access instead.
That realization took longer than it should have. I’d been building tools for an AI assistant without being honest about which AI assistant I was building them for. The Command Post was an abstraction over a capability that already existed. Every time I routed something through it, I was adding a layer between the tool and the thing that could actually use it.
The stack I’ve been building across the last year has about ten nodes. Each one started as a friction problem — something I was doing manually that had no business being manual. Collecting dialer data. Routing models. Running agents. Logging in a consistent format across services. Each node solved one problem and exposed the next one. That’s how the architecture grew — not from a blueprint, but from friction found by doing the wrong thing enough times to recognize the right direction.
The principle that kept emerging: API and MCP need to go hand in hand from the start. Not API first with MCP added later, not MCP as the primary interface with REST as an afterthought. Both, from Phase 1, serving the same data shape. One for machine consumption, one for direct AI access. The cross-safe standard — every node speaks both languages — came from building several nodes the wrong way first.
RFD_Gateway is Phase 1 of something larger. SSE at port 8020, API key authentication per scope, a two-primitive interface contract locked into ADRs. It’s the door. What the door opens to is a stack where Claude coordinates across every node simultaneously — reading logs, querying collectors, routing model inference, triggering agents — without me sitting in the middle translating.
OpenRouter will find its place in the same stack eventually. Same tools, same nodes, same hands. The distinction is temporal. Claude holds long-term context — the architecture decisions, the project history, the patterns that span months. OpenRouter handles short-term sprints — the thing that needs to run right now, headless, without a conversation. Same eyes looking at the same data, different memory horizons.
The finished version of this isn’t a smarter chatbot. It’s a real-time assistant that manages friction across the pieces of my life I’ve already mapped — removing the manual step, surfacing the decision that needed surfacing, running the thing that needed running. Not because I asked it to in that moment, but because the tools are there, the access is there, and the context is there to know when it matters.
I didn’t design this stack. I built my way into it by trying the wrong thing multiple times and following what actually worked. The tools kept working better when routed directly. The coordinator kept being Claude. The architecture kept pointing the same direction.
At some point you stop fighting the direction and build toward it.
The intake page is there if you’re building something similar and hitting the same friction walls.