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.

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 compatible — see Softcode 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 ##/#@
$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 Phase 1 ships a full TinyMUX 2.x compatible softcode evaluator alongside the TypeScript sandbox. In-game object attributes can be written in MUX softcode; all system scripts remain in TypeScript.

How it works

  • TypeScript/JS attributes (default) — executed in the existing Deno Web Worker sandbox.
  • Softcode attributes — executed in a dedicated softcode Deno Worker with a 100ms wall-clock timeout.

To mark an attribute as softcode when setting it with &:

&GREET/softcode me=[name(%#)] greets you!

The /softcode flag persists on the attribute and routes all future evaluations through the softcode engine. Omitting the flag uses the TypeScript sandbox as before. Attributes that contain MUX substitution syntax (%N, [func()]) and no TypeScript keywords are also auto-detected as 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

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).