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.player and req.raw hold the old first and second args
  • Detection via debug.info parameter 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, UDim2 support
v2.2.3 | Issue #6 Fix
Listener race condition on rapid successive events patched
  • Fixed: listener:Once could 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, GrantAll for rewarding active players after round events
  • Router: typed params now support =boolean and =string in 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.BindOnce for single-fire internal listeners
  • Query string parsing added to Router | req.query.page etc.
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