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.

HP4/6
Hope4/6
Stress3/6
Vulnerable
Marlowe VennLvl 3 Ranger · Human

Broadcast · official · any game

HP4/6
Hope4/6
Stress3/6
Vulnerable
Marlowe VennLvl 3 Ranger · Human

Daggerheart · official · shown here with HP switched to a bar

Live

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 Library
Live

Make 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.

  1. Start from a frame

    Pick an official or community frame, then choose Make a frame from this one.

  2. 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.

  3. Style it

    Choose bar or chits for each stat, and set every color.

  4. 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" }
  ]
}