Your table, your data. All local.
GM Vault keeps your NPCs, session notes, and initiative order in one app that runs on your own machine. No account. No subscription. One SQLite file you can copy to a USB stick.
Foundry Floor Ambush
Live, not a picture β tap the HP buttons
Every record type lives in the same searchable place, with tags, quick stats, and Markdown descriptions. These are the real counts from the sample campaign that ships with it β Cinders of the Aether Engine, a magitek city-state held up by an engine somebody is sabotaging.
Everything you touch while four players wait on you is a target you can hit without looking: 48px minimum, bottom tabs, dark by default, and as little typing as the job allows.
Round and turn tracking, add or drop combatants mid-fight, and big β5 / β1 / +1 / +5 HP buttons. The tracker saves itself, so closing the tab by accident costs you nothing.
Full notation without the keyboard β 2d6+3, 4d6kh3, advantage as 2d20kh1+5. Save the formulas you roll every session and keep a running history.
A session editor with live preview, sorted by session date. Search across every NPC, place, faction, and item as you type β no menus to dig through when a player names someone you forgot.
Most campaign managers are a subscription with your world inside it. If the company folds or the price changes, your prep is hostage. GM Vault inverts that.
"format": "gm-vault-campaign", "version": 1, "campaign": { "name": "Cinders of the Aether Engine", "setting": "Voltengard" }, "records": [ β¦ ], "notes": [ β¦ ], "formulas": [ β¦ ]
You need Node 20+. There is no installer, no account step, and no first-run wizard β it comes up already holding a sample campaign so every screen has something in it.
git clone https://github.com/Eltacolibre/gm-vault
cd gm-vault
cd server && npm install && npm run dev
# in a second terminal
cd client && npm install && npm run dev
Then open localhost:5173. To reach it from your phone, start Vite with --host and use your computerβs LAN IP β 192.168.1.20:5173 or similar.
A Dockerfile and a docker-compose.yml ship with the repo too, meant to serve the app on localhost:8580 in one command. Be careful: that image build is untested, because I do not have Docker installed. Treat it as a starting point, not a supported path.
On the roadmap
Prep on a laptop, run at the table on a phone. End-to-end encrypted sync between your own devices is in development as a paid tier β and the local app stays free and offline-first either way. That promise is the product; it will not be paywalled.