A modern, cross-platform, Qt based, drop-in replacement for MUSHClient, MUD (Multi-User Dungeon) client.
19
stars
359
commits
C++
primary language
Sep 8, 2026
updated
QMud is a Qt 6 port and continuation of the original MUSHclient (by Nick Gammon), designed and written by Panagiotis Kalogiratos (Nodens) of CthulhuMUD. It is a client program for connecting to MUD (Multi-User Dungeon) games. It is compatible with existing MUSHclient files and plugins, but it will migrate them to its own format in order to maintain separation. As more features are implemented, things were bound to diverge, especially in data persistence, so, as a conscious choice, QMud diverges from the get-go. The active implementation in this repository is C++20 + Qt 6.11.
The official site and documentation of QMud is here: qmud.dev
QMud is fully functional and early porting issues have been ironed out. There are several improvements and new features implemented already and many more on TODO. It is now also the FIRST and ONLY, at the time of this writing, MUD client with a multithreaded Lua engine. v11.00 essentially marks the first production release. QMud started with a v10 versioning offset in order to guarrantee higher than MUSHclient versioning for compatibility/importing reasons. Please use the issue tracker, with the appropriate template to report issues, request features, etc.
File -> Reload QMud).For support, testing feedback, and development discussion, join:
Do NOT use the issue tracker for general support requests.
NOTICE: While contributions/PRs are very welcome, if you open a PR, you are expected to UNDERSTAND the code you're touching AND be able to make requested changes after review. "Vibe coding" is NOT welcome.
QMud can migrate an existing MUSHclient data tree.
Migration is copy-based, so source files are preserved and moved under a migrated marker
path after successful import to avoid reprocessing.
What is migrated:
.MCL and related world XML data)Path handling during migration normalizes legacy Windows-style paths (for
example C:\...) so migrated worlds resolve correctly on the active platform.
<include name="./worlds/plugins/CthulhuMUD/CthulhuMUD_Mapper.xml" plugin="y" />Always keep a copy of your original MUSHclient directory. Extensive testing has been done but better safe than sorry.
QMUD_HOME)QMud resolves its startup/data directory in this order:
QMUD_HOME environment variable (all platforms).QMUD_HOME from config file fallback:
~/.config/QMud/config, then /etc/QMud/config~/Library/Application Support/QMud/config, then /Library/Application Support/QMud/config%LOCALAPPDATA%/QMud/configWhen multi-instance mode is enabled (QMUD_ALLOW_MULTI_INSTANCE env var or --multi-instance/
--allow-multi-instance), config fallback is disabled and QMUD_HOME must be set explicitly in the process environment
in order to avoid second instances writing to the same datadir.
System config lines support both:
QMUD_HOME=/path/to/direxport QMUD_HOME=/path/to/dirQuoted values are accepted, and leading ~ is expanded.
The same config fallback files can also define any QMUD_* environment flag, and those values are used when the real
process environment does not override them.
If nothing is configured, defaults are:
$HOME/QMud~/Documents/QMudFlags below can be provided either as process environment variables or in the OS config fallback files (QMUD_*
entries, used as fallback when not set in the process environment).
QMUD_HOME: Overrides startup/data directory resolution (see section above).QMUD_ALLOW_MULTI_INSTANCE: When set to 1, y, yes, or true, bypasses single-instance enforcement. (Not safe
with same datadir). In this mode, QMUD_HOME must be explicitly set in process environment.QMUD_DISABLE_UPDATE: When set to 1, y, yes, or true, disables the automatic updates functionality (for
distro packaging).QMUD_RELOAD_VERBOSE: When set to 1, y, yes, or true, enables verbose per-world reload diagnostics in logs.--multi-instance (alias: --allow-multi-instance): Bypass single-instance enforcement for that process. (Not safe
with same datadir). In this mode, QMUD_HOME must be explicitly set in process environment.--dump-lua-api <output-dir>: Export Lua API inventory to the given directory and exit.File -> Reload QMud is available on Linux and macOS. It performs a reload keeping worlds connected when possible.
Current behavior/limitations:
Widgets, Network, Sql, PrintSupportMultimedia (sound; disabled at runtime if missing)TextToSpeech (TTS support; disabled if missing)QMUD_ENABLE_LUA_SCRIPTING=ON (default)Docker build images for AppImage/Windows/macOS have everything required for building already staged. The above is for building natively.
cmake -S . -B cmake-build-release -DCMAKE_BUILD_TYPE=Release
cmake --build cmake-build-release --target QMud -j"$(nproc)"
cmake -S . -B cmake-build-release \
-DCMAKE_BUILD_TYPE=Release \
-DQMUD_ENABLE_APPIMAGE=ON
cmake --build cmake-build-release --target AppImage -j"$(nproc)"
The packaged AppImage is generated under cmake-build-release/appimage/.
cmake -S . -B cmake-build-release -G "Visual Studio 17 2022" -A x64
cmake --build cmake-build-release --config Release --target QMud
cmake -S . -B cmake-build-release -DCMAKE_BUILD_TYPE=Release
cmake --build cmake-build-release --target QMud -j"$(sysctl -n hw.ncpu)"
Build the cross-build images first:
docker build -t qmud-appimage-builder:qt6.11 -f tools/docker/appimage-qt611/Dockerfile tools/docker/appimage-qt611
docker build -t qmud-macos-builder:qt6.11 -f tools/docker/macos-qt611/Dockerfile tools/docker/macos-qt611
docker build -t qmud-windows-builder:qt6.11 -f tools/docker/windows-qt611/Dockerfile tools/docker/windows-qt611
Configure once (Docker targets are Linux-host only):
cmake -S . -B cmake-build-release \
-DCMAKE_BUILD_TYPE=Release \
-DQMUD_ENABLE_APPIMAGE=OFF \
-DQMUD_ENABLE_APPIMAGE_DOCKER=ON \
-DQMUD_ENABLE_MAC_DOCKER=ON \
-DQMUD_ENABLE_WINDOCKER=ON \
-DQMUD_DOCKER_EXECUTABLE=docker
Build cross targets:
cmake --build cmake-build-release --target AppImageDocker
cmake --build cmake-build-release --target MacDockerU
cmake --build cmake-build-release --target WinDocker
MacDockerU is the default macOS packaging target and produces universal x86_64/arm64 binaries. To build a
single-architecture macOS package manually, use MacDocker with QMUD_MAC_DOCKER_ARCH set at configure time:
cmake -S . -B cmake-build-release -DQMUD_MAC_DOCKER_ARCH=aarch64
cmake --build cmake-build-release --target MacDocker
QMUD_MAC_DOCKER_ARCH accepts x86_64 or aarch64.
Notice that Qt is always universal as it is not customly built for QMud.
Artifacts are written to:
cmake-build-release/appimage-docker-outcmake-build-release/mac-docker-outcmake-build-release/windows-docker-outConfigure with tests enabled:
cmake -S . -B cmake-build-release \
-DCMAKE_BUILD_TYPE=Release \
-DQMUD_ENABLE_TESTING=ON \
-DQMUD_ENABLE_GUI_TESTS=ON
Build and run all registered tests:
cmake --build cmake-build-release -j"$(nproc)"
ctest --test-dir cmake-build-release --output-on-failure
Run the default quick suite used for pull requests:
ctest --test-dir cmake-build-release --output-on-failure --label-exclude slow
CI policy:
.github/workflows/pipelines.yml is the authoritative CI workflow.Pipelines / PR/Push quick suite (exclude slow) and package build jobs to pass
before merge.These are intentional design choices in QMud:
QRegularExpression (PCRE2 behavior).QXmlStreamReader).sqlite3 integration is implemented on top of Qt SQL (QSqlDatabase/QSqlQuery) via the in-tree Lua binding
layer.QCryptographicHash).qmud elements; legacy muclient are still read for compatibility.QMud is licensed under the GNU General Public License v3.0. See LICENSE.
Third-party license texts are in skeleton/docs/licenses.
C++
87.9%
Lua
9.0%
CMake
1.4%
A modern, cross-platform, Qt based, drop-in replacement for MUSHClient, MUD (Multi-User Dungeon) client.
19
stars
359
commits
C++
primary language
Sep 8, 2026
updated
QMud is a Qt 6 port and continuation of the original MUSHclient (by Nick Gammon), designed and written by Panagiotis Kalogiratos (Nodens) of CthulhuMUD. It is a client program for connecting to MUD (Multi-User Dungeon) games. It is compatible with existing MUSHclient files and plugins, but it will migrate them to its own format in order to maintain separation. As more features are implemented, things were bound to diverge, especially in data persistence, so, as a conscious choice, QMud diverges from the get-go. The active implementation in this repository is C++20 + Qt 6.11.
The official site and documentation of QMud is here: qmud.dev
QMud is fully functional and early porting issues have been ironed out. There are several improvements and new features implemented already and many more on TODO. It is now also the FIRST and ONLY, at the time of this writing, MUD client with a multithreaded Lua engine. v11.00 essentially marks the first production release. QMud started with a v10 versioning offset in order to guarrantee higher than MUSHclient versioning for compatibility/importing reasons. Please use the issue tracker, with the appropriate template to report issues, request features, etc.
File -> Reload QMud).For support, testing feedback, and development discussion, join:
Do NOT use the issue tracker for general support requests.
NOTICE: While contributions/PRs are very welcome, if you open a PR, you are expected to UNDERSTAND the code you're touching AND be able to make requested changes after review. "Vibe coding" is NOT welcome.
QMud can migrate an existing MUSHclient data tree.
Migration is copy-based, so source files are preserved and moved under a migrated marker
path after successful import to avoid reprocessing.
What is migrated:
.MCL and related world XML data)Path handling during migration normalizes legacy Windows-style paths (for
example C:\...) so migrated worlds resolve correctly on the active platform.
<include name="./worlds/plugins/CthulhuMUD/CthulhuMUD_Mapper.xml" plugin="y" />Always keep a copy of your original MUSHclient directory. Extensive testing has been done but better safe than sorry.
QMUD_HOME)QMud resolves its startup/data directory in this order:
QMUD_HOME environment variable (all platforms).QMUD_HOME from config file fallback:
~/.config/QMud/config, then /etc/QMud/config~/Library/Application Support/QMud/config, then /Library/Application Support/QMud/config%LOCALAPPDATA%/QMud/configWhen multi-instance mode is enabled (QMUD_ALLOW_MULTI_INSTANCE env var or --multi-instance/
--allow-multi-instance), config fallback is disabled and QMUD_HOME must be set explicitly in the process environment
in order to avoid second instances writing to the same datadir.
System config lines support both:
QMUD_HOME=/path/to/direxport QMUD_HOME=/path/to/dirQuoted values are accepted, and leading ~ is expanded.
The same config fallback files can also define any QMUD_* environment flag, and those values are used when the real
process environment does not override them.
If nothing is configured, defaults are:
$HOME/QMud~/Documents/QMudFlags below can be provided either as process environment variables or in the OS config fallback files (QMUD_*
entries, used as fallback when not set in the process environment).
QMUD_HOME: Overrides startup/data directory resolution (see section above).QMUD_ALLOW_MULTI_INSTANCE: When set to 1, y, yes, or true, bypasses single-instance enforcement. (Not safe
with same datadir). In this mode, QMUD_HOME must be explicitly set in process environment.QMUD_DISABLE_UPDATE: When set to 1, y, yes, or true, disables the automatic updates functionality (for
distro packaging).QMUD_RELOAD_VERBOSE: When set to 1, y, yes, or true, enables verbose per-world reload diagnostics in logs.--multi-instance (alias: --allow-multi-instance): Bypass single-instance enforcement for that process. (Not safe
with same datadir). In this mode, QMUD_HOME must be explicitly set in process environment.--dump-lua-api <output-dir>: Export Lua API inventory to the given directory and exit.File -> Reload QMud is available on Linux and macOS. It performs a reload keeping worlds connected when possible.
Current behavior/limitations:
Widgets, Network, Sql, PrintSupportMultimedia (sound; disabled at runtime if missing)TextToSpeech (TTS support; disabled if missing)QMUD_ENABLE_LUA_SCRIPTING=ON (default)Docker build images for AppImage/Windows/macOS have everything required for building already staged. The above is for building natively.
cmake -S . -B cmake-build-release -DCMAKE_BUILD_TYPE=Release
cmake --build cmake-build-release --target QMud -j"$(nproc)"
cmake -S . -B cmake-build-release \
-DCMAKE_BUILD_TYPE=Release \
-DQMUD_ENABLE_APPIMAGE=ON
cmake --build cmake-build-release --target AppImage -j"$(nproc)"
The packaged AppImage is generated under cmake-build-release/appimage/.
cmake -S . -B cmake-build-release -G "Visual Studio 17 2022" -A x64
cmake --build cmake-build-release --config Release --target QMud
cmake -S . -B cmake-build-release -DCMAKE_BUILD_TYPE=Release
cmake --build cmake-build-release --target QMud -j"$(sysctl -n hw.ncpu)"
Build the cross-build images first:
docker build -t qmud-appimage-builder:qt6.11 -f tools/docker/appimage-qt611/Dockerfile tools/docker/appimage-qt611
docker build -t qmud-macos-builder:qt6.11 -f tools/docker/macos-qt611/Dockerfile tools/docker/macos-qt611
docker build -t qmud-windows-builder:qt6.11 -f tools/docker/windows-qt611/Dockerfile tools/docker/windows-qt611
Configure once (Docker targets are Linux-host only):
cmake -S . -B cmake-build-release \
-DCMAKE_BUILD_TYPE=Release \
-DQMUD_ENABLE_APPIMAGE=OFF \
-DQMUD_ENABLE_APPIMAGE_DOCKER=ON \
-DQMUD_ENABLE_MAC_DOCKER=ON \
-DQMUD_ENABLE_WINDOCKER=ON \
-DQMUD_DOCKER_EXECUTABLE=docker
Build cross targets:
cmake --build cmake-build-release --target AppImageDocker
cmake --build cmake-build-release --target MacDockerU
cmake --build cmake-build-release --target WinDocker
MacDockerU is the default macOS packaging target and produces universal x86_64/arm64 binaries. To build a
single-architecture macOS package manually, use MacDocker with QMUD_MAC_DOCKER_ARCH set at configure time:
cmake -S . -B cmake-build-release -DQMUD_MAC_DOCKER_ARCH=aarch64
cmake --build cmake-build-release --target MacDocker
QMUD_MAC_DOCKER_ARCH accepts x86_64 or aarch64.
Notice that Qt is always universal as it is not customly built for QMud.
Artifacts are written to:
cmake-build-release/appimage-docker-outcmake-build-release/mac-docker-outcmake-build-release/windows-docker-outConfigure with tests enabled:
cmake -S . -B cmake-build-release \
-DCMAKE_BUILD_TYPE=Release \
-DQMUD_ENABLE_TESTING=ON \
-DQMUD_ENABLE_GUI_TESTS=ON
Build and run all registered tests:
cmake --build cmake-build-release -j"$(nproc)"
ctest --test-dir cmake-build-release --output-on-failure
Run the default quick suite used for pull requests:
ctest --test-dir cmake-build-release --output-on-failure --label-exclude slow
CI policy:
.github/workflows/pipelines.yml is the authoritative CI workflow.Pipelines / PR/Push quick suite (exclude slow) and package build jobs to pass
before merge.These are intentional design choices in QMud:
QRegularExpression (PCRE2 behavior).QXmlStreamReader).sqlite3 integration is implemented on top of Qt SQL (QSqlDatabase/QSqlQuery) via the in-tree Lua binding
layer.QCryptographicHash).qmud elements; legacy muclient are still read for compatibility.QMud is licensed under the GNU General Public License v3.0. See LICENSE.
Third-party license texts are in skeleton/docs/licenses.
C++
87.9%
Lua
9.0%
CMake
1.4%