On the hills surrounding the fields of battle,where skulls are crushed by mighty warhammers,warriors in plate clash with monsters from the cold north,and those who can command the winds of magic turn the living to ash.
The scribes watch, and do not look away.
Every deed is weighed.
Every death is recorded.
All of it is written in
The Scriptorium
The Scriptorium
Vol 1: The Season of Skulls
This file needs your Supabase keys before it can connect.
Open this file in a text editor and find the CONFIG block near the top of the script.
In Supabase, go to Project Settings → API and copy two things:
your Project URL, and the public key (labelled "anon public", or "publishable" on newer projects).
Paste them in, save, and reopen. Never use the "service_role" / "secret" key here.
Seeing this on a phone, or after opening the file directly (e.g. from Files, Messages
or email) rather than a web link? The keys are probably already set — phone browsers
block the page's connection code from running when it's opened as a local file rather
than loaded from a proper https://… address. Ask whoever shared it
with you for the hosted link instead.
The Scriptorium
Vol 1: The Season of Skulls
Offline for maintenance.
We're rolling out campaign support behind the scenes. Nothing has been lost —
check back soon.
The Scriptorium
Vol 1: The Season of Skulls
Sign in to view your warband.
You're joining a campaign — sign in to carry on, or create an account below if you're new.
New to the campaign?
The Scriptorium
Vol 1: The Season of Skulls
A username, a password and an email address — or sign in with Google below.
You're joining a campaign — just create your account below and you'll be added automatically.
Already enlisted?
The Scriptorium
Vol 1: The Season of Skulls
Viewing as — read-only, nothing here can be changed or saved.
This campaign has ended — no new battles can be logged, and it’s no longer accepting new players.
Join a campaign to get started.
This app uses lists made with Old World Builder to manage your campaign. As you go through the campaign, you can import new units later; just make sure you keep the same list options in your Old World Builder. You'll need to export the list as an Old World Builder owb.json file, then drag and drop it into the importer below.
Import army
Upload an Old World Builder export (.owb.json) to load or replace your roster.
Lost your Old World Builder file? Grab a fresh copy of exactly what's stored here, so your next edit starts from the right place.
You already have a roster. Choose how to apply this file:
Replacing loses every unit’s XP, veteran abilities and wound history for good. Use “Add to existing roster” if you want to keep growing your current list instead.
Inscribing…
Reading your rolls…
Get your list set up on the Muster List tab first — wizards' lore of magic and experience points are locked in there. Which specific spells they know gets picked fresh right before each game. When you're ready to play, start a game.
Free play uses the same tools below but isn’t scored — no XP, Campaign points or round progress.
Opponent
Choose a registered player — their army needs to be visible to track kills and victory points. They'll need to accept before the game begins.
Skips straight to Game view for solo practice — still unscored, like Free play.
Scenario
Game aid gives you a live turn counter and spell reference during the battle. Skipping goes straight to logging results once the request's accepted — for a battle you're playing (or already played) without the app's help.
Waiting for a response
Waiting for your opponent to accept…
Spells for this game
Roll and tick which spells your wizards know for this battle — specific spells are rolled fresh each game (the lore each wizard specialises in is set on the Muster List tab).
Waiting for your opponent
Waiting for them to confirm they’re ready…
Waiting
Confirm the result
Round 1
The battle’s reached its turn limit — ready to end the game?
Reading your rolls…
What you scored
Mark what happened to your opponent's units — that's what earns you victory points.
Reading their roster…
What they scored
Mark what happened to your own units — that's what earns your opponent victory points.
Confirm & submit
Recording…
Player rosters
Browse any campaign member's army list at a glance — faction, units, and what they're equipped with.
Lists themselves become visible once the organiser locks them in for this round — until then you can see who's playing, but not what they've brought.
Campaign standings
How each alliance is doing, tallied live from every battle logged.
Counting the slain…
Rank perks
My alliance
Loading…
Narrative updates
The story so far.
Turning the pages…
Campaign stats
Muster lists
Top generals
Battles awaiting confirmation
Logged by one player, not yet confirmed by their opponent — these earn nobody Campaign Points or XP until confirmed. Confirming here applies the result exactly as the opponent confirming it would.
Tournament
Reading the muster roll…
This round
Reading the muster roll…
Outstanding games
Alliance campaign points
Each alliance's total from logged battles, plus any manual bonuses/penalties you've awarded below.
Award points
Recent adjustments
Membership
Everyone in this campaign, their faction and alliance.
Show membership
0 selected
Reading the muster roll…
Game log
Fix a mis-entered result or points total, or remove a bad entry. Deleting a battle reverses any experience it granted.
Show game log
Reading the muster roll…
Alliances
The teams on the standings hub.
Show alliances
Scenarios
This campaign's custom scenarios.
Bulk import scenarios (CSV)
Every field the wizard has, one row per scenario — handy if you draft scenarios in a spreadsheet. Map images aren't part of this: upload them once in Admin → Maps and just reference the map's name in the deployment_type column.
Inscribing…
Official templates
Visible to every campaign. Copy one into this campaign to customise it.
Scenario name
Deployment map
Choose a map, or upload a new one.
Objectives
Toggle on the objectives available in this scenario. Victory point values default to the standard scoring — adjust them only if you want to tune this specific game.
Bespoke objectives with their own rewards. Pick from ones already created, or add a new one.
Add a new custom objective
Turn limit & special rules
Add each rule as its own entry — easier to read than one long paragraph. **bold** and _italic_ markup both work.
Announcements
Short logistics posts — "Round 3 starts Friday" — shown to players near the top of the app, newest first. Always visible once posted, unlike Narrative updates below.
Narrative updates
Pages of this campaign's ongoing story, shown to players in order as a click-through book. Switch the tab on for players in Campaign Admin.
New page
Supports **bold** and *italic*.
Phases / rounds
Pre-set a run of scenarios for a round — each one is a single hard game slot, used up once a player submits that game. Only one phase can be active at a time; players see just that phase's remaining scenarios in Game View until you mark it completed.
New phase
Rank perks
A narrative rule for whichever alliance ranks 1st/2nd/3rd in Campaign Points — awarded automatically when you mark a phase completed, using whatever's saved here at that moment. Editing this afterwards doesn't change perks already awarded.
Tournaments
Self-contained Swiss, single-elimination or round-robin events — either a quick mini-tournament alongside the ongoing campaign, or (if this campaign's format is Tournament) the whole campaign.
New tournament
How many rounds to plan scenarios for. Exact for Swiss; round-robin/elimination recompute the real count once entrants are locked, but this decides how many scenario slots you can set up now.
Max points — at or under is fine, over is flagged and holds back auto-picking that entrant in the picker below. Doesn't block anything — you can always tick them in anyway. Change it any time from Tournament Setup.
This tournament hasn’t started yet — pick entrants, set round scenarios and start it from Tournament Setup.
Current round
Send this back to Tournament Setup to change entrants or scenarios. Entrants stay locked in; round scenarios are kept.
Standings
The final round's result is hidden from players until you reveal it.
Entrants
A new or withdrawn entrant only takes effect from the next round's pairings.
Tournament setup
Pick or create a tournament in Tournament Admin first.
Round scenarios
Set a scenario for each planned round — you can do this before entrants are locked.
Entrants
Pick who's playing, then lock the list. The number of rounds is fixed once you lock.
A submitted list over this is flagged below and won't auto-pick — you can still tick them in regardless.
Campaign settings
Share this link instead of the code — new players just click it, sign up, and are added automatically.
Caps self-service joins (the join code / link). You and other organisers or platform admins can always be added past it.
Write pages in Narrative Admin first, then switch this on when you're ready for players to read them.
Unit XP, Veteran Abilities/Seasoned Commander rolls, and Battlefield Losses/Death & Dishonour. Turning this off just hides it — nothing already earned is lost, and it can be switched back on later.
Stops players from changing their own alliance from Muster List. You can still reassign anyone from Membership regardless.
Campaign points per game
How many Campaign Points each result awards, and the Victory Point margin that defines each tier. Applies to battles logged from now on — already-logged games keep their points.
Result
VP margin
CP
Crushing Victory
+
Major Victory
+
Minor Victory
+
Draw (below Minor margin)
—
each
Defeat (any margin)
—
View as player
See an actual player's Muster list — their real roster, faction theme and units — read-only. Nothing can be edited or saved while viewing.
Audit trail
Who changed what — membership, scenarios, phases, alliances, campaign settings, and any organiser edits to a player's battle log.
Reading the muster roll…
Danger zone
While on: no new battles can be logged and no new players can join. Nothing is deleted or hidden — standings, rosters and narrative stay fully readable, and it can be switched back on at any time. Use this once a season wraps up.
Players
Every player on the platform and their rank — not just this campaign's roster.
Show players
Create campaign
Set once at creation. A tournament-format campaign has no narrative chapters and no alliances — the standings tab tracks the tournament instead. Create its rounds in Tournament Admin once players have joined.
Delete campaign
Deletes whichever campaign is currently selected (the switcher in Account settings) — removes it and everything in it: rosters, games, standings, narrative. Permanent, and superadmin-only. To just wrap up a season without losing data, use End campaign in Campaign Admin instead.
This changes how you appear in the app and to other players — and it's also what you'll need to type to sign in from now on (or you can always sign in with your email address instead).
Spells known
Welcome to Scriptorium!
Pick a colour theme
Just a look for the app — the faction shown next to your name follows whatever army you import, not this pick.
Add your email address
So you can reset your own password if you forget it — this is a one-time step, and it's only ever used for account recovery.
Reset your password
Enter your username — if your account has a real email on file, we'll send a reset link to it.
Set a new password
Game request
General
Reconcile your list
This file doesn’t line up perfectly with your current roster. Match an old unit to a new one to carry over its XP, veteran abilities and wounds — or mark it as no longer in your list to keep it as history.
Review scenario
This is what players will see when they select this scenario in Game view.