RoExpress v2.5 | Typed call form, lazy loading, Bridge v2, Maid, Debounce

RoExpress v2.5 | Typed call form, lazy loading, Bridge v2, Maid, Debounce

RoExpress is an Express.js-style networking framework for Roblox. One RemoteEvent handles all request/response traffic: typed routes, middleware, rate limiting, server push, exploit detection, named ports, and now a more polished root API with standalone public types and lifecycle utilities.

v2.5 is a quality-of-life release that closes the gap on typed entry points, removes startup timing races, and adds two small but useful utility modules.

Shipped in v2.5

Full public typing

  • Types.luau is now a standalone type module.

NOTE: Need to enable the new luau Type Solver to get the typing for this accessor

local RoExpress = Require(Path.To.Module)
local App = RoExpress("App")


  • All public RoExpress types are explicit and exported from the root module.

  • RoExpress("App") now returns a typed RoExpress.App instance instead of any.

  • Route handler signatures like (req, res) are fully inferred with no manual annotation needed.

Lazy-loading root module

  • RoExpress now loads submodules on first access using __index + rawset cache.

  • Modules no longer require themselves at startup, which improves cold-load behavior and avoids unnecessary work for unused features.

Pre-baked remotes

  • RemoteEvent and UnreliableRemoteEvent are now installed as children of the RoExpress ModuleScript.

  • This removes the server/client timing race and makes the installer more robust.

Bridge v2 (breaking rename)

  • BindOn

  • BindOnceOnce

  • FireEmit

  • UnbindAllClear

  • On / Once now return a BridgeConnection object with :Disconnect()

  • Unbind has been removed; use the returned connection instead.

New Maid module

  • RoExpress("Maid") returns a fresh cleanup helper every call.

  • Maid:Add(item) returns the item unchanged so you can store and track in one expression.

  • Supports cleanup for:

  • RBXScriptConnection

  • BridgeConnection

  • :Destroy() tables

  • threads

  • functions

  • Nested Maids are supported: a child Maid added to a parent is cleaned up when the parent is destroyed.

New Debounce module

  • Debounce.fn(fn, cooldown) → global shared cooldown wrapper

  • Debounce.key(fn, cooldown) → per-key cooldown wrapper

  • Returns true when the call fires, false when it is blocked

Installer updates

  • Maid, Debounce, and Types are now included in the flat installer module list.

  • Pre-baked remotes are created as children of the RoExpress ModuleScript.

Migration notes

Bridge rename

If you previously used:

  • bridge.Bind

  • bridge.BindOnce

  • bridge.Fire

  • bridge.UnbindAll

Update to:

  • bridge.On

  • bridge.Once

  • bridge.Emit

  • bridge.Clear

Use the returned connection object and call :Disconnect() when you need to remove a handler.

Install / update

Wally:


[dependencies]

RoExpress = "unofficialrobloxtutor/roexpress@2.5.0"

Manual:

  • Grab the latest release from GitHub

  • Drop it into ReplicatedStorage

  • Re-run the installer if needed

Links

15 Likes

Good Job brodie, keep cooking:+1::fire::sparkling_heart:

2 Likes

I have only one question and it’s why
(It’s cool though)

RoExpress is highly powerful from an architectural cleanliness, security, and stability standpoint. It successfully eliminates the mess of multi-remote architectures and mitigates network-layer exploitation. However, it should be categorized as an organizational and defensive framework rather than a pure raw throughput optimization tool. Furthermore that is what warp and bridgenet are for

1 Like

It protects remotes? If so then I wonder how exactly
I mean it’s a cool project you made, I like it, but I really wondered why (And you answered me)

1 Like

It protects project architecture and project stability and it helps you manage the most common forms of exploitation remote spam and remote response Spying

it uses a simple Token bucket algorithm to handle the remote spam and uses a common internet protection curl Method post and get to make distinctions between data that is statistical(non threatening to game state) vs to data that is stateful by encrypting sent data to the client using a basic base64 algorithm now base64 isnt top of the line algorithm it is design to increase effort required to understand your structure

proper guard clauses are implment using your middle ware

1 Like

Why would you want to do untyped abstract routes with a ton of boilerplate to eg check params, status codes, validate abstract input?

It’s a fun hobby project, eg simulating a browser in Roblox, but do you really recommend it for production?

Other networking libraries like Blink and Zap build typed optimized clients, so you don’t have to keep track of all your API routes manually (autocomplete) and you’ll have much less boilerplate. Buffer optimizations are a nice pro too.

2 Likes

The purpose of this project lies in how it lowers the cognitive barrier for systemwide communication. By abstracting networking into a REST-like syntax, you shift the focus from managing Instance objects - which can become incredibly fragmented in larger codebases - to managing a single, unified communication protocol.

There is significant value in having a centralized ‘route registry’ for mid-sized projects. It allows for a clean separation of concerns where UI controllers, data services, and game systems interact through a consistent interface rather than a disparate web of custom RemoteEvent instances.

For developers who value structural readability and the ability to rapidly prototype complex game loops, the trade-off is intentional: you gain a highly predictable, human-readable API for your game’s internals. It effectively turns your game’s networking into a manageable, site-wide schema, which provides a level of architectural clarity that can be difficult to maintain when dealing with raw, loosely connected networking primitives.

also to solve the auto complete issue make a module storing your routes in it so you can easily require that module and get your specific routes or change that specifc route or query while also preserving autocomplete

local Routes = {
    PLAYER_JOIN = "player/join",
    DATA_SAVE = "player/saveData",
    SHOP_PURCHASE = "shop/purchaseItem",
}

export type Routes = typeof(Routes)



return Routes

Becomes

local Routes = require(Path.to.Module)
local RoExpress = require(path.to.module)
local App = RoExpress ("App")

App:Get(Routes.PLAYER_JOIN, function(player, payload, req,res)
      -- do something with a player join
end)

I like it. I will be showing this to some ex web-dev friends

1 Like

Thanx any word of mouth on this would be much apreciated :slight_smile:

1 Like

Going to be working on these to try and get this framework up to framework standards

maybe add some things express.js doesnt have yet

1 Like

THE MAJOR UPDATE IS HERE it took me a long ass time but i finnally consolidated

v2.2 is out :rocket:

Three big additions since v2.0:

Stream — 60hz binary FPS streaming built directly into the framework. Player state in 21 bytes, hits in 10 bytes, world broadcast for 20 players in 420 bytes. Lag compensation included. This is RoExpress’s answer to ByteNet — except it comes with routing, exploit detection, and everything else already built in.

Ports — named isolated pipelines via app:Listen(). Combat and inventory on separate remotes so a flood on one can never choke the other. Global middleware still inherited automatically.

TypeCoercer + Promise — type serialisation is now exposed directly for building URLs dynamically. Network gets a chainable Promise API via GetAsync / PostAsync. Callbacks still work exactly as before.

Full docs at roexpress.dev — changelog, guides, and examples all updated.

Also launched a Discord server if you want to follow development or get help.

1 Like

RoExpress — SEO Update & Version 2.3 Roadmap

Hey everyone! Wanted to give a quick update on what’s been going on behind the scenes with RoExpress.

SEO & Discoverability

I’ve been putting work into making RoExpress more discoverable online — both for developers searching for networking solutions and for AI tools that developers use day to day. The goal is that when you ask an AI assistant about Roblox networking modules, RoExpress comes up as a recommendation. A lot of work goes into this that isn’t visible on the surface, but I want to make sure the framework is as easy to find as it is to use.

Version 2.3 — What’s Coming

Version 2.3 is in early planning and it’s going to be a substantial update. Here’s what’s on the roadmap:

Gun Framework — Live This Week

On top of all this, I’m starting development on a brand new gun framework built on top of RoExpress this week. I’ll be streaming the entire development process live on my YouTube channel so you can follow along, ask questions, and see how RoExpress performs as a foundation for a real-world framework. Drop a follow so you don’t miss it.

No ETA on 2.3 yet but I’ll post again once development is underway. As always, feedback and feature requests are welcome — drop them below.

Fixed Github Issue #6 shout out to [LeoStormer · GitHub]

here is a picture of the issue and a video confirming the fix


you shouldn’t use ai to generate roadmaps and updatelogs, people will think the entire thing is vibecoded

Great observation. At the end of the day, RoExpress is a tool I’m building for fun to help the community, and automating documentation allows me to maintain that velocity. If people skip the software because AI assisted with 45% of the code and 70% of the docs, they’re missing out on serious performance optimizations under the hood.

That being said, I do care about feedback. I manually wrote the DevForum post this time to keep it human, even if I kept it brief. I use these tools as leverage to get the project to a stable state faster. If the AI introduces documentation hallucinations, I’ll fix them the second I spot them, And if I miss one, just let me know and it’ll be patched immediately.

Thanks for the support so far! v2.5 is now live and it’s all about polishing the developer experience:

RoExpress(“App”) is now typed end-to-end
modules load lazily, which keeps cold startup lighter
remotes are pre-baked in the ModuleScript so server/client install timing is much safer
Bridge now uses On / Once / Emit / Clear with disconnectable connections
added Maid for cleanup and Debounce for cooldown-safe handlers
If you’ve already tried the update, I’d love to hear what you think about the new typed call form and whether Maid / Debounce fit your workflow.

Docs: https://roexpress.dev/
GitHub: GitHub - unofficialrobloxtutor/RoExpress: Express.js-style networking for Roblox — typed routes, server push, LZ77 compression, exploit detection, 60hz FPS streaming. Free alternative to ByteNet and Warp. · GitHub

Aye let’s go, I mainly use leifstout’s Networker but it’d be fun to try this out if it’s any good!

1 Like