Download
Giant Mushroom Studio

Your table.
Your rules.
Your server.

A fully self-hosted virtual tabletop for D&D 5e. Per-player instanced fog of war, AI-generated tokens, real-time combat tracking, and complete GM control — all running on your own machine with Docker.

TableTop Forge — The Sunken Keep
🧙
⚔️
🏹
💀
⚔️ Combat
Round 3
3 Players · 1 Enemy
What It Does

Built for the Table

Everything a Game Master needs to run a compelling session — and everything players need to feel genuinely present in the world.

👁️
Per-Player Fog of War
Every player sees only what their character can see. Vision is computed individually per token using ray-cast line-of-sight against walls and obstacles. Darkvision, Truesight, and Blindsight all behave differently.
Standout Feature
🤖
AI Token Generation
Generate full D&D stat blocks via a local LLM (Ollama or LM Studio) or any OpenAI-compatible API, and auto-generate matching portraits via a local SwarmUI image-gen server (NSFW supported, opt-in). No cloud required — your data stays on your network.
Standout Feature
🕯️
Dynamic Lighting
Place candles, torches, lanterns, and magical light sources anywhere on the map. Light radiates as bright and dim rings that interact with walls and the fog of war in real time.
🌑
Magical Darkness
Place zones of magical darkness that block all vision except Truesight and Blindsight. The darkness occludes everything beyond it like a solid wall for characters without penetrating senses.
⚔️
Combat Tracker
Full initiative order, HP and temp HP, conditions (blinded, stunned, invisible, etc.), and round tracking. Start and end combat with a single click. Players see the tracker live.
🗺️
Per-Map State
Tokens, walls, lights, doors, magical darkness zones, and spawn points are all instanced per map. Switch maps mid-session and everything snaps back to exactly how you left it.
🧱
Wall & Door Editor
Draw line walls, rectangles, polygons, and circles directly on the map. Place standard, heavy, and portcullis-style doors that open and close with a click — visible to all players.
📖
Creature Library
Store a full library of monsters and player characters. View D&D-style stat blocks, drag creatures onto the map as tokens, and edit stats at any time during the session.
📜
PDF Spell Importer
Upload a sourcebook PDF and the app scrapes spell entries directly into a shared library players can learn from. Names are validated against a canonical 5e list; missing details fall back to the open5e SRD (2014 or 2024, your choice).
New
🗺️
Split the Party
Run two scenes at once. Drop named spawn points anywhere on a map, then right-click any token → Send to map → [point] to relocate them. The player's view auto-follows their token to the new map without disturbing anyone else, and a "Default Spawn Map" lets new arrivals land on a lobby map while the rest of the party fights elsewhere. The bundled Split the Party plugin adds a per-player dropdown that pins manual assignments — useful for scouting or out-of-body scenes where the token shouldn't move at all.
New
🧩
Plugin System
Drop in a folder, restart, and extend the app. Plugins can add animated map effects, custom GM tabs, click-to-place tools, and shared state that auto-syncs between the GM and players. A documented contract keeps plugins from touching login or doing permanent damage — disabling or deleting one always restores the base app cleanly.

Read the plugin authoring guide →
New
🔒
Fully Self-Hosted
TableTop Forge runs entirely on your own machine inside a Docker container. No accounts, no subscriptions, no data sent anywhere. Your campaign is yours.
Requirements

Getting Started with Docker

TableTop Forge runs inside Docker — a lightweight container system that handles all dependencies automatically. You only need to install Docker once.

🐳 TableTop Forge requires Docker Desktop (Windows & Mac) or Docker Engine (Linux). Download it free at docker.com/products/docker-desktop. No Docker account is needed to run the app.
1
Install Docker Desktop for Mac
Download Docker Desktop for Mac (choose Apple Silicon or Intel depending on your chip). Open the downloaded .dmg and drag Docker to Applications. Launch it from Applications and wait for the whale icon in your menu bar.
2
Extract TableTop Forge
Unzip TabletopForge.zip anywhere on your Mac — your Desktop or Documents folder works well. You should see a folder containing a docker-compose.yml file and a backend folder.
3
Open Terminal and navigate to the folder
Open Terminal (search Spotlight for "Terminal"). Navigate to the extracted folder:
cd ~/Desktop/TabletopForge
4
Start the app
Run the following command. Docker will download and build everything automatically on first run (this takes a few minutes):
docker compose up -d
Once complete, open your browser and go to http://localhost
5
Share the URL with your players
Players on the same Wi-Fi connect at http://<your-Mac-name>.local. The Mac advertises that automatically — find your name in System Settings → General → Sharing → Local hostname. Mobile-app players (iOS / Android) need this .local form rather than a raw IP, because the App Store and Play Store sandboxes restrict cleartext to known-private destinations. The GM panel's Player Join Link box prints the right URL for you to read aloud.
6
Stopping and restarting
To stop the app: docker compose down. To start it again later: docker compose up -d. Your session data is preserved automatically.
1
Install Docker Desktop for Windows
Download Docker Desktop for Windows. Run the installer and follow the prompts. When asked, enable the WSL 2 backend (recommended). Restart your computer if prompted. Launch Docker Desktop from the Start menu and wait for it to show "Engine running".
2
Extract TableTop Forge
Right-click TabletopForge.zip and choose Extract All. Place the extracted folder somewhere accessible, like your Desktop or C:\Projects.
3
Open PowerShell in the folder
Navigate to the extracted folder in File Explorer. Hold Shift and right-click an empty area, then choose Open PowerShell window here (or Open Terminal here on Windows 11).
4
Start the app
In PowerShell, run:
docker compose up -d
Docker will build and start all services. Once complete, open your browser and go to http://localhost
5
Install Bonjour for Windows (one time, for phone players)
For player phones to use a friendly .local URL instead of a raw IP, install Apple's free Bonjour Print Services for Windows (4 MB MSI). After install, your PC permanently advertises <COMPUTERNAME>.local — that's the URL the GM panel prints in the Player Join Link box. iOS / Android Play Store apps require this .local form because they refuse cleartext to raw LAN IPs by policy. If you skip Bonjour, browser-based players can still connect via the IP, but the App Store / Play Store mobile apps will refuse.
6
Stopping and restarting
To stop: docker compose down. To restart: docker compose up -d. Your data is stored in Docker volumes and persists between restarts.
1
Install Docker Engine
Follow the official guide for your distro at docs.docker.com/engine/install. For Ubuntu/Debian, the quick install is:
curl -fsSL https://get.docker.com | sh sudo usermod -aG docker $USER
Log out and back in after running these commands.
2
Extract and enter the folder
unzip TabletopForge.zip cd TabletopForge
3
Start the app
docker compose up -d
Once running, open http://localhost in your browser.
4
Install Avahi for phone players (one time)
For player phones to connect via a clean .local URL (required by the iOS App Store and Android Play Store sandboxes), make sure Avahi is running. Most desktop distros already ship it; if not:
sudo apt install avahi-daemon sudo systemctl enable --now avahi-daemon
For the cleanest UX, also uncomment network_mode: host under the backend: service in docker-compose.yml — that lets the container's own mDNS publish reach the LAN as tabletopforge.local.
5
Sharing the URL with players
The GM panel's Player Join Link box prints a .local URL (e.g. http://yourbox.local) once Avahi + Bonjour publish are running. Browser-based players can also use the LAN IP http://192.168.x.x; mobile App Store / Play Store builds need the .local form.
Local AI Integration

Generate Creatures with AI

TableTop Forge can connect to a local AI model to generate D&D stat blocks and token images on demand. No API keys or internet connection required — everything runs on your hardware.

LM Studio
GUI-based local LLM runner — easiest to set up
1
Download LM Studio from lmstudio.ai and install it for your OS.
2
Open LM Studio, go to the Discover tab and search for Gemma 3 or Gemma 4. Download a 4B or 12B variant depending on your VRAM.
3
Go to the Developer tab (or Local Server tab). Load your model and click Start Server. It will listen on http://localhost:1234 by default.
4
In TableTop Forge's GM view, open the Session tab and paste http://localhost:1234 as the AI Base URL. Enter any model name shown in LM Studio.
Ollama
Lightweight CLI model runner — ideal for always-on servers
1
Install Ollama from ollama.com. On macOS and Linux it's a single installer; on Windows it's a setup exe.
2
Pull the Gemma model. Open a terminal and run:
ollama pull gemma3
3
Ollama starts automatically and serves on http://localhost:11434. You can verify with: ollama list
4
In TableTop Forge, set the AI Base URL to http://localhost:11434 and the model name to gemma3 (or whatever you pulled).
SwarmUI (image generation)
Optional — auto-generate a portrait every time a creature is AI-generated
1
Download SwarmUI from github.com/mcmonkeyprojects/SwarmUI. Run the installer for your OS and load any Stable-Diffusion-style model (SDXL, Flux, Pony, etc.). NSFW-capable models are supported — the app exposes an explicit toggle.
2
In SwarmUI's Server tab, set Host to 0.0.0.0 (or *) so the app can reach it over LAN/Docker. The default localhost binding only accepts connections from the same machine. Restart SwarmUI after changing it.
3
If SwarmUI is on a different machine, allow inbound TCP 7801 in your firewall. On Windows: New-NetFirewallRule -DisplayName "SwarmUI" -Direction Inbound -Protocol TCP -LocalPort 7801 -Action Allow (admin PowerShell).
4
In TableTop Forge's GM view → Session tab → AI Integration, scroll down and tick Generate token images. Enter the SwarmUI URL (e.g. http://host.docker.internal:7801 when SwarmUI is on the same machine as Docker, or the LAN IP when remote), then click Test Image Connection. The Model field can be left blank to auto-pick the first installed model.
Connecting to TableTop Forge
Once your local AI is running, open the GM view and go to the Session tab in the right panel. Enter your AI server's base URL and model name. The ✨ AI button in the Creature Library will then be active — click it to generate a complete stat block from a text description.
Recommended model: Gemma 4 (Google) performs excellently at structured D&D stat block generation. A 4B parameter variant runs well on most modern laptops with 8GB+ VRAM, and the 12B variant produces more creative and detailed results on higher-end hardware. You can also use any OpenAI-compatible endpoint — including the OpenAI API itself — by entering your API base URL and key.
For the PDF spell importer: use a vision-capable model — Gemma 3/4 Vision, Llama 3.2 Vision, GPT-4o, or Claude with vision all work. Image-only or scanned PDFs depend entirely on the vision model's ability to read the page. Set your model's context window to at least 16k tokens (32k+ recommended for whole-book scans); a small context truncates pages and silently drops spells.
⚠️ AI accuracy disclaimer: The PDF spell scanner uses an AI model to read your sourcebook, so mistakes are expected — misspelled names, wrong damage dice, missing components, or hallucinated entries can all happen. The app mitigates this with multi-pass consensus voting, a canonical 5e name list, and an open5e SRD fallback, plus a post-scan Review names panel that suggests fixes. Always proofread imported spells before relying on them at the table.
Image generation (optional): when SwarmUI is wired up, the app fires off a portrait every time a creature is AI-generated — both via the manual ✨ AI button in the Token Library and the Random Encounter Builder plugin. Each saved creature also gets a 🎨 Regenerate Image button in its detail view, which opens a prompt-edit modal so you can rewrite the prompt for that specific creature without touching the session-level template. The Allow NSFW content toggle is off by default; with it off the app appends safe-content terms to the negative prompt, with it on only your prompt + your negative prompt are sent (what you actually get depends on the model loaded in SwarmUI).
Plugin Store

Plugins for TableTop Forge

Plugins extend the app with new map effects, custom GM tabs, click-to-place tools, and shared state that auto-syncs between the GM and players. Install via the Plugins section of the Session tab in the GM view.

🔥
Elemental Templates
v1.1.4 · TableTop Forge
Animated elemental overlays on spell templates — fire, water, ice, lightning, void, and acid/poison. Tag a template in the edit popup; the effect renders for both GM and players. Cone-aware: every effect originates at the cone's apex and stays constrained inside the wedge shape. v1.1.4 — line templates are now 1ft-wide rotated rectangles and elemental effects emit from the line's start point along its length: fire travels down the line, lightning bolts fork start-to-tip with zig-zag wobble.
Download v1.1.4 .zip Ships built-in; download to upgrade an existing install.
🌦
Weather Effects
v1.0.0 · TableTop Forge
GM-controlled animated weather across the whole map — rain, snow, fog — with intensity and wind-angle controls. Visible to all players in the session. Per-session, so two simultaneous campaigns get their own weather. Particles scale with map size so it looks right on small skirmish maps and giant outdoor battlemaps alike.
Download .zip Upload via GM view → Session tab → Plugins.
💥
Damage Pop-Ups
v1.1.0 · TableTop Forge
GM enters a value, picks Damage / Healing / Temp HP, then clicks a token on the map. A colour-coded number floats up above the token and fades while the token's HP is updated using 5e rules — temp HP absorbs damage first, healing caps at max HP, temp HP doesn't stack. Visible to every player in the session.
Download .zip Upload via GM view → Session tab → Plugins.
📜
Custom Classes
v1.2.0 · TableTop Forge
Adds custom character class names (Blood Hunter, Mystic…), custom subclasses scoped per class, and class-level "build choices" (Cleric Divine Order, Fighter Weapon Mastery, Rogue Expertise, etc.). Choices appear on the character form once the class is picked — single-option, multi-skill, and multi-weapon kinds are supported, and picks rewrite skills, weapon/armor proficiencies, spells and traits with clean revert on class swap. Lists sync live across GM and players.
Download .zip Upload via GM view → Session tab → Plugins.
🗂
Tab Controller
v1.2.0 · TableTop Forge
Hide rarely-used GM panel tabs AND individual collapsible sub-sections inside the Session tab (Session Info, Connected Players, Quick Dice Reference, AI Integration, Plugins). Hidden tabs stay reachable via the Open button; hidden sub-sections re-appear only by re-ticking them. Map, Token Library, Token List and Session itself are protected from being hidden. v1.2.0 adds the Terrain, Items and Origins tabs to the controllable list.
Download .zip Upload via GM view → Session tab → Plugins.
🎲
Random Encounter Builder
v1.0.0 · TableTop Forge
Pick a biome (forest / cave / road / city / swamp), party size and party level, then roll for a random encounter with a flavour line and a creature draw. Each rolled creature is matched against your existing Token Library; missing ones get a per-row Generate now button that asks the AI for a stat block and (if SwarmUI is hooked up) a portrait, then inserts the result into the library. Recent rolls are saved per session.
Download .zip Requires AI Integration configured (Session → AI Integration).
🎨
Theme Customizer
v1.0.0 · TableTop Forge
GM-tunable accent colour, panel and window backgrounds, and UI font family. Pick from gradient backdrops (Forest, Ember, Nebula, Cinnabar dusk, Deep ocean) or a flat colour, and choose between Cinzel, Crimson Pro, or system fonts. Changes apply live to the GM and every player in the session, and revert cleanly when the plugin is disabled.
Download .zip Upload via GM view → Session tab → Plugins.
💬
NPC Chat
v1.1.0 · TableTop Forge
One-way speech from the GM to players, with per-language scrambling. Pick a language and an NPC name, type a line, hit Speak; players whose character knows that language see plain text in a popup, others see deterministic gibberish keyed to the language. Pulls the language list from the host's first-class language registry — every language you add to a creature shows up here automatically. Players who don't understand are told only that the speaker uses a tongue they don't know, so they can't deduce the language from the modal.
Download .zip Upload via GM view → Session tab → Plugins.
📜
SRD 2024 Content Pack
v1.0.0 · TableTop Forge
Imports the full WotC SRD set — every creature plus every magic item — via Open5e on enable. Creatures land in the main library tagged "(SRD 2024)" so they're easy to filter; magic items live in the plugin's own tab and can be sent directly to a player creature's inventory or downloaded as a Treasure-Chest JSON. Disabling the plugin deletes every creature it inserted (tracked by ID) so the library returns to its previous state — a clean test of the disable/cleanup contract.
Download .zip Requires internet on first enable to fetch from Open5e.
📜
SRD 2014 Content Pack
v1.0.0 · TableTop Forge
Same install/cleanup contract as the SRD 2024 pack but tagged "(SRD 2014)" so the two editions can run side-by-side without colliding. Pulls the 5.1 SRD via Open5e — every creature plus every magic item — and removes everything cleanly on disable. Useful when you want the older stat lines available alongside the 2024 revisions.
Download .zip Requires internet on first enable to fetch from Open5e.
📦
Content Exporter
v1.3.0 · TableTop Forge
Pick creatures, spells, AND treasure-chest items, fill in a manifest, and download a self-contained installable plugin .zip. The exported pack imports its library content (creatures + spells) ONCE on first enable — guarded by a once-flag so reloading the page doesn't accumulate duplicates — and removes it on disable using tracked IDs. Bundled treasure items are pushed into the destination GM's treasure chest once on first install. The zip is built in-browser with an inline STORE-method ZIP encoder, so no external dependencies and the whole file is reproducible.
Download .zip Upload via GM view → Session tab → Plugins.
🎲
3D Dice
v1.0.0 · TableTop Forge
Real polyhedra (Tetrahedron, Cube, Octahedron, custom d10 trapezohedron, Dodecahedron, Icosahedron) tumble across every player's screen via three.js. Faces stay blank during the roll; once the dice settle, the rolled value fades in as a textured plane locked to the camera-facing face — rotated to match the die's own orientation, not the world. Drop optional GLB models in the plugin folder (d4.glb / d6.glb / … / d20.glb) to swap the procedural geometry for proper 3D dice. Per-die colour overrides persist per session and sync to all players, and the plugin hijacks the host's built-in dice roller so even quick-rolls from the Session tab and character sheets get the full 3D animation.
Download .zip Loads three.js from a CDN on first roll. GLB models bundled inside the zip.
👁
Player View Preview
v1.1.2 · TableTop Forge
GM-only — preview exactly what a specific player sees in a fullscreen overlay: fog of war, hidden tokens, light radius, magical darkness, plugin overlays. Lists every player token on the current map; click "Preview" to mount the player view inside the GM tab. Switch back via the bar button or Escape. Observe-only mode binds to the existing token (via ?previewTokenId=) so it never spawns a duplicate on the map.
Download .zip Upload via GM view → Session tab → Plugins.
Want to write your own?
The plugin authoring guide covers the manifest format, lifecycle, every extension point, the data API + event bus, and a complete worked example. Plugins are folders of static files — no build step, no host-side code execution.
Read the Plugin Authoring Guide
TableTop Forge

Download TableTop Forge

Free, self-hosted, and open for your table. No accounts, no subscriptions, no data leaving your network.

Docker Stack

The full stack — frontend, backend, real Postgres 16 — running in containers. One zip, every desktop OS. Best when you want to host the server on a separate machine, run alongside other Docker apps, or pop the hood and tweak the compose file.

  • Runs on Windows, macOS, and Linux
  • Full Postgres 16 — same engine the live demo uses
  • Plugin folder + uploads on the host filesystem — easy to back up
  • Hostable behind a reverse proxy + domain
  • Requires Docker Desktop (free) on Win/Mac
Download v1.9.20 (.zip)
≈ 50 MB · Windows 10/11 · macOS 12+ · Any modern Linux
macOS App

A single double-click. The full stack — frontend, backend, a Postgres-compatible database — bundled inside one signed .app. Best for a GM running the server on the same Mac they sit at, with no Docker, no terminal, and no install steps beyond drag-to-Applications.

  • No Docker, no Postgres install, no Terminal
  • Database bundled (PGlite — Postgres-compatible, in-process)
  • Auto-detects the LAN — players reach it via .local
  • Drag-to-Applications install, just like every other Mac app
  • Apple Silicon only for now (Intel + Windows builds in progress)
Download v1.9.20 (.dmg)
≈ 53 MB · macOS 12+ · Apple Silicon (M1 / M2 / M3 / M4)
Not sure which one?

Both ship the same TableTop Forge server software, the same plugin contract, the same multi-device LAN access. They differ only in how the database and runtime get packaged.

If you're on a Mac at the table and want it to "just work" — pick the .app. Drag it to Applications, double-click, you're done.

If you want to host the server on a separate machine (a home server, a NUC, a Linux box, a desktop PC sitting in another room), or you already use Docker for other things — pick the Docker stack. It's also the only option for Windows or Linux right now.

View source on GitHub
Player Companion Apps

Native Stats / Abilities / Inventory / Spells client for tablets & phones. Connects to your hosted server via the same code your players use on the web.

Android APK (v1.9.17) Google Play — Coming Soon App Store (iOS / macOS) — Coming Soon
Android (sideload, available now): direct download of the signed APK above. Settings → Apps → Special access → Install unknown apps · enable for your browser, then tap the .apk to install. The site build also self-updates: every release prompts in the Settings → App tab.
Android (Google Play, coming soon): the same app under the same TableTop Forge name will be available on Google Play once the Internal-testing track + listing review clear — no in-app sideload prompt, just a normal Play install + auto-update. Sign up for the testing track via the link that lands here once the listing goes public.
App Store (iOS + macOS, coming soon): a single Mac Catalyst binary covers iPhone, iPad, and Mac. Listed once on the App Store as TableTop Forge Companion; the same install reaches every Apple device signed in to your Apple ID. Pending review.
Also from Giant Mushroom Studio

More Tools for Your Campaign

Support the Project

TableTop Forge is completely free and always will be. If it helps your sessions run smoother and you'd like to say thanks, buying me a coffee keeps the forge burning.