FC5 Character Viewer
A character sheet viewer for D&D 5th edition characters exported from Fight Club 5, built for use at the table. It runs entirely in the browser, and a tiny Android app gets backups from the phone to it with one share.

What it does
- Reads a single-character export or a full roster backup, and renders a sheet: abilities and saves, skills, hit points and hit dice, armour class, initiative, speed, attacks, features, spells with slots, inventory with weight and value, companion creatures, and personality details. A backup with several characters gets a picker, and portraits are shown when the backup includes them.
- Goes beyond reading. There is a dice roller with a formula box and a roll log; attacks, saves, skills and spells have their own roll buttons; hit points can be damaged, healed or given temporary points; gear can be equipped and unequipped with armour class recalculated; and prepared spells can be toggled.
- These changes are session-only. They are kept in the browser's local storage per character and never written back to the export, so loading the same file elsewhere starts clean.
- Three colour themes, collapsible sections that remember their state, and an optional 3D die that tumbles before a result appears.
- A hosted copy can also load the most recent backup uploaded from a phone, using the companion app below.
Under the hood
- Plain JavaScript, HTML and CSS with no build step and no framework. Separate files parse the XML, calculate derived stats, render the sheet, hold session state, and run the dice. Opened straight from disk it still works for dropping files in; a local static server adds the features that use
fetch. - The export format is well-structured XML, but many fields are bare integer codes for proficiencies, modifier types, damage types and spell schools, with no lookup table in the file. The mappings were worked out by inspecting the app and are documented alongside the viewer.
- The export stores raw components, not totals. Armour class, saves, skills, speed and carrying capacity are recalculated from ability scores, proficiencies, equipped gear and modifiers using the standard rules, so unusual homebrew can differ slightly from the app's own figures. Attack values that are stored as unevaluated formulas are shown as written rather than guessed at.
- Each export carries the full class and race template, including every subclass option and future level. The viewer uses the app's own resolved feature list and ignores options marked as not chosen, so a character shows only the subclass they actually took.
- Racial walking speed is not a number in a character export. It can be read from the Complete Compendium, which the viewer ships as a gzip file (the raw XML is about 40 MB, over the static-asset size limit) and unpacks in the browser with
DecompressionStream. The race data is cached locally after the first load. - The 3D dice use three.js and the fonts come from public CDNs. If either fails to load, the sheet and the plain dice roller still work.
- The hosted copy is a Cloudflare Worker serving the viewer as static assets, with an R2 bucket for backups. A path allowlist means anything not on it returns 404 before reaching the assets. Access is controlled by Cloudflare Access at the edge rather than by code in the Worker.
Backup share target
- Fight Club 5's own backup feature ends in the standard Android share sheet. The companion app registers as a share target for it, reads the shared file and uploads it, so the viewer can load the newest backup with a tap. Fight Club 5 itself is not modified.
- On a successful upload it shows a confirmation and a button to open the viewer. It also publishes a sharing shortcut so it can appear in the share sheet's direct-share row.
- The upload goes to a separate hostname that only accepts a POST of the backup, authenticated with a Cloudflare Access service token because the app cannot do an interactive login. The Worker keeps a "latest" copy plus a timestamped copy of each upload, in case a bad upload replaces the only good one.
- Written in plain Java with no dependencies beyond the Android SDK, and built with the SDK command-line tools rather than Gradle, since Gradle would be more machinery than the app needs.
Independent personal project, not affiliated with Lion's Den or Fight Club 5. The screenshot is one of my own characters, with a portrait I made in Fooocus.