A shared battle map for play-by-post D&D — drag tokens, measure distances, post positions to Discord.
Distance
Switch to Measure, then tap two tokens.
Roster tap a name to select
Edit token
Live sync
Not configured — running in local mode.
Signed in as . Your edits push to every player instantly.
One-time setup for your domain (DM does this once)
The map page itself is static, so you can host it anywhere your domain points (Netlify, GitHub Pages, cPanel, S3…). The shared, real-time state lives in a free Firebase Realtime Database:
1. Go to console.firebase.google.com and create a free project.
2. Build → Authentication → Sign-in method → enable Email/Password. In the Users tab, add one user: the DM's email and a password. Copy the user's UID.
3. Build → Realtime Database → Create database. In the Rules tab paste (with the real UID): {
"rules": {
"scenes": {
".read": true,
".write": "auth != null &&
auth.uid === 'PASTE_DM_UID_HERE'"
}
}
}
4. Project settings → Your apps → add a Web app. Copy the firebaseConfig object it shows.
5. Open this HTML file in a text editor, find FIREBASE_CONFIG near the top of the script, and paste the config in.
6. Upload the file to your domain and share the URL. Players just open it; only the DM signs in.
These rules are what actually enforce “DM-only” — the database rejects writes from anyone else, so hiding the login box is cosmetic, not the security.
Share with your group
How to use this map
Move tokens: drag any circle. It snaps to 5-ft squares. Each page (/moxie, /nyx\u2026) is its own map with its own saved scene.
Measure: tap the Measure mode, then tap two tokens. You get the grid distance (D&D squares) and, if one of them is elevated, the true line distance for ranged attacks.
Squares are named like a chessboard (E7), so you can post moves in Discord: “Kira drops from the tree and moves to D6.”
Copy positions as text posts a readable summary of everyone’s location for players taking turns later.
Export / Load: whoever takes their turn exports the scene and pastes the block into Discord; the next player pastes it back in and presses Load. The map has no server — the text block is the save file.