Dwaalhof
Wegen naar Roem — a court game of roads, dice and nine houses
- HTML
- CSS
- Vanilla JavaScript
- PWA
- Docker
A local hotseat board game for two players: one device, taking turns, no
server, no account, no internet. Open it and play. There is nothing to
install — no npm install, no bundler, no build step — and it installs as a
PWA, or runs with docker compose up.
The project's iron law is zero external network requests: no CDN, no webfont stylesheet, no remote image, no analytics. The typefaces live in the repository, the icons are SVG in the code, the sounds are base64. The game has to behave the same on a plane as it does at home.
The goal
Collect the most Aanzien — standing. Two players each send three pawns across a road network that lies differently every match, looking for nine houses. A match lasts six rounds, so twelve turns in all. After the sixth round whoever carries the most Aanzien wins, and that is the whole score.
The four resources are tools, not points. Relaties (connections) buy reach in the walking phase, and a court office. Reputatie grows your dice pool permanently. Geld (money) buys loose dice and endowments. Gunst (favour) bends a roll that has already landed. At the end all four are worth nothing — anyone left holding a pile of resources collected tools and built nothing with them.
The board
A hexagonal grid of radius 5: 91 fields, cut into an irregular coastline afresh every match, so the land lies like an island in the sea. Ten fields do something: the Stadsplein at the heart, where all six pawns begin, and nine houses that move every match — Gilde, Poorterij, Gasthuys, Bank, Molens, Brouwerij, Taverne, Kerk and Bibliotheek. No two buildings are ever adjacent.
Between them lie shuffled path tiles — straight, bend, T-junction, crossroads — and you can rotate those during play. If you cannot find the road, you make it: a tile's first turn costs a step, and after that the same tile turns freely. One or two lakes and two to four forest tiles are not walls but expensive crossings: go round, jump over for two connections, or find a bridge. At most two bridges to a board, and those never turn.
Four phases a turn
- Trekken (draw) — four court cards lie face up in a shared market; you take one. What you leave lies there for your opponent.
- Lopen (walk) — roll two dice and spread the pips freely as steps across your three pawns. Moving is a draft: nothing is real until you confirm.
- Actie kiezen (choose) — for every pawn standing at a house, commit to one of the two actions there. No dice yet.
- Werpen (roll) — one court roll for all your actions at once, then bend it with favour, then activate cards, then settle.
Two roads at every house
Every house offers exactly two choices, and the difference is the currency.
The low road pays a resource and has no threshold. It always pays out; the roll only decides how much, and never less than 1. It also establishes a trading post, which yields income every turn and unlocks the high road at that house.
The high road pays Aanzien against a threshold: 9, 11 or 13, for 1, 2 or 4 Aanzien respectively. Miss the threshold and the action yields 1 Gunst as consolation. Aanzien is the final score, and a final score should never be free.
Because every action in a turn reads the same sum, you always clear a contiguous stretch of the ladder: roll 13 and you have cleared 11 and 9 as well. A turn is therefore about how high you reached, not about which action came off.
The dice
Ordinary six-sided dice only, in two rolls a turn. The walking roll is always two dice. The court roll uses your dice pool: two at the start, three from 3 Reputatie, four from 7, five from 12 and six from 18, which is the ceiling. For a single roll you can buy extra dice with money, and only before you throw.
With Gunst you may bend the roll after the dice land: reroll the lowest die (1 favour), raise it by one (2), or add a die (3). At most three bends a roll, and never more than six dice.
What it is made of
Hand-written HTML, CSS and vanilla JavaScript. No framework, no build, no
package.json. The style is pen and ink with a watercolour wash on parchment:
brown-black ink, never pure black, and the lightest surface is parchment,
never white. Everything on the board is vector and generated in code, bar one
parchment texture and a handful of medieval plates — those are public domain,
and they hang on the walls of this room.
In the hall
- The dice
- Ordinary six-sided dice only, in two rolls a turn. The walking roll is always two dice; the pips are your steps and you split them freely across three pawns. The court roll uses your dice pool: two at the start, more as your Reputation grows, six at most. That single roll settles all your actions at once. Favour lets you bend it after it has landed — reroll the lowest die, nudge it up by one, or add a die.
- The court market
- Four cards lie face up, shared by both players, and at the start of your turn you take one. What you leave is there for your opponent: taking is also denying. Beside them runs a second row of commissions — the nearest is free, and every place deeper costs a Relation. A card is only activated after the roll, at a fixed cost in pips taken off that same total.
- The board
- A hex grid of 91 tiles, cut into its own coastline afresh every match. Ten tiles do something: the Town Square at its heart, where all six pawns start, and nine houses that move every match. Between them lie shuffled path tiles — straight, bend, T-junction, crossroads — and you turn those yourself as you play. If there is no road where you want to go, you turn one towards you. Lakes and woodland are not walls but expensive crossings: go round, jump over, or find a bridge.
- The manuscripts
- Three leaves lie here in the case; two more hang on the wall. All five are public domain, and the game itself uses all five. What follows is about the leaves themselves — where they come from and what is actually depicted. What the game does with them comes last. Roundel Bible moralisée, 13th century. Public domain. A Bible moralisée is a picture Bible with a fixed recipe: every page stacks roundels in two columns, each a scene from Scripture with the moralisation beneath it — what that scene means for the reader. This is one of those commentary roundels, not the scene itself. On a gold ground two couples embrace. Behind them stand two devils: a small horned one holding something aloft, and a larger one with an ass's head in a red cloak, leaning over the right-hand pair. Those devils are not part of any story and nobody in the picture sees them. They are the gloss: they are there to say what the embrace is — desire prompted from outside. That is the genre's standard device, and it is why such roundels are so full of devils. Which manuscript this leaf comes from is not recorded. Several thirteenth-century Bibles moralisées survive, and the source of this fragment did not travel with the file. In the game this is the picture on the court cards that strike your opponent: the sting comes from the side. Marginalia Thirteenth- or fourteenth-century manuscript, illuminator unknown. Public domain. In the margin beside a blue initial lies a creature with an animal's hindquarters — tawny, clawed, long-tailed — joined to a human arm in a blue sleeve with the index finger extended. Two things meet here. The creature is a drollery: the half-beast, half-something-else figures illuminators drew in the margins, busy with things the text never mentions. Often that is the only trace of the artist's own humour in an otherwise solemn book. The pointing hand is a manicula, the medieval reader's “this is the bit” — added by hand in the margin, and the ancestor of the arrow in a bulleted list. Here they have become one figure: the pointer has grown a body. This leaf's source is not recorded either. In the game it sits beside the rulebook's contents, where a pointing finger still does what it always did. Sea serpent Olaus Magnus, Carta Marina, Venice 1539. Public domain. A red serpent coils around a ship and rears its head over the deck. Beside it lies a second monster like a crested crocodile; further off two ships sail along the coast of “Hegalandia, terra nobilium”, and a sounding is marked in the water. The straight lines crossing the sea are rhumb lines, which a helmsman laid his course along. Olaus Magnus was an exiled Swedish archbishop, and the Carta Marina is the first detailed map of the Nordic countries. The monsters on it are not decoration and not a joke. He meant them as warnings and published a separate key explaining each beast in turn; sailors' accounts of whales, squid and walruses reached the page as monsters by that route. This is how, in 1539, you put on a map that a stretch of sea is dangerous. In the game, the lake monsters on the board are drawn from this.
- The rulebook
- The full court regulation sits inside the game itself, as an illuminated parchment leaf with contents, initials and real fragments of play as illustration. Thirteen chapters: aim, materials, setup, the four phases, the nine houses, the court events, the court cards, the court, and the final count. What is on these walls is the summary you can sit down with; the page beneath this hall carries the rest.
- Four phases, six rounds
- Every turn runs through four fixed phases, always in the same order: draw, walk, choose an action, roll. At each house where a pawn stands you pick one of two roads. The low road pays a resource and has no threshold; the roll only decides how much. The high road pays Standing against a threshold of 9, 11 or 13, for 1, 2 or 4 — miss it and you get 1 Favour. After six rounds, whoever holds the most Standing wins. Relations, Reputation, Money and Favour are worth nothing at the end: they are tools, not score.
- The harness
- Not a historical object but hall dressing, built here out of simple shapes. It stands here because this hall is dressed as medieval; the game itself has no knights. What is genuinely medieval in this room hangs on the wall and lies in the case.
- The sea serpent
- Eight and a half metres, slung from the hall's beams the way a natural history museum hangs a whale. It comes from Olaus Magnus's Carta Marina, Venice 1539 — that leaf is in the case — and reached this room by way of the game: the lake monsters on the board are drawn from the same picture. On the map it is two centimetres long and coiled around a ship. Here it is at the size Olaus claimed for it himself. Vermilion over a pale belly, and a row of separate spines along its back: that is how the map colours it, and it is why the back has no continuous ridge. Nothing else about it is genuine — it was built here out of one swept tube. What is genuine is the print it came from.
On the wall and in the case

Courtly scene — Codex Manesse, Zurich, about 1300–1340. Heidelberg University Library, Cod. Pal. germ. 848. Public domain. A woman in a fur-lined mantle holds a lapdog and offers her hand to a man kneeling before her; his own hands are raised to receive it. The gesture is borrowed. Kneeling with raised hands between another's is the immixtio manuum, by which a vassal swore fealty to his lord. Courtly love poetry took the whole gesture over: the poet serves his lady as a man serves his lord. So this is an oath, not a flirtation — and she stands while he kneels. The rest of the picture says the same. The lapdog is a standing attribute of a noblewoman, and the rose bush growing up between them is the flower of Minne. Behind the figures the Middle High German verse shows through the parchment. The Codex Manesse is the largest surviving collection of Middle High German song: 137 full-page miniatures, one per poet, each with his arms. Which poet this leaf belongs to is not recorded with this detail. In the game this opens the name screen: “Who enters the court?” 
Fight scene — Codex Manesse, Zurich, about 1300–1340. Heidelberg University Library, Cod. Pal. germ. 848. Public domain. Five men with drawn swords press in on one man in the middle. They wear padded caps; he does not. His hair is loose, his hands go to his head, and his own dagger still hangs at his belt — he has not drawn. One sword is already raised above him and two others have his arms. This is not a duel and not a tournament. Those this manuscript draws with harness, helm and shield, and with two equal sides. Here the whole composition is the inequality: five against one, and the moment before the last blow. In the game this closes the end screen, above the final scores. Six rounds of contest for the court, settled here. 
Roundel — Bible moralisée, 13th century. Public domain. A Bible moralisée is a picture Bible with a fixed recipe: every page stacks roundels in two columns, each a scene from Scripture with the moralisation beneath it — what that scene means for the reader. This is one of those commentary roundels, not the scene itself. On a gold ground two couples embrace. Behind them stand two devils: a small horned one holding something aloft, and a larger one with an ass's head in a red cloak, leaning over the right-hand pair. Those devils are not part of any story and nobody in the picture sees them. They are the gloss: they are there to say what the embrace is — desire prompted from outside. That is the genre's standard device, and it is why such roundels are so full of devils. Which manuscript this leaf comes from is not recorded. Several thirteenth-century Bibles moralisées survive, and the source of this fragment did not travel with the file. In the game this is the picture on the court cards that strike your opponent: the sting comes from the side. 
Marginalia — Thirteenth- or fourteenth-century manuscript, illuminator unknown. Public domain. In the margin beside a blue initial lies a creature with an animal's hindquarters — tawny, clawed, long-tailed — joined to a human arm in a blue sleeve with the index finger extended. Two things meet here. The creature is a drollery: the half-beast, half-something-else figures illuminators drew in the margins, busy with things the text never mentions. Often that is the only trace of the artist's own humour in an otherwise solemn book. The pointing hand is a manicula, the medieval reader's “this is the bit” — added by hand in the margin, and the ancestor of the arrow in a bulleted list. Here they have become one figure: the pointer has grown a body. This leaf's source is not recorded either. In the game it sits beside the rulebook's contents, where a pointing finger still does what it always did. 
Sea serpent — Olaus Magnus, Carta Marina, Venice 1539. Public domain. A red serpent coils around a ship and rears its head over the deck. Beside it lies a second monster like a crested crocodile; further off two ships sail along the coast of “Hegalandia, terra nobilium”, and a sounding is marked in the water. The straight lines crossing the sea are rhumb lines, which a helmsman laid his course along. Olaus Magnus was an exiled Swedish archbishop, and the Carta Marina is the first detailed map of the Nordic countries. The monsters on it are not decoration and not a joke. He meant them as warnings and published a separate key explaining each beast in turn; sailors' accounts of whales, squid and walruses reached the page as monsters by that route. This is how, in 1539, you put on a map that a stretch of sea is dangerous. In the game, the lake monsters on the board are drawn from this. 
The board — Screenshot from the game: the walking phase, with the gold-lit destination tiles and the rotation handles around the Town Square. The board is generated afresh every match, so no two screenshots show the same country. 
Draw — Phase 1. Four court cards lie face up; you take one. 
Walk — Phase 2. The walking roll, split freely across three pawns — on a phone, which is what the game was built for. 
Roll — Phase 4. The dice as they fell, the totals, and each action settled in turn. 
The court regulation — The rules page inside the game itself: an illuminated leaf with contents, initials and real fragments of play.