Tweet Card
The tweet screenshot format, animated: avatar and handle header, text that lands word by word (or character-by-character with a real recorded keyboard, by paragraph, or as a fade). Add the shared overlay camera for the same timed settle used by Quote Card.
Put this in your video
Quote a post without pasting a screenshot nobody can read on a phone. Paste this into Claude Code, Codex, or any coding agent.
Use the OverlayMotion video templates from https://github.com/ricardo/overlay-motion Add the Tweet Card template with the name Ricardo Metring, handle @ricardometring, verified badge on, my avatar, and the post text landing word by word. Centered, holding for 8 seconds.
- Have ready: The display name, the handle, the text of the post, and an avatar.
- Works over any clip, and still renders with no clip at all.
- Defaults to the center of the frame for about 15 seconds. Ask for another spot, a start time, or a longer hold.
- A correction is one sentence: “Type it character by character with the keyboard sound.”
Technical reference: props, spec knobs and JSON
Inputs
Everything inside the overlay's props. Omit one and its default applies.
nametextRequiredhandletextRequiredtexttextRequiredavatartextOptionalverifiedtrue / falseDefault falsetypingSfxfalse | cue name | file pathDefault "keyboard-typing-natural"Recorded keyboard typing while character-by-character text lands, so it only plays on the typewriter reveal. false types in silence.
All 46 accepted values
falsepopbubbletickdingwhooshkeyboard-typing-naturalmouse-click-pressmouse-click-releasetypewriter-scissor-metallic-lowtypewriter-scissor-metallic-basstypewriter-scissor-metallic-subtypewriter-scissor-metallictypewriter-scissor-lowtypewriter-scissor-deeptypewriter-laptoptypewriter-chiclettypewriter-scissortypewritertypewriter-softtypewriter-mechanicaltypewriter-digitaltypewriter-heavytypewriter-thocktypewriter-steeltypewriter-slamtypewriter-buttontypewriter-switchtypewriter-keycapclickclick-crispclick-roundclick-glasstogglesuccesserrornotificationsparkleswoopriserimpactglitchshutterswipedropdisplayanimateInwords | typewriter | paragraphs | fade-up | noneOptionalwordstypewriterparagraphsfade-upnoneWhat the spec changes without touching props
These live on the overlay, not in this template. They are renderer-provided, so they behave the same here as on every other template.
regionWhere it sits. One of the 12 named boxes, or your own
{ "x": 62, "y": 12, "w": 34, "h": 42 }in percent of the frame. This template is designed aroundcenter, which is what it uses when the spec says nothing.fullscreentop-bannerlower-thirdupper-thirdcaption-zoneleft-panelright-panelcentercorner-tlcorner-trcorner-blcorner-brscaleUniform size inside the resolved region,
0.25to2. Props that size the artwork stay relative to the region box, soscaleis how an overlay grows past it.timeWhen it lives:
start,duration, or theappear+holdpair (entrance length plus how long the finished overlay stays). Seconds (3s), percentages (66%) and negative seconds from the end (-2s) are all valid.motionObject motion, applied to the element itself so nothing is cropped or zoomed. Unset here, so add
{ "style": "shake" }(orwobble,float,sway-3d) withamount(0..1) and its owntimewindow, or one of theskew-*sweeps for a single slow turn into a perspective keystone. Pass an array to stack several.shakewobblefloatsway-3dskew-rightskew-leftskew-upskew-downnoneenterRenderer-owned entrance, 0.6s, identical on every template. It stacks with whatever entrance the template already runs, so set the template's own entrance prop to
nonewhen you drive it from here.slide-leftslide-rightspringmaskexitHow it leaves:
blur-outmelts it away,fade-downdrifts down,shrinkscales to center (0.9s each),vanishpops it out of existence in 0.45s. Set one and the template's own fade steps aside.blur-outfade-downshrinkvanishcameraMoves the region's VIEWPORT rather than the element:
push-in,pull-out, thepan-*family,handheld. Its own transform layer, so it stacks withmotion,enter,exitandscale.soundPer-overlay override of the spec's sound block:
enabled,volume, and asoundsmap that remaps one cue by name ({ "pop": "ding" }, a path to your own file, orfalseto mute just that cue). The map is keyed by CUE, so remappingpopalso changes anexit: "vanish", which firespoptoo. To change only this template's own sound, use itssfxprop instead. Core palette:click,pop,whoosh,ding,typewriter.All 45 premade cues
popbubbletickdingwhooshkeyboard-typing-naturalmouse-click-pressmouse-click-releasetypewriter-scissor-metallic-lowtypewriter-scissor-metallic-basstypewriter-scissor-metallic-subtypewriter-scissor-metallictypewriter-scissor-lowtypewriter-scissor-deeptypewriter-laptoptypewriter-chiclettypewriter-scissortypewritertypewriter-softtypewriter-mechanicaltypewriter-digitaltypewriter-heavytypewriter-thocktypewriter-steeltypewriter-slamtypewriter-buttontypewriter-switchtypewriter-keycapclickclick-crispclick-roundclick-glasstogglesuccesserrornotificationsparkleswoopriserimpactglitchshutterswipedropdisplay
Copy and customize
This exact spec drives the preview. Replace media paths and props with your own.
{
"theme": "<your-brand-tokens>",
"version": 1,
"format": "square",
"fps": 60,
"durationSec": 15,
"source": {
"type": "none"
},
"sound": {
"enabled": true,
"volume": 1,
"sounds": {}
},
"overlays": [
{
"template": "tweet-card",
"region": "center",
"time": {
"appear": 7.5,
"hold": 7.5
},
"camera": {
"preset": "pull-out",
"amount": 0.1,
"rest": 0,
"frequency": 2.4,
"seed": 0,
"time": {
"start": 4,
"duration": 11
},
"easing": "ease-in-out"
},
"reveal": "typewriter",
"props": {
"name": "Ricardo Metring",
"handle": "@ricardometring",
"avatar": "/demo/avatar.png",
"verified": true,
"text": "Nobody rewatches a raw screen recording.\n\nGive the clip a hook, captions, and your brand colors. That takes one JSON spec, not an editor. The template already knows the rest.\n\nPost it. Repeat tomorrow."
}
}
]
}