TinyMUX

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

VersionDateStatusChangelog
TinyMUX 2.14April 2026ALPHASee below
TinyMUX 2.13March 2025BETA
TinyMUX 2.10May 2012ReleasedCHANGES
TinyMUX 2.9July 2012ReleasedCHANGES
TinyMUX 2.7December 2009ReleasedCHANGES
TinyMUX 2.6April 2010ReleasedCHANGES
TinyMUX 2.4January 2007ReleasedCHANGES
TinyMUX 2.3December 2005ReleasedCHANGES
TinyMUX 2.2December 2004ReleasedCHANGES
TinyMUX 2.1December 2003ReleasedCHANGES
TinyMUX 2.0December 2002ReleasedCHANGES

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), and netmux (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. @dump performs 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.
  • @lua command for server-side scripting.
  • lua() and luacall() 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:
    1. Static routes: Unconditional next-hop tables built by @route/set. Query via route() and routepath().
    2. Zone routing: Per-zone tables with cross-zone gateway selection via meta-table.
    3. Lock-validated routing: Exit locks checked at query time; locked paths excluded.
    4. NPC movement: @walk moves objects along computed routes; @patrol cycles through waypoints.

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_GMCP attribute, gmcp() function sends frames.
  • WebSocket (RFC 6455): Same-port auto-detection with wss:// support via deferred protocol detection.
  • Connection logging: SQLite connlog table with connlog() and addrlog() 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.
  • @search for simple cases routes to indexed SQL queries — O(log n) instead of linear scan.
  • have_comsys and have_mailer config options removed — always present.
  • MEMORY_BASED build option removed — SQLite is the only storage backend.
  • ALONE and TALKMODE flags added.
  • link_anywhere power added.
  • #lambda anonymous inline attributes for filter/map operations.
  • safer_iter config 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.