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
Tell the story of your battles in Warhammer: The Old World
Sign in
You're joining a campaign: sign in, or create an account, and you'll be added.
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 your existing army from Old World Builder. To do so, select your built army, then select the menu in the top right → Export → Download as .owb.json. Import that file below.
Public lists can be viewed by anyone in Open play. Otherwise only players you've accepted a challenge with can see it.
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…
Magic items
History
Battalions
Reading your rolls…
Waiting on you
Game nights
More game nights
Opponent
Choose a registered player — their army needs to be visible to track kills and victory points. They'll need to accept before the battle begins. No opponent available? You can still play unscored, for solo practice.
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.
No opponent on Scriptorium: pick one of the rules’ scenarios, or build your own. The battle isn't scored.
Free play: pick one of the rules’ scenarios, or build your own, then send the request. The battle isn't scored.
Waiting for a response
Waiting for your opponent to accept…
Spells for this battle
Roll and tick which spells your wizards know for this battle — specific spells are rolled fresh each battle (the lore each wizard specialises in is set on the Muster list tab). Each wizard knows one spell per wizard level.
Waiting for your opponent
Waiting for them to confirm they’re ready…
Waiting
···
Round 1
Strategic locations held
The battle’s reached its turn limit — ready to end the battle?
Victory points so far
Scoring so far
Reading your rolls…
End of battle
Mark what happened to your opponent's units — that's what earns you victory points.
Mark what happened to your own units — that's what earns your opponent victory points.
Strategic objectives held at the end
Warpstone objective
Recording…
Player rosters
Map
Your record
Grudges
Campaign standings
How each alliance is doing, tallied live from every battle logged.
Counting the slain…
Rank perks
My alliance
Loading…
Setting up
The tournament
Needs your attention
Fun stats
Battles each week
Alliance standings
Campaign points, bonuses included
Calls for an organiser
Add an event:
Campaign stats
Top generals
Battles awaiting confirmation
Logged by one player, not yet confirmed by their opponent. Nothing counts until the opponent confirms. Confirming here applies the result exactly as the opponent would.
This phase
Reading the muster roll…
Outstanding battles
Alliance campaign points
Each alliance’s total from logged battles, plus any bonuses or penalties you award.
Recent adjustments
The reason shows in the recent adjustments.
Invite
Join code
Share join link copies an invitation ready to paste into WhatsApp (on a phone, it opens the share menu). Or print the QR code for the club noticeboard: new players open it, sign up and are added automatically. They can also type the code in Account. A new code stops the old code, link and QR code working.
They’re added straight away, even if the event is full, and get a notification.
Players
Check-in
On the day: tick everyone who’s here, drop anyone who hasn’t turned up, then lock the entrants.
Waiting list
The event is full, so these players are waiting for a place. When someone drops out before check-in, the first in line gets the place and a notification.
Alliances
The teams on the standings hub.
Entered battles count straight away. They don’t award unit experience, since there’s no unit detail to award it from.
Rounds
Lists
Lock the lists so they stop changing, then reveal them to everyone. Each player’s list is in Players.
Players can’t import a new list or add or remove units. You still can. Experience and wounds still change in battle.
Whether players can see each other’s lists. Lock the lists first to stop changes. For a tournament, lists can be revealed once they’re locked.
Finalise and send
Scenarios
This campaign
The rules’ scenarios
The rulebook, Matched Play Guide, narrative and Battle March scenarios, which every player can pick. Copy one into this campaign to change it; your campaign’s own scenarios only show in its battles and events, not free play.
Battlefield map generator
Roll terrain and lay out a table for any scenario. Save it as an image, or add it to the map library so scenarios can use it.
Custom objectives
Announcements
Short logistics posts — “Phase 3 starts Friday” — shown to players near the top of the app, newest first. Always visible once posted, unlike the narrative pages 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 › Settings.
How players will see it, at the top of their updates:
Cover photo
Adding the photo…
Game nights
List the campaign’s gaming nights and tournament days so players can book a table. Once the tables are full, later bookings join a waiting list and move up when someone cancels. Tickets are still bought in your shop: add each night’s ticket link and players get a button to it.
nights in a row, a week apart
Tickets are bought in your shop; players get a button to this link.
Phases
Each phase is a stretch of the campaign with its own scenarios: each scenario is one battle for each player. Only one phase is played at a time; you start and finish them in Run.
No phases yet: the campaign plays without scenario limits until you add one.
Each scenario is one battle for each player in this 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.
Leave a name blank and nobody gets a perk for that place.
Phases
Start each phase when it’s time to play it, and finish it when it’s done: finishing one awards the rank perks. Swipe between them to see how each is going.
No phases yet. Add them in Set up.
Awards
Best painted, best sportsman, best chronicler, or your own. Open voting and each player gets one secret vote per award; you see the totals. Or skip the vote and name a winner yourself. Winners show on their record and in standings, and everyone's told.
Battles in progress
Battles and requests still open in this campaign. You’re notified when one has been quiet for 3 hours; after 24 hours with no result sent, it closes itself. Closing one ends it for both players and records nothing.
Battle log
Fix a mis-entered result or points total, or remove a bad entry. Deleting a battle reverses any experience it granted. Add a battle nobody logged in Game view, including one with three or more players.
Reading the muster roll…
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.
Lists over this are flagged when you pick entrants. You can change all of this later with Edit details.
Map
Allegiances
Supply and Warpstone
Warpstone objectives
History
Lists over this are flagged when you pick entrants; you can still tick them in.
minutes
Shows a countdown to you and the players once a round starts. Blank for no timer.
Scenarios for each round are now chosen as the round comes up, in Rounds.
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.
Rounds start once the entrants are locked and the tournament has started.
Battles
Current round
Print and more
Print
Less often
Standings
The final round's result is hidden from players until you reveal it.
Ties are split by VP difference, then strength of schedule (the total score of everyone you played), then head-to-head.
Bonuses and penalties
Soft scores
Each player’s painting score, sportsmanship total and favourite army votes, as your judges and score sheets have them. Best Overall weighs each against the best in the field.
Score changes
Every change to a result, Victory Points, bonus or penalty: when, who made it, and what it was before.
Downloads
For a rankings site such as Old World Rankings, or your own spreadsheet.
Standings appear once the first round starts.
Entrants
Use a minus for a penalty, such as −1. Players see the reason beside the standings.
A new entrant only plays from the next round’s pairings.
Ready to start
Check-in
Entrants
Quests
Finalised: unlock to change anything.
Campaign settings
Name
What everyone sees the event called: on Play, in invites and in the player pack.
Format
Campaign or tournament. Set once, when the event is made.
Battles
Normal battles or Battle March, for the whole event, and the points limit for every army. Battle March is played at up to 750 points on a smaller table, with its own scenarios. Every scenario for the event is made for this.
Dates
The day (or days) it runs. Leave either end blank if it’s not settled yet.
Max players
How many can join with the code or link. Past that, players go on the waiting list. Organisers can always add players.
Notes
Anything else players need to know, such as what to bring, food and parking. Shown on Play and in the player pack.
Campaign points
The campaign points each result earns towards the campaign standings.
Scoring and ranking
Scoring
How a battle’s result turns into tournament points.
Byes
What a player gets for sitting out a round when there’s an odd number of players.
Tiebreaks
When players are level on points, these decide who’s higher, in this order.
Final ranking
Best General ranks on battles alone. Best Overall adds the soft scores, by their share.
Pairings and extras
Pairings
How players are matched each round: round 1, which table the top players take, and who’s kept apart.
Soft scores
Awards outside the battles themselves: painting, sportsmanship and favourite army.
Comp
Rules to balance the armies, such as Square Based Comp’s tiers of extra points.
Leave either blank if it’s not settled yet.
Caps self-service joins (the join code or link). You and other organisers or platform admins can always be added past it.
How close a battle must be to count as a draw. 0 means only an exact tie.
With an odd number of players, the lowest-ranked player who hasn’t had a bye gets it.
When players are level on points, these decide who’s higher, in this order. The official order puts total VP first; secondary-objective VP and Generals slain aren’t recorded per battle yet.
Keep apart
Always in round 1, and in later rounds where the scores allow. Players set their club in Account.
Awards outside the battles themselves. Turn on the ones you’re running; with Best Overall, each counts for its share of the overall score. Scores are entered on the day.
Each tier gets extra points to build with, and a kill point modifier: the VP an opponent scores against that army are multiplied by it. Players pick their tier on their Lists page; you can correct it in Players. No single character or unit may cost over 500 points (the Arachnarok excepted).
Applies to battles logged from now on; battles already logged keep their points.
Switches
Write pages in Campaign › Story first, then switch this on when you’re ready for players to read them.
Shared posts show photos and stories only, under “All campaigns”. Switching this off hides them from other campaigns straight away.
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 changing their own alliance from Muster list. You can still reassign anyone from Membership.
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.
Campaigns
Every campaign on Scriptorium, players’ drafts included. Anyone signed in can start one with the campaign builder and becomes its organiser.
Opened to players straight away. You become its organiser; set the rest up in the admin tabs.
Set once. A tournament has no narrative chapters and no alliances; its standings track the tournament, set up in Events › Tournaments once players have joined.
Delete campaign
Deletes whichever campaign is currently selected (the switcher in Account) — it and everything in it: rosters, battles, standings, narrative. Permanent, and superadmin-only. To wrap up a season without losing anything, use End campaign in Campaign › Settings instead.
Every organiser of this campaign gets a notification with your name, who you're playing and your table.
Declare a grudge
Name your rival and what they did. If they accept, your next battle against each other settles it, and the whole campaign gets to watch.
Accept, and your next battle against them settles it. Decline, and it goes no further.
Vote for the awards
One vote per award, for anyone in the campaign but yourself. Votes are secret: nobody else sees yours, organisers included. You can change your mind until voting closes.
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.
Set up two-factor login
Scan this with an authenticator app on your phone, such as Google Authenticator, Microsoft Authenticator or 1Password. From then on, signing in asks for the 6-digit code it shows.
Can’t scan it? Enter this key in the app instead:
Enter your code
Open your authenticator app and type the 6-digit code it shows for The Scriptorium.
Lost your phone? Ask an organiser to contact the Scriptorium admin to reset it.
Reset your password
Enter the email address on your account and we'll send a reset link to it. If you never added one, ask an organiser to reset your password.
Set a new password
Battle 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.