A Warmaster Revolution army list builder — clean, fast, and entirely client-side. Lists auto-save to browser local storage and can be shared via URL. Available at warmuster.net and built for deployment on Cloudflare Pages.
Requires Node.js >=22.12.0.
npm ci
npm run dev # dev server
npm test # data validation + unit tests
npm run test:layout # Playwright card-layout tests (needs: npx playwright install chromium)
npm run build # production build (dist/)Army data is generated from the Markdown source lists, per schema.md:
npm run generate:data # data/source/WMR_Armies_*.md + data/curation/ -> src/data/generated/
npm run scouting:data # assign scouting values and regenerate the scouting audit report
npm run validate:data # sanity-check the generated JSON
npm run generate:diff # compare against data/previous/ snapshot (if present)data/source/WMR_Armies_2.26_army_lists.md— raw source tables (kept in the repo).data/curation/— persistent curated normalization (facing/flying/speed overrides, mount eligibility, split special rules). Reapplied on every conversion; entries carry asourcehash so changed source text is flagged for review. This is the source of truth and is edited directly.data/intermediate/units.json— generated snapshot of the parsed source rows (raw special text + hashes); regenerated bygenerate:data, useful for reviewing source diffs.src/data/generated/— final app JSON. Regenerated, never hand-edited.reports/— normalization and version-diff reports.scripts/archive/— one-time bootstrap scripts that produced the initialdata/curation/; kept for reference, not part of the regular pipeline. See scripts/archive/README.md.
See roadmap.md for the project roadmap.
Configuration offers three independently saved rule sets: Warmaster Revolution, WMR - 2026 Playtest, and A Matter of Mustaches. The 2026 Playtest begins as a complete copy of Warmaster Revolution but has its own rule-set ID, army data objects, lists, folders, and import preferences so it can diverge safely.
Each path opens Warmuster with that rule set selected, saves the selection, and then returns the address bar to the base URL:
- Warmaster Revolution: warmuster.net/WMR
- WMR - 2026 Playtest: warmuster.net/WMR-2026-playtest
- A Matter of Mustaches: warmuster.net/A-Matter-of-Mustaches
Enable Scouting from Configuration to show generated scouting points in the unit catalog, commit checkboxes and totals for each configured stack in the roster, and the committed scouting total at the top of the rules printout. The adjacent information button contains the deployment procedure and the Flyers/Scouts/Patrols table.
The Scouting display preference is stored in the browser. Unit and character commitments are stored on the army list, including backups and shared lists. Toggling a multi-copy stack commits one copy and splits it from the uncommitted copies. Flying mounts and attached Scout/Patrol upgrades use the higher of the parent and upgrade values.
scripts/apply-scouting.mjs assigns values programmatically from structured troop type, armour,
Flying subtype, and the named exceptions in the rule table. It updates the Revolution army JSON,
builds the derived Playtest and A Matter of Mustaches lookups in
src/data/generated/scouting-points.json, and
writes reports/scouting-points.md, grouped by rule set, army, and scouting value 3 through 0.
npm run generate:data runs this step automatically after rebuilding the base army tables.
Warmuster is an unofficial, non-commercial fan project, not affiliated with or endorsed by Games Workshop.
Original source code is licensed under the MIT License. Game data, trademarks, and bundled fonts are subject to separate terms described in THIRD_PARTY_NOTICES.md.
The Privacy, Changelog, Roadmap, and Credits dialogs are maintained as Markdown files in src/content/info/. InfoDialog.tsx imports them as raw text and MarkdownContent.tsx renders headings, paragraphs, bullet lists, and external links. Update the Markdown files to change the dialog copy; no component edit is required.