← Project Management · Visual Information
Case Study
A 20 Below character is a single file. It moves between the Character Creator, the Battle Tracker and the character sheet in Owlbear Rodeo, and it gets passed around the table. When characters needed pictures, the picture had to travel the same way: inside that one file, shown the same way in every tool, and safe to open whoever made it. It was asked for, built, tested and released in one morning. The study is also honest about the part it didn’t reach.
I was setting up an Owlbear Rodeo room for a portfolio video shoot. The Battle Tracker’s button for putting a character on the map placed nothing, even after a reload. The tokens had to be drawn, uploaded and linked by hand. That bug was logged as its own task instead of being fixed mid-shoot, but it raised a better question. Why doesn’t a character already carry its own picture?
The tracker could already pair an image with a character file when both were picked together, Wolf.json beside Wolf.png. But that means two files picked at once, every time, and the picture reached only the tracker. Nothing in the Creator or the Owlbear sheet knew what a character looked like.
Wants their character to look like someone, wherever it appears.
Needs to tell combatants apart at a glance in the tracker.
Wants one file to pass across the table, not a file and a picture that can get separated.
Needs to trust that a shared file can’t carry anything harmful.
My question at 08:11 was simple: “Is it possible to bundle icons with the JSONs and have the extension load them? … Automatically?” Four options were weighed. Five minutes later, the decision was one sentence: “Build the Portrait field.”
The portrait lives inside the character file, set once in the Creator on the Name & Concept step or beside the sheet’s heading. Wherever the file goes, the picture goes with it. The Battle Tracker shows it in its Catalog and its encounters from the file alone. Saved encounters and exports carry it too. The Owlbear sheet shows it beside the name. Nobody has to pick a second file.
A player can pick any picture, of any shape. Every place a portrait appears is a circle or a small square, so the Creator keeps the centred square and re-encodes it at 256 by 256 pixels. That’s more than twice the largest size any tool shows it at, so it stays sharp on a high-density screen. One source picture serves every size, from 96 pixels on the Creator’s first step down to 34 in a tracker row. With no portrait, each tool falls back to the character’s initials.
Character files are made by players and passed around, and each tool puts the portrait straight onto the screen. So one shared check decides what counts as a portrait. It accepts PNG, JPEG, WebP or GIF image data, up to 400 kB. It refuses:
Anything refused counts as no portrait, and the file still opens. A picture picked in the Creator is re-encoded even when it’s already small, so what the Creator writes is always a plain image and nothing else.
The old pairing wasn’t removed. If a GM picks a picture alongside a character file, that picture is used, because someone chose it deliberately. The portrait inside the file fills in only when nothing else was given.
Two things were left out, on purpose, and said out loud.
A character now carries its own picture. It’s set once in the Creator, framed the same way everywhere, and shown in the Creator, the Battle Tracker and the Owlbear sheet with no second file. A file from the table can’t slip anything but a plain picture onto the screen. The part that isn’t done, map tokens, has a named route and a task behind it.
What this doesn’t show yet is players using it. The next sessions will show whether portraits get set, and whether the GM’s tracker reads faster for them.
| The request, the decision and the release ruling | Me, as producer |
| Options, Package Deliverables, tests and figures | Claude (AI assistant), checked by me |