

Toy Story 5 (RHJ's Storybook Style)
A placeholder while we wait patiently for RHJ's Storybook poster.


A placeholder while we wait patiently for RHJ's Storybook poster.
Reading this subreddit and watching some YouTube video, now I feel like I am the stupidest person for falling for this car...
I've been building a self-hosted character sheet manager for TTRPGs (not a ton of self hostable options currently), and it's gotten to a point where it's worth sharing.
I'll be upfront about this from the start: this project has been built heavily with AI assistance (Vibe/Slop, call it what you will). I'm not a professional developer, I have limited background in VB.NET and SQL. I have used Claude throughout, from architecture decisions down to individual features. I'm mentioning this because AI not often well received and Ive been self hosting long enough to see issues arise from it. The ideas, the decisions about what to build and why, and the hours of testing are mine. The AI helped me get there faster than I could have on my own.
The Sheet Bundle Idea:
The thing I'm most proud of architecturally is how game systems work. Most character sheet tools I've used you dont own the data and/or are typically for one system. I wanted something a little different: a game system is just a folder that has a HTML file for the sheet layout, a CSS file for the style, a JSON schema describing the data, and a manifest with some metadata, the app picks it up automatically. No code changes, no rebuild, no touching the core app at all.
Others features include: Assigning Campaigns, Character Statuses, External Sharing, Dice & Dice Logs, Attachments, Theming and more…
I am looking for anyone wanting to collaborate on Sheet Bundles. I would also love to have someone who actually knows what they're doing take a proper look, If that's you, reach out!
I've been building a self-hosted character sheet manager for TTRPGs (not a ton of self hostable options currently), and it's gotten to a point where it's worth sharing some deatils. I'll be upfront about this from the start: this project has been built heavily with AI assistance (Vibe/Slop, call it what you will). I'm not a professional developer, I have a background in VB.NET and SQL. I have used Claude throughout, from architecture decisions down to individual features. I'm mentioning this because I thats not often well recived and Ive been self hosting long enough to see issues arise from it. The ideas, the decisions about what to build and why, and the hours of testing are mine. The AI helped me get there faster than I could have on my own. On that note, security. I've run OWASP ZAP against it and done multiple rounds of AI-assisted code review focused specifically on auth, sharing, and data handling. I'm reasonably confident in where it stands, but I want to be honest: I'd love to have someone who actually knows what they're doing take a proper look before this goes fully public. If that's you, reach out.
TLDR: it's a web app (React, Node & json) for managing TTRPG characters, it runs on your own server, and once I'm happy with it, it's going to be released FOSS. I hate subscriptions, and just wanted to own my character data. Looking to gauge interest of others to collaborate on Sheet Bundles and/or security reviews. I have never done this sort of thing before and nervous to post it out in the public... but I am proud of what I have made here and I think of r niche product it could be of use to others.
The thing I'm most proud of architecturally is how game systems work. Most character sheet tools I've used you dont own the data and are typically for one system. I wanted something a little different: a game system is just a folder that has a HTML file for the sheet layout, a CSS file for the style, a JSON schema describing the data, and a manifest with some metadata, the app picks it up automatically. No code changes, no rebuild, no touching the core app at all.
The renderer that ties it all together doesn't know anything about Savage Worlds, or D&D, or Pathfinder. It just reads the bundle's HTML, looks for some data attributes on the elements (this input binds to this field, this button adds a row to that list, etc.), and wires it up to live state. That's what makes it sustainable to add new systems over time, and it's also what's going to make it possible to let a community build and share their own bundles down the road, sheet design becomes something anyone comfortable with HTML and CSS can contribute, not something that requires understanding React or the app's internals. That's gated behind some security work first (treating bundle HTML as untrusted input, basically), but the architecture is already shaped for it.
Right now I've got a few systems built out this way, with a full one for Savage Pathfinder, D&D 5e (2014), and Risus: The Anything RPG.
For GMs, there's a campaign layer on top of individual characters. A GM creates a campaign, gets a join code, and players attach their characters to it. Once a character is in a campaign, the GM gets visibility into that character's sheet without taking ownership of it or being able to edit it out from under the player. It's read access scoped to "characters in my campaign," for GMs who needs to glance at party resources or check someone's status mid-session without needing to message anyone.
Characters aren't just active or not. I made it into a small set of states; active, inactive, retired, deceased, shelved. Switching states goes through one consistent menu action rather than having separate buttons scattered around, and the same control works to bring a character back to active, so there's no separate "restore" flow to remember.
Not everyone you want to show a sheet to needs (or wants) an account. There's a share link system that generates a unique URL for a single character, with a permission level, read or read/write, and an expiration window you pick when you create it. Useful for handing a sheet to a GM running a one-shot, or letting a player update their own gear list without logging in on their phone at the table. Links can be revoked early, and they only ever expose the one character they were generated for, nothing else about your account or your other characters.
No database. Each character is its own .json file, organized by user. That was a deliberate choice, it means backups are just copying files, the data is human readable if you ever need to poke at it directly, and there's no schema migration step when the app changes.
Session, notes work as a per-character log, date stamped entries for what happened, loot, NPCs, and any loose threads the party needs to follow up on and they're stored as a seperate .json file next to the character rather than crammed into the main character file. That keeps the character file itself small and fast to load even after years of session history piles up (lucky few that can campaign that long), since the app only needs to read the full session log when you're actually looking at that tab.
Characters export as JSON, sheet images, portrait image, and a markdown file with session notes all zipped into a single file, so the data is portable and not locked inside the app.
These are not a guarantee, but they are things that I want for myself