Frames
One HUD.
A frame per game.
A frame is everything about how your HUD looks: its colors, where each widget sits, and whether each stat draws as a bar or as chits. The stats themselves come from your game. Switch frames and your character stays exactly as it was.
Same character, two frames
The data stays. The look changes.
Both tiles show the same sheet. Broadcast is the Vellum default; Daggerheart warms the plates and gilds the edge. Each frame picks bar or chits for every stat on its own.
Broadcast · official · any game
Daggerheart · official · shown here with HP switched to a bar
Pick a frame
The app shows three shelves for each game: Official, Community (marked unofficial) and My frames. Your pick rides in your share link, so OBS loads it with no extra setup.
Library frames ship inside the app. Choosing one never contacts a server.
In the app today
Daggerheart uses its official frame automatically. The picker and the Library arrive together.
See the LibraryMake your own
The frame creator sits under the frame picker in the app. Start from any frame, change it, and watch the real HUD wear it at Discord tile size as you go.
Start from a frame
Pick an official or community frame, then choose Make a frame from this one.
Place widgets
Put the stats, conditions, dice and nameplate in any of six spots. Widgets on the right mirror so their labels read outside-in.
Style it
Choose bar or chits for each stat, and set every color.
Check the tile
The preview shows the real HUD at Discord's 640×360 tile size. The creator won't save a frame that breaks the two rules.
Your frames stay on your machine. Export one as a file to share it, or submit it to the Library.
For frame makers
Two rules every frame keeps.
A frame can change colors, positions, and bars or chits. It can't break these two rules, and Vellum checks them.
Labels are always readable
At least 2.1% of the frame's width: 40px on the 1920 canvas, about 13px on a 640×360 Discord tile. At least 7:1 contrast, always on a solid plate, never straight on video.
Everything reads outside-in
Each widget reads from the nearest frame edge toward your face. Left side: label, value, bar. Right side, mirrored: bar, value, label.
Under the hood
Frames are data, never code.
A frame is a small, versioned JSON file. It names a game, overrides chassis colors, and lists widgets by anchor, offset and size on the 1920×1080 stage. Widgets bind to stats by id, like hp or hope, so a frame never reaches into the code.
Face anchors are optional and always carry a fixed fallback, so every frame works with tracking off.
// a frame, abridged and illustrative
{
"game": "daggerheart",
"name": "Ember",
"colors": { "plate": "#1b140b", "player": "#c9a14a" },
"widgets": [
{ "type": "track", "stat": "hp",
"display": "chits", "anchor": "top-left" },
{ "type": "track", "stat": "hope",
"display": "bar", "anchor": "face-top",
"fallback": "top-center" }
]
}