Open source · Local-only · 0.2.0 beta — live in your browser

The character sheet, on camera.

A layer of story over every camera.

Vellum renders a live character HUD over your webcam — through OBS, into your video call — so your table sees your stats where they're already looking.

HOPE HP STRESS CONDITIONS NAME · CLASS & HERITAGE VELLUM · SCENE: PLAYER OVERLAY SHEET · 16:9
Live HUD composited on a Discord call — demo clip coming soon.

The shift

Off the tab, onto the table.

In a remote session, everyone's stats live in a character-sheet tab off-camera — private, invisible, and a tab-switch away. Vellum composites them onto the webcam feed itself: OBS renders the HUD over your camera, the virtual camera carries it into the call, and your character state becomes ambient information the whole table shares.

Before

The other tab

Hope, HP, and conditions sit in a browser tab nobody else can see. Every check starts with "hang on, let me look."

After

The frame

Your stats ride your camera tile — visible to everyone, updated live, exactly where the table is already looking.


Built like a good tool.

Local-only & yours

Nothing leaves your machine

No account, no server, no telemetry. Vellum runs from a static file and writes to localStorage — there is nothing to sign up for and nothing to phone home to.

Composable

Daggerheart in the box, your system next

Systems, scenes, and themes are config, not core code. Daggerheart ships as the reference implementation; the platform exists so you can teach it yours.

Made for the call

Not the stream

Designed for a 4–6 person Discord call at 480p — legible at thumbnail size, calm on camera. A table tool, not a broadcast package.


For system authors

Compose it.

A system declares its resources, conditions, and character schema. It offers scenes — URL-addressable HUDs, one per role, each the target of an OBS browser source. Scenes compose widgets: generic pip tracks, slot tracks, badges, and nameplates bound to your config.

Add your system as one folder — config plus a few components, no core edits.

// systems/daggerheart/index.ts — illustrative
export const daggerheart: SystemDefinition = {
  id: "daggerheart",
  label: "Daggerheart",
  resources: [
    pipTrack("hope", { max: 6 }),
    slotTrack("hp", { thresholds: true }),
    slotTrack("stress"),
  ],
  conditions: coreConditions,
  characterSchema,
  scenes: [
    scene("player", ["identity", "hope", "hp", "stress"]),
    scene("gm", ["fear"]),
  ],
  defaultTheme: "daggerheart",
};

Quick start

Four steps to the table.

  1. Open Vellum

    No install — open the app in your browser, or download the static bundle to run fully offline. Either way it runs entirely on your machine; nothing you enter is uploaded.

  2. Build your character

    Fill in the character form, then hit Copy share link. Your whole sheet packs into a URL — no files to prepare or email around.

  3. Drop it into OBS

    Import the Vellum scene collection — macOS, Windows, or Linux — or add a browser source pointed at your share link. The in-app setup wizard walks you through the rest.

  4. Go live in Discord

    Add your webcam under the HUD, start the OBS Virtual Camera, and pick it in Discord. Your tile is now camera plus HUD — and every value persists across a reload.