A birthday card video generator (per-recipient, from CSV)
Per-recipient birthday cards from a CSV. One HTML template, hundreds of personalized MP4s, sent at scale.
Sending a personalized birthday video is one of those things that is touching when it's clearly hand-made and creepy when it's clearly templated. The trick to making the templated version work is not to disguise the template — it's to lean into the personal information the recipient cares about and skip the parts that scream "automation."
A name, an age, a one-sentence note. Three personal data points. That's enough.
The data
One row per recipient:
name,age,joined_year,note
"Lin",34,2019,"Three years on the team and still the only one who reads the docs."
"Marcus",41,2021,"Happy birthday — the project ships because of you."
"Jordan",28,2024,"Thanks for everything this year."The CSV is the contract. If it has 200 rows, you render 200 birthday videos. The CSV is the part of this project that requires real thought; the renderer is the easy part.
The template
A single HTML file with four scenes:
- Opener (3s). "Happy birthday, NAME." Big serif type, settle curve, gentle confetti pulse in the corner.
- The fact (4s). "X has been here since YEAR." Tabular numerals, a quiet timeline visualization.
- The note (5s). The hand-written line from the CSV, set in a serif, line-by-line clip reveal.
- The sign-off (3s). Sender name + logo. "From everyone at Acme."
Total: ~15 seconds. Right length for a Slack DM or an email embed.
The voice trap
Here is the part that determines whether the recipient feels seen or marketed-to: the tone of the note.
The wrong tone is corporate cheer. "Wishing you a wonderful day filled with joy!" reads as a mailer.
The right tone is specific. The hand-written note in the CSV does the heavy lifting; it should be specific enough that the recipient knows someone actually wrote it. Two sentences. A reference to something they did. A real signature.
The template's job is to frame the specific message, not to add to it.
The render
Per recipient, one MP4. With 200 recipients at ~15 seconds each:
- ~22 render-seconds per recipient.
- 200 × 22 = 4400 render-seconds = ~73 minutes.
On a single Chromium instance. With 4 parallel browser contexts, ~18 minutes.
For 10,000 recipients (a company-wide HR program), see render 10k variants overnight — same math, larger queue.
The delivery
Two paths:
- Embed in email. The MP4 lives at
/cards/{recipient_id}.mp4. The email contains a poster image and a play-link. Click → opens the video in the browser. - DM with a video preview. Slack, Teams, and iMessage all preview MP4s inline. Drop a link, the platform unrolls it.
Don't try to embed an MP4 as an <video> tag in the email body. Many clients block it. The poster + link pattern is more reliable.
What to template, what to leave alone
Three things must be unique per recipient:
- The name (obviously).
- The personal fact (years here, role, something verifiable).
- The hand-written sentence.
Two things should be the same across recipients:
- The visual design.
- The sender signature.
Templating the design per recipient is a waste. The whole point is recognizable consistency — every recipient knows the card is "the company card," with their name on it.
The "per-row from CSV" pattern is in batch personalized videos from CSV. The CSV-personalized card playground example is the direct primitive.
A close
A personalized birthday video is one of those "small thoughtful gestures" that don't scale unless the production path is templated. The template makes the gesture possible at scale; the specific note inside it makes the gesture land. Both pieces have to be there.
Cite this postBibTeX · APA · Markdown
@misc{park2026birthday,
author = {Ren Park},
title = {A birthday card video generator (per-recipient, from CSV)},
year = {2026},
url = {https://hyperframes.video/blog/birthday-card-video-generator},
note = {HyperFrames blog}
}Ren Park. (2026, May 19). A birthday card video generator (per-recipient, from CSV). HyperFrames. https://hyperframes.video/blog/birthday-card-video-generator
[A birthday card video generator (per-recipient, from CSV)](https://hyperframes.video/blog/birthday-card-video-generator) — Ren Park, 2026
Ren writes guides, runs workshops, and breaks the CLI on purpose so you do not have to. Previously dev rel at a CI company; before that, an actual filmmaker.
An animated invoice summary video (the per-customer billing recap)
Send customers a 20-second recap of their monthly invoice — top metrics, charges, savings — rendered from their data. Quietly more memorable than an email.
Real estate listing video template (one HTML, many listings)
Real estate listing videos are a $2B/year market of nearly-identical 30-second clips. Here's how to template one and render thousands.
Build a Year-in-Review video generator (Spotify-Wrapped style)
The Wrapped formula — a per-user year-end recap video — fits inside an HTML template and a deterministic renderer. Here's the architecture.
Building with HyperFrames? Come hang out.
We're on GitHub, in Discord, and the playground is one click away. Bring weird ideas — we collect them.