A portable, offline-first DM tool designed for dual-monitor setups.
Manage combat, track timelines, and project a rich campaign wiki seamlessly.
✨ Check out our over-engineered amazing website here! ✨
Supported Languages:
🇺🇸 English | 🇹🇷 Türkçe | 🇩🇪 Deutsch | 🇫🇷 Français
📢 Developer Note: You can find current priorities and known bugs in TODO.md.
Due to personal time constraints, updates might be slower recently. However, I am doing my best to stick to the roadmap and implement planned features. Thank you for your support!
| 📺 Dynamic Projection | 🌫️ Fog of War | 🧠 Mind Map |
|---|---|---|
| Drag & drop images to project instantly to a second screen. | Draw fog to hide secrets on the battle map. Persists per encounter. | Infinite canvas to link notes, NPCs, and create story workspaces. |
| 🎵 Adaptive Audio | ⚔️ Combat Tracker | 🌍 System Agnostic |
|---|---|---|
| Layered music with intensity sliders. Create custom themes easily. | Manage initiative, HP, and conditions integrated with the map. | Built-in 5e SRD/Open5e browser, but adaptable to any system. |
- 📺 Project to Players: Click "Toggle Player Screen". Drag any image (NPC/Map) to the "Drop to Project" bar at the top.
- 🌫️ Fog of War: In the Session Tab, click "Fog". Left-click to hide, Right-click to reveal.
- 🧠 Mind Map: Right-click on the canvas to add Nodes or Workspaces. Middle-click to pan.
- 🎵 Soundpad: Open the panel, select a theme (e.g., "Forest"), and use the Intensity Slider to shift music dynamically.
- Projector: Multi-image split view & Battle Map sync.
- Maps: Video map support (
.mp4), Fog of War, Grid. - Campaign: Rich text notes, binary storage (
.dat), Timeline tracker. - Customization: Theme Engine (10+ themes), English/Turkish localization.
- Audio: Custom Soundpad with Theme Builder.
- Generators: Random NPC & Encounter creators.
- Tools: Image-to-Note (OCR) transformer.
- Content: Pre-built worlds & "One-Click" campaign setups.
- Online: Hosted servers for remote play.
- Download
DungeonMasterTool-Windows.ziphere. - Extract the folder and run
DungeonMasterTool.exe.
- Download
DungeonMasterTool-Linux.ziphere. - Extract the folder and run
DungeonMasterTool.
git clone https://github.com/elymsyr/dungeon-master-tool.git
cd dungeon-master-tool
bash installer/install.sh # (Use install-arch.sh for Arch Linux)
./run.shSince this is an open-source project and not signed with an official Apple Developer account, you need to manually bypass the "unverified developer" warning.
Click here to download DungeonMasterTool-MacOS.zip
Steps to run the app:
- Extract the downloaded
.zipfile. - Drag
DungeonMasterTool.appto your Applications folder. - Open Terminal (Cmd + Space, type 'Terminal') and run the following command to remove the quarantine flag:
sudo xattr -rd com.apple.quarantine /Applications/DungeonMasterTool.app
- Launch: You can now open the app from your Applications or Launchpad.
pip install -r requirements-dev.txtpython dev_run.pyOptional flags:
--path <dir>: watch/run from a specific root (default is repo root)--patterns "*.py,*.ui,*.qss,*.json,*.yaml,*.yml": override watched patterns--debounce-ms 300: debounce window for change bursts--no-restart: disable fallback auto-restart when hot reload fails--restart-only: disable in-process hot reload, restart on every change
.py: changed modules are reloaded withimportlib.reload(), then root UI is rebuilt in-process.qss: active stylesheet is reapplied live (no restart).ui,.json,.yaml,.yml: root UI is rebuilt in-processlocales/*.yml/locales/*.yaml: UI is retranslated after rebuild
Restart-required boundaries:
main.pydev_run.py- any file under
core/dev/
- Hot reload is attempted first.
- If it fails and
--no-restartis not set, dev runner gracefully restarts the app. - In dev mode, restart tries to reopen the last active world automatically.
- Reload status values are explicit:
APPLIED,NO_OP,RESTART_REQUIRED,FAILED,BUSY. BUSYretries once in-process with a coalesced change set; additional retries wait for the next change event.
Outcome troubleshooting:
| Status | Meaning | Default Supervisor Action |
|---|---|---|
APPLIED |
Reload + optional rebuild succeeded | Continue |
NO_OP |
No actionable files in batch | Continue |
RESTART_REQUIRED |
Stable-shell/dev infra changed | Restart (unless --no-restart) |
FAILED |
Reload/rebuild/health-check failed | Restart (unless --no-restart) |
BUSY |
Another reload in progress | Retry once, then defer |
- State preservation is best-effort (tab index/splitter/soundpad visibility). Deep widget state may reset.
- If startup fails (for example syntax error), supervisor waits for the next file change before retry.
- Production startup is unchanged (
python main.pydoes not enable dev hot reload). - App-write directories
cache/andworlds/are excluded from watch to avoid self-trigger reload loops.
- Run
python dev_run.py. - Modify a
.qssfile inthemes/and save. - Confirm styling updates in the running app without closing it.
- Modify a UI python file such as
ui/tabs/map_tab.py. - Confirm UI rebuild happens while the app process stays alive.
- Introduce a syntax error in a loaded python module and save.
- Confirm hot reload fails and the app auto-restarts.
- Confirm app reopens the last world in dev mode after restart.
- Fix the syntax error and save.
- Confirm hot reload succeeds again.
I read every piece of feedback. Whether it's a bug report or a feature request, please reach out!
Her geri bildirimi okuyorum. Hata bildirimi veya özellik isteği için lütfen ulaşın!
| Platform | Link / Contact |
|---|---|
| 🐛 GitHub Issues | Report a Bug |
| @erenorhun | |
| Orhun Eren Yalçınkaya | |
| orhunerenyalcinkaya@gmail.com |



