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 · 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 · The email
A poster and a link
From Erik, RelayTo[First name]Subject[First name], a seat with your name on itI made you something short. It plays in your browser.
A mock. An email can't play the page, so it carries a still frame and the link. Erik sends it, after consent.
-
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 · Redeem
The register page, code filled in
Email[their email] Invite codeA9M4FGThe 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.
| Switch | What it does |
|---|---|
#founding | The whole film in one go, about 22–25 s. It plays in 9:16 by itself on a tall screen. |
#founding.series | Animatic 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.generic | Two recorded lines play under scenes 2 and 3, and the captions say what the voice says. The personal lines stay as silent captions. |
#founding.vertical | Forces 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.
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.
| Option | What plays | For | Against |
|---|---|---|---|
| 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.
- Fields live on the server, never in the link. Each invitee gets a single-use code in their campaign (
mint_campaigns.py --batchalready mints these). Their first name, org, role and use case sit on that code's record. The link carries only the code. - 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. - 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. - 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.