Logo

For builders, streamers, and wonderfully overbuilt tables

Make the Table Answer Back

Tavern Scribe turns campaign moments into signals your room, stream, or automation can react to. Fire signed webhooks for the full event catalog, or start with our public ESP32 project and make a shared natural 20 light the room before the cheer dies down.

Open-source PlatformIO firmware, a documented SignalR client, captive-portal setup, reconnect handling, and relay effects for natural 20s and natural 1s.

An ESP32 board imagined as an enchanted tabletop artifact with violet glowing traces
Open sourceLive dice pathSigned webhooks

Keep the table you love

Screens are an on-ramp, not the table.

Use as much or as little Tavern Scribe as fits the group. The signal can begin with a character page, character-sheet roll, party chat, a VTT map, or a session event while the actual adventure stays around minis, paper, and friends.

A physical table with digital character sheets

Players keep sheets on a phone or laptop and share rolls into party chat. The live starter can react to those roll messages while minis and terrain remain center stage.

A VTT-enhanced room

Put maps, tokens, dice, and chat on the shared screen. Webhooks can turn captured campaign events into lighting, sound, notifications, or a completely custom service.

An actual-play production

Translate crits, kills, session state, and published story artifacts into OBS overlays, soundboard cues, clip markers, or audience-facing effects.

The technical primitives

One moment. Two ways to react.

Tavern Scribe captures the meaning once, then gives builders a durable automation path and a low-latency table path. Pick the transport that matches the job.

01 · Capture

A table moment

A shared roll, kill, level-up, loot claim, map-zone trigger, session transition, recap, or newspaper becomes a named campaign event.

02 · Record

A consistent receipt

The event spine gives that moment an id, type, timestamp, campaign context, and event-specific data.

03A · Stable rail

Signed webhook

Filtered JSON delivery to a public HTTPS endpoint, with test sends, retries, delivery history, and replay.

03B · Live starter

SignalR dice stream

The public ESP32 example joins party chat and reacts to shared natural-20 and natural-1 roll messages with minimal delay.

Webhooks · available now

The dependable way to automate a campaign.

Add a public HTTPS endpoint in Campaign Settings, select only the moments your rig needs, reveal the signing secret once, and send a test before game night. Tavern Scribe signs every body with HMAC-SHA256 and keeps the delivery trail visible.

  • Stable camelCase JSON envelope with event, campaign, session, actor, and data fields
  • Per-subscription event filters and example payloads
  • Retry schedule, failure visibility, manual replay, and automatic endpoint protection
  • Works with n8n, Make, Zapier webhook triggers, secure Home Assistant relays, or your own service
Start a Campaign
dice.natural_20signed JSON
{
  "id": "evt_…",
  "type": "dice.natural_20",
  "createdAt": "2026-08-25T…Z",
  "apiVersion": "2026-08-01",
  "campaign": { "id": "…", "name": "The Amber Court" },
  "session": { "id": "…" },
  "actor": { "characterId": "…" },
  "data": {
    "name": "Elyra Dawnwhisper",
    "expression": "1d20+7",
    "total": 27
  }
}
Header: X-TavernScribe-Signature: t=…,v1=…

Current webhook catalog

dice.natural_20dice.natural_1combat.enemy_killedcharacter.diedcharacter.revivedkill.confirmedparty.level_uploot.claimedmember.joinedmap.zone_triggeredsession.recording_startedsession.table_startedsession.table_endedsession.processing_completerecap.publishednewspaper.published
A natural 20 dice result shared in Tavern Scribe party chat

A player shares a roll. Party chat sees the result. The table device hears the same message and fires its effect.

Live SignalR starter · public on GitHub

Flash a board. Join the table. Roll a 20.

The public loji-gaming/tavern-scribe-live-embeded repository is a working PlatformIO example, not a mockup. It handles Wi-Fi setup, the SignalR JSON handshake, campaign room registration, keepalive, reconnects, dice-message parsing, and two non-blocking relay effects.

Builder note: the starter currently stores a campaign-member access token. Treat it as a credential, keep the device under your control, and do not expose its configuration portal. Scoped device keys are a future hardening step.
Browse the Code on GitHub

What would your table do?

Build the part only your group would invent.

The primitives stay plain so the result can get strange. Make one lamp blink, orchestrate a streaming rig, or give a model castle opinions about the party's choices.

The room takes the hit

Gold for a crit. Red for a natural 1. A crypt zone dims the room and wakes the fog.

The story finds its cue

Land a sting on the killing blow, ring a bell on level-up, or change the soundscape as a scene turns.

The stream knows why

Drive overlays, scene changes, clip markers, chat posts, or a custom audience interaction from named events.

The starter rig

About $25 between the roll and the light.

The reference project targets an ESP32 and two relay outputs. These are ordinary search links, not affiliate recommendations.

Mains voltage is not a cantrip. Keep relay projects low-voltage — 12V LEDs are plenty dramatic — unless you are qualified for wall-power work.

Questions before initiative

The honest integration FAQ.

Do I need a virtual tabletop at my physical table?

No. Keep the minis, map, and physical dice. Players can still open Tavern Scribe character sheets or party chat on a phone or laptop. When sheet rolls are shared to chat, the same natural-20 and natural-1 messages used by the live ESP32 starter are available without turning the session into a screen-first game.

What is the difference between webhooks and the live connection?

Webhooks are the stable, configurable automation rail: pick campaign event types and Tavern Scribe sends signed JSON to your public HTTPS receiver, with retries, tests, delivery history, and replay. The live SignalR connection is a developer-facing, lower-latency path used by the public ESP32 starter to hear party-chat dice rolls at the table.

Which events can webhooks deliver today?

The current catalog includes natural 20s and 1s, enemy kills, character death and revival, confirmed kills, level-ups, loot claims, new members, map-zone triggers, session lifecycle events, completed processing, and published recaps and newspapers. You choose the event types for each endpoint.

Does the ESP32 starter receive every campaign event live?

No. The public starter proves the party-chat dice path: it listens for shared roll messages and reacts to natural 20s and natural 1s. Use signed webhooks for the broader campaign-event catalog. The two transports solve different jobs and should not be treated as interchangeable.

Can this work with n8n, Make, Zapier, or Home Assistant?

Yes, through standard webhook triggers or your own HTTPS service. The destination must be publicly reachable over HTTPS; private and local-network addresses are deliberately blocked. For a local Home Assistant installation, use a secure public relay or tunnel rather than exposing the LAN directly.

Is the current device authentication production-ready?

The ESP32 starter currently uses a campaign-member access token, which must be protected like any other login credential. A dedicated table-effects member limits practical exposure, but scoped device keys are still the cleaner future contract. The repository is a transparent starting point for technical builders, not a one-click consumer appliance.

Roll for tinkering

Give the next great table moment somewhere to go.

Start with one shared roll and one light. The same foundation can grow into the automation, prop, or production system your campaign deserves.

Building something unusual? Show us in Discord. The stranger the prop, the better.