Version History
TinyMUX has been in active development since 2000. Each release brought new features, bug fixes, and performance improvements. The changelogs below document the evolution of the server across every major version.
Changelogs by Version
| Version | Date | Status | Changelog |
|---|---|---|---|
| TinyMUX 2.14 | April 2026 | ALPHA | See below |
| TinyMUX 2.13 | March 2025 | BETA | |
| TinyMUX 2.10 | May 2012 | Released | CHANGES |
| TinyMUX 2.9 | July 2012 | Released | CHANGES |
| TinyMUX 2.7 | December 2009 | Released | CHANGES |
| TinyMUX 2.6 | April 2010 | Released | CHANGES |
| TinyMUX 2.4 | January 2007 | Released | CHANGES |
| TinyMUX 2.3 | December 2005 | Released | CHANGES |
| TinyMUX 2.2 | December 2004 | Released | CHANGES |
| TinyMUX 2.1 | December 2003 | Released | CHANGES |
| TinyMUX 2.0 | December 2002 | Released | CHANGES |
TinyMUX 2.14 ALPHA — Highlights
TinyMUX 2.14 is a ground-up overhaul of the server’s internals while maintaining full softcode compatibility. The major changes fall into several categories:
Architecture
- Three-process architecture: The server is split into
libmux.so(core types),engine.so(game engine loaded as a COM module), andnetmux(network driver). The engine communicates with the driver through COM interfaces — the foundation for future process isolation. - SQLite storage backend: All object metadata, attributes, comsys channels, and @mail are stored in a single SQLite database with write-through on every mutation.
@dumpperforms a WAL checkpoint only — no flatfile serialization, no fork. Crash durability is immediate. - GANL networking: Event-driven architecture using epoll (Linux), kqueue (BSD), and IOCP (Windows) replaces the legacy select-based I/O.
- SSL always enabled: OpenSSL on Unix, Schannel on Windows. Non-blocking SSL sockets.
- LBUF_SIZE increased: From 8,000 to 32,768 characters with pool-backed RAII.
JIT Compiler
- AST-based expression evaluator: Expressions are tokenized by a Ragel-generated scanner, parsed into an AST, and cached in an LRU cache. The classic character-by-character parser has been replaced.
- JIT compilation pipeline: AST → HIR → SSA → optimize → RV64 codegen → dynamic binary translation to native code.
- Multi-platform DBT backends: x86-64 SysV (Linux/FreeBSD/macOS), x86-64 Win64 (JIT now enabled on Windows), and AArch64 AAPCS64 (ARM64).
- Compile-time constant folding for 35+ functions with semantics matched by construction.
- Peephole optimization: Redundant load-after-store elimination, identity arithmetic removal, dead-code cleanup.
- Superblock optimization: Merge straight-line basic blocks across unconditional edges.
- Re-entrant JIT execution via shared heap DBT for inner expressions (e.g.,
u()bodies).
Lua Scripting
- Embedded Lua 5.4 with sandboxed execution, bytecode cache, and
mux.*bridge API. @luacommand for server-side scripting.lua()andluacall()softcode functions.- Lua JIT compiler: Lua bytecode compiled through the same HIR/SSA/DBT pipeline. 83 opcodes supported.
- Back-edge iteration budget prevents infinite loops from consuming unbounded CPU.
Routing System
- Room-to-room routing engine with four phases:
- Static routes: Unconditional next-hop tables built by
@route/set. Query viaroute()androutepath(). - Zone routing: Per-zone tables with cross-zone gateway selection via meta-table.
- Lock-validated routing: Exit locks checked at query time; locked paths excluded.
- NPC movement:
@walkmoves objects along computed routes;@patrolcycles through waypoints.
- Static routes: Unconditional next-hop tables built by
Protocols
- MSSP (Mud Server Status Protocol, telnet option 70): Structured key-value data for MU* directory crawlers.
- GMCP (Generic MUD Communication Protocol, telnet option 201): Full negotiation, inbound packets fire
A_GMCPattribute,gmcp()function sends frames. - WebSocket (RFC 6455): Same-port auto-detection with
wss://support via deferred protocol detection. - Connection logging: SQLite
connlogtable withconnlog()andaddrlog()query functions.
Unicode
- Updated from Unicode 10.0 to Unicode 16.0.
- All attribute values NFC-normalized at storage time.
- String functions use grapheme cluster indexing (UAX #29) instead of codepoint counting.
- Unicode collation (UCA/DUCET) is the default sort order.
- CJK width-aware
center(),ljust(),rjust(),columns(). - New
graphemes(),strsort(),strunique(),strunion(),strdiff(),strinter()functions operate at the grapheme cluster level.
New Commands
@cron/@crondel/@crontab— scheduled attribute triggers with Unix cron syntax.@protect— player name reservation system.@include— include attribute contents in the command stream.@chatformat— per-player channel message formatting.@route/@walk/@patrol— routing and NPC movement.@lua— Lua scripting.
New Functions (50+)
Highlights from the new function additions:
- Routing:
route(),routepath() - JSON:
isjson(),json(),json_query(),json_mod() - Crypto:
encode64(),decode64(),hmac() - Lua:
lua(),luacall() - Protocol:
gmcp(),connlog(),addrlog() - String:
graphemes(),strsort(),strunique(),strunion(),strdiff(),strinter(),strdistance(),printf(),tr()(upgraded to grapheme clusters) - List:
butlast(),zip(),lxor(),lband(),lbor(),lbxor(),limath(),sortkey(),unique(),linsert(),lreplace(),lrest(),lmath() - Positional:
posn(),wordstart(),wordend() - Statistics:
mean(),median(),stddev() - Control:
letq(),unsetq(),listq(),firstof(),allof(),switchall(),caseall(),sandbox() - Channel:
cbuffer(),cdesc(),cflags(),cmsgs(),cowner(),crecall(),cstatus(),cusers(),cmogrifier() - Zone:
zchildren(),zexits(),zrooms(),zthings() - Benchmarking:
benchmark(),asteval(),astbench(),jitstats() - PennMUSH/RhostMUSH adopted:
bound(),between(),garble(),caplist(),moon(),soundex(),soundlike(),while(),wrapcolumns(), and more.
Other Notable Changes
- PCRE2 replaces PCRE for regular expressions with JIT compilation and better Unicode support.
- PCG-XSL-RR-128/64 replaces Mersenne Twister as the PRNG. Seeded from
/dev/urandom. @searchfor simple cases routes to indexed SQL queries — O(log n) instead of linear scan.have_comsysandhave_mailerconfig options removed — always present.MEMORY_BASEDbuild option removed — SQLite is the only storage backend.- ALONE and TALKMODE flags added.
link_anywherepower added.#lambdaanonymous inline attributes for filter/map operations.safer_iterconfig option for games using##in attribute contents.- Channel mogrifiers for per-channel message transformation.
- 917 smoke tests (up from 733).
Other Historical Documents
- BETA — Cautions and procedures during the 2.4 beta period
- UTF-8 Machinery — An early illustration of TinyMUX’s Unicode state machine table generation (PDF)
Tributes
Read the tributes page for acknowledgments of the people who shaped TinyMUX’s early development.