- An action in an encounter no longer loads the encounter again: the
answer to the action already holds it. Live updates that arrive
together are answered with one reload, of the encounter or character
that changed, where each used to reload every one on screen.
- Everything the site sends is compressed. Nothing in front of it did
that (frp only tunnels), so the API and the built site now do it
themselves: the main script is 100 kB on the wire, down from 330 kB.
- Each page is its own download, fetched the first time it is opened,
so signing in does not wait on the encounter tracker or the builder.
- The library is fetched when one of its pickers is opened, where the
campaign page used to fetch it on every visit by the DM.
- The database has indexes on the columns every list is looked up by,
and checking that someone is in a campaign takes one query, not two.
- On a server: "npm install", then "npm run deploy", then build the
frontend again and restart both.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>