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.

    ResultVP marginCP
    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.