Reference
Changelog
Full version history for RoExpress. Breaking changes are marked breaking.
v2.3 | Compact Arguments current
Handler signatures slim from four arguments to two
- New compact handler form:
function(req, res)|req.playerandreq.rawhold the old first and second args - Detection via
debug.infoparameter count | existing four-arg handlers continue working without any changes backward compat - Stream rebuilt as generic typed channels |
Stream.Channel(name, schema),ch:Set,ch:Flush,ch:Rewind - breaking Stream (v2.4) replaces the old FPS-only singleton API | see the migration guide
- Codec LZ77 window size increased from 128 to 512 bytes | better ratio on larger payloads, same API
- TypeCoercer: added
UDim,Rect,UDim2support
v2.2.3 | Issue #6 Fix
Listener race condition on rapid successive events patched
- Fixed:
listener:Oncecould fire multiple times under rapid event delivery (GitHub issue #6) - Root cause: the disconnect handle was captured before the connection closed | now uses an atomic flag
- v2.2.1 and v2.2.2 were failed patch attempts; v2.2.3 is the confirmed fix
v2.2 | Server Push & Tamper
Reliable server-initiated events and built-in exploit detection
- Added
app:Push,app:PushAll,app:PushTo| reliable server-to-client events on the existing RemoteEvent - Listener transparently separates push packets from request-response packets | no API change on the client
- Added Tamper module | automatic strike tracking, configurable threshold, kick on exceed
- TokenBucket: added
Grant,GrantAllfor rewarding active players after round events - Router: typed params now support
=booleanand=stringin addition to=number
v2.1 | Ports & Benchmark
Namespace isolation and round-trip latency measurement
- Added Port module | isolated App instances each on their own RemoteEvent
- Added Benchmark module | fires real requests and measures min/avg/median/p95/p99/max
- Broadcast: added per-event rate limiting in addition to the existing global limit
- Bridge: added
bridge.BindOncefor single-fire internal listeners - Query string parsing added to Router |
req.query.pageetc.
v2.0 | Full Rewrite breaking
Complete redesign | HTTP semantics, TypeCoercer, Stream, Codec, Bridge
- breaking All v1 APIs removed | v2 is a ground-up redesign
- App: HTTP-style routing with GET/POST/PUT/DELETE, middleware, status codes
- Network: client-side request with callback and query support
- Listener: client-side event subscription with
On,Once,Off,Clear - Broadcast: unreliable UnreliableRemoteEvent channel with rate limiting
- Bridge: internal server-side event bus for module decoupling
- Stream: FPS position channel (later replaced in v2.3)
- Codec: LZ77 compression for route-level opt-in
- Router: named and typed route params, wildcard segments
- TokenBucket: per-player token bucket rate limiter
- TypeCoercer: serialize/deserialize Roblox types to string
v1.6
Last v1 release | simple RemoteEvent wrapper
- Single RemoteEvent with string-keyed event handlers
- Per-player rate limiting (basic, no token model)
- No compression, no routing, no push
- Maintained for backward compat while v2 was developed
See also
Roadmap | what's coming in v2.3+ · Migration Guide | v1 → v2 upgrade steps · GitHub | full commit history