The Story ✦
RoExpress didn't arrive fully formed. It came out of years of frustration, failure, circumstance, and stubbornness | built in pieces across very different seasons of life.
A post went up on the Roblox Developer Forum asking for feedback on an early idea for a remote framework. It never got listed. No traction, no replies worth counting. Most people would have moved on.
The core problem was already right: Roblox games scatter RemoteEvents everywhere with no structure and no safety. One remote, one pipeline. That instinct never changed | everything since has been figuring out how to execute it properly.
Back at it. A small standalone router module | basic route matching, typed params, nothing fancy. It worked but it didn't fit together as a framework yet. The pieces weren't talking to each other. The struggle was real: how do you make something that feels like one thing instead of a collection of parts?
That question didn't get answered in 2023. But the router module survived as a reference point | proof that the routing problem was solvable. It became the seed of what would eventually be the Router module in v2.
Joined a small development team. First time working in a real collaborative codebase. Saw how other people structured things | middleware patterns, request/response pipelines, module boundaries. Express.js wasn't just a reference anymore, it became the mental model.
The gap between "a Roblox game's networking" and "a structured API" became clear. And the gap was fixable. Spending time in a real team codebase showed exactly where Roblox networking fell apart at scale | and what a framework would need to fix it.
2025 was hard. Homeless, but in school | studying engineering and working toward a welding certificate. The framework sat on the back burner. Life had other priorities. But the ideas kept accumulating: rate limiting that actually works, typed routes, a broadcast primitive that's honest about reliability.
Still showed up on the DevForum. Still talking to other developers, still part of the community. That continuity matters more than it sounds. Sometimes the best thing that can happen to a project is that you can't touch it for a year | you come back knowing exactly what it needs.
The situation didn't change | still homeless. What changed was the output. v1.6 shipped as the first real, complete version: one remote, a working request pipeline, rate limiting, middleware, broadcast. Something you could actually put in a game. Then v2.0, then v2.1 through v2.4 in quick succession.
Time is the scarce resource. To make up for it, AI tools became part of the workflow | but not as a shortcut. The approach is to study the research first, understand the problem deeply, write informed prompts, then manually review and fix every hallucination. The framework's correctness comes from that last step. AI accelerates the writing. The decisions are still made by hand.
The framework that was sketched in a DevForum post in 2021 finally became the thing it was always trying to be. The circumstances of getting here weren't ideal. That part doesn't matter anymore.
See also
Design Decisions | the specific trade-offs behind every choice · Changelog | every version, what changed · Research Papers | academic foundations · Discord | come say hi