Animated quote cards for Twitter (and other platforms)
A quote-card generator that produces a still PNG and a short animated MP4 from one HTML template. Same source, every social size.
A quote card is the easiest piece of social content to make and the easiest to make badly. A handful of design rules separate the version that gets shared from the version that looks like a Canva default. Once you have the rules pinned down, the production path is one HTML file — and the animated version is the same HTML rendered as render(t).
The five rules
- One quote per card. Not two. Not a sentence with a follow-up. One quote, one attribution.
- Serif typeface for the quote. A serif reads as "a thought worth thinking." A sans-serif reads as "marketing."
- The opening quote glyph is huge. A 200-300pt opening
"(or") in a tinted color, anchoring the top-left. The eye lands on it first, then reads the line. - The attribution is small. 14-16pt, tracked-out, all caps. Below the quote, never above.
- One color per quote. A subtle accent — a brand tint on the opening glyph, a thin rule under the attribution. No gradients, no shadows.
That's the whole brief.
The HTML version
<style>
body { background: #f6f5f1; color: #0a0a0a; display: grid; place-items: center; height: 100vh; }
.card { max-width: 720px; padding: 80px 88px; position: relative; font-family: ui-serif, Georgia, serif; }
.open { position: absolute; left: 32px; top: -20px; font-size: 240px; color: #ff3b1f; opacity: .25; line-height: 1; }
.q { font-size: 48px; line-height: 1.25; letter-spacing: -.01em; }
.by { margin-top: 40px; font-family: ui-monospace, monospace; font-size: 13px; letter-spacing: .25em; text-transform: uppercase; color: #6b6862; }
.rule { display: inline-block; width: 28px; height: 1px; background: #0a0a0a; vertical-align: middle; margin-right: 12px; }
</style>
<div class="card">
<span class="open">"</span>
<div class="q">Make new mistakes. Make glorious, amazing mistakes. Make mistakes nobody's ever made before.</div>
<div class="by"><span class="rule"></span>Neil Gaiman</div>
</div>Forty lines. The animated version adds a render(t) that ranges the quote in via a clip-reveal:
function render(t) {
const u = ease(t / 0.9);
quoteEl.style.transform = `translateY(${(1 - u) * 30}px)`;
quoteEl.style.opacity = u;
byEl.style.opacity = ease((t - 0.4) / 0.8);
}The two outputs
From one source:
- Still PNG (1200×630) for Twitter, LinkedIn, Bluesky
og:image. - Animated MP4 (1200×630, 4 seconds) for Discord, Slack, iMessage
og:video.
The still is the last frame of the animation. They never drift.
For vertical Stories (1080×1920), the same template re-renders at the new aspect with the quote re-wrapped — the design rules don't change.
Templating at scale
For a long-running quote series (one a week for a year), the CSV is:
slug,quote,author,accent_color
neil-mistakes,"Make new mistakes...","Neil Gaiman","#ff3b1f"
ursula-rules,"Rules change in the act of obeying them","Ursula K. Le Guin","#1f6f8a"
...Render 52 cards in a few seconds. Schedule one per week. Cost: zero, after the template exists.
The pitfall to dodge
Don't add a brand mark to every quote card. The card is the brand mark — the typeface, the serif, the rule under the attribution. Adding a logo on top reads as advertising. The card is more credible without the logo because it doesn't feel like it's selling.
Save the logo for the third or fourth card the viewer sees from your account. By then they know it's your aesthetic without the logo confirming it.
For the kinetic-type variant (animated reveal patterns) see kinetic typography for headlines. For the broader OG-card pattern see animated Open Graph images.
A close
A quote card is the lowest-effort, highest-ROI piece of social content you can ship. The trick is to stop iterating on the design every week and let one template carry a hundred quotes. The repetition is what makes the account recognizable.
Cite this postBibTeX · APA · Markdown
@misc{okafor2026animated,
author = {Marcus Okafor},
title = {Animated quote cards for Twitter (and other platforms)},
year = {2026},
url = {https://hyperframes.video/blog/animated-quote-cards-twitter},
note = {HyperFrames blog}
}Marcus Okafor. (2026, May 19). Animated quote cards for Twitter (and other platforms). HyperFrames. https://hyperframes.video/blog/animated-quote-cards-twitter
[Animated quote cards for Twitter (and other platforms)](https://hyperframes.video/blog/animated-quote-cards-twitter) — Marcus Okafor, 2026
Marcus leads design and motion at HyperFrames. Before that he shipped editorial motion for newsrooms and product launches. He thinks every easing curve has a personality.
Twitter / X video card generator (the HTML version)
X expanded its Card spec to support short MP4 previews. Here's how to generate one per post, automatically, from an HTML template.
Animated Open Graph images (the practical version)
Most platforms still want a static og:image. A handful — Discord, Telegram, Slack — preview MP4s. Here's how to serve both from one source.
Animated app onboarding screens to MP4
Build an animated app onboarding video in HTML — three-screen carousel with sliding screens, fading headlines, scaling illustrations, advancing dots — and render to MP4.
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.