Planning to refactor my separate character sheet apps into a cohesive suite.
Written by: Colin Bate
I’m launching a project to unify and evolve several of my existing TTRPG tools into one cohesive “Sheets” ecosystem. The idea is to split the workload into a couple of main front-end apps:
Under the hood, all apps will share a common @ttrpgtools/core
package (dice-rolling, data models, random tables) and a themable @ttrpgtools/ui
component library. I’ll be leveraging pnpm workspaces, so each app does:
pnpm add @ttrpgtools/core @ttrpgtools/ui
…and imports exactly what it needs:
import { rollDice } from '@ttrpgtools/core/dice';
import { Button } from '@ttrpgtools/ui';
import { NPCManager } from '@ttrpgtools/systems/nimble';
The big lift is refactoring existing code—but by breaking every system into a small packages/systems/{system}
folder (with a manifest, PlayerSheet
, NPCManager
, etc.), I can move functionality wholesale without copy-pasting. SessionForge will be a SvelteKit app talking directly to D1 for persistence (games, NPCs, encounters) and is tied to an SSO user. Character Sheets stay offline-first with IndexedDB, syncing to D1 only if you choose to sign in.
I’m aiming to keep sign-in completely optional. One-shots and quick pickup games will work entirely in the browser, while ongoing campaigns get durable storage and cross-device syncing. Over the next few months, you’ll see:
This refactor is a sizable engineering effort, but I hope to have something to show by the end of the summer by reusing and reorganizing existing modules. Stay tuned for early previews of SessionForge and the revamped Character Sheets—hopefully just in time for your next campaign.