Python and DragonRealms — a monorepo of hobby projects for the DragonRealms MUD.
Most of the tooling around DragonRealms lives in the Ruby ecosystem (lich, dr-scripts, profanity, Genie plugins). Revenant is an excuse to rebuild some of that in Python, have fun, and see what sticks. None of these projects are polished or production-ready — they are prototypes, experiments, and works-in-progress.
Shout out to Pylanthia, a great related project.
The repo is a uv workspace. client/ and chat/ are workspace members with their own pyproject.toml; beholder/ is deliberately outside the workspace because its pinned deps are incompatible with modern Python (see beholder/README.md).
# Install uv: https://docs.astral.sh/uv/getting-started/installation/
uv sync # create the workspace venv + install everything
uv run pytest --rootdir client # run the client test suite
uv run -- python -m client.gui.client_gui # launch the PyQt6 clientPython 3.10–3.12 is required. Python 3.13+ is not yet supported because client/client/login.py depends on the telnetlib module that was removed in 3.13.
| Directory | What it is |
|---|---|
| client/ | A Python MUD client and engine — aims to be a lich-style middleman with a PyQt6 front end and a (WIP) terminal front end. |
| beholder/ | A Dash web dashboard for visualizing character experience gains in real time, fed by a lich script writing to SQLite. |
| chat/ | A standalone LNet chat client, roughly a Python port of rcuhljr's Genie LNet plugin. |
| launcher/ | Small helper scripts for spinning up a headless lich instance alongside ProfanityFE. |
A rough-draft engine + front ends for playing DragonRealms with Python in the loop.
- core — the engine/middleman between the game and whichever front end is attached. See client/client/core.py.
- gui — a PyQt6 front end reminiscent of the old AOL-era Gemstone clients. See client/client/gui/client_gui.py.
- tui — a non-working draft of a terminal front end. Profanity is what you actually want for a TUI today; this is just a sketch.
Python 3.10–3.12. Packaged via client/pyproject.toml as a member of the root uv workspace.
A browser-based dashboard for character experience gains, built with Dash/Plotly on top of a SQLite database.
The pipeline:
- beholder/revenant.lic runs inside lich, polling
DRSkillevery 60s and writing rows into a SQLite database. - beholder/app.py reads from that database via SQLAlchemy and renders a Dash app with per-character, per-skill mindstate plots that refresh on an interval.
See beholder/README.md for setup. Note: the pinned dependencies in beholder/requirements.txt are old — Dash 0.22, Flask 1.0, pandas 0.23 — and the code uses the deprecated dash_core_components / dash_html_components / dash_table_experiments imports, so it won't run under a modern Dash without porting. That's why beholder is not part of the uv workspace yet.
A minimal LNet client in pure Python. Connects over SSL to lnet.lichproject.org, handles the login XML handshake, answers pings, and parses incoming messages into a typed LnetMessage. See chat/chat.py. Run with cd chat && uv run python chat.py (the bare relative path to LnetCert.txt means it must be invoked from the chat/ directory).
launcher/launch.py picks a free port, starts lich headless with --detachable-client, and attaches a Profanity front end to it. Paths are currently hard-coded for the author's machine — treat it as a template rather than a turnkey tool.
revenant/
├── beholder/ # Dash/Plotly XP dashboard + lich data-logging script
├── chat/ # LNet chat client
├── client/ # PyQt6 client + engine (core/gui/tui)
└── launcher/ # Helpers for launching lich + profanity together
Hobby-grade. Things are in varying states of disrepair — the client is the most actively poked at, beholder is dormant but fun, chat works, and launcher is a convenience script. Expect to read code before running anything.
MIT (see client/pyproject.toml).