Mudlet A cross-platform, open source, and super fast MUD client with scripting in Lua

Mudlet is a quality MUD client, designed to take mudding to a new level.

It’s a new breed of a client on the MUD scene – with an intuitive user interface, a specially designed scripting framework, and a very fast text display. Add to that cross-platform capability, an open-source development model, and you have a very likable MUD client.


Latest news

Mudlet 3.0 final is here!

March 24th, 2017

So long 2.1, 3.0 delta!

Mudlet 3.0 is the culmination of 4 years of hard work and replaces Mudlet 2.1 as the latest version of Mudlet: it’s the recommended upgrade if you’re on 2.1 or any of the 3.0 previews (3.0.0-delta, 3.0.0-epsilon).

This release adds many new features to 2.1 and fixes a lot of the issues that have been present in preview versions of 3.0 – big thanks to everyone involved!

Big features

There has been a ton of improvements in Mudlet, so included below a quick summary of the big features.

Variables view

You can now view and edit your Lua variables from within Mudlet! No longer are they things that are just “there”.

Additionally, you can now get Mudlet to save your variables by ticking them in the list.

Windows sound fixes

Mudlet can now play sound again on Windows!

HTTPS downloads

Mudlet can now download over https:// links! This means that Mudlet packages can now be installed and/or self-updated from secure websites like Github.

As a bonus tip, if you’re a package author, check this out for an easy way to install your package.

Double-click word selection

You can now double-click in the main window or a miniconsole to select a word:

You’ve also got the option of choosing what characters will the selection stop on – in case you don’t want to select quotes and such.

Mudlet is now skinnable

You can create and apply skins to Mudlet!

Check this out for a demo you can try yourself.

Mapper API improvements

A lot of work went into the mapper. Mudlet can now perform automatic quality checks on your map, a lot of the right-click windows in the mapper have been improved, custom exit lines creation has been streamlined, and pathfinding performance across large maps and distances has been improved. For coders, a lot of new functionality has been introduced – check out the API changelog.

Script loss issues

Development preview versions of Mudlet have had issues where they’d lose your scripts – this is no more and all such problems have been ironed out in the 3.0 final.

A ton of db: fixes

Mudlet’s database interface has received a lot of attention and improvements, with a lot of functions getting fixes to work – work better, faster, stronger. If you’ve got a patched copy of the db: interface in your scripts, try running them without the local fixes so you can enjoy the new functionality.

macOS improvements

A lot of improvements have gone into the macOS version of Mudlet: the toolbar no longer goes black when you open the mapper, Mudlet no longer randomly resizes, tab completion works, and the new installer is really good-looking:

MSDP support

Mudlet now includes native support for MSDP! Protocol description available here, and as always, Mudlet allows you to add support for your own subchannel protocol.

Miscellaneous improvements

Below is a highlight of some other improvements over 2.1:

  • GMCP data overflow on IRE MUDs fixed
  • Mudlet now detects infinite loops in aliases between the pattern and the substitution field
  • Strike-out text support has been added
  • nil and boolean can now be used with raiseEvent()
  • Geyser now supports flyout labels. You can build menus using them in a manner similar to insertPopup().
  • Buttons creation has been fixed

See here for the list of API changes.

Work that went into 3.0

Mudlet is an open project: anyone can contribute to the community, wiki, or even Mudlet’s code. Release 3.0 was 4 years in making: 650+ commits, 18 authors, thousands of users (65,000 downloads on 2.1 alone).

Mudlet is a much different project compared to 2.1. Internally, we’ve upgraded from Qt4 to Qt5, all development is done on Github, modern C++11 is in use, and quite importantly, a very streamlined development workflow. Sounds interesting? Join us!

Looking forward

Mudlet 1.0 was about getting a super-fast, open-source and free client for Windows, macOS and Linux. Mudlet 2.0 was about getting that client an awesome 2D and 3D mapper. Mudlet 3.0 is a culmination of efforts of improvements to all around functionality of the client.

Mudlet 4.0 will be about taking on the world and making Mudlet international. We aim to make Mudlet enjoyed by MUD players all around the world  – everywhere from Spanish to Chinese MUDs.


This project would not be possible without the passion and free time contributed by many of individuals. We owe big thanks to:

Ahmed Charles
Chris Mitchell
Stephen Lyons
Christer Oscarsson
Colton Rasbury
Damian Monogue
Eric Wallace
Florian Scheel
Heiko Koehn
Ian Adkins
Michael Hupp
Owen Davison
Vadim Peretokin


And, one last thing, Mudlet now has a Discord server! Join up.

Posted in Uncategorized | 2 Comments »

Mudlet 3.0 API changelog

March 24th, 2017

There have been over 100 improvements to the Mudlet’s API in the 3.0 release. Check out te list below:

  • added: addCustomLine() to programatically draw a custom line in the mapper
  • added: getAllRoomEntrances() which returns rooms that have exits to the given room
  • added: getAreaExits() to return the exits leading out of a particular area
  • added: getCustomLines() to return data on all the custom lines attached to a room
  • added: getExitStubs1() which starts indexing from 1, in addition to getExitStubs() which starts at 0
  • added: getModulePath() to return the module’s location that it’s loaded/saved from on your computer
  • added: getModulePriority() to return the module’s loading priority which determines the module loading order
  • added: Geyser.Label:clear() to clear the label
  • added: Geyser.Miniconsole:clear() to clear the miniconsole
  • added: Geyser.MiniConsole:resetFormat()
  • added: installModule() to install a module
  • added: map auditing to detect any errors in maps (autocorrects any errors that it can)
  • added: native MSDP support! Mudlet has an open architecture so you can also add support for your own protocol via
  • added: openWebPage() to open a webpage in the browser
  • added: option to display whitespace or tabs in the editor
  • added: reloadModule() to uninstall and reinstall a module at once
  • added: searchAreaUserData(), setAreaUserData(), clearAreaUserData(), clearAreaUserDataItem(), getAreaUserData(), getAllAreaUserData(), setMapUserData(), clearMapUserData(), clearMapUserDataItem(), getMapUserData(), getAllMapUserData() to store user data at the map and area level, in addition to the existing room-level commands
  • added: setAppStyleSheet() to allow you theming of Mudlet
  • added: setStrikeOut() to strike out text
  • added: shms() to convert seconds into hours, minutes, and seconds
  • added: status bar display for the main display
  • added: stopSounds() to stop all currently playing sounds
  • added: sysProtocolEnabled Mudlet event that is raised when MSDP, MXP, ATCP, GMCP or Channel 102 is enabled
  • added: sysProtocolDisabled Mudlet event that is raised when MSDP, MXP, ATCP, GMCP or Channel 102 is disabled
  • added: table.deepcopy() to make a copy of a table
  • added: uninstallModule() to uninstall a module
  • added: getMudletVersion() to check Mudlet’s version. Prefer to check if a function exists over checking the version wherever possible as a good practice
  • added: you can now use the keyboard up/down/left/right buttons to navigate the trigger/alias/etc editor
  • fixed: added missing icon from replay toolbar
  • fixed: cecho/decho/hecho not allowing <text inside pointy brackets>
  • fixed: colour triggers can now fire on cyan/light grey
  • fixed: db: now reports times in the local timezone instead of UTC
  • fixed: db: setting _unique property to actually take effect
  • fixed: db:close() now allows re-opening the database again
  • fixed: db:create can now create sheets without the unique index
  • fixed: db:eq() now escapes field names when querying the database
  • fixed: db:fetch() sort operator is now applied to all fields
  • fixed: db:set() to work
  • fixed: disabling/re-enabling MCCP from the game no longer breaks output
  • fixed: downloadFile() now supports https:// URLs
  • fixed: duplicate .xml files if you specify an existing file to use when exporting profiles or triggers
  • fixed: duplicate area names in the mapper are no longer allowed
  • fixed: errors window will no longer show errors about WindowResizeEvent at startup
  • fixed: exportAreaImage() now draws doors as well
  • fixed: getExitStubs() to return correctly if no exit stubs are defined
  • fixed: Geyser clickCallback passes all arguments to function, rather than only the first
  • fixed: geyser flash() callback fixed
  • fixed: Geyser.MiniConsole:setBold(), Geyser.MiniConsole:setUnderline(), Geyser.MiniConsole:setItalics() toggles to work
  • fixed: Geyser.MiniConsole:setFontSize changing fontSize of other miniconsoles
  • fixed: insertText() crashing when containing newlines (“\n”) and used outside of triggers
  • fixed: io.exists() can now detect if folders exist on Windows
  • fixed: minimised alias/trigger/etc editor wouldn’t come back if you pressed on Aliases/Triggers/etc buttons
  • fixed: Mudlet randomly resizing on OSX
  • fixed: new rooms default to area -1 in the mapper
  • fixed: permanent triggers that get added from a package/module import no longer end up behind in execution order after existing temp triggers
  • fixed: regex compilation errors in triggers and aliases are now reported correctly
  • fixed: script editor losing your scripts
  • fixed: setExitStub() to allow in/out exits
  • fixed: setExitWeight() won’t accept invalid exits anymore
  • fixed: some profile icons in the connection dialog no longer have a black background
  • fixed: spawn() to read more than the first line of the output
  • fixed: tempLineTrigger() crashing under very specifc conditions
  • fixed: typos in item activation/deactivation messages in the trigger/alias/etc editor
  • fixed: uninstalling scripts now also unregisters the event handlers they had
  • fixed: xterm256 colours not showing up properly
  • fixed: you can now pass numbers bigger than 999999 through Mudlets event system
  • fixed: sound not working in 3.0 previews
  • improved: 2D map selection now has the info label dynamically move out of the way as needed
  • improved: changing areas in the area selection mapper dropdown now centers on the area
  • improved: copying maps across to other profiles automatically reloads the map
  • improved: createGauge() can now specify the gauge orientation
  • improved: createMiniConsole() can now be called multiple times to change the layout of a miniconsole
  • improved: createRoomID() can now take a starting roomID
  • improved: db:add() to return a positive result on completion or nil and the error message on fail
  • improved: db:aggregate() now allows filtering by distinct values
  • improved: db:query_by_example() can now be used with all functions as the query
  • improved: display({}) outputs {} and not {\n}
  • improved: drawing custom exit lines is now more intuitive
  • improved: echo() now uses the current foreground/background colours of the cursor
  • improved: exits interface for the mapper reorganised and has its own icon
  • improved: fg(), bg() accepts “main” parameter and report wrong color names used
  • improved: game profile tabs in the main window are now re-orderable
  • improved: getColumnNumber() can now return the column number for a miniconsole as well
  • improved: getLineNumber() can now return the line number for a miniconsole as well
  • improved: map can now store players position (requires map format 18)
  • improved: map loading speed
  • improved: much faster initial Mudlet loading
  • improved: mudlet.exe now has an icon on Windows and in the Control Panel
  • improved: raiseEvent() now takes boolean and nil arguments
  • improved: replace() can now have a 3rd argument to keep the colour
  • improved: room deletion in the mapper is much quicker
  • improved: room/area deletion speed in mapper
  • improved: searchRoom(), getRoomName(), setRoomName() can now work with non-Latin characters. This is leading up to upcoming work to make Mudlet i18n friendly
  • improved: setExitWeight(), addCustomLine(), setExitStub(), connectExitStub(), lockExit(), hasExitLock(), setExit() can now take shorthand “n”, longhand “north” and numeric 1 arguments for specifying the exit
  • improved: setGaugeText() now works with my text here to align the text
  • improved: showColors() colors are clickable, added showColors(columns), showColors(filterColor), showColors(columns, filterColor) options
  • improved: table.contains() won’t error if passed nil for the table argument
  • improved: various mapper functions now find rooms faster
  • improved: word wrapping now gets rids of leading spaces on wrapped lines
  • improved: you can now double-click on words in the main window and miniconsoles to highlight them (also: you can configure what it should stop selecting on)

Posted in Uncategorized | 1 Comment »

Mudlet 3.0.0 kappa! (preview #7)

March 16th, 2017

The last 3.0 preview is available now! This preview focused extensively on fixes, covering off a lot of the issues that were present in epsilon and iota – if you’ve been using 3.0.0-delta preview for a long while, this is the preview you want to have a look at.

Should no major issues be discovered, Mudlet 3.0 will be released on March 24, 2017!

iota profile crash fixed

The previous iota preview for Windows did not have the right libraries for accessing db: from Lua, causing profiles that use databases to crash. This has been fixed and all profiles will load correctly now as they did before.

New default MUD: Midnight Sun 2

MUDs that get onto Mudlet’s default profiles list are ones that either contribute to the open Mudlet project, or those that go the extra mile to add a great gaming experience for their players on Mudlet. Midnight Sun 2 is one such game – check out their Mudlet integration here.

macOS fixes

Black toolbar

An issue specific to 3.0 previews of Mudlet – opening the mapper would cause the toolbar to go black or have other sorts of graphical corruption. This has been fixed!



Slow resizing

3.0 previews were also pretty slow when resizing on macOS the window with graphics in it – performance has been improved a fair bit to the point where it’s acceptable.

No background in installer

The awesome background in the macOS installer is back after taking a vacation in the last few previews.

Alias/Trigger/etc export

Exporting items from Mudlet will no longer add two .xml.xml suffixes on macOS if you select an existing xml file to overwrite, and will properly overwrite it as you intend.

Zips / nested folders in packages fixed

Package loading behaviour has been fixed, you’ll find that packages that loaded in 2.1 but no longer in 3.0 previews will work again. This means that automatic graphics installation on games such as GodWars 2 and Midnight Sun 2 will work again as well.

WoTMUD URL fixed

The game URL for the default WotMUD profile has been fixed and you are able to connect to it without adjusting it.

Lua db: fixes

A few more improvements have made their way to the Lua database layer that’s provided with Mudlet. If you have a patched copy of it in your scripts, this is the release to see if you still require those fixes – and if you do, let us know!

New function: ansi2decho()

A new function, ansi2decho(), allows you to transform raw colour-encoded ANSI to the decho function. See examples here.

Default scripts updated

The IRE mapping script and 3k mapper scripts that come with Mudlet updated have been updated – all new profiles created will load a far more recent version of the scripts than before. An honourable mention goes to the Generic Mapper Script, which you’ll find useful if you need to setup Mudlet’s mapper to work on a non-IRE or 3k MUD.

setExitStub() fixed

The setExitStub() function has been fixed to allow for in/out exit stubs.

Linux installer

The Linux installer is no more – mostly since it didn’t actually work all that well. Instead, in addition to PPA’s on Ubuntu, Mudlet now provides an AppImage – a portable, stand-alone version of Mudlet that you can just download and run on many Linux distributions. This is our first time using it so we’d love to hear your feedback on this.

Windows installer improved

The Windows installer has been improved: the .exe now has an icon, and icons for Mudlet show up in the Control Panel and on the Start Menu. Additionally, options for creating shortcuts in the Start Menu and on the Desktop are now present.

Minimised script editor fixes

If you minimised the alias/trigger/script editor, pressing on the Mudlet buttons to open it again wouldn’t do anything – you’d have to open the window from your task bar. This has been fixed: if you minimise the trigger window for example, you can press the triggers button again and the window will come up.

regex errors are now correctly reported

Regex errors in triggers and aliases are now reported as they should – previously, you could see a blank error message or the old message. No more!

mccp toggling works

Disabling and re-enabling MCCP compression now works correctly and won’t corrupt the output anymore.


Mudlet is an open project and it would not be possible to keep going year after year without so many contributions. Big thanks to Darksix, dicene, Erik Pettis, Jor’Mox, keneanung, Nyyrazzilyss, Rockhound, Stephen Lyons, and everyone else who helped to make it happen!

That’s it for this 3.0.0-kappa preview! We’re inching closer to the 3.0 final release, with the release date currently set at March 24th, 2017.

Discord community

And, one last thing, Mudlet now has a Discord server! Join up.

Posted in Uncategorized | Comments Off on Mudlet 3.0.0 kappa! (preview #7)

Mudlet 3.0.0 iota! (preview #6)

November 15th, 2016

Hey everyone!

Another 3.0 preview is available today. We’ve made a few minor improvements to the client, but most importantly, this release fixes a crashing bug introduced with epsilon.

Fixed profile creation

Creating a profile on Mudlet 3.0.0-epsilon would crash the client – no longer. This has been fixed and you can create new profiles fine now.

Default MUD listings change

Midkemia Online was removed from the list of default profiles, as it has been shut down. The Wheel of Time MUD (, a MUD played by one of our contributors, has taken its place.

Along with the listing change, the connection dialog has been fixed back not to duplicate the profile name under the profile icon, which has the name already.



getRoomUserData() behaviour restored

getRoomUserData()‘s behaviour of returning an empty string, “”, when no room user data is available was inadvertently changed to return nil+error message instead in epsilon. This can break compatibility with existing Mudlet scripts, which is something we care a lot about. The function has been fixed to return “” as it did before, and if you’d like it to return nil+error message, you can now use a third boolean argument to the function to specify the behaviour.

That’s it for this 3.0 preview! We’re inching closer to the 3.0 final release, with just a few bugs ( introduced since 2.1 left to fix.

Posted in Uncategorized | Comments Off on Mudlet 3.0.0 iota! (preview #6)

Mudlet 3.0.0 epsilon! (preview #5)

October 15th, 2016

Hey everyone!

It’s been a while since the last Mudlet update, but here we are again! It’s great to see that many people still value a free, open-source, and cross-platform desktop client and continue to make it their choice for playing MUDs to this day.

As we’re getting into making releases again, please forgive us if this one is a little rusty. The idea of this release is to get back to a regular schedule and get closer to the 3.0 Mudlet final.

Since the last delta release, a lot of work has gone into improving the mapper, with our contributor Stephen Lyons doing the lion’s share of work. This release and the tidiness of Mudlet’s forums would not be possible without him.

Mapper improvements

A lot of the mapper code has been improved and optimized to run faster, both when speedwalking and when editing maps. In addition to performance improvements, a whole host of functions have been added to the API to ease scripting and allow you to get more done with less work!

The mapper is now more strict on area names and now allows unique area names only, as having duplicate area names was problematic for scripting and UI dropdowns. Along with this, map auditing has been introduced, which auto-corrects duplicate area names and a few other things. Upon loading Mudlet on an old map for the first time, you might see this:

Mudlet map audit

Don’t be concerned about it, it’s just Mudlet cleaning up the map for you. You can see a more detailed report of the audit in the errors.txt file that is mentioned at the bottom of the message.

The mapper widget’s area list has been improved and now updates more dynamically to any map changes. To make map editing easier, the room selection widget is now editable, allowing you to exactly select the rooms you’d like to modify at once.

Many mapper functions now also allow using names in other than English, as part of the work that has went into making Mudlet more friendly to MUDs in other languages.

Mapper API function improvements:

  • getAllRoomEntrances() has been added: find all the normal and special exits leading into a room
  • setAreaName() has been improved: now takes an area name for the original area, complementing using the area id
  • searchRoom() has been improved: now allows for case-sensitive and substring/exact match searches
  • getAllRoomUserData(roomID) has been added: given a roomId number returns a lua table of all the user data
  • getRoomUserDataKeys(roomID) has been added: given a roomId number returns a lua list of all the keys of the user data for that room.
  • clearRoomUserDataItem(roomID, key) has been added: given a roomId number and a user data key removes that key/value pair from the user data for that room. Returns true if data was removed, false if not and nil if the room does not exist for that roomId number.
  • searchRoomUserData(key, value) has been improved: given a string “key” and “value” returns a list of the roomIDs which contain that value for that key, now returns a sorted list of room numbers.
  • searchRoomUserData(key) has been improved: given a string “key” returns an ascending sorted list (lua table with monotonically incrementing integer keys from unity) of the unique values stored against that key in all rooms.
  • createRoomID(startingRoomNumber) variant of createRoomID() has been added, allowing you to specify where should Mudlet start searching from for an available room ID when creating a new room
  • setDoor() has been improved to return true on success or nil+false on error
  • new functions for storing userdata in areas and the map itself, however they require upgrading the map format in order to store that data (meaning any Mudlet before 3.0.0-epsilon won’t be able to get this data):
    • searchAreaUserData((string)<key>[, (string)<value>])
    • setAreaUserData((number)<area Id>, (string)<key>, (string)<value>)
    • clearAreaUserData((number)<area Id>)
    • clearAreaUserDataItem((number)<area Id>, (string)<key>)
    • getAreaUserData((number)<area Id>, (string)<key>)
    • getAllAreaUserData((number)<area Id>)
    • setMapUserData((string)<key>, (string)<value>)
    • clearMapUserData((string)<key>)
    • clearMapUserDataItem()
    • getMapUserData((string)<key>)
    • getAllMapUserData()

OSX resizing fixed

Mudlet 3.0.0-delta had an issue where the main window would resize whenever text got too big for the input line. This has now been fixed.

HTTPS support

IRE maps are now downloaded over HTTPS, and the downloadFile() function now supports downloading over HTTPS as well. loadMap() has also been improved to handle importing IRE XML map files in addition to Mudlet map files, so should the URL change in the future, you can still load maps in without waiting for a Mudlet update.

Colour parsing

You can now trigger on grey (light white) and cyan colours – colour triggers previously did not differentiate between them properly. Additionally, a few colours weren’t rendered exactly right when coming in from the MUD – this has now been fixed as well.

Strikeout support

Scripts can now set text to be striken-out via the newly-added setStrikeOut() function, both in the main and console windows. Labels have already supported this feature through CSS formatting.

New events for data protocols

sysProtocolEnabled and sysProtocolDisabled  envets have been added to let your scripts know when MDSP, ATCP, GMCP, MXP, or channel102 data protocol has been enabled.

nil and boolean for raiseEvent()

The raiseEvent() function has been improved and now supports passing nil and boolean arguments.

Code cleanup

Lastly, a lot of Mudlets code has been improved – dead code removed, better coding style and practices applied. Anyone wishing to get into improving Mudlet is welcome to join us on the Gitter chat.


  • fixed small bug in editor where the icon for a script would dissapear when it was activated via saving
  • added options to display spaces and paragraphs in the code editor
  • status bar for the cursor’s position in a code editor has been enchanced to report character position and the total amounts of lines/characters
  • a lot of error messages from Lua API functions have been fixed to report the proper function name
  • spawn() function has been fixed to output timely

Onto 3.0 final

In order to release the 3.0 final, we need to clear off the last remaining issues that we’ve introduced since 2.1, and any issues found during testing of 3.0.0-epsilon. Please report any problems you find to our forums or directly on the bugtracker, and a big thank you for taking the time to do so! We strive to ensure that Mudlet is always in good quality.


Big thanks to Stephen Lyons, chrio, Chris Mitchell, Eric Wallace, keneanung, and Zahatric for making this release possible. We look forward to more regular releases in the future!

Note: a previous version of this article incorrectly referred to downloadMap() – the proper function is downloadFile().

Posted in Uncategorized | 8 Comments »

« Previous Entries Next Entries »