Skip to content

v0.131.0 — Playtest fixes: a sitewide chat, Sort by everywhere, and the phone's Chat and Back buttons

The owner's playtest of 2026-10-21, in two parts: lists and chat first, then the layout around the chat and the phone. The TODO list was TODO.md.

Lists

  • [x] Sort by, on every list of maps, campaigns and characters: most and least recently updated, most and least recently created, name A–Z and Z–A, most recently updated first by default. /maps, a campaign's maps and characters, /campaigns, /characters, the Home strips, the character drawer and a party's characters all have it; a list keeps its own extras after the six (a character's level, a campaign's most recently accessed and most maps). "Updated" counts as "created" for something never edited.
  • [x] Campaigns now know when they were made and last changed (migration 0081), filled in for existing campaigns from their maps.

Chat

  • [x] Unread counts you can trust. Every chat room's unread is now counted on the server against how far you have read it (migration 0082), the campaign's and the map's rooms included. Before, those two were counted only in your browser, and any refresh zeroed them, which is why a badge came and went. Your own messages, typed as a character too, never count.
  • [x] The total beside the back chevron, inside a chat room: the unread across every other room, beside the chevron rather than tucked on its corner.
  • [x] Bubbles from the other rooms. A message in any room the chat isn't showing pops up beside it, with the chat open or closed: the sender's avatar, the room (or the sender, in a private message), one line of the message and the time. Click one to open its room.
  • [x] The room list, restyled: more room between rows, a divider between rooms, stronger text in every skin, and each room's unread count left of its icon.
  • [x] All campaigns and All maps in the room list, after This campaign, This map, Direct messages and Personal: every other campaign and map you are in. A message written into another campaign's room is filed under that campaign.

The Global Chat Log (desktop)

  • [x] The chat is on every page, in the right sidebar, not only on /play. "Expand the right sidebar" in every top bar shows it; it stays open as you move between pages and comes back after a reload. Off a map it opens on the room you last opened, or on the room list if you have never opened one.
  • [x] The right sidebar is the chat's alone. Edit Object and the Initiative Tracker are left-sidebar tabs now (the tracker keeps syncing with the table whether or not the chat is open), and Settings on /play is a window over the map.
  • [x] Search, Settings and your account are at the foot of the left rail, your avatar at the very bottom (Edit Profile and Log Out).

The map

  • [x] The nub's switchers are all dropdowns: campaign, map and layer, each showing the current one.
  • [x] Drawing options at the bottom of the map view, clear of the nub. End Turn stands above them, and Cancel Drawing sits beside it (or in its place when End Turn isn't showing).

Phone

  • [x] A Chat button on every page, the bottom bar's last, with the unread across every room. It opens the chat from the bottom over whatever you are looking at; the chat's View options are in its header.
  • [x] A back button in the installed app, top left: over the map on /play (a small blurred circle), beside a page's title, and in the chat, Me and the menu, which back now closes. Partial drawers (Actions and the like) no longer take a step of history.

Icons

  • [x] Undock is now picture-in-picture, so it can't be mistaken for a sidebar's expand/contract; Library is a book, System a hierarchy, and Edit Map a pinned map.

Under the hood

  • [x] Database: migrations 0081 (campaign created/updated) and 0082 (chat read cursors). POST /api/channels/:id/read; GET /api/channels?all=1.
  • [x] @tabler/icons-react 3.49.0 (for the pinned map). Its slightly redrawn icons are re-vendored for conditions and the drawing cursors; one icon a condition may already store, mood-confuzed, keeps its name.