Concept · addressed to no one · the [bracketed] slots are where a person's details would go · nothing minted or sent
Relay · outreach · personal invites · concept · 26 Sep 2026

Personal invites

An invite whose landing page plays a paper film made for the person it's for, drawn live in their browser from their details. Their character walks in holding a sign with their first name. Their work piles up. Their invite arrives as the ticket, with their Code on it. This page shows how that works end to end, with every personal detail left as a slot.

New: a special invite: how one code opens either the default register page or a film made for one person, with The receipt as its template, a skip that's always one tap away, and the call to action after the film. Also the console view, which shows every personal invite under Access › Invites, with phone and desktop previews. Also new is a seventh template, 1:1 after a call.

For EC: a concept to see the idea, not an invite to anyone. [First name] and [Org] mark where a person's details would go, and A9M4FG is the brand's example Code. Nothing is live, and the campaigns stay on hold. The plan, the gates and the production path are in relay-marketing video/invites.md.

How it works, end to end

One invite, from the details to the redeemed code. The founding-member campaign is the example.

  1. 1 · The details

    What the invite knows

    First name
    [First name]
    Org
    [Org]
    Role
    creative → Doodle leads
    Use case
    client briefs
    Invite code
    A9M4FG, single use
    Campaign
    Founding member

    In production these sit on the server, on the invite's own code. The link carries the code and nothing else.

  2. 2 · The email

    A poster and a link

    From Erik, RelayTo [First name]Subject [First name], a seat with your name on it

    I made you something short. It plays in your browser.

    The email poster: the cast under the org's Stream, the lead holding the invite ticket

    A mock. An email can't play the page, so it carries a still frame and the link. Erik sends it, after consent.

  3. 3 · The landing

    The film, drawn live

    About 22 s: the sign, the work, the invite, where it goes. The same link always plays the same film.

  4. 4 · Redeem

    The register page, code filled in

    Email[their email] Invite codeA9M4FG

    The existing relayctx.com/register/?code= page. Redeeming grants the campaign's access and counts the signup for it, as campaigns do today.

Six campaigns, one template

The same slots in each. What changes is the wording, the lead character and who joins in. Silent previews; open a landing for the score.

Three ways to watch one

A landing link is a plain hash token, with switches after dots.

SwitchWhat it does
#foundingThe whole film in one go, about 22–25 s. It plays in 9:16 by itself on a tall screen.
#founding.seriesAnimatic series: four short scenes: The sign, Your work, Your invite and Where it goes. Each plays on its own, and the next opens with a click or on the person's next visit. Progress is kept in their browser only.
#founding.genericTwo recorded lines play under scenes 2 and 3, and the captions say what the voice says. The personal lines stay as silent captions.
#founding.verticalForces 9:16 (or .wide for 16:9). Switches combine: #team.series.generic.

Try the slots

Type into any slot and the film rebuilds as you type. Nothing leaves this page.

Picks the lead character.
Goes into the captions, so write it as the line reads. Some campaigns want a plural noun ("client briefs"), and some a list ("Quotes, job sheets…").
Used by the Elevate campaign's note in scene 2. It falls back to the use case.
Any example: 4–16 letters and digits.
Comma-separated. They pile up in scene 2 and hang on the Stream in scene 4.

The fields travel in the URL's fragment (after the #), which browsers never send to a server. That's fine for a concept and wrong for production: a link is forwardable, so real fields live on the server, keyed to the invite's single-use code (see How it would ship).

Voice: three options

The browser has no Kokoro, so nothing personal can be spoken live.

OptionWhat playsForAgainst
A. Captions only (the default)The score and sound effects, built live. The personal lines are cut-paper captions in the picture.No server and no per-invite cost. The name is in the picture and the words. It works muted, which is how most first plays start.No voice. It feels more like a card than a film.
B. Generic voice, personal captions (.generic)Two lines already recorded for Boots from a Code (Kokoro af_heart): "Every new chat starts blank." and "Give it a Code, and it picks up mid-stride."Warmer, and nothing new is recorded or stored. The same two files serve every invite.The voice never says the name. The personal beats (1 and 4) stay silent, and the captions in 2 and 3 turn generic, because spoken and captioned lines must match.
C. A video rendered per invite (server-side)render.mjs on this page with the invite's fields, and Kokoro saying the name. Out comes an MP4 plus the poster frame and a GIF for the email.Fully personal, the name spoken. The same run makes the email poster.One render per person (about 1–2 min on a box with Playwright, Kokoro and ffmpeg). The MP4 is a copy of personal data to store and gate. Each name's pronunciation needs a listen. It doesn't scale to self-serve.

Recommendation: A on the landing, with B as the switch when a warmer first play matters. Keep C for the few named 1:1 sends where you want the name spoken. The email poster doesn't need C: it's a still frame (step 2 above), rendered from the same page with no voice.

How it would ship

Not built. Each step is a gate, in order.

  1. Fields live on the server, never in the link. Each invitee gets a single-use code in their campaign (mint_campaigns.py --batch already mints these). Their first name, org, role and use case sit on that code's record. The link carries only the code.
  2. One small read in relay-platform. The landing asks for the card that belongs to a valid, unredeemed single-use code: first name, org, role, use case, campaign, and nothing else. Any other code gets a 404, rate-limited like validate-code. This is the only new backend piece.
  3. The landing is this page plus that read, served beside the register page with the engine files. Redeem opens relayctx.com/register/?code= with their code, and the redemption attributes to the campaign as it does today.
  4. The email carries the poster and the link. Consent is recorded first, and Erik sends it. That's the founder-led, one-at-a-time send in relay-marketing PLAN.md.

Gates that stay shut: campaigns on hold ("Nothing can be public") · named people only · consent before any send · stealth until the provisional files · outcome-level copy only, with no mechanism or roadmap. The copy passes Ada before anyone sees it.