snapcn
Copy-paste components for Remotion videos. Components install via shadcn and land in
components/snap-cn/ — you own the code.
Installation
Prerequisites: a Remotion project (npx create-video@latest).
# Add any component (namespaced shadcn registry)
shadcn add @snapcn/text-reveal
# Component lands at components/snap-cn/text-reveal.tsx
@snapcn/<name> is the canonical namespaced form. It needs no registries entry — the
namespace is in the shadcn registry directory. The plain registry URL
https://snapcn.dev/r/<name>.json also works.
Dependencies install automatically
Many components pull others via registryDependencies — shadcn installs them transitively.
For example, shadcn add @snapcn/search-typing also pulls @snapcn/snap-cn-ui, @snapcn/input
and @snapcn/caret.
@snapcn/snap-cn-ui is the shared core lib (timeline-fold hook, theme context, color math).
Most UI Primitives depend on it. You rarely install it directly.
Two tiers
snapcn has two kinds of components — they have different APIs:
- Animation tier (
snapcn) — text animations, transitions, backgrounds, UI-block sims,
brand/social cards, full compositions. Frame-driven. Shared props: speed (time multiplier),
and for text: fontSize, color, fontWeight.
- UI Primitives (
snap-cn-ui) — timeline-driven shadcn-style primitives. Two ship today:
input and caret. State-based props (state, style, size, theme) — the open/typing
state is a pure function of the timeline. No speed prop. Built on @snapcn/snap-cn-ui.
Component categories
Pick by what you're building. The catalog is split one file per component under
references/components/. Start at references/components/index.md — a router table grouped by
these categories with a Use for / Avoid for signal per component. Scan it, pick candidates, then
open only the references/components/<name>.md files you need (full props, example, all use / don't-use
notes). Don't read every file.
| Category |
Tier |
Components |
| Text & Titles |
snapcn |
text-reveal, text-swell, text-highlight, text-swap, text-build, word-flip |
| Captions |
snapcn |
word-captions, karaoke-captions |
| AI Chat Input |
snapcn |
search-typing, prompt-zoom, answer-stream |
| Screens & Devices |
snapcn |
phone-frame, laptop-frame, terminal-simulator |
| Logos |
snapcn |
logo-assemble, logo-flicker, block-wordmark |
| Scenes |
snapcn |
announce-title, hero-launch, orbit-gallery, moodboard-reveal, status-cycle |
| Social Proof |
snapcn |
follower-rush |
| Effects |
snapcn |
pulsing-border |
| UI Primitives |
snap-cn-ui |
input, caret (+ snap-cn-ui, the shared core lib) |
That is the whole registry — 27 items. There are no shaders, no standalone transition
components, no chart or social-card components, and no shadcn primitive beyond input and
caret. If a scene needs one, build it (references/anatomy.md §1) — do not emit a
shadcn add for a name that is not in this table. references/components/index.md maps the
older names that no longer install.
Component patterns
Conventions differ by tier — don't assume animation-tier props on a primitive.
Animation tier (snapcn)
- Named
Props interface per component (e.g. TextRevealProps).
speed?: number — global time multiplier (default 1), applied as frame * speed.
- Text components:
fontSize, color, fontWeight.
- Scene-to-scene transitions are not in this registry — use Remotion's own
@remotion/transitions (slide, wipe, fade, flip) inside a <TransitionSeries>.
className?: string on the root.
UI Primitives (snap-cn-ui)
- State-based, not
speed-based: state (e.g. "open" / "closed"), style, variant,
size, theme?: Partial<SnapCnTheme>.
- The opened/closed/active state is a pure function of the timeline (keyframed presets).
- Compose modal-layer primitives (dialog, alert-dialog, drawer) with a trigger element — see
each component's example.
Animation API
import { interpolate, spring, useCurrentFrame, useVideoConfig } from "remotion";
const opacity = interpolate(frame, [0, 30], [0, 1], { extrapolateRight: "clamp" });
const scale = spring({ fps, frame, config: { damping: 12, mass: 1, stiffness: 100 } });
// Deterministic randomness (NEVER Math.random())
import { random } from "@remotion/random";
const jitter = random(`seed-${frame}`);
Composition structure
import { Sequence, Series } from "remotion";
<Sequence from={30} durationInFrames={60}>
<TextReveal text="Ship it in React" />
</Sequence>
<Series>
<Series.Sequence durationInFrames={60}><SceneA /></Series.Sequence>
<Series.Sequence durationInFrames={60}><SceneB /></Series.Sequence>
</Series>
Canvas & timing
- Canvas standard:
1280×720 @ 30fps. Components are laid out for it.
- Budget each Sequence around the component's natural length — the
Length column in
components/index.md (and each file's Natural length). Under-budgeting clips the animation;
over-budgeting leaves dead air.
- Tone matching: each catalog entry carries a
vibe tag (tech/premium/data/clean/
playful/social) — pick components whose vibe fits the brand.
- Palette & fonts: stay within the library's tokens (
references/design.md → tokens) so your
own elements don't clash.
Design defaults — avoid AI-slop
When you write your own text, scene chrome, or cards (not the prebuilt components), keep it
restrained:
- No decorative
letter-spacing on body/heading text you add.
- No
text-transform: uppercase / ALL-CAPS defaults — prefer sentence case (Launch, not LAUNCH).
- No gradient text-fills or decorative gradient washes — gradients only as intentional backgrounds.
- No glow / colored drop-shadows or large blur radii (
blur > ~24px, spread, multi-layer) —
subtle 1px elevation only.
Exception: never strip these from components whose essence is the effect — word-flip's
gradient word, block-wordmark's colour deck, announce-title's glow, pulsing-border itself,
and the caption presets' heavy outlines are all legitimate. The rules govern your additions,
not the library.
Full do/avoid examples: references/design.md. For motion quality (timing, anticipation,
staging, easing), see references/motion-principles.md.
Gotchas (snapcn-specific)
- No transition components ship — a scene change is
<TransitionSeries.Transition> from
@remotion/transitions, not a snapcn component. text-swap swaps a line, not a scene.
- Terminal scroll is instant — step-function
translateY, never spring/ease the scroll.
overflow: hidden on split layouts — prevents content breakage during width animations.
- Cursor blink is deterministic —
Math.floor(frame / 15) % 2 === 0, not intervals.
- Static files go in
public/ — load via staticFile('cursor.svg'), not imports.
- Social cards render offline —
avatarUrl="" / coverUrl="" fall back to gradients; no fetch.
General Remotion rules (no Math.random(), no setInterval, animate transform not top/left,
load fonts before render) live in Remotion's own skills, not this one:
npx skills add remotion-dev/skills.
Composing a video
Don't dump components — compose one story. When asked to build a full video ("make a product demo",
"changelog video", "intro for my landing"):
- Decide the strategy — ready template vs compose from components vs build a new component. See
references/anatomy.md §1.
- Follow the beats — a product demo is Hook → Positioning → Product reveal → Features → Proof →
CTA (last two optional). See
references/anatomy.md §2.
- Use the recipe —
references/archetypes/index.md routes to per-archetype builds: content contract
(infer → ask → placeholder), duration variants, beat→component slots, and a worked
<TransitionSeries> skeleton.
- Pick each beat's component from
references/components/index.md; match the vibe tag to the
brand and budget each <Sequence durationInFrames> around its natural length.
- Check the quality bar — one accent, sentence-case kinetic type, real content, no glow halos, no
feature-list enumeration, no decorative gradient wash behind the type. See
references/anatomy.md §3.
Reference
references/anatomy.md — composing a full video: strategy (template/compose/new), the product-demo beats, and the good-vs-slop quality bar.
references/archetypes/index.md — router to per-archetype build recipes (product-demo flagship + changelog, feature-announcement, oss-showcase, cli-tool-demo, testimonial-reel, year-in-review, pricing-reveal, logo-bumper): content contract, duration variants, beat→slot map.
references/components/index.md — router table (all components, grouped by category, with Use for / Avoid for). Open references/components/<name>.md for one component's full props, example, and use / don't-use notes.
references/design.md — anti-slop design defaults (do/avoid) + design tokens (palette, fonts, canvas).
references/motion-principles.md — motion-design principles adapted to snapcn + Remotion.
references/anti-patterns.md — common generation mistakes and their fixes.
1---2name: snapcn3description: Build Remotion videos with snapcn — a shadcn registry of copy-paste animation components and timeline-driven UI primitives. Use when composing video scenes, adding text animations, transitions, backgrounds, UI blocks, brand/social cards, or full compositions in a Remotion project. Triggers include "snapcn", "video component", "add animation", "text reveal", "product demo video", "remotion component", "terminal simulator", "device frame", "phone mockup", "burned-in captions", "karaoke captions", "logo animation", "launch video", "changelog video", and the UI-primitive tier: "video input", "typing caret". Even if the user doesn't mention snapcn, activate when they need polished video primitives for Remotion.4---56# snapcn78Copy-paste components for Remotion videos. Components install via `shadcn` and land in9`components/snap-cn/` — you own the code.1011## Installation1213Prerequisites: a Remotion project (`npx create-video@latest`).1415```bash16# Add any component (namespaced shadcn registry)17shadcn add @snapcn/text-reveal1819# Component lands at components/snap-cn/text-reveal.tsx20```2122`@snapcn/<name>` is the canonical namespaced form. It needs no `registries` entry — the23namespace is in the shadcn registry directory. The plain registry URL24`https://snapcn.dev/r/<name>.json` also works.2526### Dependencies install automatically2728Many components pull others via `registryDependencies` — `shadcn` installs them transitively.29For example, `shadcn add @snapcn/search-typing` also pulls `@snapcn/snap-cn-ui`, `@snapcn/input`30and `@snapcn/caret`.3132- **`@snapcn/snap-cn-ui`** is the shared core lib (timeline-fold hook, theme context, color math).33 Most UI Primitives depend on it. You rarely install it directly.3435## Two tiers3637snapcn has two kinds of components — they have **different APIs**:3839- **Animation tier** (`snapcn`) — text animations, transitions, backgrounds, UI-block sims,40 brand/social cards, full compositions. Frame-driven. Shared props: `speed` (time multiplier),41 and for text: `fontSize`, `color`, `fontWeight`.42- **UI Primitives** (`snap-cn-ui`) — timeline-driven shadcn-style primitives. Two ship today:43 `input` and `caret`. State-based props (`state`, `style`, `size`, `theme`) — the open/typing44 state is a pure function of the timeline. **No `speed` prop.** Built on `@snapcn/snap-cn-ui`.4546## Component categories4748Pick by what you're building. The catalog is split one file per component under49`references/components/`. **Start at `references/components/index.md`** — a router table grouped by50these categories with a `Use for` / `Avoid for` signal per component. Scan it, pick candidates, then51open only the `references/components/<name>.md` files you need (full props, example, all use / don't-use52notes). Don't read every file.5354| Category | Tier | Components |55|---|---|---|56| **Text & Titles** | `snapcn` | `text-reveal`, `text-swell`, `text-highlight`, `text-swap`, `text-build`, `word-flip` |57| **Captions** | `snapcn` | `word-captions`, `karaoke-captions` |58| **AI Chat Input** | `snapcn` | `search-typing`, `prompt-zoom`, `answer-stream` |59| **Screens & Devices** | `snapcn` | `phone-frame`, `laptop-frame`, `terminal-simulator` |60| **Logos** | `snapcn` | `logo-assemble`, `logo-flicker`, `block-wordmark` |61| **Scenes** | `snapcn` | `announce-title`, `hero-launch`, `orbit-gallery`, `moodboard-reveal`, `status-cycle` |62| **Social Proof** | `snapcn` | `follower-rush` |63| **Effects** | `snapcn` | `pulsing-border` |64| **UI Primitives** | `snap-cn-ui` | `input`, `caret` (+ `snap-cn-ui`, the shared core lib) |6566**That is the whole registry — 27 items.** There are no shaders, no standalone transition67components, no chart or social-card components, and no shadcn primitive beyond `input` and68`caret`. If a scene needs one, build it (`references/anatomy.md` §1) — do not emit a69`shadcn add` for a name that is not in this table. `references/components/index.md` maps the70older names that no longer install.7172## Component patterns7374Conventions differ by tier — don't assume animation-tier props on a primitive.7576### Animation tier (`snapcn`)7778- Named `Props` interface per component (e.g. `TextRevealProps`).79- `speed?: number` — global time multiplier (default `1`), applied as `frame * speed`.80- Text components: `fontSize`, `color`, `fontWeight`.81- Scene-to-scene transitions are **not** in this registry — use Remotion's own82 `@remotion/transitions` (`slide`, `wipe`, `fade`, `flip`) inside a `<TransitionSeries>`.83- `className?: string` on the root.8485### UI Primitives (`snap-cn-ui`)8687- State-based, **not** `speed`-based: `state` (e.g. `"open"` / `"closed"`), `style`, `variant`,88 `size`, `theme?: Partial<SnapCnTheme>`.89- The opened/closed/active state is a pure function of the timeline (keyframed presets).90- Compose modal-layer primitives (dialog, alert-dialog, drawer) with a trigger element — see91 each component's example.9293### Animation API9495```tsx96import { interpolate, spring, useCurrentFrame, useVideoConfig } from "remotion";9798const opacity = interpolate(frame, [0, 30], [0, 1], { extrapolateRight: "clamp" });99const scale = spring({ fps, frame, config: { damping: 12, mass: 1, stiffness: 100 } });100101// Deterministic randomness (NEVER Math.random())102import { random } from "@remotion/random";103const jitter = random(`seed-${frame}`);104```105106### Composition structure107108```tsx109import { Sequence, Series } from "remotion";110111<Sequence from={30} durationInFrames={60}>112 <TextReveal text="Ship it in React" />113</Sequence>114115<Series>116 <Series.Sequence durationInFrames={60}><SceneA /></Series.Sequence>117 <Series.Sequence durationInFrames={60}><SceneB /></Series.Sequence>118</Series>119```120121### Canvas & timing122123- **Canvas standard:** `1280×720 @ 30fps`. Components are laid out for it.124- **Budget each Sequence around the component's natural length** — the `Length` column in125 `components/index.md` (and each file's `Natural length`). Under-budgeting clips the animation;126 over-budgeting leaves dead air.127- **Tone matching:** each catalog entry carries a `vibe` tag (`tech`/`premium`/`data`/`clean`/128 `playful`/`social`) — pick components whose vibe fits the brand.129- **Palette & fonts:** stay within the library's tokens (`references/design.md` → tokens) so your130 own elements don't clash.131132## Design defaults — avoid AI-slop133134When you write your **own** text, scene chrome, or cards (not the prebuilt components), keep it135restrained:136137- **No decorative `letter-spacing`** on body/heading text you add.138- **No `text-transform: uppercase` / ALL-CAPS** defaults — prefer sentence case (`Launch`, not `LAUNCH`).139- **No gradient text-fills or decorative gradient washes** — gradients only as intentional backgrounds.140- **No glow / colored drop-shadows or large blur radii** (`blur > ~24px`, spread, multi-layer) —141 subtle 1px elevation only.142143**Exception:** never strip these from components whose essence is the effect — `word-flip`'s144gradient word, `block-wordmark`'s colour deck, `announce-title`'s glow, `pulsing-border` itself,145and the caption presets' heavy outlines are all legitimate. The rules govern *your* additions,146not the library.147148Full do/avoid examples: `references/design.md`. For motion quality (timing, anticipation,149staging, easing), see `references/motion-principles.md`.150151## Gotchas (snapcn-specific)152153- **No transition components ship** — a scene change is `<TransitionSeries.Transition>` from154 `@remotion/transitions`, not a snapcn component. `text-swap` swaps a *line*, not a scene.155- **Terminal scroll is instant** — step-function `translateY`, never spring/ease the scroll.156- **`overflow: hidden` on split layouts** — prevents content breakage during width animations.157- **Cursor blink is deterministic** — `Math.floor(frame / 15) % 2 === 0`, not intervals.158- **Static files go in `public/`** — load via `staticFile('cursor.svg')`, not imports.159- **Social cards render offline** — `avatarUrl=""` / `coverUrl=""` fall back to gradients; no fetch.160161General Remotion rules (no `Math.random()`, no `setInterval`, animate `transform` not `top`/`left`,162load fonts before render) live in Remotion's own skills, not this one:163`npx skills add remotion-dev/skills`.164165## Composing a video166167Don't dump components — compose one story. When asked to build a full video ("make a product demo",168"changelog video", "intro for my landing"):1691701. **Decide the strategy** — ready template vs compose from components vs build a new component. See171 `references/anatomy.md` §1.1722. **Follow the beats** — a product demo is Hook → Positioning → Product reveal → Features → Proof →173 CTA (last two optional). See `references/anatomy.md` §2.1743. **Use the recipe** — `references/archetypes/index.md` routes to per-archetype builds: content contract175 (infer → ask → placeholder), duration variants, beat→component slots, and a worked176 `<TransitionSeries>` skeleton.1774. **Pick each beat's component** from `references/components/index.md`; match the `vibe` tag to the178 brand and budget each `<Sequence durationInFrames>` around its natural length.1795. **Check the quality bar** — one accent, sentence-case kinetic type, real content, no glow halos, no180 feature-list enumeration, no decorative gradient wash behind the type. See181 `references/anatomy.md` §3.182183## Reference184185- `references/anatomy.md` — composing a full video: strategy (template/compose/new), the product-demo beats, and the good-vs-slop quality bar.186- `references/archetypes/index.md` — router to per-archetype build recipes (product-demo flagship + changelog, feature-announcement, oss-showcase, cli-tool-demo, testimonial-reel, year-in-review, pricing-reveal, logo-bumper): content contract, duration variants, beat→slot map.187- `references/components/index.md` — router table (all components, grouped by category, with `Use for` / `Avoid for`). Open `references/components/<name>.md` for one component's full props, example, and use / don't-use notes.188- `references/design.md` — anti-slop design defaults (do/avoid) + design tokens (palette, fonts, canvas).189- `references/motion-principles.md` — motion-design principles adapted to snapcn + Remotion.190- `references/anti-patterns.md` — common generation mistakes and their fixes.