MUSH Compatibility

UrsaMU is not a drop-in replacement for PennMUSH, TinyMUSH, or MUX2. It is a fresh platform with a different architecture — WebSocket-native, TypeScript, sandboxed scripts instead of MUSHcode.

If you are migrating from a traditional MUSH or hosting your first server, this page tells you exactly what works today and what is planned.

Updated for v2.6.0.


What Works Today

Feature Status Notes
connect <name> <password> ✅ Working Standard login command
create <name> <password> ✅ Working Character creation
look / l ✅ Working Room and object descriptions
Auto-look on connect ✅ Working Fires automatically after login
say / " ✅ Working Room speech
pose / : ✅ Working Emotes
page <player>=<msg> ✅ Working Private messages
who ✅ Working Online player list
score ✅ Working Character stats
inventory / inv ✅ Working Carried objects
get / drop / give ✅ Working Object interaction
home ✅ Working Return to home location
teleport ✅ Working Admin/wizard teleport
examine ✅ Working Full object inspection
@desc / @name ✅ Working Object descriptions and naming
@dig ✅ Working Create rooms
@open / @link / @unlink ✅ Working Exit management
@create ✅ Working Create objects
@destroy / @clone ✅ Working Object lifecycle
@lock / @set ✅ Working Flags and locks
@parent ✅ Working Object inheritance
@boot / @toad ✅ Working Admin user management
@newpassword ✅ Working Password reset
@chown ✅ Working Ownership transfer
@channel/list/join/leave ✅ Working Channel system
@chancreate / @chandestroy / @chanset ✅ Working Channel admin
@reboot / @shutdown ✅ Working Server control (admin+)
@moniker ✅ Working Color-coded display names (admin+)
Connection banner ✅ Working text/default_connect.txt shown pre-auth
Broadcast on connect/disconnect ✅ Working Room sees join/leave messages
Exit movement (type exit name) ✅ Working Standard directional movement
Help system ✅ Working help [<topic>]
Discord bridge ✅ Working Relay in-game chat to Discord
Scene tracking & export ✅ Working REST API, Markdown or JSON output
@emit / @pemit / @remit ✅ Working Staff broadcast commands
MOTD (@motd, @motd/set) ✅ Working Displayed automatically on login
Login notifications ✅ Working Unread mail + new bboard posts on connect
Connection history ✅ Working Last login time and failed attempt count
Bulletin board (@bblist, @bbread, @bbpost) ✅ Working Full bboard system with unread tracking
@quota ✅ Working View and set object quota
@find ✅ Working Search objects by name, flag, or type
@stats ✅ Working Server uptime and object counts
@trigger <obj>/<attr> ✅ Working Fire stored attributes as scripts
@wipe <obj> ✅ Working Clear all user-set attributes
@Aconnect / @Adisconnect ✅ Working &ACONNECT / &ADISCONNECT attributes fire on login/logout
MUX softcode evaluator ✅ Working TinyMUX 2.x — full how-to in the Softcode Guide; tables below
@tag / @ltag ✅ Working Global and personal named-object registry (RhostMUSH-style)
@switch ✅ Working Eval value as softcode, compare cases, execute matching action
@dolist ✅ Working Iterate a softcode list, execute action per item with ##/#@
@if <expr>=<true>[,<false>] ✅ Working Conditional action command
@while <expr>=<action> ✅ Working Loop while expression is true (100ms timeout enforced)
@break ✅ Working Exit current @dolist or @while
@wait <seconds>=<action> ✅ Working Delay an action
@function <name>=<obj>/<attr> ✅ Working Define a global softcode user function
@cpattr / @mvattr ✅ Working Copy / move attributes between objects
@grep <obj>=<pattern> ✅ Working Search object attributes by name pattern
@decompile <obj> ✅ Working Dump object as copyable @name/&ATTR lines
@ps ✅ Working List pending @wait jobs
@drain <obj> ✅ Working Cancel all pending @wait jobs on an object
@notify <obj>[/<sem>][=<count>] ✅ Working Signal a semaphore
Zone system (@zone) ✅ Working Assign objects to a zone master for shared $-pattern routing
$pattern attrs ✅ Working Objects respond to player input via $<glob>:<action> attributes; captures map to %0%9
^pattern attrs (MONITOR) ✅ Working MONITOR-flagged objects listen to room speech/poses via ^<glob> attributes; captures map to %0%9

MUX Softcode Support

UrsaMU ships a TinyMUX 2.x compatible softcode evaluator
alongside the TypeScript sandbox. Builders: start with
the Softcode Guide (how-to, examples,
$/^, UDFs). This section is the parity inventory.

How it works

  • TypeScript/JS attributes (default) — Deno Web Worker
    sandbox. See Attribute Scripts.
  • Softcode attributes — dedicated softcode worker, 100ms
    wall-clock timeout.
&GREET/softcode me=[name(%#)] greets you!

The /softcode flag persists and routes eval through the
softcode engine. Omitting it uses TypeScript unless the
value is auto-detected as MUX softcode.

Supported functions (~250 total)

Category Functions
Math add, sub, mul, div, mod, abs, floor, ceil, round, power, sqrt, exp, sin, cos, tan, rand, max, min, isnum, isint, eq, gt, lt, gte, lte, band, bor, bxor, shl, shr, dist2d, dist3d, vadd, vsub, vmul, vmag, vunit, vcross, vdot, …
String strlen, upcase, lowcase, capstr, trim, squish, left, right, mid, ljust, rjust, center, before, after, index, pos, lpos, edit, reverse, space, repeat, chr, ord, cat, strcat, strmatch, comp, alpha, regex, regmatch, regrab, regraball, wrap, columns, ansi, stripansi, sha1, spellnumber, itemize, …
List words, word, first, rest, last, extract, elements, member, lnum, ldelete, insert, replace, remove, revwords, shuffle, splice, grab, graball, match, matchall, pickrand, setunion, setinter, setdiff, sort, sortby, ladd, lmin, lmax, iter, parse, map, filter, filterbool, fold, foreach, munge, step, mix, distribute, merge, table, …
Logic t, not, and, or, xor, cand, cor, andflags, orflags, if, ifelse, switch, case, null, lit, @@, …
Object name, fullname, dbref, num, type, hastype, hasflag, flags, lflags, setflag, unflag, loc, where, room, home, contents, lcon, lexits, lwho, lplayers, match, pmatch, nearby, u, ulocal, get, default, xget, attr, lattr, hasattr, v, conn, connlast, connnum, idle, doing, host, ip, money, mudname, version, conntotal, …
Register setq, setr, r, localize
Output pemit, remit, oemit, cemit, emit, npemit, trigger
Tags tag, istag, listtags, tagmatch, ltag, isltag, listltags, ltagmatch

Substitutions

All standard TinyMUX substitutions are supported: %# (enactor dbref), %! (executor dbref), %@ (caller), %N/%n (name), %L (location), %s/%S/%o/%O/%p/%P/%a (pronouns), %0%9 (args), %q0%qz (registers), ## / #@ (iter variables), %VA%VZ (object attributes), %r (newline), %t (tab), %b (space), %% (literal %), full ANSI color codes (%ch, %cr, %cg, %cb, %cy, %cw, %cc, %cn, %xN truecolor).

TinyMUX compatibility stubs

Function Behavior
sql() Returns #-1 FUNCTION DISABLED
rxlevel() / txlevel() Returns 0
beep() Returns ""
height() / width() Returns 24 / 78
colordepth() Returns 256
textfile() / text() Returns ""

@tag / @ltag — Named Object Registry

UrsaMU ships a RhostMUSH-style named object registry. Instead of remembering dbrefs, you can assign human-readable names to objects.

@tag (global, wizard-only)

@tag citygate=here          Register current room as "citygate"
@tag vault=#142             Register #142 as "vault"
@tag                        (no args) list all tags
@tag/remove citygate        Remove the "citygate" global tag

Global tags are visible to everyone. Only wizards and admins may create or remove them. When a tagged object is destroyed, its tags are automatically removed.

@ltag (personal, any player)

@ltag home=here             Register current room as your "home"
@ltag/list                  List all your personal tags
@ltag/remove home           Remove your personal "home" tag

Personal tags are scoped to your character (max 50). They are visible only in your own softcode evaluations.

Softcode usage

[tag(citygate)]             → dbref of the citygate room
[istag(vault)]              → 1 if "vault" global tag exists
[tagmatch(here,citygate)]   → 1 if here is tagged "citygate"
[ltag(home)]                → dbref of your personal "home" tag
[name(#citygate)]           → name of the citygate object (shorthand)

The #tagname shorthand works anywhere an object reference is accepted in softcode (personal tags shadow global ones).


What’s Different from Traditional MUSH

Traditional MUSH UrsaMU
MUSHcode scripting only TypeScript/JS sandbox and MUX softcode — both supported
Telnet primary WebSocket primary (Telnet sidecar available)
All attributes run softcode &ATTR/softcode opts in; default is TypeScript sandbox
@tr / @trigger @trigger <obj>/<attr> command + u.trigger() SDK method
@pemit / @remit @pemit and @remit — both implemented
No named-object registry @tag / @ltag provide global and personal registries
Lock ops & / | only && / || / ! with parens, plus legacy &/| (v2.2.0)
Hard-coded format attrs 8-slot format pipeline: register TS handlers or raw softcode templates (v2.3.0+)

Format-Attribute Pipeline

Eight engine-known format slots route through both softcode attributes on the
object and plugin-registered handlers (priority: softcode attr → plugin handler
→ fallback):

NAMEFORMAT, DESCFORMAT, CONFORMAT, EXITFORMAT, WHOFORMAT,
WHOROWFORMAT, PSFORMAT, PSROWFORMAT.

Plugins may also register arbitrary uppercase slot names (e.g. MAILFORMAT,
BBROWFORMAT) — FormatSlot is an open union as of v2.3.4.

// TS handler
registerFormatHandler("WHOROWFORMAT", (ctx) => `${ctx.name} - idle ${ctx.idle}`);

// Softcode template (v2.4.0)
registerFormatTemplate("WHOFORMAT", "[center(===,78,=)]%r[u(#1/HEADER)]");

Lock Expressions (v2.2.0+)

Locks support &&, ||, ! with () grouping plus the legacy &/|
operators. Built-in lockfuncs: flag(name), attr(name[, val]), type(name),
is(#id), holds(#id), perm(level). Custom lockfuncs register via
registerLockFunc(name, fn).

lock: "connected && (flag(wizard) || attr(tribe, glasswalker))"

Planned Enhancements

Feature Notes
Terminal/screen settings Width detection via Telnet NAWS, persistent pager settings

Connecting with a Traditional MU* Client

UrsaMU’s Telnet sidecar makes it compatible with any standard MU* client:

Client Platform Connection
Mudlet Windows / Mac / Linux Host + port (default 4201)
MUSHclient Windows Host + port (default 4201)
Potato Windows / Mac / Linux Host + port (default 4201)
SimpleMU Windows Host + port (default 4201)
Any terminal Any telnet <host> 4201

WebSocket-capable clients can connect directly to port 4202 (or 4203 for HTTP/WS).