Installation
Set up your Remotion project's aliases and install a free Imgcli component with the shadcn CLI.
Start with a Remotion project. Run npx create-video@latest if you need one.
1. Teach your project the @/ alias
Components are copied in importing @/components/imgcli/… and @/lib/snap-cn-ui. A create-video project has no @ alias, and Remotion's bundler does not read tsconfig paths — so set it in both places, or the import resolves in your editor and fails at render.
{
"compilerOptions": {
"paths": { "@/*": ["./src/*"] }
}
}On TypeScript 5 you also need "baseUrl": "." alongside it. TypeScript 7 removed
baseUrl and errors on it — paths are resolved relative to the tsconfig.json
now, so leave it out. create-video scaffolds neither.
import path from "node:path";
import { Config } from "@remotion/cli/config";
import { enableTailwind } from "@remotion/tailwind-v4";
Config.overrideBundlerConfig((config) => {
const c = enableTailwind(config);
return {
...c,
resolve: {
...c.resolve,
alias: { ...c.resolve?.alias, "@": path.join(process.cwd(), "src") },
},
};
});2. Add a components.json
The shadcn CLI reads this to know where files go. npx shadcn@latest init writes one for you — but only in a framework it recognises, and Remotion is not one of them, so write it yourself:
{
"$schema": "https://ui.shadcn.com/schema.json",
"style": "new-york",
"rsc": false,
"tsx": true,
"tailwind": {
"config": "",
"css": "src/index.css",
"baseColor": "neutral",
"cssVariables": true
},
"aliases": {
"components": "@/components",
"utils": "@/lib/utils",
"ui": "@/components/ui",
"lib": "@/lib",
"hooks": "@/hooks"
},
"iconLibrary": "lucide"
}3. Add a component
$ pnpm dlx shadcn@latest add https://imgcli.com/r/text-reveal.jsonNeeds an existing Remotion project and a components.json. Two-minute setup if this is your first Imgcli component.
The URL points to Imgcli's registry. The CLI copies text-reveal.tsx to src/components/imgcli/ and adds the shared files under src/lib/snap-cn-ui/. You can install the free components without an account or API key.
For shorter commands, add this mapping to your components.json. Keep any registry mappings you already use.
{
"registries": {
"@imgcli": "https://imgcli.com/r/{name}.json"
}
}npx shadcn@latest add @imgcli/text-revealComponent code
The exact file shadcn add copies into your project.
Install everything
Want the whole library at once?
$ pnpm dlx shadcn@latest add https://imgcli.com/r/answer-highlight.json https://imgcli.com/r/agent-steps.json https://imgcli.com/r/announce-title.json https://imgcli.com/r/answer-stream.json https://imgcli.com/r/text-reveal.json https://imgcli.com/r/text-highlight.json https://imgcli.com/r/text-rewrite.json https://imgcli.com/r/text-select.json https://imgcli.com/r/text-swap.json https://imgcli.com/r/text-swell.json https://imgcli.com/r/text-build.json https://imgcli.com/r/word-flip.json https://imgcli.com/r/word-captions.json https://imgcli.com/r/karaoke-captions.json https://imgcli.com/r/logo-drift.json https://imgcli.com/r/logo-assemble.json https://imgcli.com/r/logo-flicker.json https://imgcli.com/r/block-wordmark.json https://imgcli.com/r/phone-frame.json https://imgcli.com/r/laptop-frame.json https://imgcli.com/r/terminal-simulator.json https://imgcli.com/r/screen-recording.json https://imgcli.com/r/count-grid.json https://imgcli.com/r/roster-grant.json https://imgcli.com/r/wordmark-cut.json https://imgcli.com/r/cursor-track.json https://imgcli.com/r/pulsing-border.json https://imgcli.com/r/follower-rush.json https://imgcli.com/r/prompt-send.json https://imgcli.com/r/prompt-zoom.json https://imgcli.com/r/punch-lines.json https://imgcli.com/r/orbit-gallery.json https://imgcli.com/r/hero-launch.json https://imgcli.com/r/moodboard-reveal.json https://imgcli.com/r/reel-collage.json https://imgcli.com/r/reel-wall.json https://imgcli.com/r/phone-stack.json https://imgcli.com/r/portal-intro.json https://imgcli.com/r/dot-bloom.json https://imgcli.com/r/hello-zoom.json https://imgcli.com/r/spec-sweep.json https://imgcli.com/r/drop-line.json https://imgcli.com/r/title-sweep.json https://imgcli.com/r/cut-lockup.json https://imgcli.com/r/bloom-lockup.json https://imgcli.com/r/gather-lockup.json https://imgcli.com/r/sky-lockup.json https://imgcli.com/r/search-typing.json https://imgcli.com/r/status-cycle.json https://imgcli.com/r/type-morph.json https://imgcli.com/r/orb-swarm.json https://imgcli.com/r/word-gather.json https://imgcli.com/r/word-wheel.json https://imgcli.com/r/brand-wheel.json https://imgcli.com/r/check-cycle.json https://imgcli.com/r/font-shuffle.json https://imgcli.com/r/button-press.json https://imgcli.com/r/click-type.json https://imgcli.com/r/capture-reveal.json https://imgcli.com/r/channel-thread.json https://imgcli.com/r/logo-collapse.json https://imgcli.com/r/card-rail.json https://imgcli.com/r/snap-cn-ui.json https://imgcli.com/r/caret.json https://imgcli.com/r/input.json4. Use it in a Remotion composition
import { Composition } from "remotion";
import { TextReveal } from "@/components/imgcli/text-reveal";
export const RemotionRoot = () => (
<Composition
id="HelloWorld"
component={TextReveal}
durationInFrames={60}
fps={30}
width={1280}
height={720}
defaultProps={{ text: "Hello, world", mode: "dark" }}
/>
);Components take shadcn's light palette by default, and a Remotion render with no background of its own is black — so pass mode="dark" (or your own theme) when you render onto a dark frame, or near-black text lands on a near-black background.
That's it. Render with npx remotion render HelloWorld out.mp4.
For Claude Code, Cursor, or another coding agent, see the Imgcli Skills and plugin instructions.