Changelog
All notable changes to the D&D Toolkit are documented here. Versioning: the major version only moves for something drastic (a full rebuild/port); the minor version moves for feature additions; the patch version moves for bug fixes or internal-only changes with no user-facing effect (refactors, migrations, code-quality passes).
v5.152.0 — A bonded wyvern (2026-11-10)
- On a character's card, under Companions, + Wyvern egg adds an egg bonded to that character. A small tracker shows its stage (egg, hatchling, young, alpha), counts the days the egg has been kept warm, has a Saddle built switch for the alpha, and a notes line. You press Advance when it grows; nothing happens by itself. A new stage brings its own hit points, armour class and size, in the party and in the fight (the egg cannot fight; a hatchling takes one square, a young wyvern two, an alpha three). The egg turns into a hatchling named Wyvern, and when a table is shared everyone sees a message at the moment it grows.
- The bonded player sees a line on their phone, like Bonded: Wyvern, young wyvern. The wyvern egg is also a prop on the map (Furniture), drawn as a dark scaled egg in a warm glow. Carrying riders comes next.
- The seats it will have: none for an egg or a hatchling; the bonded rider and one in the claws for a young wyvern; for an alpha one on the back, three with a saddle, and one in the claws.
v5.151.1 — Wider wakes (2026-11-10)
- A boat or wagon moving through water leaves a wake as wide as itself, not a thin streak down the middle. People and small things still leave a narrow one.
v5.151.0 — Resize a shape you have turned (2026-11-10)
- A rectangle or circle that has been turned a few degrees now has its resize corners on the turned corners, so you can drag it bigger or smaller without turning it back first. The corner you hold stays under the pointer and the opposite corner stays where it is.
v5.150.2 — Screenshots on the Features page (2026-11-10)
- The Features page has screenshots of an NPC card, the combat tracker, the map editor by day and at night, the token pictures, and a player's phone, each with a short caption.
v5.150.1 — The theme script runs again (2026-11-10)
- The small script that sets the dark or light look before a page paints had a mistake in it, so it did not run at all. The look is now right from the first frame again, the phones and the table screen start in the look they chose, and the home page's entry animation works as designed.
v5.150.0 — A Features page (2026-11-10)
- There is a Features page (dnd-toolkit.com/features) that lists everything the toolkit does in plain words: the NPC generator, the combat tracker, the party and loot tools, the battle map, sharing it with players' phones, session tools and saving. It links from the home page and the footer, and has a short list of common questions. FEATURES.md in the repository now comes from the same text.
v5.149.0 — Map detail: Auto, Full or Simple (2026-11-10)
- A small round Detail button among the map's buttons on the phones and the table screen. Tap it to choose Auto, Full or Simple. The same choice is at the bottom of the stats page and in Settings, and it is kept on each device separately.
- Simple draws a lighter map: trees, rocks and water are flat instead of melting together, no grass tufts, flowers, foam or wakes, weather is a plain tint instead of drops, tree tops are not trimmed, and nothing on the map animates. Walls, doors, tokens and fog are unchanged.
- Auto, the default, watches how smoothly the map moves while you move or zoom it. If it stutters for a few seconds, the map switches itself to Simple and says so, with an Undo. It only ever steps down, never back up by itself, and a choice made by hand is never overridden.
- The Detail menu has a Speed test: the map pans and zooms by itself for five seconds and shows how many frames a second the phone managed, with a button to copy the result.
v5.148.0 — Firelight stops at walls (2026-11-10)
- At night, a fire, torch or brazier lights the ground round it only as far as the walls let it: a fire in a room lights the room and not the street behind the wall, and a fire in the street does not light the room. Light still goes through an open door and out of a window, and a closed door stops it.
v5.147.0 — Dry rooms and fading roofs (2026-11-10)
- Rain, storms, snow and mist no longer fall inside a room whose roof is off, on the DM's map and on the players' screens. A roof that comes off because the room was revealed fades away over about two thirds of a second instead of vanishing. Both follow the Motion setting.
v5.146.0 — Fewer cloud writes when nobody is connected (2026-11-10)
- While no phone and no table display is connected, the app stops sending the table anything, including the quiet heartbeat. The Table panel says so next to the player count. As soon as a phone or the table display opens its link, the current picture is sent at once.
- A phone now says it is here as soon as it opens its link, instead of waiting for the first picture, so it can bring the table back by itself.
v5.145.0 — Players pick their own token picture (2026-11-10)
- A player can choose the little picture on their own token from their phone: My picture on the stats page, and in the panel of the sideways map. They pick from the same packs as the DM (Beasts, Folk, Monsters, Classes); Automatic gives the choice back to the name. The token changes on every screen a moment later, with nothing for the DM to approve.
v5.144.1 — Turn marker in the Table panel (2026-11-10)
- In the Table panel, the player whose turn it is gets a small gold TURN marker next to their name.
v5.144.0 — A map tour and map moods (2026-11-10)
- The map editor has a short tour the first time it opens, and a Tour button to replay it: the page dims, a ring follows the part being explained and a card says what it is for. Next, Back, Skip, Enter, the arrow keys and Escape all work.
- A new Build / Combat / Explore / Social switch sits above the map tools. Combat, Explore and Social put away the tools and panels you are not using right now and fold the ones that are not needed; More brings every tool and the Floor, Names and Weather choices back. Nothing is deleted or switched off. Build is the default and shows everything.
v5.143.0 — Trees over rooftops (2026-11-10)
- The crowns of tall trees (trees, birches, pines, palms and willows) are now drawn over walls and doors, so a tree beside a house grows over its edge. On the players' screens a house they cannot see into stays under its roof, with the trees growing over it. When a room is revealed, the trees over it fade away so the inside shows, while the rest of the crown stays. On the DM's map the trees are always trimmed away from the rooms, so you can see inside.
- Bushes, rocks and low growth stay on the ground. Tokens are always drawn over the trees, so nobody disappears under a crown.
v5.142.0 — Map layers (2026-11-10)
- Water, grass, sand, snow and mud patches and big plain floors now always lie under buildings, furniture and props, even when they were drawn afterwards. A river or a field placed after a house no longer covers it. A click on the map also finds the building before the ground under it.
- Selecting a rectangle, circle or text shows a Layer choice under Order: Auto (the default, which shows what it works out), Ground, Things or Overhead. Overhead puts a shape over the walls and doors too, like an awning or a tent cover. Forward and Back still move a shape within its own layer.
- Old maps need no change: the layers are worked out when they open.
v5.141.0 — A smoother map on older phones (2026-11-10)
- While a finger or the wheel is moving or zooming the map, its animations (water, fire, weather) pause and the picture is drawn as one moving layer, so a zoomed-in map is lighter to move around. Everything goes back to normal, sharp and animated, a moment after you let go.
- The phones and the table screen have a Motion choice (Full, Calm, Off) at the bottom of the stats page, the same one as in the app's Settings. A touch phone that looks slow (few processor cores or little memory) starts on Calm until you pick.
v5.140.0 — Choose the picture on a token (2026-11-10)
- Right-click a token (or select it) and choose Picture to pick the little picture on it from packs: Beasts, Folk, Monsters and Classes. Automatic, the default, still picks from the name the players know. Letters keeps the two letters on purpose. For a player character the picker suggests the picture that fits the class typed on the party card.
- New pictures: frog, fish, crab, deer, goat and elephant; merchant, farmer, sailor, thief and beggar; giant, troll, golem, treant, beholder and mimic; and fighter, rogue, cleric, bard, druid, monk, paladin, barbarian, sorcerer and warlock. Names like Troll, Golem, Merchant or Farmer now get theirs automatically.
v5.139.0 — Lights fade in and out (2026-11-10)
- When the DM lights a screen again, the dark curtain on a phone or the table display fades away instead of disappearing, and the picture underneath fades back up with it. Going dark fades in the same way, about two thirds of a second. Calm motion makes it shorter and Off or reduced motion makes it instant.
v5.138.0 — A steadier Table panel (2026-11-10)
- The Table panel's top bar keeps its place when the status or the map button changes: the status sits on its own line with the player count underneath, and the buttons have fixed widths.
- The player rows line up. The name sits above a small status ("Not connected yet" for a phone that never opened the link), the link buttons stay on the right, and the checkboxes sit in two even columns.
- A new Everyone row lights or darkens all the phones and sets free movement for the whole table. When free movement is on for everyone, each player shows "set for everyone" instead of a greyed-out box.
v5.137.0 — Chest names and numbers (2026-11-10)
- A chest rolled on the map now remembers which chest on the map it belongs to. Hover over it, or select it, and you see the name the players see ("Iron-bound chest 2"), how good it is, and whether the players have come across it.
- Chests with the same name get numbers in the order the characters first reach them: the first Iron-bound chest found is 1, the next is 2. A chest nobody has reached yet has no number, so the numbers never tell the players how many chests there are. The Chests list, the Loot window and the players' Loot list all use the same names.
v5.136.0 — Look button and Stats page button on the phone map (2026-11-10)
- The players' map has a small round button, among the zoom buttons at the lower right, that swaps dark and Parchment. It sets the same Look as the choice at the bottom of the stats page, and that choice follows it.
- On a phone held upright with the map turned, the panel that opens from the ☰ has a "Stats page" button next to the ✕ to get back to the stats. Before it was at the very bottom of the panel.
- The ☰ and ✕ symbols are centred in their buttons.
v5.135.3 — Doors replace windows (2026-11-10)
- When two houses snap together, or a door is placed or slid along a wall, it now takes the place of a window in the same spot. Before, the window stayed under the door and a character could not be moved through.
v5.135.2 — A subtler sparkle (2026-11-09)
- The sparkle that shows a character where they noticed something hidden is much quieter. The stars are smaller, have no bright outline and are about half as bright, and instead of all pulsing together every couple of seconds each one glints briefly on its own slow beat, roughly every five seconds, and is almost invisible in between. With Calm or Off motion it is a still, faint glow.
v5.135.1 — Fewer cloud writes (2026-11-09)
- The cloud use counter in the Table panel shows where the day's writes came from next to the Writes total: table updates, heartbeats, phone requests, campaign saves and so on, biggest first. It starts counting by source from this version, so a day's earlier total has no breakdown.
- Sharing a table writes less. The one-a-minute "still here" heartbeat is skipped when a real update was sent in the last 50 seconds, since that already says the same thing, and updates to the table are never closer than a second instead of about a third of a second, so a busy stretch is one write a second at most.
v5.135.0 — Movement at one speed, a drag that follows the finger, and loot that cannot be taken twice (2026-11-08)
- Tokens, carts, props, the foam round them and the camera that follows them now move at one speed for every metre, so the further they go the longer it takes. Before, a walk along a path took 0.12 seconds per square (about 12 metres a second) but never more than 2.4 seconds, so anything over 20 squares got faster, and a plain glide always took 0.45 seconds whatever the distance. Now Normal is 3 squares a second (15 ft, 4.5 metres), so a 30 ft move takes 2 seconds and 60 ft takes 4. A step still takes at least 0.45 seconds and a very long way at most 20.
- A Movement choice (Slow, Normal, Fast: 2, 3 or 5 squares a second) next to Look at the bottom of the phone and table page sets the speed on that device. It only changes how the move is drawn; Calm and Off motion still keep it still.
- Fixed: on a phone held upright, the map page is turned a quarter by the page itself, but dragging, pinching and swiping read the screen's directions, so moving a finger up and down moved the map left and right. Dragging, pinching, the zoom buttons and the swipe that opens the turn order now go the way the finger goes.
- When two players ask for the same loot, the first request you agree gets it and the second is answered with "Someone already took that". Before, a request named an item by its place in the list, and when the first player took an item the rest moved up, so an older request could take a different item than the one the player had picked. A request now carries a short tag of the item it was made for and only takes that item. The DM's own Loot window is not affected.
- A phone no longer says that something is too far away, and neither does the table panel: loot is simply not in the list until the character is close or in the same room, the way they would see it at a real table.
v5.134.0 — Furniture fix, loot by distance, names off, looking around (2026-11-08)
- Fixed: the furniture that comes with a building (a Forge, Bench, Counter, Desk, Anvil, tables, beds) carried the same room mark as the building's floor, so each piece counted as a closed room of its own and showed to the players as a roof until someone stood on that exact spot. Only a floor at least two squares across is a room now, in every building and in maps already saved. Furniture is picked on its own when you click it, and still moves with the building when you move the building by its floor or walls.
- Loot depends on where the characters are. A defeated enemy or a chest on the map can only be looted by a character within 15 ft of it or in the same room; the phones show only what that character can reach and say when something else is too far. Something with no place on the map (an old chest) is for everyone. The table panel says "nobody is close enough yet" for what nobody can reach.
- The DM's Loot window lists the chests as well as the defeated, with who is close to each, and a character who is not close is marked in the picker (you can still let anyone loot). Right-click a chest on the map and roll loot, and the chest rolled is kept at that spot.
- A Names choice next to Floor and Weather hides the names written on things (Prison, Desk, Table...) on every screen; the name is still shown when you select the thing. Tables (long and round), benches, bar and shop counters, desks, forges, anvils and crates have drawings of their own now, so they do not need a name.
- On the phones and the table screen the map can always be moved and zoomed to look around, whatever the distance set for the map around the party, which is only where the view starts (fog of war is what hides places). A hand button next to the zoom buttons makes one finger move the map instead of drawing a route.
v5.133.0 — Look choice on the phones, turning a prop in hand, and clearer errors (2026-11-08)
- The table screen and the players' phones have a Look choice at the bottom of the page: Auto (follows the device, or the theme chosen in the app on the same device), Dark, or Parchment for daylight. It is remembered on that device only and applied before the page is drawn, so there is no flash of the other theme.
- While you are placing a prop, R turns it a quarter (Shift+R the other way), and Q and E turn it 15 degrees, or use the buttons in the bar; the picture following the pointer is turned and the prop lands the same way. Buildings, transports and hitched things turn a quarter at a time.
- A bridge or a rug put down within a square of another one is pulled flush against it, lined up with its edge, so the two read as one bigger bridge or rug. Bridges that overlap, and bridges turned by the same angle that touch along the slant, fuse as well.
- When the table does not take what a phone sent, the phone says why with a short code at the end: the table refused it (an old link, or sharing was stopped or restarted), could not be reached, or is busy. It used to say only to check the connection.
v5.132.0 — Palm, willow, lily pads, cliffs and a wake in the water (2026-11-08)
- New props: a Palm with fronds and coconuts and a Willow with hanging strands in Trees & plants, Lily pads (green pads with a pink flower that bob slightly) and a Cliff (a lighter top, a cracked rock face and a shadow at its foot) in Water & rock. Like the other drawings they come from the label.
- The flap of a tent now billows slowly.
- The foam round a prop or a token in water glides along with it when it moves, and a moving boat, raft, cart or token leaves a double streak of foam behind that fades in a couple of seconds. A boat, raft, ship, cart, carriage or wagon is washed over however big it is. Lily pads float and have no foam.
- A grass-coloured circle grows the same patches of tall grass and flowers as painted grass and grass rectangles. Calm and Off motion keep the flap, the pads and the foam still.
v5.131.0 — Turn anything, and bridges that fuse (2026-11-08)
- A rectangle or a circle can be turned by any angle, not only a quarter turn. In the Size and turn part of the panel there are buttons for 15 degrees to the left and to the right (the Q and E keys do the same), the quarter turn (R), a box to type an angle, and Straight to turn it back. It is saved with the map and shown the same on the table screen and the phones. Nothing is snapped to the grid, so a bridge can lie across a river that runs on a slant. A river or lake rectangle turns with its banks.
- Buildings, transports and hitched things (a wagon and its horses) still turn a quarter at a time, because their rooms, seats and squares are counted on the grid. A turned shape has no resize corners; type its size or turn it straight first. Difficult ground that is turned is counted by its real outline.
- Bridges that lie edge to edge are one bigger bridge: the planks run on and there are rails and posts only along the sides nothing else touches, so two bridges side by side make a wide one and one after the other a long one. Rugs that touch fuse the same way. A bridge that is turned does not fuse.
- A label that only repeats the picture is left off the map: bridge, river, pond, lake, cart, carriage, wagon and boat. The name is still shown in the panel when you select the shape.
v5.130.0 — Props that are easy to find (2026-11-08)
- The props are sorted into eight folders: Buildings, Village (stall, tent, chimney, banner, well, campfire, fence, signpost, haystack, fountain, statue, gravestone), Transport, Furniture, Trees & plants, Water & rock (rock, pond, river, bridge, waterfall), Dungeon and My props. The long Nature folder is gone.
- Inside a folder the props are in alphabetical order.
- Every prop has a small picture on its button, drawn the way it looks on the map, so you pick it by sight and do not have to read the names. The name is still under the picture.
- A prop you saved earlier into the old Nature folder is now under My props.
v5.129.0 — Icons for fighters, casters and monsters (2026-11-08)
- Tokens of creatures that are not animals get a small picture instead of two letters, from the words in the name the players know it by: a skull for skeletons, zombies, ghouls and other undead, a dragon, a demon, an ooze, a pointed hat for mages, wizards, priests, cultists and druids, a bow for archers and scouts, a crown for nobles, lords and kings, and crossed swords for guards, soldiers, bandits, knights, goblins and orcs. Animals still come first, so a Wolf Skeleton shows a wolf. A creature you have not named yet shows what its public label says, and the party's own characters keep their letters.
- Right-clicking the map opens the Generate loot menu only on a chest. On empty ground or on any other shape it does nothing now.
v5.128.0 — Weather (2026-11-08)
- A new Weather choice under Draw and edit, next to Floor: Clear, Rain, Storm, Mist, Night or Snow. It is drawn over the whole map on your screen, the table screen and every phone, over the ground and the shapes and under the fog and the tokens, so everything can still be read.
- Rain falls in two layers, a storm is heavier and darker with lightning every now and then, mist drifts in slow pale clouds, and snow falls in two layers of flakes.
- Night darkens the map but keeps the light round campfires, torches, braziers, fireplaces and the candles of an altar, so a camp at night looks like one.
- Calm and Off motion keep the weather still but drawn. The weather is part of the map, so it is saved with it and comes back when you reload.
v5.127.0 — Doors, roofs, smoke and a waterfall (2026-11-08)
- Doors are drawn as doors: a closed one has planks, hinges and a handle, and an open one shows its leaf swung out from the hinge with the arc it swept. Windows have a bar across the pane and a glint, and an open window shows its two shutters swung out.
- A building the players cannot see into is no longer a dark box: they see a shingled roof with a ridge down the middle, and it disappears when a character steps in or a door opens, the same as before. A rectangle you label Roof is drawn the same way.
- New Chimney prop in the Buildings folder, with smoke that rises, spreads and fades. Campfires send up a little smoke too.
- New Waterfall prop in the Nature folder: water pours along its long side, between rock edges, with spray at the bottom. Calm and Off motion keep the smoke and the waterfall still.
v5.126.0 — Painted ground like drawn ground, and foam in the water (2026-11-08)
- Ground painted with the Paint tool is dressed like the shapes you draw. Sand, mud, dirt, snow, forest, road, stone floor and rubble get the same textures, and a grass-coloured rectangle you draw yourself grows the same patches of tall grass and flowers as painted grass next to it.
- Painted water is a river like the drawn kind: uneven banks, a pale shore that slowly breathes in and out, and ripples and glints that drift.
- Where two painted grounds meet, the higher one spills a little over the lower one in round blobs, so a border is soft and uneven instead of a ruler line. Water keeps its own banks.
- Anything standing in water, painted or drawn, is washed over: a ring of foam with a few bubbles round a boulder, a post, a boat or any small thing, and round the token of a character or creature that stands in it. The ring follows the token when it moves. Floors, big shapes, bridges and the crowns of trees are not washed over. Calm and Off motion keep the foam still.
v5.125.0 — Grass in patches, a tidier selection panel, a better horse (2026-11-08)
- Grass painted with the Paint tool is no longer one flat green. It comes in patches about three squares across: taller grass, meadows with small flowers, and plain grass with a tuft here and there. Where each one is comes only from the square, so every screen shows the same and nothing is saved in the map.
- The panel that opens under the map when you select something is sorted into labelled sections: Look (colour, what a wall is built of, open or closed, label), Size and turn, Players see it, Ground and movement, Order and Save as a prop. A section only shows what applies to what you selected.
- Whether the players see a shape is one choice: Shown, Hidden, or Hidden to be found. The last one opens a box with the Investigation DC and the characters who noticed it, so those controls no longer mix with the shape's other buttons. Picking Shown again makes it normal for everyone and forgets who had noticed it.
- The Horse prop is drawn as a horse with a head, and its body turns to face the way its head sits. Horses already on a map keep their old head circle until you replace it. The horse token shows a horse's head, which reads better than a horse from above.
v5.124.0 — Moving water everywhere, a banner and a tent (2026-11-08)
- Water painted with the Paint tool ripples and glints the same slow way as a drawn pond or river, and the pale shore round drawn water slowly breathes in and out.
- A new Banner prop in the Buildings folder, a flag on a pole that ripples. Calm and Off motion keep it, the water and the shore still.
- The Tent is drawn as a tent: a ridge down the middle, a lighter and a darker side, an open flap and pegs with ropes. The new Tent prop no longer comes with two wall lines; tents already on a map are unchanged.
v5.123.0 — Animals on the tokens (2026-11-08)
- A creature that is an animal gets a small animal on its token instead of two letters: wolf, dog, bear, horse, cat, bird (raven, hawk, eagle, owl), bat, spider, rat, snake and boar. The token keeps its colour and shape, so friends are still round and foes rounded squares.
- Which animal comes from the name the players know the creature by. A creature you have not named yet shows the label it has on the players' screens, so a werewolf that the players call Beast does not turn up as a wolf. Only whole words count, and the party's own characters never get one.
- When there are several of one kind, the number sits in the corner of the token (Wolf 1, Wolf 2).
v5.122.0 — Little objects with drawings (2026-11-08)
- New props with their own drawings: Well, Campfire, Haystack, Signpost, Gravestone, Fountain and Statue in the Nature folder, Market stall in Buildings, Rug, Bookshelf and Cauldron in Furniture, and Torch, Brazier, Coffin, Spike trap, Cell bars and Bones in Dungeon.
- The Chest, Bed, Barrel, Fireplace, Stairs, Altar, Pit and Pillar that were already there are drawn properly too: a chest with its lid and lock, a bed with a pillow and blanket, a barrel with hoops, stairs with steps and an arrow, a pit with rubble round its edge.
- Which drawing a shape gets comes from its label, like the tree, so nothing in a saved map changes, and a rectangle or circle you draw yourself and call Well or Coffin gets the drawing as well. A fence or a row of bars has to be thin.
- Fires, torches, braziers and altar candles flicker and give off a warm glow. The Calm and Off motion settings keep them still.
v5.121.0 — More nature on the map (2026-11-08)
- Trees, birches and bushes that touch run together into one bigger crown, not just a dark outline behind separate ones.
- New in the Nature folder: Pine (tiers of needles), Birch (a lighter crown with white bark marks), Dead tree (bare branches), Stump (with rings), Flowers, Reeds, Mushrooms and a Bridge, and two ready-made groups, Grove and Pine wood. They come from the colour and the label, like the tree, so you can also draw a green circle and call it Pine.
- A bridge is a wooden shape labelled Bridge: it gets rails and posts along the long sides, and its planks lie across the way you walk. Place it over water and bring it forward if the water covers it.
- Reeds lean slowly from side to side. The Calm and Off motion settings keep them still.
v5.120.0 — Hidden finds: a chest only some characters notice (2026-11-08)
- Anything on the map can be hidden to be found. Select it and press Hide it to be found, then set the Investigation DC it takes to notice it (12 to start with). The players see nothing of it, and neither does the table screen.
- A character notices it without a roll when their passive Investigation reaches the DC and they are in the same room as it or within three squares. Or you roll at the table and press the names under Noticed by to say who saw it.
- The characters who noticed it see a few small stars twinkling where it is, on their own phone only. Nothing else tells the others it is there. Once a character has noticed it they keep the sparkle, even after walking away. Show it to everyone, or turn Hidden from players off, and it appears for all as a normal thing on the map.
- Edit character has a Proficient in Investigation tick. Passive Investigation is 10 plus the Intelligence modifier, plus the proficiency bonus when ticked, and it is shown under the ability scores. The Calm and Off motion settings keep the stars still.
v5.119.0 — Wood, stone and moving water on the map (2026-11-08)
- Things on the map now look like what they are made of. A wood-coloured shape shows planks, a stone one flagstones and a brick one brickwork, and sand, grass, snow, mud and forest get a light texture. The colour underneath is unchanged, so recolouring still works, and small things such as a barrel or a thin rail stay flat. Nothing in a saved map changes, the look comes from the colour.
- Water is drawn as water: uneven banks on a river or a lake, a pale shore, ripples that drift slowly in two directions and a few glints that come and go. Pieces of water that touch run into one lake or river. The movement follows the Motion setting, so Calm and Off keep the water still.
- Walls can be built of wood or stone. They are drawn thick, with planks or blocks, and two walls meet at a corner without a seam. A new Walls button under the map, shown when a wall is selected, switches the selected walls between a plain line, wood and stone. Walls you drew earlier stay plain lines until you change them. The House, Bar, Shop and Cottage have wooden walls, the Hotel and Cell stone ones.
- New buildings in the Buildings folder: Stone house, Cottage, Smithy (stone, with a forge and an anvil) and Prison (stone, three cells and a guard desk).
- A cart, carriage or wagon has wheels, and a wagon has a canvas cover and a carriage a roof. A boat has a pointed bow. The carriage is wooden now instead of red.
v5.118.0 — A driven cart faces the way it goes (2026-11-08)
- When you agree to a drive, the cart, carriage, wagon or boat turns to face the way the last stretch of the route goes, with the horses hitched to it and everyone on it. A route that goes right and then up leaves the cart facing up. On the table screen and the phones it rolls along the route and swings round at the last corner instead of jumping round at the end. A turn on the spot from the Turn buttons swings round the same way.
- Everyone on the cart keeps their seat, so the driver stays the driver. Which end is the front now follows the horses: the driver's seat and the front row are at the end where they are hitched, also when the cart faces left or up. Without horses the front is as before (the right end of a wide cart, the bottom end of a tall one), and a cart without horses only turns between wide and tall, because a half turn would look the same.
- The Table panel has a switch, A driven cart turns to face the way it goes, on by default. Switch it off and a drive only moves the cart; the Turn buttons still work.
v5.117.0 — Moves follow the drawn path, and the driver can turn the cart (2026-11-08)
- When you agree to a route, the token (or the cart with the horses hitched to it and everyone on it) travels along the route that was drawn, round its corners, on the table screen and the phones. Before it glided in a straight line from the old place to the new one. A longer way takes a little longer (up to about two and a half seconds), and the view follows at the same pace. A token you drag by hand, or one moved by an undo, still glides straight. The Motion setting still applies.
- The driver of a transport (a cart, carriage, wagon or boat) gets Turn buttons next to Drive: a quarter to the left or to the right. You see "Aria wants to turn the wagon clockwise" and Agree turns the transport, what is hitched to it and everyone on it. Everyone keeps their seat, so the driver is still the driver and the passengers stay on board. A turn costs no distance.
v5.116.1 — The view glides with the characters (2026-11-08)
- The part of the map shown on the table screen and the phones follows the characters. When they walked or a cart was driven, that view used to jump to the new spot at once while the cart and the tokens slid inside it, so the whole map seemed to shift and then move. The view now slides in the same time and with the same curve as the tokens and props, so everything arrives together. The Motion setting still applies: Calm and Off skip it.
v5.116.0 — The driver of a cart, and plans from the table screen (2026-11-08)
- The character in the driver's seat of a transport (a cart, carriage, wagon or boat with Carries what stands on it) can drive it from their phone or the table screen. On the map there is a Drive the wagon button next to Move: draw a route from the middle of it and send it. You see "Aria wants to drive the wagon 25 ft" with the route on the map, and Agree moves the transport together with every token standing on it and whatever is hitched to it (the horses). If the route would leave the map, it stops at the edge.
- A passenger gets Suggest a route for the wagon instead. The suggestion is drawn on the map in violet and the driver is asked on their phone: Yes, send it to the DM, or No. After a yes you get the driver's request (it says the driver agreed with the passenger's route), after a no the suggestion is gone. You can also agree to a suggestion straight away without the driver.
- With strict movement a transport has a speed for the turn: 40 ft for a cart or a wagon, 60 ft for a carriage, 30 ft for a boat, picked from its label. The distance driven counts against it, you see "Too far: 55 ft of 40 ft" and can still agree anyway, and it starts again when its driver's turn starts. With free movement there is no number and no limit. The phones show what is left.
- The table screen, when it may play, keeps a separate waiting place for each character, so a plan for Aria no longer replaces the plan for Bram. Picking another character on the screen and coming back shows the plan still waiting.
- A move or a cart route sent out of turn in a fight is a plan: the phone says so, it stays on the map, and the request list marks it "a plan: waits for their turn" and, when that character's turn comes, "their turn now".
v5.115.0 — Boulders, trees and bushes that are not round (2026-11-08)
- A circle that stands for a rock (a stone one with no label), a tree (a green one labelled Tree) or a bush (a green one with no label) is drawn as what it is. A boulder is an uneven lumpy stone with a lit side and a dark side, a tree has a crown of lobes with a shadow under it, a bush is a clump. The shape of each one comes from its own id, so every boulder and every tree is a little different, and the same one looks the same on your map, on the phones and on the table screen.
- Rocks that touch or overlap run together into one bigger uneven mass, and trees next to each other make a canopy. Hidden props, towers, ponds and everything else keep their old look. Props from the Nature folder (Tree, Bush, Rock) work as they are; a round shape you draw yourself with the Circle tool and colour stone or grass counts too.
v5.114.0 — Seats on a transport (2026-11-08)
- A rectangle or circle with Carries what stands on it switched on (a cart, a carriage, a wagon, a boat) now has seats. There is one for every whole square of it. The front row has one or two seats at the middle of the front edge, the first is the driver's, and the back area fills in rows from the front. The right end of a wide transport is its front, the bottom end of a tall one. A carriage of 3 by 2 squares has six seats: two in front and four behind.
- Drop a character or an NPC on the transport and it takes the nearest free seat, with its size unchanged. A seat that is taken is skipped. The token rides along as before when you move or turn the transport.
- Select a transport and its seats show as small dots on the map (the driver's seat in yellow), and the selection panel says how many seats it has and who is driving.
v5.113.0 — Health states, the MVP on the screens, Heal on the map (2026-11-08)
- A character is shown as fine above 75% of its hit points, hurt from 51 to 75%, bloodied at half or fewer, and down at 0 (dead stays dead). Before there were only fine, bloodied and down. A hurt character's map token has an amber ring and a bloodied one a red ring, on your map, the table screen and the phones. Down and dead tokens keep their own look. An enemy still only ever shows hurt, at its own hidden point, so nobody can work out its hit points. The phone's side strip, the order lists and the table screen all use the same four words.
- When you open the MVP in the session panel, the table screen and the phones show it too. The screen goes black slowly, then the podium (Dealt, Kills, Healed and natural 20s, and the cursed with the most natural 1s) fades in. Closing the MVP fades it out again. The Motion setting scales the time or skips it. A screen that is dark (Pause or a dark line) stays dark.
- Right-click a token and choose Heal: type the amount and say who healed. The healer's Healing done goes up, the target's log and the What happened list say who healed whom for how much.
- The token size slider is back, now in the phone's side panel in landscape.
v5.112.1 — Props glide on the players' maps (2026-11-08)
- When you move a prop (a cart, a wagon, a boulder, a table, a text note), it glides to its new place on the phones and the table screen. It used to jump while the characters riding it slid along. The shape and the riders now take the same time and curve, so the cart arrives with its passengers. The Motion setting scales it or turns it off. Walls and doors still do not move on their own, so they are not animated.
v5.112.0 — The table display with a lock (2026-11-08)
- The Table panel has three settings for the table display: Map only, Ping only and Go. The display now always has its own link with a key, so there is no second link to open. A table saved before this keeps working: "It can play too" on becomes Go, off becomes Map only.
- Map only is just the map, with no buttons on the screen at all. Ping only adds one small Ping button, so a party without phones can show you where they want to go. Go also gives the screen Move, Dash, Attack and Loot. Until you give the Go those buttons are not on the screen, and your side ignores any request the display sends, so it cannot be bypassed. Go stays until you switch it back.
- On Go, the character whose turn it is plays from the display by itself, and "Whose turn it is" is picked under Playing from here. Tapping another character plans for them: their request waits for you and shows "not your turn". On an enemy's turn nobody is picked. In Ping only, a ping goes out in the name of whoever has the turn. ## v5.111.0 — Kills, which action an attack used, and the fight feed (2026-11-08)
- Each character has a Kills number next to Dealt: on the combat card, in the Edit window, in the session recap's Marks line and in the archived sessions. An attack made through the attack window that takes an enemy from standing to down is a kill, and so is the last damage tick of an ongoing effect a character put on that enemy. Each kill writes "Killed (name)" in the character's log. Damage typed in with the plain Dmg button, and an enemy taken captive, do not count.
- An attack says which action it uses. The phone's attack has Action, Bonus action and Reaction to pick from, and the request card on your side shows it. When you make an attack for a character (from the map or the encounter list) the attack window asks the same. Only the chosen one is marked used, because a bonus action can do damage too. The Action is no longer ticked automatically for a character. NPCs and creatures still use their Action by themselves. The choice travels inside the attack's name, so no change to the table's database was needed, and a phone from before this still works as before.
- A "What happened" list under the map keeps what happened in the fight, newest first, and it is still there after a reload: each attack and whether it hit or missed, the damage dealt and whether the target went down, and what you agreed or refused. It keeps the latest 120 lines, and Clear empties it. The session recap has the latest 60 lines under Fight log.
v5.110.1 — The recap window, and how to play from the table screen (2026-11-08)
- Print, Session recap and Print, Player handout now open their window at once. The window was drawn inside the Settings menu's dropdown, so once that dropdown closed the window was hidden with it, and it only showed up when the menu was opened again. All windows in the app are now drawn directly on the page, so none of them can be hidden by the place they were opened from.
- "It can play too" for the table display: when it is switched on, the display gets a new link that carries a key, and the old link only watches. The Table panel now says so under the switch, with the three steps (open the new link on the screen, pick who is playing under "Playing from here", then draw and send). A table screen that is still on the old link shows a note that the link has changed.
v5.110.0 — The phone map in landscape (2026-11-08)
- Held sideways, a player's phone shows the map on the whole screen. On the right is a narrow strip with the turn order as initials, each with a small dot for how that fighter is doing. Whoever has the turn has a yellow glow and an arrow. The player's own character is a bigger blue tile with a YOU tag, its HP and bar, AC, distance left to move and three dots for the Action, Bonus action and Reaction. A Move button sits at the bottom of the strip; it is greyed when it is not your turn, but it still works, because the DM decides.
- Dragging the strip to the left, or tapping the menu button, slides out a panel: everyone by name with their conditions and state, next to your Stats card and every button (Move, Dash, Ping, Attack, Loot). It closes by itself when you start drawing a route or a ping on the map, and the Send, Undo and Cancel bar for a route sits at the top of the map.
- The DM's line (for example "The bridge is on fire") and the answers to what you sent show over the map.
- The map on the phone is landscape only: there is no upright map layout. Pressing Map brings up this layout by itself. It asks the phone to go full screen and turn sideways; Android Chrome does that. Where the browser will not (iPhones), the page turns the whole layout a quarter itself, so the phone is simply turned to read it. In the panel, Back to the stats page returns to the Stats page. The panels have no scrollbars and the text in the strip is bigger.
- Every map (phones and table screen) has a button that centers the view on the characters. It zooms to them with a few squares around, so you can get back after zooming or moving the map.
v5.109.1 — Damage dealt is counted (2026-11-08)
- When a character attacks and the damage is applied (from the map, from the Attack button in the encounter list, or after you answer a player's attack from the phone), the damage now goes into that character's Dealt total, with a line in their log naming the target. Before, Dealt only grew when you logged it by hand with +Dealt. Only an attack on the other side counts: a hit on a friend, an allied NPC or another character does not, and NPCs and creatures do not have a Dealt total. If you were adding Dealt by hand for these attacks, you can stop, or it will count twice.
v5.109.0 — Cloud use in the Table panel (2026-11-07)
- The Table panel has a Cloud use folder with today's writes, reads and deletes on the cloud database, each against the free daily limit (20,000 writes, 50,000 reads, 20,000 deletes) with the percent used. The bar turns amber from 70% and red from 90%.
- It counts what this device did: table updates, requests and marks, cloud save, backups and the usage counters. The phones are not on this device, so their reads are an estimate: each update you send counts one read for every phone that is here. The real total for the whole project is in the Firebase console.
- A day runs from midnight Pacific time, when the free quota starts again. The count is kept on this device only.
v5.108.0 — No stop at 80 squares (2026-11-07)
- A map can be wider or taller than 80 squares. Past 80 it shows a warning under the size boxes (and when you add space) that the map is big, that big maps get slow on the phones, and that another map is the better way to cover another area: save the map as a scene and start a new board. Nothing is blocked. Only a size no battle map needs (over 300 squares across) is refused.
- Sharing with the phones still has a real limit, the amount of data on the map, not its width. The message when it is hit now also suggests using another map for part of it.
v5.107.0 — The map around the party (2026-11-07)
- The table screen and the players' phones no longer show the whole map. They show the characters and the ground around them: a frame from the first to the last character, plus 9 m on every side. A character alone sees 9 m around it. The frame moves as the characters move, and it never leaves the map. When it would be nearly the whole map, the whole map is shown.
- How far is a setting. Settings, Table screen has "Map shown around the party" for how a new table starts (4.5 m, 9 m, 13.5 m, 18 m, 27 m or the whole map), and the Table panel has the same choice for the table that is running.
- With the fog of war on, the frame is only where the view starts. The players can move the map to anything that was revealed (what is not revealed stays dark), and a button on the map takes them back to the party. The view follows the characters until the player moves it. With the fog off, the frame is all they are shown.
- Your own map view is not changed.
v5.106.1 — A steadier content check (2026-11-07)
- The automatic content check that runs on every change failed now and then without anything being wrong. It looked for setting-only words such as "fae" in what the standard setting rolls, and it read the random seed code of each NPC as text; a seed is made of letters and digits, so one sometimes spelled the word by chance. The check now leaves seeds out, and when it does find a word it says where. Nothing in the app changes.
v5.106.0 — After Victory the encounter is a map (2026-11-07)
- Victory no longer takes the characters out of the encounter. It ends combat, writes Victory! on every screen and opens the loot as before, and the Encounter tab turns into a map of who is where: the Next button, the round counter, the initiative boxes, the turn markers and Re-roll initiative are gone, and each row keeps its name, HP and AC, the Loot button and the other buttons.
- A bar at the top says the fight is over and has a Fight again button, which brings rounds, turns and initiative back. It also ends by itself when an enemy stands again, for example one that is added or healed.
- The bar slides in and the rows settle with a short green sweep when Victory is pressed. The Motion setting scales it or turns it off.
- On the phones there is no fight and no turn order, and the characters can move freely.
v5.105.0 — Armour class on the NPCs in the encounter (2026-11-07)
- Every NPC in the Encounter list now shows its armour class (AC 16) next to its hit points, so when a player says what they rolled you can tell at once whether it hits.
v5.104.1 — Selection settings under the map (2026-11-07)
- The map is back to a fixed height, and the settings of whatever you select on the map (a token, a shape, a room) open in a panel under it, not beside it. The page no longer moves when you select something or open a folder under the map, and the map does not move to the top of the window when you open it.
v5.104.0 — Chests, captives and searching for hidden loot (2026-11-07)
- Right-click bare ground on the map and a Generate loot menu opens with five qualities: Plain, Nice, Rare, Very rare and Legendary. The chest that is rolled has coins that fit the party's level, a few everyday things and, the better it is, an item from the rare lists. Rare and better chests have a false bottom with the best item under it. The chest is offered to the players' phones straight away, in the same Loot list as the defeated.
- A Chests folder under the map lists the chests you rolled. Each can be held back from the players, marked "Search succeeded" once the false bottom was found, re-rolled at the same quality or removed.
- NPCs in the Encounter list have a Captive button beside Ally. A captive can be looted by the players while it is still standing, and it no longer keeps the fight going, so Victory shows once everyone else is down.
- When a body or chest has something hidden, the player's phone says so without telling what. Try to find it sends you a request: you see that the character is searching and answer They found it (the hidden items join the list) or They found nothing. The phone shows the answer.
v5.103.0 — The map fits the window (2026-11-07)
- The map screen is as tall as the window: the toolbar, the map and the folders under it fit together, so there is nothing to scroll to. When you open the map the page moves so it sits in the window, and the map takes all the room the tools and the Props and Scenes folders leave. Fold those two to give the map more.
- The settings of whatever you selected (colours, Shown to players, Duplicate, Delete, the room options and so on) are now in a panel beside the map on a window wide enough for it, and below the map on a narrow one, instead of taking the height of the map. The panel has its own scrolling when a selection has more options than fit.
- An attack you make for a character from the map (right-click the character's token, Attack, then click the target) now asks what the d20 showed before the damage window, like the attacks that come from the phones: It hits, Natural 20, It misses or Natural 1. A natural 20 opens the damage window with the critical-hit reminder and gives the character a star once the damage is applied, a natural 1 or a miss just says so in the log, and a natural 1 gives the character a skull. The damage box starts empty for the number the player rolled.
v5.102.0 — More effects: class features and stances (2026-11-07)
- The effects have a group for class features and stances: Raging (the barbarian's rage), Reckless, Dodging, Disengaging, Dashing and Readied, each with a short reminder of what it does. The Helps group has five more spells that last: Armored (mage armour), Barkskin, Guided, Heroic and Aided.
v5.101.0 — Effects next to the conditions (2026-11-07)
- A new group, Effects, sits next to the conditions on the cards of characters, NPCs and guests. It is for what a spell, a power or a stance does to somebody, as opposed to the standard conditions like Poisoned or Prone. A + Effect button opens the list: Unseen (Invisible, Hidden, Disguised), Helps (Blessed, Hasted, Shielded, Protected, Blurred, Mirror images, Sanctuary, Inspired, Flying, Enlarged), Hinders (Hexed, Marked, Baned, Slowed, Outlined, Silenced, Confused, Cursed, Dominated, Banished, Polymorphed, Reduced) and Stance (Raging, Dodging). Each has a short reminder of what it does when you point at it. An effect that is on shows in purple, apart from the conditions, and clicking it ends it.
- Effects are saved, shown on the table screen and cleared exactly like conditions, and they work the same for a character and an NPC, so a player's Hex on an enemy or an NPC's Invisible are the same kind of thing. Hidden and Invisible moved here from the conditions list; anything that already carries them keeps them, and an enemy that is Hidden or Invisible is still left off the players' screens. The list of conditions is shorter now, and the Charmed condition stays among the conditions.
v5.100.0 — Add room to the map (2026-11-07)
- The map can be made bigger on any side. In Scenes and board there is a new row, Add [5] squares, with the buttons Left, Right, Up and Down. Adding on the left or at the top moves everything over, so the shapes, the tokens, the painted ground, the fog and the spell areas all keep their place on the map, and what you were looking at stays on screen. The new squares are empty ground, and hidden when the fog is on. A map can be 80 squares across at most. Undo takes the added room away again.
v5.99.0 — The fog follows the characters (2026-11-07)
- With the fog of war on, the fog now lifts by itself around a character that moves, whether the player walked there from their phone and you agreed, or you moved the token yourself. The squares around the whole way the character went are revealed, not only where it ended up. A character that was already on the map when you opened it, or is put back in the line at the edge, lifts nothing, so Hide all stays dark until somebody walks.
- In the Fog tool a switch, The fog lifts around a character that moves, turns this off, and a menu chooses how far it lifts: 3, 6, 9 (the default), 13.5 or 18 metres around. Reveal around the party and the drag tools work as before. Like the Reveal tools it does not look at walls, so a room that is closed to the players still stays hidden until a character steps in, opens a door or comes to a window.
v5.98.1 — See what the phones can loot (2026-11-07)
- Under the loot switch in the Table tool, in the folder For everyone, there is now a short list of the defeated enemies and what the phones are offered for each: on offer with how many things, not on offer because the body is hidden from the players (a closed room, fog nobody has revealed, or Hide from players), or not on offer because nothing is left on it. When a player says they do not see the Loot button, this shows at once whether there is anything for them to loot.
v5.98.0 — Looting any time (2026-11-07)
- The players can now loot the defeated from their phones at any time, not only after you press Victory. The map is used between fights as well, so a player can walk up to a body and take what they find, and you agree it like a move. It is on by default. The switch The players can loot from their phones, in the Table tool under For everyone and in the Encounter tab, turns it off, and a table that had it switched off before starts with it on. The panel on the phone is called Loot now, not Victory.
v5.97.2 — Zoom on the map, and older transports carry their riders (2026-11-07)
- The zoom buttons are on the top right corner of the map as − 100% + Fit, with the zoom level in the middle (press it to go back to 100%). The row of tools above the map no longer wraps a few buttons onto a second line.
- A rectangle labelled Wagon, Carriage, Cart, Boat, Ship or Raft that was on the map before now carries the characters and creatures standing on it when you move or turn it, like the ones placed from the props. When you select a shape, a new switch Carries what stands on it turns that on or off for it. A new button Hitch together appears when you have selected more than one thing (shift-click the carriage and its horses): after that selecting one of them selects them all, so they move and turn as one.
v5.97.1 — The map window fits its settings, the board can be bigger than it (2026-11-07)
- The window you draw on is as tall as the screen allows while leaving room for the settings under it (colours, Shown to players, Duplicate, Delete and so on), and the settings of whatever you have selected stay stuck to the bottom of the screen, so there is no scrolling to reach them.
- The squares keep the size they have always had at 100%: a board 30 squares wide fills the window. A board bigger than the window is no longer squeezed in, it runs past the edges and you move around in it by holding the right mouse button and dragging (the cursor turns into a hand while you do), or with the Hand tool, the middle mouse button, or Space and drag, and zoom with the wheel or + and −. A right-click without a drag still opens a token's menu. While you carry a token or a shape with the left button you can hold the right button as well and move the map under it, so something can be carried a long way across a big board. Fit shows the whole board, and a board smaller than the window sits in the middle of it.
v5.97.0 — Natural 20 and natural 1 in attacks (2026-11-07)
- An attack now asks what the d20 showed. On the phone, before Send to DM, the player can pick Normal, Natural 20 or Natural 1 (also for an attack that walks first). Your card of that attack says so, and it has four answers: It hits, Natural 20, It misses and Natural 1, with the one the player named highlighted.
- A natural 20 hits as a critical hit: the damage window opens with a reminder that the dice are rolled twice, and the character gets a star (★). A natural 1 misses and the character gets a skull (💀). Both are written in the log under the requests.
- For an NPC's attack, I'll roll now asks what the d20 gave: It hits, Natural 20, It misses or Natural 1. Roll for me already knew.
- The combat card of a character has Natural 20 and Natural 1 counters with + and −, the same as in the Party tab, instead of two fixed numbers.
v5.96.0 — The Table tool in folders (2026-11-07)
- The Table tool in the Encounter tab is now a bar and five folders instead of one long list. The bar is always visible: whether the table is live, paused or partly dark, how many players' phones are here and how many have left, and the buttons Pause, Lights on and Hide the map (Show the map when it is hidden).
- The folders are by who the setting is for. Players has one row for each player with their link and QR code, whether their phone is here, lit or dark, Only this one lit, Legal routes go through and Free movement. Table display has its link, whether it plays too, what it shows, and whether it is lit or stays lit. For everyone has free movement for everyone, the beep and the loot switch. Words on the screens has the line on a dark screen and the message to every screen. Sharing has the address for the links, New links and Stop sharing.
- Each folder says on its title line how things stand, for example "0 here · 1 left" or "free movement off · beep on · loot closed". A folder opens and closes smoothly, the ones you leave open are remembered on this device, and a folder shows a pulsing yellow dot when something in it needs a look, such as a player who has left.
v5.95.0 — Players only see fine, bloodied or down (2026-11-07)
- In the turn order on the table display and on every phone, a character on the party's side is shown as Fine, Bloodied or Down, like the enemies are shown as fine or hurt. Half the hit points or fewer is Bloodied, 0 is Down, and that is all anyone else gets: no hit point numbers and no bars.
- A player's own phone still shows the exact hit points of their own character and of the companions that belong to them, live. Allies and guests that do not belong to a character only show their state.
v5.94.1 — Token menu inside the map (2026-11-07)
- The menu that opens on a right-click on a token no longer gets cut off at the right or bottom edge of the map. It opens where you clicked and is pulled back inside, and its options stay on one line.
v5.94.0 — Transports carry their riders (2026-11-07)
- Tokens standing on a wagon, a cart, a carriage or a boat now move with it when you drag it, and turn with it when you press R. A token only rides when its middle is inside the transport, so one standing beside it stays put.
- A wagon, a cart and a carriage are hitched to their horses: select the horse or the wagon and the whole rig is selected, so it moves and turns as one. The new Unhitch button in the selection panel lets them be moved apart. The Wagon and the Cart now come with their horses (the wagon with two, the cart with one), and Wagon (no horses) and Cart (no horse) are there when you want them parked. A hidden wagon takes its horses with it: they all appear when a player gets close.
- Dragging on the map no longer selects the letters on it (House, Wagon and so on), so the map stays clean while you move things around.
v5.93.0 — Victory and loot (2026-11-07)
- When every enemy in the fight is down, a bar in the Encounter tab says so, with a Victory button. One press leaves combat mode (with the gold sweep), takes the player characters out of the encounter, writes Victory! on the phones and the table display, and opens the loot. Nothing happens by itself, so reinforcements or a mistake cannot end a fight.
- Loot opens a window: pick who is looting (nobody is assumed) and which defeated enemy. The carried and pocket items are listed; items the enemy hid only show after you press Search succeeded, which is yours to press once the players have made their roll. Each ticked item goes to the looter, or to another character instead, and a coin note is only split evenly between the characters when you choose Split evenly for it. Everything that is taken leaves the body and goes into that character's inventory or purse and their log.
- Loot the defeated in the Encounter tab, Loot on a defeated enemy's row, and Loot… in a character's token menu on the map all open it. A switch there lets the players loot from their phones.
- On the phones, after the win, a Loot panel lists the defeated by the label the players know them by. The player ticks what they take and, for each thing, whether they keep it, give it to someone else or split the coins; you see it as a request saying who takes what and agree it like a move.
v5.92.0 — The table display can play, player labels and AC in the collection (2026-11-07)
- The table display can play too. In the Table tool, Table display now has a switch, The table display can play too, and its link gets a key. On a tablet or laptop at the table that link shows a row, Playing from here, with the characters in the fight. Picking one turns the big map into that character's map, with Move, Dash, Ping and Attack, so the players can draw where they go and where they attack on the shared screen. Several players can take turns on it; it sends one thing at a time. The phones work as before, and with the switch off the display link is a plain display again.
- Next to an NPC's name in the Encounter tab and on its combat card you now see what the players call it on their screens, for example Alwin Penhale (CG2), with the longer name when you point at it. Nothing shows for an NPC whose name you have told the players, or when the table screen is off.
- The Collection shows each NPC's armour class next to its type and faction.
v5.91.0 — Zoom and move the map (2026-11-07)
- The map you build on can now be zoomed and moved around, so a big map is no longer stuck at the size it first shows. The mouse wheel zooms around the pointer. The Hand tool moves the map by dragging, and from any other tool the middle mouse button, or Space and drag, does the same. The + and − buttons and keys zoom in and out, and Fit (or 0) shows the whole map again. This is only your own view: the players' screens are not changed.
v5.90.1 — R turns shapes on the map (2026-11-07)
- On the map, R turns the selected shape or house again instead of rolling another NPC. While the map is open, R and Space no longer roll an NPC at all.
v5.90.0 — Labels numbered by first sighting (2026-11-07)
- The labels the players see for NPCs (City Guard 1, City Guard 2) are now numbered in the order the players first see each one, not in the order you added them to the fight. A guard you kept hidden and then showed is the next number, so a visible City Guard 3 never gives away that two other guards exist. The order is saved with the map, so a number stays the same for the rest of the fight.
v5.89.0 — NPCs attack from a list (2026-11-07)
- Attack in an NPC's or creature's token menu now opens a window that asks who it attacks. The list shows every character on the other side, nearest first, with the distance, armour class and hit points, and nothing is picked for you.
- Then it shows the attacks that NPC has: a creature's attacks are read out of its stat block (reach or range, bonus to hit, damage dice and type), a generated NPC has its weapon, with a thrown or shot version where the weapon has one. Each says whether it reaches from where the token stands, how far short it falls, or that a wall or closed door is in the way.
- Roll for me rolls the d20 against that armour class, says hit, miss or critical, and rolls the damage (the dice are doubled on a critical). Apply puts the damage on the target. I'll roll opens the usual damage window with an empty box for the number you rolled yourself, and It misses just says so. What happened is written in the log under the requests.
- A player character's attack made by hand from the DM's map still works by clicking the target token.
v5.88.0 — Attacks from the phone and a list of attacks on each character (2026-11-07)
- Each character has an attack list in Edit character, under Attacks: a name, melee, ranged or spell, and a range (Touch, Short, Medium, Far, each shown with its distance, or a number of your own). Weapons can be added from a ready-made list. A character with no list still gets one attack, melee next to a foe and ranged otherwise.
- On the phone, Attack opens a list of everything the player can see to attack, nearest first, with its distance and whether it is fine or hurt. Nothing is picked for them: they tap one, or tap its token on the map. Then their own attacks are shown, each saying whether it reaches from where they stand, how far short it falls, or that a wall or closed door is in the way (a window does not stop it).
- An attack that does not reach can be walked to first: Walk there first lets the player draw where they want to stand, says whether the attack reaches from there, and sends the walk and the attack together.
- For the DM the attack arrives as a request that says who attacks whom, with which attack, how far away the target is and whether it reaches, with a note when it is not that character's turn. It hits opens the damage window, It misses closes it, and the usual Not possible answers are there. When the attack is out of reach but there is a way to walk to a square from which it reaches, a button offers that walk; the DM presses it and the attack stays open to be answered from the new spot. The card checks the target again when it is shown, so a target that was hidden, moved or went down shows up. Hits and misses tick the attacker's Action.
- A character that is down cannot send an attack.
v5.87.0 — Turning shapes, who is connected, and the table in the cloud save (2026-11-07)
- Pressing R turns whatever is selected on the map a quarter clockwise, whether that is a whole house, a wagon or a horse. Shift+R turns it the other way, and a Rotate button in the selection panel does the same. The turned shape lands on whole squares and stays inside the map.
- A character's card in the Party tab and its table link show whether its phone is connected: a green dot and On a phone while it is, and Phone left 3 min ago once it has gone quiet. A phone that never came shows nothing.
- The window with a character's QR code closes by itself once that phone has joined, and the QR code in the Table tool tucks itself away the same way.
- The table game is part of the cloud save now: whether it is switched on, the running table with its player links, and its settings come back by themselves on another device or after a restore. The link address and the request sound stay on each device.
- A few small movements: tokens glide to their new square on your own map when a move is agreed or undone (not while you drag them), a dark screen fades in on the phones with its line rising a little, and the green dot of a connected phone breathes. All of them follow the Motion setting, so Calm and Off keep them quiet.
v5.86.0 — Setting up a fight, hidden wagons and a clearer fog tool (2026-11-07)
- When a fight starts, every screen at the table goes dark with the line "The DM is setting up", so you can build the map without the players seeing how many enemies there are. On the map a button, Show the map to the players, turns the screens back on and says how many tokens are on it. Hide the map from the players does the same thing in reverse in the middle of a fight. A fight that was already running when you started sharing is left alone.
- A wagon, a tent and a boat are hidden from the players until a player token gets close: about 6 m for the wagon, 3 m for the tent and 9 m for the boat. Once someone has been close they stay visible. Any rectangle or circle on the map can be given the same behaviour with Seen from (Always seen, Near, Medium or Far, each shown with its distance), and Reveal now or Cover again if you want to decide yourself. A creature standing on one is hidden with it.
- The Fog tool now draws a box: drag over the squares and they change when you let go, with Reveal and Hide again as before. The brush is still there as the second choice. Dragging on the fog switches it on, so it no longer looks as if nothing happened.
- A creature you drag on the map only reaches the players when you let go of it. While you hold it the distance label says it is in your hand.
- Undo on a line like "Aria moved 40 ft" now gives back one square at a time, and the feet of that square with it. Undo all puts the token back where the move started.
- The collection panel has one row at the top: the search, a Filter menu where you tick several factions and types at once, and a menu with New group and Select NPCs. The tick boxes and the bar with + Encounter, Move and Delete only show while you are selecting.
- The ⋯ menu on a character in the Party tab opens again. It was being cut off by the section it sits in, and so were other menus in folded sections.
v5.85.0 — Token menu, hidden rooms and labels on the map (2026-11-07)
- Right-click a token on the map, or select it, to attack with it, hide it from the players, or tell the players its name. Attack asks you to click the token it goes for, then opens the damage window.
- Players now see a label such as City Guard 1 instead of an NPC's name, on the map and in the turn order. The numbers follow the order the NPCs were added. Tell the players the name changes one NPC to its real name, and you can take it back.
- A building hides its inside from the players. They see the walls and a dark floor until a player token steps in, one of its doors opens, or a player is within two squares of one of its windows. Once opened it stays open; Reveal now and Cover again are in the panel under the map, and the switch can be turned off per building.
- An NPC you hide, or one standing in a hidden room or in fog the players have not seen, is also left out of the turn order, so the players do not know it exists.
- When a player's attack hits, a damage box opens straight away. The player is told it hit only after you apply the damage.
- When a closed door stops a player's move you can now answer Open the door, go through, or Stop at the door; the player is told where they stopped.
- The Lit rows in the Table tool line up, and the map has three folders, Draw and edit, Props, and Scenes and board, that remember whether you left them open.
v5.84.0 — Choose what the table display shows (2026-11-06)
- The Table tool has a new choice, What the table display shows: the map and the order together, only the map, or only the order. Showing one of them makes it bigger for the room. Without a map on the board the display always shows the order. The phones are not affected.
v5.83.0 — Table screen section in Settings (2026-11-06)
- Settings has a new section, Table screen. The on/off switch moved there from At the table, and below it you can choose how a new table starts: with free movement or with distances, whether the table display stays lit when you pause, and the line a paused phone shows. A table that is already running keeps its own choices.
- A few settings now carry a small tag: This device, Needs sign-in or Experimental, so you can see where a setting applies before you change it.
v5.82.6 — Cloud save menu on a narrow phone (2026-11-06)
- Fixed the Cloud save menu opening partly off the left edge of a narrow phone.
v5.82.5 — Monthly report delivery, again (2026-11-06)
- Another small change to how the monthly report post is sent.
v5.82.4 — Monthly report delivery (2026-11-06)
- Small change to how the monthly report post is sent.
v5.82.3 — Monthly report and the Hobby plan (2026-11-06)
- The monthly report only asks Vercel for days it will answer for (31 days on the Hobby plan) and says when the start of the month is cut off.
v5.82.2 — Monthly report error messages (2026-11-06)
- When the monthly report cannot read the visitors, it now says what Vercel answered.
v5.82.1 — Monthly visitor report fix (2026-11-06)
- Fixed the request the monthly report sends to Vercel, so it can read last month's visitors.
v5.82.0 — Visitor numbers and an error screen (2026-11-05)
The site now counts how it is used, with nothing about who, and a broken screen no longer goes blank.
- Visitor numbers come from Vercel Web Analytics, which uses no cookies. A few plain totals are kept too: downloads, new accounts, save codes, shared tables, player phones that joined a table, and how many visits rolled an NPC, started an encounter, gave out loot or opened the map. Nothing is saved on your device for this, and nothing is counted on a test address.
- A new switch, "Don't count my visits", in Settings under Data and backup. It keeps your browser out of all of the above. The privacy page says the same.
- If a screen breaks while it is drawn, you now get a short message with Try again and Reload instead of a blank page. It only adds 1 to a count of error screens; nothing else is sent.
v5.81.0 — A tidier Settings window (2026-11-05)
Settings is sorted into sections, and each setting is one row.
- Four sections: Appearance, At the table, Content, and Data and backup. Each has a short line under its name that says how it is set right now. On a wide screen the list sits beside the settings. On a phone the list is the first screen, a tap opens a section, and a back arrow returns.
- Moving between sections is animated: the settings slide in the way you moved, the highlight in the list glides, and the window grows or shrinks to fit while its top edge stays put. Motion set to Calm or Off tones it down.
- Folding sections open and close a little faster, with an arrow that turns: on the NPC and party cards, in Help, the Session panel, the Encounter rows, the map panels and the short rest and cloud admin windows. The Cloud save menu in the header now drops in like the gear menu next to it.
- Each setting is a row with its name, one short line and the control on the right. Anything that is just on or off is a switch. There is a close button at the top, so you no longer scroll to the bottom to close it.
- The Combat card tabs are chips you tap on or off, one group for NPC cards and one for party cards, with "Combat opens on" under them.
- Cloud save and Export, Import and Restore now also show in Data and backup. They do the same as in the header menu.
- The Halloween setting is now called Horror.
v5.80.0 — Battle map and moving from the phone (2026-11-04)
The Table screen now has a map, and players can say where they want to go.
- A battle map next to the Table screen. A Card / Map switch sits in the main area. Draw walls, doors, windows, rectangles, circles and text, or place props from folders: houses, a bar, a hotel, shops, towers, tents, carts, a carriage with its horses, boats, furniture, trees and dungeon pieces. Buildings snap together edge to edge with a door where they meet. Doors and windows slide along their wall. Anything that is not alive can be resized. Scenes and your own props can be saved.
- A floor for the whole map, and ground you paint square by square: grass, forest, water, sand, mud, snow, rubble, dirt, road and stone floor. Painted ground sits under everything else. Difficult ground is drawn hatched and a move through it counts double.
- Fog of war. Turn it on and the players only get the squares you reveal. Shapes, painted ground and enemy tokens in the dark are not sent to their phones. You can reveal by dragging, around the party, or all at once.
- Spell areas: a circle, a cone or a line (one to three squares wide). Everyone sees the covered squares, and every token inside gets a ring.
- Tokens are coloured circles with initials. Foes are squares, so friend and foe do not rest on colour alone. Small badges show conditions, a ring marks whose turn it is, and on a phone your own token is bigger with a YOU tag. A legend under the map names everyone, and each device has a token size slider. Tokens glide when they move (following the Motion setting).
- Players move from their phone. They draw a line with a finger or tap the corners. The phone checks walls, closed doors and how much movement is left, in meters or feet as set in Settings, and sends the route. You see the route on your map and agree or say it is not possible, with a reason. A route waiting for you shows faintly on every screen. A player can ask to open a door (it is ringed on your map) or to Dash, and after you open the door their drawn route is still there. A player set to automatic goes through by itself on their own turn.
- Free movement hides every number on the phones, so you just say sure or not. New tables start in free movement; you can switch it for everyone or per player in the Table tool.
- Speed comes from the character: Edit has a Speed field, and picking a species in the Race field fills it in. Conditions such as Grappled or Restrained, exhaustion, a beast form and Dash are worked in and the reason is shown. A ruler on your map shows the distance while you drag any token, enemies included.
- Players can Ping a spot, which shows as a ring on every screen for a few seconds. To attack, a player picks the target on the map (it is ringed) and sends it. You get one prompt, "Aria attacks Dire Wolf", and answer It hits, It misses or Not possible (with a reason). The arrow shows on every screen until you answer, and the player's phone shows your answer. Nothing is rolled in the app; players roll their own dice.
- Two tokens never share a square. A route that ends on another token cannot be sent from the phone, and a token you drag or agree onto an occupied square goes to the nearest free one.
- A character's table link and QR code are also in the "..." menu in the Character section of its card, as well as in the Table tool.
- Pause turns every screen dark: a heavy dim with one short line, which you pick from a list (Short break, Eyes up, Story time, Back in 5 minutes, Listen up) or write yourself. Nothing under it can be used. While every screen is dark nothing about the fight is sent. Screens can also be lit or dark one by one, with an "Only this one lit" button, and the table display can stay lit when the phones go dark. The links stay the same through a pause; Stop sharing ends the table and New links makes a new one.
- Phones can keep their screen on during a fight (on by default, with a switch on the phone; it needs the secure https address). Answers, pings and the message now go out at once instead of after a short wait. Every screen shows how old its picture is, how long the last update took, and has a Reconnect button. Your laptop beeps and the tab title counts when a player sends something; the beep can be switched off.
v5.79.0 — Table screen (2026-11-02)
- A new experimental Table screen. Turn it on in Settings, At the table, and the Encounter tab gets a Table tool. Start sharing and every player gets a link and a QR code, plus one more link for a screen in the middle of the table. Sharing uses your Cloud Save account, so sign in first.
- A player's phone shows their own HP, AC, speed and conditions, which of Action, Bonus action and Reaction are used, a "You're up!" banner on their turn, and the turn order with everyone else. Party members and allies show exact HP. Enemies show only as Fine, Hurt or Dead, with their conditions. Hurt means close to death, at a slightly different point for each enemy so the players cannot count on it. An enemy with the Hidden or Invisible condition is left out, and death saves are never shown.
- The table display shows the whole order in large type. A one-line message from you ("The bridge is on fire") shows on every screen.
- Phones and the display can only look. They say when the connection is lost or the DM may be offline.
- "New links" stops the old links and makes new ones. Deleting your account also deletes any tables you started. The privacy page describes what is stored.
- Look at the page without a table: /t#demo is the display, /t#demo/demo1 a phone.
v5.78.0 — Combat mode transitions (2026-10-25)
- Turning Combat mode on is now a short glide. The notices and extras fade, and the avatar, name and AC of the long NPC card move into their places on the combat card, with the rest of the combat card rising in after them. It only morphs when the combat card is for the same NPC; otherwise the card simply appears.
- Turning Combat mode off plays a calm sweep: a blue band reading BACK TO THE TABLE crosses the screen from right to left and the layout changes behind it (about one second).
- When every enemy in the fight is defeated, leaving Combat mode plays a gold VICTORY sweep instead, left to right and much slower (about three and a half seconds). Only enemies count: players, allies, companions and guests do not, and a fight with no enemies never counts as a win. A Celebrate wins tick in Settings, under At the table, turns it off (it is on by default).
- All of this follows the Motion setting. With Full it plays; with Calm or Off the layout changes at once, as before. The sweep never blocks clicks, and toggling again during one simply switches at once.
- An NPC row in the Encounter tab has an Ally button for an NPC who fights on the party's side. An ally does not count as an enemy for the victory sweep or for the difficulty estimate, and its row is styled like the party's. It goes back to being an enemy when it is removed from the fight.
- The Dmg, Heal and Temp buttons on the combat cards, and Heal on a downed player in the Encounter tab, no longer end in dots.
- Fixed two bullets in the 5.77.0 in-app notes that ran together.
v5.77.0 — Lighter cards (2026-10-21)
Changed
- The NPC card opens with the Combat section first while the NPC is in the encounter, and with Personality first otherwise. The Hit Points box and the repeated HP in the combat snapshot are gone; the header's HP shows the current value once the NPC has taken damage.
- The reroll icons on an NPC card appear when the pointer is over their section (always visible on touch screens).
- Conditions on the NPC card, the party cards and the combat cards show only the ones that are on, with a "+ Condition" button for the rest.
- A secret in an NPC's mood and hook, the disguise, the hidden threat, a rumor's truth and the hidden loot show as a "tap to show" button instead of text, on the full card and on the combat card's Roleplay tab. "Show secrets" on the card opens all of them at once. Settings, At the table, has a switch to show them openly again.
- On the combat card the Abilities tab keeps only what the top numbers do not show, the roll box appears after the first roll, and the "5.5e" label reads "Turn".
- Collection rows show the NPC's type and faction under the name, with a + Fight button (adds it to the encounter, quiet until the row is hovered or ticked) and a menu with Open, Duplicate, Rename, Move and Delete (Undo stays). The leftover HP is no longer shown, and the "+ Selected → Encounter" button is greyed out until something is ticked and shows the count.
- Settings is grouped into Look, At the table, Content and Data. The campaign setting folds into one line once the campaign is locked to it.
- While Combat mode is on, the backup and sign-in notices, the type description, the shop specialty row and the seed row are hidden, and the generator bar is slimmer. The storage warning still shows.
- The Dice panel opens as a small button that shows the last roll. The "–" button in its title makes it small again, the button opens it.
- "Roll Again" on the NPC card is now "Roll another NPC", and the R key does the same. A toast offers Undo for a few seconds and brings the previous NPC back.
- The first time you open the app with saved NPCs, a short notice says that secrets are hidden until tapped, with a link to the setting.
- On the full Party card the six abilities are boxes with the modifier large, as on an NPC card. The combat card's Abilities tab already had them.
- The sign-in fields look like the other fields, the turn markers in the encounter list are wider so they are easier to tap, and "Roll another NPC", the R key and the Space key do nothing while Combat mode is on, so a stray press cannot replace the card of whoever is up.
- The pictures on the landing page show the current layout.
- Opening screen: when no card is open and you have saved data, "Welcome back" offers Continue the fight, Open <last NPC> and Open <first PC>. The backup and sign-in notices share one slim line. On a first visit (nothing saved yet) the Collection, Party, Encounter, Recent and Session panels wait behind one "More tools" button.
- NPC card: an unsaved NPC has a Save button next to its name. The empty Special Actions section and the empty "Hidden" loot line are left out (a "+ Special actions" button in Notes & tools brings the section back). "Reroll Selected" and "Reroll Unlocked" became one "Reroll checked" button; the disguise is a tick in the list.
- In Combat mode on a wide screen the combat card stays in view while the long fight list scrolls. On a phone the generator bar is hidden in Combat mode, the avatar sits next to the name, and the Dice button moves to the left.
- The Dice switch in the header opens and closes the dice panel. While it is closed, a small dice button with your last roll stays on screen; switching the panel on grows it out of that button with a short animation and the "–" in its title shrinks it back. When you roll from a card while it is closed, the button pulses and shows the result instead of opening the panel. Settings has a tick to turn the small button off (a roll then opens the panel, as before). The "✕" in the panel is gone.
- Empty logs are one line: in the encounter rows, and the dice panel's last-roll box only shows after the first roll.
- Level up fills in the average new HP (hit die average plus Constitution) and says so; the player's own roll can be typed over it. Short Rest asks for the number of hit dice and shows what each heals; the die and Constitution modifier are under "Adjust".
- Wild Shape: "Highest CR" and its limit line are folded behind "Limits" on the full card and left out of the combat card. The form search lists the forms that fit when nothing is typed.
- The open character's roster card is one line. "Long Rest" reads "Party long rest".
- Collection: filter chips for the most common factions and types, and dark checkboxes in the dark theme.
- The History tab is called Recent. The command palette also has Next turn, Roll initiative, Add PC and Party long rest. The settings menu is grouped with dividers.
Added
- "Resists & saves" on the NPC card: resistances, immunities, vulnerabilities, saving throws and languages, filled in by hand. They show on the card and on the combat card when filled in, and go into Copy, the Markdown card and print.
- A Notes tab on the NPC combat card (the party notes of the NPC), with a tick for it in Settings.
- Class and race for party members (Edit character), shown as "Level 3 Druid · Wood Elf" under the name on the Party card and the combat card.
- Conditions can be set on a party member, on the Party card and the combat card, and follow them into the encounter.
- An empty damage log on the Party card is one line instead of a large box.
- Walking speed for party members (Edit character, default 30 ft). It shows as a pill next to PB, Init and PP on the Party card and on the combat card's Abilities tab, and shows the form's speed while the character is in a Wild Shape form.
- Party member combat cards can have Loot (coins and items) and Companions (HP, AC and a Send to encounter button) tabs. Settings, At the table, has ticks for the NPC tabs and for the party member tabs, and a choice of opening every combat card on Fight or on the tab you used last.
v5.76.0 — Wild Shape (2026-10-21)
Added
- A party member can have Wild Shape (the 2024 rules). The question "Can they Wild Shape?" comes up when a character is created at level 2 or higher and when one reaches level 2. "No" ends it. "Not now" asks again at the next level-up, and then not again. Edit character has a checkbox to change it any time.
- The Wild Shape section is on the full Party card and on the Fight tab of the combat card. It shows the uses (2 at levels 2 to 5, 3 from level 6, 4 from level 17), the known forms against the table (4, 6 or 8 forms), the form being worn with its AC, speed and attacks (shown as text, since players roll their own dice), and Revert. Tapping a known form opens its stat card, with a button to take that form. Taking a form uses one use and gives temporary HP equal to the level, the higher of that and what the character already has. The character keeps their own HP. The combat card shows the form's AC while it is on.
- A creature search finds any creature from the creature list, with its stats next to it. It says whether the creature fits the Wild Shape limits (a Beast, the highest CR for the level, no flying speed before level 8), and lists the reasons when it does not. These limits are reminders: any creature can still be saved, and one over the limits is marked "ruling". The search has filters (Beasts only, within the limit, flying, swimming), sorting, the most recent picks first, a list of the saved forms, and a way to add a name with no stats. A "Highest CR" box on the section sets the limit by hand, for a subclass the SRD does not cover.
- A Short Rest gives back one Wild Shape use and a Long Rest all of them and ends the form. After a Long Rest each known form has a Swap button to replace it with another, as the rules allow; "Not this time" closes the offer.
- "Look up a creature" (Party tab button and the command palette) opens the same search just to read a stat card, with no limits and nothing saved.
The level of the character is used as the Druid level.
v5.75.0 — The combat card (2026-10-20)
Added
- While Combat mode is on, a saved NPC, a guest and a party member are each shown as a combat card instead of the long full card. For an NPC the vitals are on top (AC, speed, initiative, save DC, HP with a bar, and -1, -5, -10, +5 buttons next to Dmg, Heal and Temp). Below them are four tabs: Fight, Abilities, Roleplay and Loot.
- Fight has the Action, Bonus and Reaction ticks, the weapon with Roll attack and Roll damage buttons, the signature ability, conditions (the active ones, with a "+ Condition" button for the rest), active effects with their durations, and special-action pools such as legendary actions as tap-to-use pips. A roll made here also goes into the dice panel's log.
- When an NPC in the encounter drops to half HP or below, its morale line comes up on the Fight tab until you dismiss it. Healing it back above half re-arms the reminder.
- The "Full card" button opens the complete card in a drawer from the right over a dark scrim. Escape, the scrim and Close shut it.
- Settings has a Combat card section for choosing which of the Abilities, Roleplay and Loot tabs are shown. This is kept on this device only.
- Below 1150px the vitals stay at the top of the window while the card scrolls and shrink to a small avatar, the name, AC and HP.
- Motion: the tab pill glides and the content slides, the HP number counts, a floating -7 or +6 rises, a trailing bar drains behind the HP bar, a big hit shakes the card with a red flash and a heal flashes green, the Action pops and dims the weapon, conditions pop with a ring, the morale reminder slides in, pips pop and refill one after another, and the card of the next combatant fades in with a small zoom while the old one fades out. All of it follows the Motion setting.
A party member's combat card has the same vitals (AC, initiative, proficiency, passive perception, HP and quick buttons) and the tabs Fight, Abilities and Notes. Fight has the Action, Bonus and Reaction ticks, death saves when they are down, inspiration, exhaustion, conditions and effects. A guest gets the NPC card without loot. Companions and creatures keep their own cards, and turning Combat mode off shows the full cards again. The "Loot" button on a defeated NPC in the Encounter tab shows the Loot tab.
Turning Combat mode on moves the card to whoever's turn it is, so the card that was open before (a shop you were in the middle of, say) is remembered. Leaving Combat mode brings it back, unless you opened something else by hand during the fight. Clicking a turn marker in the Encounter tab turns Combat mode on, the way Next already did.
v5.74.0 — Combat and Dice motion (2026-10-20)
Added
- The Combat and Dice ticks in the header are now switches. The knob springs across and shows a tick when it is on. It is still a real checkbox underneath, so the keyboard and the label click work as before.
- Turning Combat mode on draws the red edge down the left side of the NPC card. The Hit Points buttons, the 5.5e tracker and the combat snapshot rise in one after another, and the "Their turn" and "Down" badges pop in.
- Dice results tumble: the number cycles through random values, slows down and settles. The box then takes a colour for a low, middle or high roll. A natural 20 turns gold with a glow and a "NAT 20" label, and a natural 1 turns red and shakes with a "NAT 1" label. Rolls that are not a single die (damage, save) keep the short flash.
The tumble, the shake and the movement of the other effects follow the Motion setting: Calm keeps the colours and fades but skips the tumble and the shake, Off shows the result at once. Screen readers hear the finished roll, not the cycling numbers.
v5.73.0 — Landing page motion (2026-10-20)
Added
- The headline, the text under it and the main button rise in one after another when the landing page opens.
- The sections further down grow in from slightly smaller the first time you scroll to them. Nothing is hidden before the page is running, and the first screen is never held back.
- The setting and feature cards grow a little when you point at them (not on touch screens).
- The tracker screenshot is blurred while it loads and sharpens when it arrives.
- The rows in "Your campaigns" slide in from the left, one after another.
All of it follows the Motion setting: Calm uses fades only, Off shows everything at once.
v5.72.1 — Backup checks everywhere (2026-10-20)
Changed
- Restoring a backup, importing a file over the campaign, changing the setting and signing out with "remove from this device" used to download a backup file every time. They now skip it when a backup you downloaded earlier still matches what is here. Signing out also skips it when the campaign is saved in the cloud.
- History no longer shows each roll's seed code in the list. Hover a row to see it.
Fixed
- Opening another campaign no longer treats the backup file from Settings as a safe copy. That file is rewritten with the next change, so it would not hold the campaign you left. Only a downloaded backup that still matches, or the cloud, counts.
v5.72.0 — Fewer backup prompts when switching campaigns (2026-10-20)
Changed
- Opening another campaign used to ask for a backup download every time the browser held NPCs. It now looks first: if a backup of exactly what is here already exists, nothing is asked. If a backup file is set up it is updated on the spot, and if the campaign is connected to the cloud its latest changes are saved there. Only when nothing covers the campaign does a dialog ask, showing what is in the browser (NPCs, groups, players) and the name of the file it will download.
- Backup files from that dialog are named after the setting, for example
throne-of-glass-campaign-backup-2026-10-20.json, not "this-browser".
v5.71.0 — Shorter History (2026-10-19)
Changed
- The History tab shows your 5 newest rolls and a "Show all" button for the rest (it keeps up to 30), so the panel is no longer a long list by default.
v5.70.1 — Smoother panel switching (2026-10-19)
Fixed
- Switching between Collection, Party, Encounter and History now slides the old panel out and the new one in, and the card glides to the new height instead of jumping.
v5.70.0 — Clearer sections on phones (2026-10-19)
Added
- On phones and narrow windows, Collection, Party, Encounter and History each start with their name, a count of what is in them ("Collection · 14 NPCs", "Encounter · round 2"), one line about what the section is for, and a short tip. Once you scroll past that heading, a small label with the name and count stays at the top of the screen.
- The bottom bar now has a small icon above each section name.
v5.69.0 — Attacks use the Action (2026-10-19)
Added
- When an NPC or a creature attacks from the Encounter tab, its Action button is ticked for you. Players are never ticked, since they track their own turn. A bonus attack or a reaction still takes one tap to fix.
v5.68.3 — Highlight fixes (2026-10-19)
Fixed
- In the Encounter tab, the blue turn highlight follows its row at once when a panel opens or closes, instead of trailing behind. It still glides when the turn passes or the order changes.
- The tier switch no longer shows the mouse's hover shade on top of the gliding highlight.
Changed
- Pressed buttons now sink a millimetre or two instead of shrinking.
v5.68.2 — Shorter changelog wording (2026-10-19)
Changed
- Several recent changelog entries are shorter and plainer.
v5.68.1 — Motion Off is fully still (2026-10-19)
Fixed
- With Settings → Motion on Off, the small colour fades on buttons and tabs still ran. Now nothing moves or fades. On Calm, the gliding highlight and the type list's arrow no longer slide.
v5.68.0 — Panels that slide (2026-10-19)
Added
- The dice panel slides up when you show it and down when you hide it.
- The keyboard shortcuts window opens like the other dialogs.
- The Build, Clocks and Notes tools in the Encounter tab drop in under their buttons.
v5.67.0 — The NPC card and the lists move (2026-10-19)
Fixed
- Rerolling a single field with its arrow no longer replays the whole card's entrance. Only a new roll, a loaded seed or an opened saved NPC does.
Added
- The reroll arrow spins once and the new text rises in.
- Condition chips pop when you switch them on.
- A new party member comes in, and a removed one folds shut. History rows fade in.
v5.66.0 — Smoother controls (2026-10-19)
Added
- The small choices in Settings (Motion, Units, Halloween) and the tier switch now share one highlight that glides to your pick, like the tab bar.
- Buttons dip slightly while pressed.
- Notices at the top (backup reminder, cloud nudge, setting note) slide in, and fold shut when you dismiss them instead of vanishing.
v5.65.1 — Commoner (2026-10-19)
Changed
- In the Throne of Glass setting, the "Street Passerby" type is now called "Commoner". NPCs you already saved keep the name they were rolled with.
v5.65.0 — A better NPC type chooser (2026-10-19)
Added
- The NPC type is chosen from a short list grouped as Fighters, Sneaks, Social and Magic and faith. Each row shows the type's role and its hit dice and armor, and the list opens with a quick drop and fade. It works from the keyboard (arrows, Home and End, Enter, Escape, or type a few letters). On phones the phone's own picker is still used.
- A grey line under the toolbar says what the chosen type and tier are.
Changed
- The tier is now a row of three, Minion, Standard and Elite, with a highlight that glides to your choice, instead of a dropdown.
v5.64.0 — Dialogs animate when Motion is Full (2026-10-19)
Fixed
- Dialogs, the theme button and the landing preview never animated when the computer was set to reduce motion, even with Motion on Full. Settings → Motion now decides: Full animates, Calm only fades, Off stays still. Until you choose, it starts on Calm if your computer asks for less motion.
Added
- The blocks in Settings rise in one after another when it opens.
v5.63.0 — Halloween: Gore (2026-10-19)
Added
- The Halloween setting has a fourth choice, Gore: the worst and most graphic level, with its own lines for every NPC type. About 3 NPCs in 10 get a touch and carry a "Halloween · Gore" tag. It needs the same sign-in and 18+ confirmation.
v5.62.0 — Halloween lines for smiths, nobles, scouts and guards (2026-10-19)
Added
- The Halloween setting now also has lines written for smiths, nobles, scouts and city guards in the Throne of Glass setting, an Eerie and a Grim set for each. That finishes the lines for every NPC type in both settings.
v5.61.0 — Halloween lines for witches, scholars, assassins and Valg (2026-10-19)
Added
- The Halloween setting now also has lines written for witches, scholars and healers, assassins and the Valg in the Throne of Glass setting, an Eerie and a Grim set for each.
v5.60.0 — Halloween lines for street folk, merchants and the fae (2026-10-19)
Added
- The Halloween setting now also has lines written for street folk, merchants, prisoners and the fae in the Throne of Glass setting, an Eerie and a Grim set for each.
v5.59.0 — Halloween lines for priests, mages and more (2026-10-19)
Added
- The Halloween setting now also has lines written for priests, smiths, nobles, rangers, cultists and mages, an Eerie and a Grim set for each. That finishes the Standard Fantasy types.
v5.58.0 — Halloween lines for common folk (2026-10-19)
Added
- The Halloween setting has lines written for commoners, merchants, bandits, thugs, city guards and hitmen, an Eerie and a Grim set for each. NPCs of these types are more likely to get a touch that fits them.
v5.57.0 — Halloween (2026-10-19)
Added
- Settings has a new Halloween choice: Off, Eerie or Grim. When it is on, about 1 NPC in 7 (Eerie) or 1 in 5 (Grim) gets one to three grim touches: a loot line, or a darker Looks, Quirk, Rumor or Hook. Such an NPC carries a small Halloween tag. The same seed still makes the same NPC, apart from the touches.
- It is for adults: you need to be signed in and say once that you are 18 or older. It is off until you choose it.
v5.56.0 — Metric or imperial (2026-10-19)
Added
- Settings has a new Units choice: Metric or Imperial. Metric shows distances and weights as meters, kilograms and kilometers, using the book's metric rates (30 ft is 9 m, 5 ft is 1.5 m, 1 lb is 0.5 kg). It covers creature stat blocks, abilities, weapon reach, shop goods, condition notes and the copied, Markdown and print versions. Saved data stays in feet, so the JSON backup is unchanged.
Changed
- Distances show in meters until you choose Imperial in Settings.
v5.55.0 — Rare finds (2026-10-19)
Added
- Now and then an NPC hides one rare item, from a healing potion to something legendary. Under the loot, "Something is hidden here" shows the Investigation DC to beat: 10 for a nice item, 15 rare, 20 very rare, 25 legendary. Press "They found it" when the players beat it. The reveal grows with the rarity: a fade for nice, green sparks for rare, and a glow, rings and a burst for very rare and legendary, with the name decoding out of runes. Calm only fades and Off shows it at once.
- About 1 in 50 for a standard NPC, more for elites and wealthy types, less for poor ones. Better items need higher party levels, and a beggar never carries a Bag of holding. Items suit the type (a mage is likelier to hold a wand). Standard Fantasy uses ordinary items. Throne of Glass has its own, each with a "plays like" note.
- Every item has a short explanation of what it does.
- The find is separate from the loot lists, so rerolling the loot never touches it. A lock next to it guards "Reroll find" (another item of the same rarity) and, on an NPC without one, "Add a rare find". "→ PC" gives it to a player.
v5.54.0 — More loot in Throne of Glass: smiths, nobles, scouts (2026-10-19)
Added
- Smiths, nobles and scouts in the Throne of Glass setting have much longer loot lists: 15 new things to carry, 15 for the pocket and 15 hidden, for each of them. That finishes the longer lists for every NPC type in both settings.
Changed
- A seed you saved before this update can roll a slightly different NPC for these three types, because the lists they pick from are longer now. NPCs already on your campaign are not affected.
v5.53.0 — More loot in Throne of Glass: witches, scholars, assassins, Valg (2026-10-19)
Added
- Witches, scholars and healers, assassins and the Valg in the Throne of Glass setting have much longer loot lists: 15 new things to carry, 15 for the pocket and 15 hidden, for each of them.
Changed
- A seed you saved before this update can roll a slightly different NPC for these four types, because the lists they pick from are longer now. NPCs already on your campaign are not affected.
v5.52.0 — More loot in Throne of Glass: street folk, merchants, prisoners, fae (2026-10-19)
Added
- Street folk, merchants, prisoners and fae in the Throne of Glass setting have much longer loot lists: 15 new things to carry, 15 for the pocket and 15 hidden, for each of them.
Changed
- A seed you saved before this update can roll a slightly different NPC for these four types, because the lists they pick from are longer now. NPCs already on your campaign are not affected.
v5.51.0 — More loot for rangers, cultists and mages (2026-10-19)
Added
- Rangers, cultists and mages have much longer loot lists too: 15 new things to carry, 15 for the pocket and 15 hidden, for each of them. That finishes the longer lists for all the Standard Fantasy types.
v5.50.0 — More loot for hitmen, priests, smiths and nobles (2026-10-19)
Added
- Hitmen, priests, smiths and nobles have much longer loot lists too: 15 new things to carry, 15 for the pocket and 15 hidden, for each of them.
v5.49.0 — More loot for common folk (2026-10-19)
Added
- Commoners, merchants, bandits and thugs have much longer loot lists: 15 new things to carry, 15 for the pocket and 15 hidden, for each of them. Rerolling loot gives more variety now.
v5.48.0 — Money for every NPC (2026-10-19)
Added
- Every NPC now carries a coin purse among the things in their pocket, sized by what kind of person they are and how strong they are: a commoner has a few coppers, a guard some silver, a merchant or a noble gold. NPCs with something hidden also have a bigger stash among the hidden things, and now and then one carries a small valuable, such as a silver ring (5 gp).
- The amounts grow with your party's level, like the enemies do: level 3 is the base and each level adds about 40%. Large amounts turn into bigger coins (silver becomes gold, then platinum).
- Pressing "→ PC" on a coin line rolls it and announces what was found as a notification, for example "Aria received 10 sp (rolled 2d6: 6 + 4)". It used to be a small grey line that disappeared after a few seconds.
Changed
- A seed still makes the same NPC as before; it just carries money now. NPCs you have already saved are unchanged.
v5.47.0 — Motion (2026-10-19)
Added
- Settings has a new "Motion" choice: Full, Calm or Off. Until you choose it follows your system's "reduce motion" setting (Calm). Calm keeps only quick fades and Off stops all movement.
- The selected tab is a pill that glides to the new tab (about half a second), and the panel slides in from that side. The same goes for the bar at the bottom of a narrow window.
- A new NPC settles in with a short fade and rise (about 0.3 seconds) when you roll, roll again, load a seed or open a saved NPC.
- Dialogs fade out when they close, and menus pop open.
- Encounter: the turn marker glides from one combatant to the next, rows glide to their new place when the order changes (a defeated NPC sinks to the bottom with a skull), HP numbers count up or down, a hit flashes and shakes the row, healing gives it a short green pulse, and a player dropping to 0 HP gets two slow red pulses before the death-save pips pop in. New rows settle in.
- Deleting an NPC in the Collection folds its row away before the Undo message appears. Notifications slide up, and panels such as "HP & actions" unfold in browsers that can animate it.
v5.46.0 — A calmer landing page when signed in (2026-10-18)
Changed
- When you are signed in, the top bar of the landing page shows one round avatar, with a small amber dot while your email is not verified. It opens a menu with your email, the verification reminder, "Your campaigns", "Account settings" and "Sign out", instead of six items in the bar that wrapped on a narrow window.
- Signed in with a campaign connected, the first screen says "Welcome back" and shows the campaign's name, its setting, NPC count and session, when it was last played, and a "Continue →" button. "Switch campaign" scrolls to the list when you have more than one. Visitors who are not signed in see the page as before.
- While your campaigns load, a placeholder of the same size stands in for the list, so the page below no longer jumps down when it arrives.
- "Account settings" opens the toolkit's account dialog (download your data or delete your account).
v5.45.0 — Getting started (2026-10-18)
Added
- A round button with a progress ring next to the ⚙ opens a five-step guide to your first fight: roll an NPC, save it, add your players, start an encounter, roll initiative and press Next. The steps tick by themselves. The button grows into the panel and shrinks back when you close it. When all five are done, or you press "Hide this button", it disappears and a message says the guide now lives in the ⚙ menu, next to Help. The "Getting started" entry there opens it at any time.
- The guide has "Try it with sample data" and "Remove sample data".
Changed
- The sample players now have different ability scores, armour classes and hit points instead of ten in everything, and a "Sample" tag on their card. "Remove sample data" takes them away together with the sample NPCs.
v5.44.0 — Defeated NPCs and death saves (2026-10-18)
Added
- An NPC or enemy creature at 0 HP is now defeated. It loses its turns, sinks to the bottom of the Encounter list and its name is struck through, but it stays in the encounter and can still be opened. A Loot button jumps to its loot. If it was its turn, the turn moves on at once. Healing it puts it back in the fight.
- A player, ally, companion or guest at 0 HP is down. Six death-save pips (three green, three red) show in the Encounter row and on the Party card: tap a pip to record a roll, tap the last one again to undo it. On a downed player's turn a prompt offers "+ Success" and "+ Failure". Three successes show Stable and three failures show Dead; stable and dead players have no turn. Nothing happens by itself: you roll at the table and tick the result.
- "Heal…" on a downed player opens the heal window with the amount, who helped, and a new "Stabilise only" button. Healing above 0 HP ends the death saves.
Changed
- Next skips combatants without a turn, and "Next up" never shows them. Dropping to 0 HP, and a long rest, start the death saves from zero.
- The small "DS 0/0 +S +F" tag is replaced by the pips, which are now visible without opening "HP & actions".
v5.43.0 — A tidier Collection (2026-10-18)
Changed
- Each group in the Collection has one "⋯" menu instead of four small icons: Select all in group, Add to encounter, Rename, Reset colour (when it has one), and, in red at the bottom, Remove all NPCs and Delete group (both still ask first).
- Groups that hold NPCs come first, then Ungrouped, and the empty groups are folded into one line ("6 empty groups: Town, Important NPCs, Enemies…") that you can open.
- The "Enc" square on a party card shows a + and turns into a green ✓ once the player is in the encounter. Click it again to take them out.
v5.42.0 — A clearer Encounter tab (2026-10-18)
Changed
- The top of the Encounter tab now follows the fight. With nobody in it you see a three-step strip (Add, Roll initiative, Fight) and four choices: Party, From Collection, Creature and Random. Once NPCs or creatures are in, one big "Roll initiative" button appears. After the roll it becomes a big "Next ▶" with "Now: … · Next up: …" under it and the HP undo button next to it.
- "Party" adds all your players at once (the ones already in are skipped).
- Build NPCs, Clocks and Notes are buttons in a Tools row at the bottom, and "Add combatants" is now "+ Add more" under the list with the same choices. "Clear encounter" is a quiet link in the Tools row and still asks first.
Added
- "Roll for new": when you add NPCs or creatures during a fight, it rolls initiative only for them. The round and everyone else's numbers stay, and the turn stays with whoever is up. "Re-roll initiative" (everyone, back to round 1) is in the Tools row.
v5.41.0 — Tabs that stay in reach (2026-10-18)
Changed
- The Collection, Party, Encounter and History tabs now stay at the top of the window as long as you scroll, also while you read a long NPC sheet. On a narrow window they move to a bar fixed at the bottom of the screen, and tapping a tab also scrolls to its panel. The dice panel and notifications sit above that bar.
v5.40.0 — A calmer backup reminder, and Undo for deleted NPCs (2026-10-18)
Changed
- The backup reminder is now one line: "Cloud sync isn't a backup. Keep a copy on your computer." with a single "Back up" button. Its menu offers to download a backup file now, to set up automatic backup (Chrome and Edge), or to remind you in 3 days. The ✕ next to it does the same as "Remind me in 3 days". The buttons no longer run off the edge of a narrow window.
Added
- Deleting an NPC from the Collection now shows "<name> deleted" with an Undo button for 8 seconds. Undo brings the NPC back in the same place, in the encounter again if it was in one, and with its links to other NPCs.
v5.39.0 — A tidier footer (2026-10-17)
Changed
- The footer of the toolkit is no longer one long line of dots. The cloud and local backup status are two small chips with a coloured dot (green when saved recently, amber when something is waiting or the backup is more than a day old, red when sync failed, grey when not set up). The links sit on their own row and the version underneath. It reads cleanly on a phone, where the old line wrapped awkwardly.
v5.38.0 — Verify your email (2026-10-17)
Added
- Creating an account with email and password now sends a verification email. The sign-up dialog turns into a "Check your email" step with a Resend button (it waits a minute between sends), "I've verified, continue", and "Use a different address".
- Accounts whose email is not verified yet show a small "Email not verified" notice with a button to send the email again, on the front page and in the cloud dialogs. It goes away by itself once you open the link and come back. Nothing is blocked for now. Google accounts are always verified and never see it.
- The verification email now comes from a dnd-toolkit.com address.
v5.37.0 — Sign out on the front page (2026-10-17)
Added
- When you are signed in, the front page has a Sign out button next to your email, so you can sign in with another account without opening the toolkit first. It works like the toolkit's own sign-out: this browser stops syncing, and you can also remove the campaign from the device (a backup file is downloaded first).
v5.36.4 — A quicker arrival (2026-10-17)
Changed
- The arrival in the toolkit after the arcane circle is about 0.7 seconds shorter: the glow holds a little less and fades faster.
v5.36.3 — The toolkit loads in the background (2026-10-17)
Changed
- While the front page is open, the toolkit page is now downloaded in the background, so it opens faster after the animation instead of starting to load only then.
v5.36.2 — A longer, softer arrival (2026-10-17)
Changed
- After the arcane circle, the toolkit now opens out of a soft glow where the circle was. The glow holds for a moment and then fades slowly while the panels rise in, instead of fading in quickly.
v5.36.1 — Easier-to-read HP numbers (2026-10-17)
Changed
- In the light theme the HP numbers and the Bloodied label are darker, so they are easier to read on the beige cards. The HP bars keep their colours.
v5.36.0 — Theme tiles and narrow windows (2026-10-17)
Changed
- The theme picker in Settings shows both themes as small previews you click, instead of a drop-down.
Fixed
- On narrower windows the side panel now moves below the NPC card earlier, and the buttons above the collection no longer wrap onto a second line first.
- The tab names (Collection, Party, Encounter, History) sit centred in their boxes instead of leaning to the right.
- The scrollbar in dialogs is slim and sits inside the dialog instead of sticking out over its rounded corners.
- The page behind a dialog no longer scrolls while a dialog is open, including when you scroll past the end of the dialog.
v5.35.0 — A preview picture for shared links, easier to read (2026-10-17)
Added
- When you share a link to the site in a chat app or on social media, it now shows a preview picture of the tracker inside the arcane circle.
Changed
- In the dark theme, filled blue buttons and badges use a slightly deeper blue so the white text on them is easier to read. Blue text and outlines are unchanged.
- Small grey text is a little lighter in the dark theme.
- Footer links, checkboxes and the small icon buttons are bigger and easier to hit, and the main roster buttons are taller on touch screens.
Fixed
- The main buttons (Roll and the other filled ones) showed dark text on a dark background in the light theme. They now use light text.
v5.34.2 — Tracker picture caption (2026-10-17)
Changed
- Reworded the caption under the tracker picture on the front page.
v5.34.1 — Smoother start, tidier drop-downs (2026-10-17)
Changed
- After the arcane circle, the toolkit now fades in out of the dark instead of appearing at once.
- The arrow on drop-down menus sits a little further in from the edge, and follows the light or dark theme.
Fixed
- A console error about the page not matching after the front page animation is gone.
v5.34.0 — An arcane circle opens the toolkit (2026-10-17)
Added
- Starting the toolkit from the front page now plays a short arcane circle animation: the page dims, a ring of writing and runes draws itself around the button, then the toolkit opens. With "reduce motion" turned on in your system settings, it opens at once.
v5.33.2 — Front page touch-ups (2026-10-17)
Changed
- Small touch-ups to the front page animations.
v5.33.1 — Sharper tracker picture on phones (2026-10-17)
Fixed
- The combat tracker picture on the landing page is now taken from the real phone layout, so the text is readable and sharp on a phone. It used to be a shrunken crop of the desktop view that ended mid-card.
v5.33.0 — Creatures in saved presets and the narrative recap (2026-10-17)
Added
- Saved encounter presets now keep the creatures from the creature list, foes and allies, along with the NPCs. Applying a preset adds them back, and replacing an encounter also clears the creature foes that were in it. An encounter made only of creatures can be saved too.
Fixed
- The narrative session recap now lists creature foes under Opposition. A fight against creatures only used to show no opposition at all.
v5.32.17 — Typed store, and a fixed prompt (2026-10-16)
Fixed
- The prompt shown when a concentrating player character, companion or guest takes damage now asks about concentration. It used to show the wording meant for ongoing effects, with blank values.
Changed
- The whole store is now checked by the compiler, so a wrong name or value in any part of the app is caught before a release.
v5.32.16 — Typed session data (2026-10-16)
The session's data and actions, and the store's own settings, now have written-down types too.
v5.32.15 — Typed NPC card data (2026-10-16)
The open NPC's data and actions now have written-down types too.
v5.32.14 — Typed Party data (2026-10-16)
The party's data and actions now have written-down types too.
v5.32.13 — Typed Collection data (2026-10-16)
The Collection's data and actions now have written-down types too.
v5.32.12 — Typed Encounter data (2026-10-16)
The Encounter tab's data and actions now have written-down types, so the compiler can catch mistakes in them.
v5.32.11 — Firebase 13 (2026-10-16)
The cloud save library (Firebase) is updated to version 13.
v5.32.10 — Confirmations in the app's own dialog (2026-10-16)
Changed
- Deleting selected NPCs, emptying a group, deleting a group and going back to the last session ask in the app's own dialog instead of the browser's pop-up. Browsers that block pop-ups no longer turn those buttons into nothing.
- Trying to delete the "Previous encounters" group shows a short notice instead of a pop-up.
v5.32.9 — Tidier project folder (2026-10-16)
Old planning notes moved to docs/archive, and an unused config file was removed.
v5.32.8 — NPC card code in smaller files (2026-10-16)
The shop, loot and copy panels of the NPC card are in their own files.
v5.32.7 — Encounter code in smaller files (2026-10-16)
The Encounter tab's code is organized into smaller files, one for each job.
v5.32.6 — Cloud save code in smaller files (2026-10-16)
The cloud save code is organized into smaller files, one for each job.
v5.32.5 — Updated libraries (2026-10-16)
Next.js, React and a few other libraries are on their latest compatible versions.
v5.32.4 — Every source file is type-checked (2026-10-16)
All source files are now checked for type mistakes automatically, so typos are caught before a release instead of at the table.
v5.32.3 — More automatic tests (2026-10-16)
Automatic tests now cover the cloud conflict check, the storage warnings and restoring a backup when there is not enough room.
v5.32.2 — Seeds open the right NPC (2026-10-16)
Typing a seed could open a different saved NPC.
Fixed
- A seed whose type or tier part was different could open a saved NPC that only shared its last letters and digits. A seed now opens a saved NPC only when the type and tier match too.
v5.32.1 — Warns when your browser can't save (2026-10-16)
If the browser's storage fills up or is blocked, the toolkit used to carry on without saving anything. Now it tells you.
Added
- A notice when changes can't be saved on this device, with an "Export now" button. It goes away once saving works again.
- A saved value that can't be read is no longer overwritten without a trace. The unreadable text is kept, and a notice lets you download or discard it.
Changed
- Restoring a backup or opening a campaign when there isn't enough room now stops and leaves your data as it was, instead of stopping halfway.
v5.32.0 — A closer look at the toolkit (2026-10-16)
The front page shows more of what you get, and its small text is easier to read.
Added
- A "See the combat tracker" picture on the front page, in the light and the dark theme, with a close-up version for phones.
- The two settings are shown side by side on the front page. "Compare the settings" under the main button jumps to them.
Changed
- The "Roll an NPC" button now sits above the example, so it is on screen on a phone and stays in place when a new NPC appears.
- Small grey text (hints, labels) is a little darker in the light theme and a little lighter in the dark theme, so it is easier to read.
- /licenses (and /license) lead to the Licences page.
v5.31.2 — Legal pages: contact, links and a German summary (2026-10-16)
The Impressum and the privacy page say a little more, and the text pages are one click apart.
Changed
- The Impressum says that email is the preferred way to reach the site's operator and that there is no telephone number.
- The privacy, licences, Impressum, downloads and changelog pages end with links to the others.
- The privacy page starts with a short summary in German, says how long Vercel keeps its server logs, and says the toolkit is not aimed at children under 16.
v5.31.1 — No more sideways wiggle (2026-10-16)
The pages no longer slide left and right under a finger or a touchpad.
Fixed
- Pages can't be scrolled or bounced sideways any more, on phones and laptops.
- On a laptop-sized window (about 900 to 1000 pixels wide) the Collection, Party, Encounter and History tabs were a few pixels too wide for their panel, which was what made the toolkit wiggle. They fit now.
v5.31.0 — A tidier footer (2026-10-16)
The front page ends with a button, and the credits have their own page.
Added
- A closing "Start" button at the end of the front page. It does what the top one does, including "Continue" when you already have a campaign.
- A Licences page with the full System Reference Document credit and the note about this being a fan project. It is linked from the footer of the front page and of the toolkit.
Changed
- The front page footer is shorter: the name, a one-line credit, and the links grouped under Toolkit and Legal.
v5.30.0 — Motion on the front page (2026-10-16)
The landing page and the start of the toolkit now move a little.
Added
- "How do the settings differ?" opens smoothly, with the two cards rising in one after the other.
- A light/dark switch in the landing page's top bar. It is the same setting as in the toolkit, so your choice carries over.
- Starting the toolkit shows "Opening…" and a thin progress line while the front page fades out.
- While your data loads, the toolkit shows a faint outline of its layout, and then its panels fade in. The "D&D Toolkit" name stays in place, and in browsers that support it the pages crossfade.
- "Roll an NPC" on the front page fades smoothly from one NPC to the next.
- All of it is off when your system has "reduce motion" turned on.
v5.29.0 — A calmer front page (2026-10-16)
The landing page asks for one click instead of a comparison.
Changed
- A clear headline and one main button, "Start with Standard Fantasy". The other setting is a link under it, and "How do the settings differ?" opens the comparison.
- "Sign in" moved to the top bar, next to "Open the toolkit".
- "Try it: roll an NPC" rolls a real NPC right on the page, with stats, a quirk, a hook and loot, and nothing is saved. Three features instead of six, and the Downloads card is now a footer link.
- Larger, easier-to-read text, and a shorter footer.
v5.28.1 — Stricter cloud checks (2026-10-15)
Cloud save is stricter about who owns what.
Changed
- Each save code and campaign belongs to one account, and only the fields the app uses can be stored.
- The site sends standard browser security headers.
v5.28.0 — Privacy page and Impressum (2026-10-15)
The site now says plainly what it stores and who runs it.
Added
- A privacy page: what stays in your browser, what cloud save stores, what the hosting and speed measuring see, and how to download or delete your data.
- An Impressum page (German first, English below), linked from the footers.
- The sign-in window points to the privacy page and mentions that Google sign-in comes with your Google account's own security, including two-step verification.
Changed
- The text about save codes now says what is true: a save code is only the name of your save space, and only your signed-in account can open what is in it.
v5.27.0 — Your account: download and delete (2026-10-15)
Signed-in people can take their cloud data with them, or remove it.
Added
- "Account & data" in the cloud menu (and in the cloud save windows) opens a window with two actions.
- "Download all my cloud data" saves every campaign in your account, with its save code, as one file.
- "Delete my account" removes every save code and campaign in your account, trash included, and then the sign-in account itself. It asks you to sign in again (or enter your password) and to type a confirmation phrase first. The campaign stored in this browser stays. The admin account can't be deleted from here.
v5.26.0 — Sign in from the front page (2026-10-15)
You can pick up your campaigns straight from the landing page.
Added
- A browser connected to a cloud campaign shows "Continue <campaign name>" at the top of the landing page.
- "Sign in" on the landing page. Once signed in, it lists "Your campaigns", and Open continues one without going through a save code.
- A new account that picks a setting on the landing page gets its first cloud campaign created right away.
- A browser that is not connected to the cloud gets a one-line suggestion to sign in once the collection holds five NPCs. "Not now" hides it for two weeks, "Don't ask again" for good.
v5.25.0 — Your campaigns, trash and campaign tools (2026-10-15)
Signed-in people can see all of their campaigns without a save code, and a deleted campaign can be brought back.
Added
- "My campaigns" in the cloud menu lists every campaign in your account, under any save code. Open one to continue it on this browser.
- Deleting a campaign now moves it to "Recently deleted" for 30 days, where you can Restore it or Delete forever. A campaign in the trash does not count toward the campaign limit.
- Each campaign in My campaigns has Download backup, Rename and Duplicate.
- Campaign rows show the NPC count and session number, and a warning when a campaign is close to the size limit. Older campaigns show these after their next save.
v5.24.0 — Share links and a backup shortcut (2026-10-15)
Three small things for people arriving fresh or sharing NPCs.
Added
- Saving your first NPC now tells you it locks the campaign's setting.
- The landing page has an "I have a backup file" link that opens the restore dialog, for a new device or cleared browser data.
- A link button next to the seed copies a share link. Opening it in an empty campaign switches to the link's setting and loads the NPC. A campaign that is already locked to another setting says so and keeps its own.
v5.23.0 — One setting per campaign (2026-10-15)
A campaign now picks its setting when it starts and keeps it. You can change the setting until you save your first NPC; after that it is locked. To change it, delete the collection: Settings, Campaign setting. A backup file downloads first, and you confirm by typing a sentence.
Added
- A Campaign setting card in Settings and a setting chip in the header that says whether the setting can still change.
- "My campaigns" (it was "Load a save") lists each campaign with its setting. The buttons are now Open and Delete, and "+ New campaign" asks for a name and a setting.
- Restoring a backup or importing a file made in the other setting asks what to do first: load it and switch, keep your campaign, or, with cloud save, load it as a separate campaign. The setting is worked out from the NPCs, so old backups without a marker work too.
- Seeds and NPCs from the other setting are not loaded, and a message says why.
- The landing page shows "Continue your campaign" for a campaign that already has NPCs, with a link to change the setting.
- A one-time note for campaigns that existed before settings, and a Help card about settings and campaigns.
- The sample NPCs from Quick start do not lock a campaign, and a button clears them.
- "Report a bug" now opens an email that already lists the version, setting and NPC count.
Fixed
- Signing out now also disconnects this browser from the cloud campaign, so another account signing in no longer finds the previous campaign. A second choice, "Sign out and remove the campaign from this device", downloads a backup and clears the campaign from the browser (for shared computers).
- Setting up cloud save no longer fails with "Couldn't reach the cloud" for regular accounts.
v5.22.0 — Standard Fantasy (2026-10-15)
A second setting for NPCs. Standard Fantasy swaps in ordinary fantasy NPCs: city guards, bandits, thugs, assassins, priests, blacksmiths, minor nobles, border scouts, cultists and hedge mages, under a plain Crown, Watch, Thieves' Guild, Merchants' Guild and Temple. It is the default for new visitors. Existing saves keep the original content, now called Throne of Glass-inspired.
Added
- A choice of setting on the landing page and in Settings. Each setting has its own NPC types, names, hooks, abilities, weapons, loot, shop stock, random encounter regions and scene presets.
- Cultists have a devotion line and hedge mages a training line.
- New collections start with groups that fit the setting, and setting-specific condition tags only appear in the setting they belong to.
- Saved NPCs and seeds keep working, and every seed gives the same NPC whichever setting is selected.
v5.21.1 — NPC types cleanup (2026-10-13)
NPC types are now set up in one table instead of rules spread through the code. Seeds give the same NPCs as before.
v5.21.0 — Downloads page (2026-10-11)
The landing page now has a Downloads folder.
Added
- A Downloads page with two files. The first is The Hidden Courts, a free pack of races, backgrounds, subclasses and languages for the Aurora character builder, with its own version history. The second is this changelog as a text file.
Changed
- The landing page links to Downloads instead of the changelog page. The changelog inside the toolkit (the Help window and the download in the ⚙ menu) is unchanged.
v5.20.0 — Animals and monsters for encounters (2026-10-11)
Adding a wolf to an encounter meant typing it in by hand. The Encounter tab now has a built-in list of 152 animals and common monsters.
Added
- A "+ Creature" button in the "Add combatants" panel opens a searchable list, with filters for type and challenge rating. Pick one, choose how many, enemy or ally, and whether to roll HP or use the average. Several of the same creature are numbered ("Wolf 1", "Wolf 2"...).
- Each creature in the fight shows its AC and attacks under its name, and clicking the name opens the full stat block. On a creature's turn in combat mode, the main card shows that stat block too, tagged with its type (Beast, Undead...).
- "Roll init" also rolls for enemy creatures (d20 plus the creature's initiative bonus). Allies enter their own, like PCs.
- The difficulty estimate counts enemy creatures. Creatures are never counted as party members, so they don't change the party's average level.
- The session recap lists enemy creatures under Foes.
- The stat blocks come from the free SRD 5.2.1 rules text and were checked against the official document. The credit it requires is in the landing page footer and the Help window.
v5.19.0 — Edit a companion (2026-10-11)
A companion could only be added or deleted, so fixing a typo in its name or stats meant deleting it and adding it again.
Added
- A ✎ button on each companion opens the add-companion form with its current values filled in, so any of them can be changed.
Changed
- If the companion has already been sent to the encounter, its name, HP and AC change there as well.
- Companion ability scores can go up to 30, like PCs.
v5.18.0 — Edit a PC (2026-10-11)
A player character could not be changed after it was created. A wrong Wisdom score, for example, stayed wrong, and since Passive Perception comes from Wisdom, that stayed wrong too.
Added
- An "Edit character…" option in the ⋯ menu of a PC's Character section opens an Edit window with the name, who plays them, level, max/current/temp HP, AC, all six ability scores, hit dice, death saves, exhaustion, inspiration and the session stats.
- The window shows proficiency bonus, initiative and Passive Perception as you change the scores.
Changed
- Renaming a PC also renames it in the encounter.
- Lowering max HP below current HP pulls current HP down with it.
- Ability scores can go up to 30 (before: 20), for magic items. Level Up no longer cuts a score above 20 back down.
v5.17.1 — Fewer false sync conflicts (2026-10-11)
Cloud Save sometimes showed "This save was updated somewhere else" when you were the only one using it. The app could mistake its own save for a change from another device, mostly during long stretches of play or right after renaming a campaign.
Fixed
- Only one cloud save runs at a time now. Edits made while one is running are picked up by a single follow-up save.
- Each device marks the saves it writes, so its own earlier save is no longer treated as someone else's change. A change from another device still shows the message.
- Renaming a campaign no longer causes the message on the next save or reload.
- While the message is showing, the app stops trying to save over it.
v5.17.0 — Admin markers in Cloud Save (2026-10-07)
It was easy to forget which account you were signed in with. When the signed-in account is the admin, Cloud Save now says so.
Added
- A small shield on the Cloud save button, with a tooltip saying you're signed in as admin. It shows in every state of the button.
- An "Admin" badge next to the "Signed in as ..." line, both in the menu and in the Cloud save setup and load windows.
- Both only show for the verified admin account. Everyone else sees no change.
v5.16.2 — Admin account (2026-10-07)
The admin view of all cloud saves now uses a dedicated account on this site's own domain. Nothing changes on screen.
Changed
- The admin check in
lib/auth.tsandfirestore.rulespoints at the new account, and the rules also require a verified email.
v5.16.1 — Sitemap, robots.txt and canonical tags (2026-10-07)
Google Search Console flagged the bare-domain and http:// versions of the site as "page with redirect". They redirect to https://www.dnd-toolkit.com on purpose, so that's fine, but the site never told Google which address is the main one. This fixes that. Nothing changes on screen.
Added
sitemap.xmlandrobots.txt, built with the site, listing/,/appand/changelogon the www address.- A canonical tag on each of those pages pointing at its own www address.
SITE_URLinlib/site.ts, so the sitemap, robots.txt and canonical tags all use the same address.- The changelog page now has its own page title, "D&D Toolkit — Changelog". Before, it used the landing page's.
v5.16.0 — Fan-project disclosure (2026-09-30)
A short, honest disclosure added to the landing page footer, ahead of a larger planned feature that will make the NPC/encounter flavor content's inspiration openly selectable (a Throne-of-Glass-inspired pack alongside a new "Standard Fantasy" alternative). Shipped on its own first since the disclosure matters regardless of when that larger feature lands.
Added
- A new line in the landing page footer: this is a fan project, some of its flavor content is inspired by Sarah J. Maas's Throne of Glass series, it is not affiliated with or endorsed by the author or publisher, and no money is made from the site.
v5.15.0 — Onboarding quick-start (2026-09-27)
The third of three small improvements from a round of external UX feedback on dnd-toolkit.com — alongside the landing-page changes (public changelog page, fuller footer) and the in-app discoverability pass (keyboard shortcuts entry, Hall of Fame surfaced, a what's-new dot).
Added
- A "Quick start" button now appears on a genuinely fresh, empty profile (no NPC rolled yet, no party at all) — one click adds 3 deliberately varied sample NPCs (a combat-oriented guard, a merchant, and a social/ intrigue noble, not random picks, so it shows the generator's actual range) plus a small 3-person demo party, and confirms with a toast. Every fresh profile gets the exact same sample NPCs, since each one uses a fixed literal seed rather than a random one — a deliberate, reproducible demo rather than a surprise grab-bag each time.
v5.14.0 — In-app discoverability (2026-09-27)
The second of three small improvements from a round of external UX feedback on dnd-toolkit.com — alongside the landing-page changes (public changelog page, fuller footer) and an upcoming onboarding quick-start.
Added
- Keyboard shortcuts are now reachable from the
⚙menu ("Keyboard shortcuts…"), right next to "Help" — previously the only ways in were already knowing to pressK, or digging into the Command Palette. - A small dot on the
⚙icon lights up when there's a version you haven't seen yet, and clears the moment you open Help (via the menu, or theHkey) — a quiet nudge for returning users that something changed, without a banner or a popup.
Changed
- "Hall of Fame" moved out of the collapsed MVP section (where it was two clicks deep and invisible with an empty party) into the always-visible Session toolbar, right next to "Prep session".
v5.13.0 — A real changelog page, plus a fuller landing footer (2026-09-27)
The first of three small improvements from a round of external UX feedback on dnd-toolkit.com — the other two (in-app discoverability, an onboarding quick-start) ship as separate follow-ups.
Added
- A public
/changelogpage — the same prose changelog already baked into the app's own "Download changelog" button, now also linkable and readable without opening the toolkit at all. Linked from both the hero (a quiet "View changelog" line under the primary CTA) and the footer. - The landing page footer now also has a one-line privacy note (what data the app touches: Firebase for optional cloud save, anonymous Vercel Speed Insights — nothing sold or shared) and a "Report a bug"
mailto:link tofeedback@dnd-toolkit.comwith a pre-filled subject line. - A short, honest "Built by a DM, for the table." line alongside the existing version/attribution text.
v5.12.0 — A quiet footer for the toolkit page (2026-09-27)
Added
- The toolkit page (
/app) now has a small footer at the bottom: the current version number, a link back to the landing page (/— there was previously no way back once you were in the tool), and a low-key "last known state" reminder for both cloud sync ("Cloud saved 2m ago") and local backup ("Local backup 5m ago"). This isn't a replacement for the header's cloud-save chip or the backup-reminder banner — those stay the actionable surfaces — it's just a permanent glance, visible regardless of scroll position or which tab is open.
v5.11.0 — Session history now follows the campaign to other devices (2026-09-27)
Auditing exactly what cloud sync does and doesn't cover (prompted by the sync-conflict-detection work) turned up several localStorage keys that were real campaign data, tracked locally the whole time, but never included in what gets pushed to Firestore — so they silently stayed stuck on whichever single device wrote them.
Added
session_archive("Past sessions" — every archived session's notes and MVP history), the DM's own★20/💀1tally, and the initiative round counter (enc_round) are now part of the synced snapshot. Sizing check before shipping this: even an unusually long 100-session campaign with full per-PC notes and combat logs adds roughly 16 KB compressed to the cloud document — well within the existing 1 MiB Firestore cap, alongside everything else already synced.- The current session's start timestamp (
session_started_at, used for the "loot found this session" cutoff in exported recaps) is synced too.
Fixed
enc_roundwas the one genuine oversight here: its siblingenc_turn(whose turn it is) was already synced, but the round number wasn't — meaning resuming a fight on another device could restore whose turn it was with the wrong round count.applySnapshot()(used both for loading a cloud save and restoring a local JSON backup) used to treat "this key isn't in the snapshot at all" the same as "this key is explicitly empty" — clearing it either way. That was harmless before, but adding new keys to the synced set means any cloud save or backup file made before this update genuinely doesn't have them yet, so a snapshot missing a key now leaves whatever's already on this device alone instead of erasing it. Loading a fresh "New Campaign" or attaching a truly empty snapshot still wipes everything as before — it just now says so explicitly instead of relying on the key being absent.
v5.10.1 — Party-card session fixes, found live at the table (2026-09-27)
Three bugs surfaced during actual play.
Fixed
- Switching straight from one PC's "opened big" card to another's (without closing the first) could leave the previous PC's "Played by" name showing under the new PC's card — the underlying React component wasn't being remounted on switch, so its uncontrolled input field kept its old value until something else forced a full remount (e.g. rolling an NPC first).
- "Next session" silently did nothing — no archive, no reset — if a PC had written a session note but logged zero combat stats (dealt/taken/healed/ nat20/nat1). The check that decides whether there's "anything worth archiving" only looked at numeric stats, so a note-only session's note just carried over into the next one instead of being archived and cleared.
- "Past sessions" now shows each PC's archived note underneath the MVP/ Cursed podium, so a note that gets swept up by the fix above is actually visible afterward, not just saved invisibly in the data.
Added
- Every PC card now has a collapsed "Notes" folder ("what did they do this session?") — under the HP bar on the compact roster card, and under "Character" on the opened big card. Editing it from either card updates the other instantly, since both can be open on screen at once. Previously this was a single-line field buried further down inside each PC's individually-opened card ("Session & log"), which is also what made it easy to overlook and easy for "Next session" to silently skip (see the fix above). Same underlying field as before — still feeds into exported session recaps — just visible and usable without opening a PC's full card first.
v5.10.0 — Warn before a cloud save gets silently overwritten (2026-09-26)
Cloud save has never had a merge model: each campaign is one Firestore document, and every save fully replaces it. Two devices (or two browser tabs) signed into the same save code could each hold their own local copy, and whichever one autosaved last would silently overwrite the other's changes with no warning at all. This adds a conflict check so that can't happen invisibly anymore.
Added
- Before autosave pushes a change to the cloud, it now checks whether the cloud has moved on since this device last synced. If it has, a prompt appears letting you choose: keep this device's changes and overwrite the other version, or load the other version and discard what changed here.
- The same check also runs the moment the app opens, on a device that's been sitting on an older copy of the save for a while — catching a stale device before it's edited anything, not just once it tries to save on top of outdated data.
- The cloud-save status chip shows a distinct "Paused — resolve to sync" state while a conflict prompt is waiting to be answered.
Notes
- This only guards the automatic background autosave path — deliberate actions like starting a new campaign, renaming a campaign, or deleting one are unaffected (those already require an explicit, confirmed choice).
- This isn't full real-time merging (there's no field-level diffing anywhere in this app, and that's a much bigger project) — it's a same-device-family safety net for the specific failure mode that actually happened: a device sitting on stale data for a while before autosaving over a newer save. Two devices saving within the same few seconds of each other can still both slip through; that's an accepted, much narrower residual risk.
v5.9.1 — Fix inaccurate landing page copy (2026-09-26)
Fixed
- The landing page's "Cloud save-sync" feature card said "no account required," which hasn't been true since v5.8.0 — signing in (Google or email) is required before a save code can be generated or used. The card now reads "Sign in free, then a game-style save code carries your campaign to any device."
- The hero section's trust line claimed the app "works offline" — this app has no service worker or offline caching (it's a static export, not an offline-capable one), and local backup itself is browser- dependent rather than guaranteed everywhere, so that claim was never accurate. Changed to "no account needed," which holds app-wide (only cloud save-sync requires signing in).
v5.9.0 — A real landing page for dnd-toolkit.com (2026-09-26)
Until now, visiting dnd-toolkit.com dropped you straight into the full toolkit UI with no introduction. This adds an actual front door.
Added
- The root route (
/) is now a landing page: a top bar, a hero section (wordmark, one-sentence tagline, and one unmissable "Launch the toolkit →" call-to-action button), a six-card feature overview (seeded NPC generator, the full 2024-rules combat tracker, party tracking, session tools, cloud save-sync, and the command palette), and a short footer crediting the app and its current version. - The toolkit itself moved to
/app— the landing page's CTA links there, and it can be bookmarked directly to skip the landing page entirely.
Changed
- The page's
<meta name="description">now matches the landing page's own tagline instead of the old generic "Modular offline table tool" copy.
Built entirely from the app's own existing design tokens (colors, type scale, spacing, radii, shadows, and its bespoke responsive breakpoints) — no new dependencies, no new colors or sizes invented for this page alone.
v5.8.5 — Cloud save cleanup: no more duplicate menus (2026-09-26)
Small cleanup pass after the header-dropdown work: two redundant UI bits and two bits of example text.
Changed
- Cloud save's action list (Switch / load save…, New campaign…, rename/ copy/forget, Manage profiles…, Sign out) used to be reachable from both the header chip's own dropdown (added in v5.8.0/refined through v5.8.4) *and* the "⚙ Settings & more tools" menu — the exact same list, mounted twice. Removed it from "⚙"; the header chip is now the only place it lives, since two menus offering identical actions was just confusing, not a helpful shortcut.
- The header dropdown's own status line used to repeat the save code (e.g. "MIST-9980 · Campaign 1 · …") even though the chip it drops down from already shows that same code right next to it — redundant once v5.8.4 made the chip show the code on every screen size. Dropped the repeated code from that line.
- The Cloud Save setup screen's name-field placeholder now uses a generic example name.
- The sign-off line on exported session recaps and printed NPC cards now reads "Luca aka Jebedaya the Bard", the app's own DM-flavor touch.
v5.8.4 — Even-spaced mobile header, save code always visible (2026-09-26)
Follow-up to v5.8.3's mobile dropdown fix: with the dropdown readable again, the header row itself still looked cramped on a real phone — Combat, Dice, the save-code chip, and "⚙" all bunched to the left with a big empty gap trailing off to the right.
Changed
- On narrow screens (≤600px), that row now spaces its four controls evenly across the full width (
justify-between) instead of packing them to the left. No change above 600px — the desktop/tablet layout is untouched. - The save-code chip (e.g. "MIST-9980") now shows its code text at every screen size. It used to hide below 480px width to save space when the row was left-packed and tight; now that the row spreads out to fill the width, there's room for it, and hiding it meant there was no way to see which save you were connected to on mobile without opening the dropdown first.
v5.8.3 — Fix the header save-code dropdown on mobile (2026-09-26)
The dropdown added in v5.8.0 (click the header's save-code chip for switch/load/rename/sign-out actions) worked fine on desktop but was broken on mobile — found on a real phone, not caught in earlier testing.
Fixed
- The dropdown rendered as a stack of empty, full-width boxes that pushed the rest of the page down, instead of a proper floating menu. Two compounding bugs:
- It was positioned
right: 0relative to its own trigger. On desktop that trigger sits at the far right of the header row, so anchoring the menu's right edge there and letting it extend left naturally stayed on screen. On mobile the header wraps, and this trigger (after the Combat/Dice checkboxes, before the "⚙" button) ends up mid-row — right-anchoring a ~300–450px-wide box to a trigger sitting mid-screen pushed most of the box off-screen to the left, so all you could see was the empty tail end of each row. - It sized itself with
width: max-content, which measures text as if it never wraps — the "By the way — local backup… runs automatically here too, account or not" hint line alone forced the box to ~450px wide on any screen size, wider than most phones. - Fixed by centering the dropdown under its trigger instead of right-anchoring it, with a fixed width clamped to the viewport so it can never overflow narrow screens, and letting the long hint line wrap normally within that width.
- The save code itself (e.g. "MIST-9980") is now shown at the top of the dropdown's status line. Previously it was only visible in the header trigger's own label, which is hidden below 480px width to save space — meaning there was no way to see which save you were connected to on mobile once you opened the menu. Now it's always there.
v5.8.2 — Actually fix the admin dashboard this time (2026-09-26)
v5.8.1 fixed a real problem, just not the one that was actually blocking the admin dashboard.
Fixed
listAllCampaignsForAdmin()still failed with "Missing or insufficient permissions" after v5.8.1's rules fix, confirmed even with a raw RESTrunQuery(ruling out any client SDK/token quirk — this was a genuine server-side rejection). Root cause, found by testing in isolation: Cloud Firestore can only allow alist/collection-group query when it can prove, from the query's own filters alone, that every possible matching document satisfies the rule for that operation.listAllCampaignsForAdmin()runs an unfilteredcollectionGroup(db, "campaigns")scan — no filter exists for Firestore to check the owner-scoped half of the campaigns rule against, so it rejects the whole query, and no amount of restructuring that rule (v5.8.1's split into two independentallowstatements included) changes that outcome, because the restriction is specific to collection-group queries, not to how the rule is written. Confirmed directly: a plain (non-collection-group) read of one profile'scampaignssubcollection under its known parent path succeeded immediately with the exact same rules, where the collection-group version 403'd every time.- Rewrote
listAllCampaignsForAdmin()(lib/cloud-save.ts) to take the profile codes fromlistAllProfiles()and read each profile'scampaignssubcollection directly — one read per profile instead of one collection-group scan — which sidesteps the restriction entirely.CloudAdminModal.tsxnow sequences profiles-then-campaigns instead of fetching both in parallel, since the campaign read needs the profile codes first. Verified live: the admin dashboard now actually renders every owner/profile/campaign correctly, for the first time since the admin-rules feature shipped. - v5.8.1's rules split is kept — it's still what makes
countOwnedCampaigns()'s *filtered* collection-group query (the 3-campaigns-per-account cap check) work, since that query's ownwherefilter gives Firestore the provability it needs.
v5.8.1 — Fix admin dashboard permission error (2026-09-26)
No app code changed — Firestore rules only.
Fixed
- The admin dashboard ("Manage profiles…" for the admin account) always failed to load with "Missing or insufficient permissions," ever since the admin-rules feature first shipped — unrelated to v5.8.0's changes. Root cause:
firestore.rules' campaigns rule wasallow get, list: if isAdmin() || (resource.data.ownerUid == ...). Cloud Firestore validates alist/collection-group query against a rule by proving, from the query's own filters alone, that every possible matching document satisfies it.listAllCampaignsForAdmin()runs an unfiltered collection-group query, so Firestore can't structurally prove the second half of that OR — and rejects the whole compound condition, even though the first half (isAdmin()) doesn't depend on document data at all and is unconditionally true for the admin account. Split into two independentallow get, liststatements (the admin case standalone, the owner-scoped case separate) — the same shape/profiles/{code}'s own plainallow list: if isAdmin();already used, which never had this problem for exactly that reason. Found by reproducing the failure in isolation (listAllCampaignsForAdmin()alone, no concurrency) and confirming the fix the same way before writing it.
v5.8.0 — Cloud Save limits and a real admin dashboard (2026-09-26)
Two asks: cap how many campaigns a normal account can rack up, and give the admin a way to manage every cloud save from inside the app instead of the Firebase console.
Added
- 3-campaign cap per account. Every non-admin account is limited to 3 campaigns total, counted across *every* save code they own (not per code) — the admin account is exempt. Enforced client-side: this app's save-code model is already explicitly "not real security, like a video game friend code" (see
lib/cloud-save.ts's header comment), so a Firestore-rules-side hard cap — which would need a maintained counter field kept accurate through every create/delete path — wasn't worth the extra moving parts for this threat model. Hitting the limit shows a clear message instead of a generic "check your connection" error, wherever a new profile or campaign gets created. - Real admin dashboard. The existing admin-only "list every profile" view is now a full dashboard: every cloud save, grouped by owner (email and display name, stamped going forward at sign-up/claim time and opportunistically backfilled on legacy profiles the next time their owner is active), then by save code, then by campaign — with delete available at the owner level (wipe everything for one person), the save code level, or a single campaign. No more cross-referencing a truncated Firebase UID or opening the Firebase console to clean something up.
- The header's cloud-save status chip (the sync dot + save code, e.g. "● MIST-9980") is now clickable in its own right, opening the same action list — last-synced status, Switch / load save…, New campaign…, rename/copy/forget, Manage profiles…, Sign out — that used to only be reachable through the "⋯" menu. That menu entry still works too; this is a faster path to the same list, not a replacement.
Fixed
- The post-sign-in Cloud Save screen still said "a lightweight save code, not a real account" — stale now that Firebase Auth sign-in is required to reach that screen at all. Reworded to acknowledge the account is real while clarifying the save code is still a separate save-slot key, not a password.
- Added a short heads-up in three signed-in Cloud Save screens (the post-sign-in setup screen, the Load screen, and the header's account menu) that local backup also runs automatically on the device regardless of Cloud Save — previously only mentioned pre-sign-in.
v5.7.0 — Backup visibility, sign-in guidance, theme picker fix (2026-09-25)
Follow-up to v5.6.1's sign-in diagnostics work: makes local backup's status actually visible, explains browser support for it, points account-averse users at it from the sign-in screen, and fixes a Settings layout bug found along the way.
Added
- Settings' "Local backup" card now shows "last backup Xm ago" (reusing the same relative-time format Cloud Save's "synced Xm ago" already used), for both the automatic and manual-fallback states, ticking live while the modal is open.
- Settings now explicitly names which browsers support automatic local backup (Chrome, Edge, Opera, Brave, Vivaldi, Arc) versus which don't (Firefox, Safari, and anything built on them including iOS Safari), and explains that Cloud Save exists specifically to cover the browsers that can't do an automatic on-disk backup — rather than just saying "needs Chrome or Edge" with no context.
LoginModal.tsxnow says upfront that Cloud Save is the only thing in the app that needs an account — local backup (Settings → Local backup) already protects your data on this device without signing in, and Cloud Save is only for syncing across multiple devices.- Both local file backup and Cloud Save's autosave are debounced (a write fires a few seconds after things go quiet, so rapid edits collapse into one write instead of one per keystroke) — but a plain debounce that resets on every call never actually fires during genuinely continuous activity. Both now also force a write at least every 5 minutes regardless of how busy things stay, so a backup is never more than 5 minutes stale even mid-encounter.
Fixed
- The theme picker's dropdown opened anchored to the right edge of its own trigger button everywhere, including inside Settings — fine in the header (where the trigger sits near the screen's right edge and the menu opens leftward, staying on-screen), but inside Settings the trigger sits at the left of a full-width card, so the menu hung off to the left, disconnected from the button. The Settings theme picker is now a full-width, left-anchored control with its options laid out in a 2-column grid instead of a single narrow list.
v5.6.1 — Real sign-in error messages (2026-09-25)
Bug-fix / diagnostics release, prompted by Google sign-in failing on the new dnd-toolkit.com domain.
Fixed
- The root cause of Google sign-in failing on
dnd-toolkit.com: the domain wasn't in Firebase's authorized-domains list yet (forgotten during the v5.5.2 rebrand). Fixed in Firebase Console, not code — but the app gave no indication of what was actually wrong, which is what this release fixes. lib/auth.ts'sfriendlyAuthError()handled only ~9 Firebase Auth error codes; anything else fell through to a flat "check your connection and try again" with the real cause discarded — exactly what happened with the domain issue above (auth/unauthorized-domain). Expanded to cover every code reachable from this app's sign-in flows (Google popup, email/password, password reset): wrong credentials, cancelled/blocked popups, project/domain misconfiguration (includingauth/unauthorized-domainandauth/operation-not-allowed— the two most likely culprits for a "the button just doesn't work" report), network/rate-limit errors, and Firebase-side errors. Anything still unrecognized now shows the raw error code instead of hiding it, so a gap in this list is visible instead of a dead end.
v5.6.0 — Hall of Fame, command palette (2026-09-25)
Two additive features: a campaign-wide trophy case, and a Ctrl/Cmd+K command palette for jumping around the app without reaching for the mouse.
Added
- Hall of Fame: a new modal opened via a "Hall of Fame" button next to the MVP section's existing "Full table" button (Session panel). Reads
sessionArchive(already populated every time "Next session" archives a session's MVP/Cursed snapshot — nothing new is stored) and aggregates across every archived session: - A trophy tally: how many times each player has placed in a session's MVP top-3 or Cursed (most natural 1s) top-3, sorted by MVP count.
- Lifetime totals: summed Dealt/Taken/Healed/★20/💀1 per player, with the same per-column leader highlight as the single-session MVP table, plus a lifetime "As DM" row.
- Shows a friendly empty state until at least one session has been archived. Only counts sessions that have actually been archived — the current, still-in-progress session's live stats aren't included.
- Command palette (Ctrl/Cmd+K): a searchable list of commands, opened from anywhere in the app — including while typing in a text field, since reaching for it mid-note shouldn't require clicking away first.
- Static commands: Roll NPC (reuses whatever Type/Tier/shop-specialty the toolbar is currently set to), Undo last damage, toggle Combat mode, toggle the Dice panel, Next session, and "Go to {tab}" for each of Collection/Party/Encounter/History.
- Type a few letters of any NPC or PC's name to jump straight to their card (searches the Collection and the Party roster).
- Arrow Up/Down to move the highlight, Enter to run the highlighted entry, Escape to close.
- Side tab selection (Collection/Party/Encounter/History) moved from
SideTabs' own local state into the shared store, so the palette's "Go to {tab}" commands and the tab bar itself always agree on which tab is active.
v5.5.2 — Rebrand to D&D Toolkit (2026-09-25)
Cosmetic rename only — no functional changes.
Changed
- The app's default title changed from "DM Toolkit" to "D&D Toolkit", matching the newly-registered dnd-toolkit.com domain. Updated every place that hardcoded the old name: the browser tab title, the pre-hydration header fallback, Settings' app-title placeholder, exported session recaps and player handouts, the local-backup file picker's description, and the Cloud Save setup hint. Anyone who's already set a custom title (Settings → Toolkit name) is unaffected — this only changes the default.
v5.5.1 — Fix production build (Vercel) (2026-09-25)
No behavior changes — build-time fixes only, surfaced by actually running next build for a Vercel deployment for the first time.
Fixed
- The Zustand store (
store/index.ts) was created viacreate((set, get) => ({...}))with no explicit type parameter. Because the store is self-referential (get()needs to return the very type being built) and every slice file it composes is// @ts-nocheck, this reduced the whole store's type tounknown— invisible in localnext dev/tsc --noEmitspot-checks, since neither ever ran a real full-project build, but it madenext buildfail outright with ~140 "Property X does not exist on type 'unknown'" errors across nearly every component. Now typedcreate<any>()(...)explicitly — matches how the store has always behaved in practice (every slice is untyped by design), just makes the type system agree with it instead of guessingunknown. - Three module-level event-listener helpers (
onToastsChange,onSyncStatusChange,onLocalBackupStatusChange) returned a cleanup function whose body was() => listeners.delete(fn)—Set.delete()returns a boolean, so the inferred cleanup type was() => booleaninstead of() => void. Harmless at runtime, butnext build's stricter check correctly flagged it as invalid wherever these fed directly into auseEffectcleanup. Now explicitly typed() => voidwith a block body that doesn't return the boolean. - A
cloneElementcall in the Help modal cast its element as a bareReactElement(props typeunknownby default), then tried to inject aclassNameprop — parameterized the cast asReactElement<{ className?: string }>instead.
v5.5.0 — Concentration/duration tracking, Legendary action pools (2026-09-25)
Concentration becomes a real computed condition driven by actual effects instead of a manual toggle, ongoing effects can now have a fixed duration, and any NPC can carry Legendary/Lair/Mythic action pools.
Added
- Ongoing effects (Fire/Poison/Acid/Necrotic/Custom) can now have an optional duration in rounds and/or be flagged as requiring concentration — two independent checkboxes/fields in the Attack modal, either, both, or neither. A duration ticks down at the start of the *caster's* own turn (not the target's), and expires on its own with a toast when it hits 0.
- Concentration is enforced properly: starting a new concentration effect automatically drops the caster's previous one; taking any damage while concentrating triggers a check (DC = max(10, half the damage taken)) — NPCs auto-roll it, PCs get a "did they make it?" popup (queued, so multiple hits in a row never overlap); dropping to 0 HP ends it immediately with no roll. A "Drop" button on the caster's card ends it manually at any time.
- "Concentrating" is now a computed condition (same treatment as Down/Bloodied) — it shows up as a badge everywhere conditions already render, with a Drop button next to it.
- New Legendary/Lair/Mythic action pools, addable to any NPC via a new "Special Actions" section (collapsed by default) on its card: name, max uses, and a reset timing (start of its turn, start of the round, initiative 20, or manual only). Shows as a compact pip counter next to Action/Bonus/Reaction on the combatant's row, with a click-to- spend/refund stepper. Elite-tier NPCs pre-fill 3 Legendary Actions (start-of-turn reset) automatically — still freely editable or removable.
Changed
- Retired the old standalone "Concentration" on/off button (in the Action/Bonus/Reaction row) and the old manually-clickable "Concentrating" condition-grid toggle — both are replaced by the one effect-driven system above.
v5.4.3 — Branch workflow rule (internal only) (2026-09-24)
Internal-only, no app changes.
Changed
- Added a CLAUDE.md rule: cut a fresh branch off
masterper unit of work instead of reusing one long-lived branch across unrelated changes, with a couple of naming/cleanup conventions to go with it. - Renamed the
tailwind-phase1-globals-stripbranch todev— it was cut for an early Tailwind CSS migration and kept absorbing every unrelated batch of work long after that migration finished, so its name no longer described what was on it.
v5.4.2 — Retroactive short changelog, reworded download hint (2026-09-23)
Changed
- The v5.4.1 short-bullet rule now applies retroactively: every entry in
lib/changelog.ts, all the way back to v1.x, was rewritten from its original paragraph (or already-short one-liner) into a few short bullets. Nothing was cut fromCHANGELOG.md/lib/changelog-full.ts— the full detail was always there and still is; this only changed how much of it repeats in the Help modal. - Reworded the Help modal's changelog hint away from a flat "the full version is downloadable" statement to something that reads more like a human wrote it.
v5.4.1 — Short in-app changelog (2026-09-23)
Changed
- The Help modal's changelog now shows short bullet points per version instead of one long paragraph. The full detailed write-up still lives in the downloadable changelog (⚙ menu → "Changelog ↓") — the Help modal now says so, right above the list, so it's clear the short version isn't the whole story. Entries written before this rule (v5.4.0 and earlier) still render as their original paragraph.
v5.4.0 — Attack action, PC-rolled saves, currency wallet (2026-09-23)
A real Attack action with ongoing elemental effects, PCs rolling their own dice instead of the app rolling for them, and an actual gold/silver/copper wallet.
Added
- Attack action in the Encounter tab: pick one or more targets (single- target or AOE), then either a one-time hit or an ongoing elemental effect (Fire/Poison/Acid/Necrotic/Custom) with a damage expression, a save ability, and a save DC.
- Ongoing effects run themselves for NPCs — fresh damage rolled at the start of the affected combatant's turn, a saving throw rolled at the end of it, both logged and toasted automatically; a manual Cure button on the combatant's card ends one early regardless of any of that.
- Target picking is a real popup (same modal family as the "Damage taken" prompt) instead of inline checkboxes sprouting on every roster row — lists whichever side isn't the attacker first (an NPC attacking sees PCs/companions first; a PC or companion attacking sees NPCs first).
- Every condition — including the two campaign-specific tags, Valg- marked and Fled — now explains itself on hover: in-fiction for the two tags with no fixed mechanical effect, mechanically for the rest.
- PCs have a real gold/silver/copper/platinum wallet, shown in their Loot section. A loot entry that's purely a coin roll (e.g. "2d4 cp") now actually rolls and credits that wallet instead of becoming a literal inventory item named "2d4 cp".
Changed
- An ongoing effect's damage and saving throw are no longer auto-rolled for a PC (or a companion/guest) — a real person has their own d20. The start-of-turn damage tick now posts a reminder to apply it by hand instead of silently deducting HP; the end-of-turn save opens a "did they make it?" popup instead of rolling on their behalf. NPCs are unaffected — the DM still runs their dice automatically.
- The session log under a PC or NPC card was fixed at roughly two lines with no way to see more. It now opens at about five lines and can be dragged taller.
v5.3.0 — PC companions, Combat Mode auto-on, condition unification (2026-09-23)
Player name + companions on the PartyCard, Combat Mode turns itself on when you actually start playing, and Down/Bloodied stopped being three signals for one fact.
Added
- PartyCard: a "Played by…" field under the character's name, shown only on the opened big card (not the compact Party-tab roster row).
- PartyCard: a Companions section for DM-defined allies tied to one specific PC — a revived thrall, a familiar, anyone "added to" that character alone. Added via a form asking for name, HP, AC, level, ability scores, and an optional description — same manual entry as adding a new PC, never randomly generated.
- A companion can be sent into the Encounter roster as a real combatant ("→ Encounter" button on its PartyCard row); its preview card shows its actual DM-entered stats, not fabricated flavor the way a random guest's preview does.
- Combat Mode now turns itself on the first time you click "Next ▶" in the Encounter tab, instead of requiring the manual checkbox first.
- Expanded the random NPC flavor/shop/loot pools (appearance, quirks, rumors, motivations, shop inventory across every specialty) and added one new signature ability + weapon per NPC archetype, plus tagged flavor text for five archetypes that had none before.
Fixed
- The Encounter roster's condition tags silently truncated past 3 with no indicator that more existed — now shows a "+N" chip.
- A guest's Combat Snapshot AC field looked editable but silently didn't persist any change — it's now read-only for guest/companion previews, matching the existing "change HP/AC from their row, not here" guidance.
- The 5.5e resource toggles (Action/Bonus/Reaction/Concentration) and reset button inside a roster row's expanded "HP & actions" panel were sized for a glance-only list, even though that panel only ever shows for one row at a time mid-combat — now sized like PartyCard's own bigger controls, without touching the always-visible collapsed row.
Changed
- Down/Bloodied no longer get a standalone pill next to the name on top of the row's own tint/grayed-vitals treatment and a conditions-row chip — one visual signal (the tint) plus one detail chip, not three overlapping ones, and the row no longer changes shape the instant a combatant crosses a threshold with no other conditions yet.
- "Down" and "Bloodied" can no longer be manually toggled in a card's condition grid, since both are calculated from HP, not something to hand-set.
- Combat Mode no longer force-opens the floating Dice panel when it turns on, whether toggled manually or via the new auto-on behavior — it shouldn't decide that for the DM either way.
v5.2.0 — Level-aware NPCs, PC Level Up, Encounter roster polish (2026-09-22)
NPCs now scale to your party instead of using fixed baselines, PCs get a real Level Up flow, and the Encounter tab's roster got a round of bug fixes and visual clarity work.
Added
- NPC generation is now party-level-aware: HP, AC, and attack/DC scale with your party's average level instead of a fixed per-archetype baseline. Applies everywhere an NPC gets generated — Roll, Random encounter, Custom Build, and Scene presets. If you haven't set up a party yet, nothing changes (level 3, the app's existing default, produces identical numbers to before).
- Adding a guest combatant (Encounter tab → Add combatants → + Player → Guest) now generates a full NPC-style stat block — ability scores, weapon, personality — via a "Weaker / Same as party / Stronger" picker, instead of only asking for a name, HP, and AC.
- PCs get a proper Level Up flow (Character section → Level Up): asks for the new max HP, hit die, and whether this level came with an ability score improvement, and keeps the Hit Dice pool in sync. Level can now only change this way — the old "Lvl" mini-stat box is display-only.
- Heroic Inspiration is now a count instead of an on/off flag (a table can house-rule holding more than one), with a click-to-spend/grant stepper control next to Exhaustion.
- Click any combatant's name in the Encounter tab to open their card — NPCs and linked PCs open their real card; guests open a read-only preview of their generated stat block (their actual HP/AC still come from their row in the roster).
Fixed
- The Encounter roster row would break apart (the remove button and/or HP bar wrapping onto an orphaned line) whenever a combatant had any condition tag.
- Down/Bloodied status could get muted into illegibility by the same dimming meant to signal "this doesn't matter right now," and both fought the PC/NPC border color for the same visual channel — a downed PC's blue border and red status were not guaranteed to both show.
- The "whose turn" highlight used the same warm color family as Bloodied, so a bloodied combatant on their own turn read as one indistinct orange blur instead of two separate signals.
- Two rows (Session & log's Dealt/Taken/Healed/★/💀, and Dmg/Heal/Temp alongside Hit Dice/Short Rest) each used only about half their available width before merging into one line.
- Removed an unwanted hover-lift animation on Party and Encounter rows (also the likely cause of a rare rendering glitch where a row disappeared on hover).
- The Encounter roster's remove (✕) button glyph wasn't centered in its pill.
Changed
- "Remove from party" moved out of Session & log (next to the harmless Reset button) into a new Character section's "Danger zone" fold — removing a PC now takes a deliberate few steps instead of one click.
- Dropped the redundant "PC" text badge from Encounter rows (the blue left border already signals this) and made that border more visible.
v5.1.1 — Tailwind completion & UI polish (2026-09-20)
Finished converting the app fully to Tailwind CSS, which surfaced (and let me fix) a batch of small visual bugs along the way. No new features, all cleanup and fixes.
Fixed
- The Collection/Party/Encounter/History tab bar wasn't actually showing which tab was active — the highlighted and un-highlighted states rendered identically.
- Several controls rendered at the wrong size because of a Tailwind/CSS specificity conflict (an unlayered base style silently beating a non-
!importantTailwind utility): the encounter tracker's turn-order numbers showed in an oversized bordered box instead of a plain digit, clock segments were the wrong size and color, the dice panel's "Personal AC" dropdown was taller than the fields beside it, the party card's Hit Dice chip was oversized, and "Recent ▾" rendered smaller than "Roll" next to it. - The header's Print menu rendered as an undersized pill instead of matching its sibling menu items, and its dropdown opened detached from it instead of directly underneath.
- Every text and number input in the app showed a pointer (hand) cursor instead of a text cursor.
- The app's own named font-size scale wasn't actually wired up correctly — a theme-token naming mismatch meant most named text sizes had been silently falling back to browser defaults since the original Tailwind migration.
Changed
- The Session # counter (display-only, changed via the "⋯" menu) is now shown as plain text instead of a boxed, disabled-looking input field.
- Tightened a handful of tooltips that were showing internal implementation notes instead of something a player or DM would find useful.
- Small typography and spacing fixes: modal titles, section headers, tag/badge sizing, and the Session panel's spacing around "Prep session".
Internal
- Completed the Tailwind CSS migration:
app/globals.cssis now just the small, unavoidable core (theme tokens, global resets, print support) — no more legacy CSS classnames or leftover inline styles anywhere in the app.
v5.1.0 — Toolbar cleanup & Settings panel (2026-09-13)
A cleanup pass on the header and the Collection tab, done in small, individually-tested steps rather than one big change.
Header
- The old always-expandable "⋯" button is now a single gear (⚙) icon. Opening it shows Downtime, Print, Cloud save actions, Export/Import, Help, and a new Settings entry.
- New Settings panel: toolkit name (previously buried inside the Help modal), the theme picker, and local-backup setup are now all in one place instead of three separate menus.
Collection tab
- Bulk-selection actions (Select visible, Clear selection, Move selected) are folded into one "Select ▾" menu. "+ Group", "+ Selected → Encounter", and "Delete selected" stay always visible.
- Export/Import/Restore moved out of the Collection tab into the header's menu, since none of it was actually specific to that tab (Export JSON is a full app backup, Restore overwrites everything, etc.).
- Import/export success and error messages now show as small pop-up notifications (toasts) instead of static text sitting in the tab.
- The Collection/Party/Encounter/History panel is a little wider so its toolbar buttons fit on one line, without shrinking the NPC card.
Removed
- The whole-collection PDF export, which kept producing broken output across different browsers. Printing a single NPC card is unaffected.
Deliberately left alone
- The merchant shop-specialty "mirroring" stat swings (±4 AC, 1.5×/0.75× HP depending on specialty) still have no on/off toggle — that's waiting on an actual verdict from real table play, not an oversight.
v5.0.0 — Next.js rebuild (2026-09-12)
The whole toolkit was rebuilt from the original single-file DM_Toolkit_v3.4.3.html (vanilla JS/HTML, js/*.js) into a proper Next.js 16 app (dm-toolkit-next), feature by feature, checkpoint by checkpoint, rather than a straight file conversion. Everything below shipped in this one jump from v4.x (the vanilla app's last version) to v5.0.0.
Core rebuild — full feature parity with the vanilla app
- Zustand store with hydration and automatic migration of existing localStorage data from the old app, so nothing already saved in a browser was lost by moving to the new app.
- NPC card + toolbar: roll, seed load/save, reroll (whole card or single fields, with per-field locks), AC/HP editing, condition toggles.
- Collection tab: groups, search, duplicate/rename/move/delete NPCs, multi-select with bulk actions.
- History tab: every rolled NPC, reloadable by seed.
- Party tab and Encounter tab, redesigned as cards rather than a literal layout port: roster, HP/rest mechanics (short/long rest, Hit Dice), initiative and turn order, combat damage/heal math, clocks, a random region/danger-based encounter builder, and a custom encounter builder.
- Collection export (JSON backup including the party; a Markdown handout-style doc) and a general-purpose Import button (accepts a full Collection export or a single exported NPC, preview + confirm step, Replace/Merge choice, automatic repair of older/malformed data).
- Theme picker: 6 themes (Dark, Parchment, Terrasen, Adarlan, Rifthold, Ironteeth), fixed a dead bug from the original where the saved theme was never actually re-applied on load, added a no-flash inline script and an OS light/dark default for first-time visitors.
- Full shop editor for merchant NPCs: specialty, regenerate inventory, add item, inline edit, pin/reroll/delete rows, "Buy as PC" — plus a matching Inventory section on party cards and a "give loot to PC" button.
- NPC relations (link NPCs to each other with a relationship label, automatically two-way in the UI even though storage is one-way, dangling links cleaned up automatically when an NPC is deleted) and a per-NPC Copy/export menu (plain text / Markdown / JSON to clipboard or file).
- Session panel (always-visible, not a tab, matching the original's layout): session/day counters, freeform notes, open campaign threads, a Downtime action that advances days and restocks every merchant's shop at once, session recap and player-handout generation (clean or narrative mode).
- Help modal with the original's help-card content, an app-title editor, a keyboard-shortcuts overlay, and a floating dice panel (attack/damage/ save rolls against a party member's AC or a typed AC, roll log).
- Print NPC card, "+ Group" bulk-add to the encounter roster, and remembered open/closed state for each card section across reloads and different NPCs.
- Shop-specialty picker and Combat "focus mode" — the two backlog items Luca asked to be designed better rather than ported 1:1: an icon-chip row instead of a dropdown for shop specialty, and a "focus mode" that collapses roleplay sections and surfaces the dice panel instead of a separate compact card layout.
This closed out the vanilla app's entire feature backlog — nothing from the original was left unported.
New features (not in the vanilla app at all)
- Cloud save-sync, built on Firebase: a display name plus an auto-generated short save code (e.g. "WOLF-3721", game-friend-code style — not a real account/password system), video-game-style campaign slots (Continue / Load / New Campaign), so the same campaign now follows a DM between phone and PC. Includes a legacy-save import step for bringing an old browser's full save into a new save code.
- Merchant shop-specialty mirroring: a merchant's own AC, weapon, HP, and appearance/quirk flavor now reflect their shop specialty — a weaponsmith is visibly tougher and better armed, a herbalist runs noticeably higher HP, and so on. Any manually pinned/locked field still overrides this.
- Nine smaller feature/polish additions found during a codebase review: a visible downtime history log, a "clear all locks" button, a clickable turn marker to jump straight to any combatant, undo now covering healing (not just damage) with a proper disabled state, tooltips added wherever a sibling control already had one and these didn't, name-required validation on the add-PC form, Collection search now also matching rumor/evidence/motivation text, and a "last synced" timestamp on the cloud-save status.
Code-quality / internal cleanup (no visible behavior change)
A 7-part pass through the codebase, done one part at a time with its own commit and full live-test each time:
1. Shop section moved to the top of the card for merchants (the most commonly needed section at the table); reroll-fields grid grouped to match the card's own section names. 2. Small wins: campaign-specific conditions sorted first, Passive Perception and Initiative modifier added to the combat snapshot, a tooltip explaining the Threat rating, a dead duplicate function removed. 3. A Collection-group badge on saved NPC cards; shop inventory rows now display alphabetically (storage/pins untouched). 4. Theme CSS extracted into its own file and a permanently dead background rule removed. 5. Render-performance cleanup in the Encounter and Collection tabs (fewer repeated scans over the NPC list on every render). 6. Piloted removing the @ts-nocheck escape hatch from one component to confirm the store's types hold up on their own. 7. The 2000+ line store file was split into six focused files (one per tab, plus shared persistence helpers), combined via Zustand's slice pattern — a pure reorganization verified byte-for-byte identical to the original logic before it was committed.
---
Earlier history (the vanilla single-file app, v3.4 and earlier)
v4.0 down through v3.4 are carried over from the original app's own in-app CHANGELOG constant. Everything from v3.3.1 down to v1.x below that is the original app's own Help-modal changelog card — a separate, richer write-up that always went back further than the in-app constant did; this file used to (wrongly) call that era "not available here" until Luca supplied the actual text.
v4.0
Major modularization: single-file app split into separate CSS and JS building blocks (rng, data, state, combat, session, help, history, collection, party, encounter, npc-gen, ui, save/load, init) while preserving full offline behavior.
v3.4.3
Fixed unescaped HTML injected via group names, shop labels, conditions, weapon prices, and clock names (importable/shared files could execute script on load). Reorganized the script into clearly labeled, fully documented sections.
v3.4.2
Polish: help cards, session/day + threads, shortcut overlay, clearer combat rows, selection helpers.
v3.4.1
Recap layouts, toasts, undo damage, player handout, compact encounter actions.
v3.4 — Table workflow
Save the current encounter mix as a reusable custom preset (Apply / Delete). Session recap sections are toggled in the modal (notes, encounter, combatants, party) and the draft rebuilds live. Collection supports multi-select checkboxes with "+ Selected" to push checked NPCs into the encounter in one step.
v3.3.1
Patch release. Wired missing click handlers for Random encounter, Session recap, and Downtime. Reorganized the Encounter tab: combat tracker stays visible while Build NPCs, Encounter notes, and Clocks collapse behind details panels. Merged "Download session notes" and "Session recap" into one large editable recap modal (session notes, encounter, clocks, combatants, party stats/logs/loot) with copy and .md download.
v3.3 — Campaign tools
Added danger-tiered random encounter generation (region × danger tables), a relationship web linking saved NPCs, shop-specialty locking so recurring merchants survive cache pruning and downtime restocks, pinned shop items, a downtime / advance-time mode with merchant restock and relationship-score attitude drift, morale-check reminders when a combatant crosses into critical HP (plus a Fled condition), and a session recap draft from encounter and party data.
v3.2.2
Bug-fix release. Regenerating a merchant from a seed (seed-archive fallback, a shared seed code, or "Load seed") could silently rebuild the wrong shop stock — fixed by making the shop-specialty roll consume the dice sequence consistently every time. Loading a save file with a missing NPC name or a corrupted group list no longer crashes the load; both are now sanitized to safe defaults instead.
v3.2.1
Party "Add PC" ability scores: removed spinner arrows, switched the six fields to keyboard-friendly numeric text inputs, and gave the grid more usable width so STR–CHA can be typed normally (still validated and clamped to 3–20).
v3.2 — 5.5e combat tools
Added Action, Bonus Action, Reaction, Concentration, Heroic Inspiration, Exhaustion, Death Saves, ability-score summaries, initiative/passive Perception, and weapon mastery tracking. Encounter rows reset turn resources as initiative advances, and older saves remain compatible.
v3.1.2
Bug-fix release. Replaced browser prompts with in-app forms so Party, Encounter, Shop, Loot, Clock, and Short Rest actions work inside embedded applications. Also fixed stale seed data, full-save imports, encounter references, and healing-credit persistence.
v3.1.1
Bug-fix release. Imported NPCs now get complete, consistent combat stats, and the type, tier, shop specialty, and seed controls update to match. Unsaved merchant inventory edits are also preserved when the seed is loaded again.
v3.1
Keyboard shortcuts no longer roll twice or act behind open dialogs. Hit Dice and threat labels update immediately after edits. Roll, import, encounter sorting, combat-card escaping, and several old CSS/importer issues were corrected.
v3.0 — D&D 2024 (5.5e)
Added Hit Point Dice for PCs, Short Rest and Long Rest rules, automatic Bloodied tracking, improved Party controls, editable session recap export, and player-facing Save DCs.
v2.24
Added Short Rest controls to the Party tab, including Hit Dice prompts.
v2.23
HP is now edited in Encounters; merchant regeneration keeps the NPC seed; Help content was cleaned up.
v2.23.1–v2.23.7
Internal code cleanup only (shared helpers, paint split, list delegation, export core, $/clamp). No table-facing changes.
v2.22
Per-combatant Heal; Long Rest; party session totals and MVP notes; session notes panel.
v2.21.1
Expanded Adarlanian Guard loot (duty gear, confiscations, paper hooks; rare royal-adjacent easter eggs).
v2.21
Encounter downed state; remembered Dmg/Heal/+Dealt; temp HP chip; Long Rest; session-stat clear hint.
v2.20
Party spotlight layout (+Dealt on action row); combat/party UX pass.
v2.17–v2.19
Party & encounter cards; Dmg & Heal prompts; temp HP; ★ 20 / 💀 1 tracking; MVP notes.
v2.16
Encoding/glyph cleanup (mojibake fixes) and small text corrections.
v2.15
Clock segment sizing; Load-game confirm newlines; one-time migrate of legacy erilea_* keys; unsaved + Current goes to Previous encounters; load accepts erilea-full-save.
v2.14
Progress clocks on Encounter (Alarm / Ritual / Escape templates, custom clocks, segment +/−, rename/delete).
v2.13
Encounter notes; scene presets (street patrol, dock ambush, noble guards, rebel meet, shop confrontation, prison transfer, road bandits, Ironteeth hunt); Previous encounters group; fast NPC delete.
v2.10–v2.12
Combat mode; encounter initiative (NPC roll / PC manual); Next turn; sort-init DOM flush; party roster with session damage log.
v2.5–v2.9
Full Save/Load game; seed archive (LRU + debounced writes); editable AC & ability mods (STR–CHA); field locks; sticky shop specialty; HTML escaping; HP input guards.
v2.0–v2.4 — Collection era
Permanent NPC Collection with user-defined groups; save / open / duplicate / move / delete; live HP tracker (current vs max); shop inventory editor for merchants; collection + encounter export/import JSON; no data loss on reload.
v1.x — Erilea NPC Generator
Seeded RNG; Minion / Standard / Elite tiers; ToG-flavoured NPC types (guards, merchants, rebels, Fae, Ironteeth, nobles…); signature abilities; mood / faction / motivation / rumor; weapons & loot; individual field rerolls; Markdown / JSON / text export; dark & light themes.
---
Feature highlights (carried across many versions, not tied to one release)
- Themes — Dark, Light, Terrasen (emerald & gold), Adarlan (iron & crimson), Rifthold (deep blue & silver), Ironteeth / Witch (bone & black iron).
- World flavour — Expanded ToG-fit name pools; Wyrdstone / Valg / Ironteeth / rebellion hooks in loot & backgrounds; print-friendly NPC sheets for the table.
- Table tools (campaign side) — Built to support live Erilea sessions: salt-camp infiltrations, tower strikes, prisoner breaks, Osric-style network NPCs, and forest-aftermath supply runs without leaving the browser.