# captions.js vs Remotion, ASS/libass and FFmpeg drawtext

> How the common ways to render animated captions compare: live preview, server-side burn-in, headless browser, word-level animation.

Most caption tools make you choose between a good **live preview** and a reliable
**server-side export**. This page compares the usual options on the points that decide
which one fits.

| | captions.js | `@remotion/captions` | Remotion (full render) | ASS / libass | FFmpeg `drawtext` |
| --- | --- | --- | --- | --- | --- |
| Live preview over `<video>` | yes | no renderer | yes, React player | depends on the player | no |
| Server-side burn-in | yes, Node + FFmpeg | no | yes | yes | yes |
| Headless Chrome in production | not needed | n/a | required | not needed | not needed |
| Word-level highlighting | yes | timing data only | build it yourself | karaoke tags only | no |
| Kinetic word animations (bounce, pop, box…) | yes, 10 built in | no | build it yourself | no | no |
| Preview and export share one code path | yes | n/a | yes, through Chrome | n/a | n/a |
| Ready-made styles | 26 presets | none | templates | write them by hand | none |
| License | MIT | Remotion license | Remotion license | open source | LGPL/GPL (FFmpeg) |

## When to use which

- **captions.js**: you show captions to users in a browser editor or player **and** export
  MP4s on a server, and the two must look identical. The same `renderFrame` draws on a canvas
  in both places, with skia-canvas + FFmpeg on the server and no browser.
- **Remotion**: your whole video is a React composition (titles, scenes, transitions),
  and you are fine running headless Chrome to render it. `@remotion/captions` parses and
  groups transcripts; it does not draw anything, so you still build the caption visuals.
- **ASS / libass**: classic subtitles, broad player support and fast burn-in, as long as you
  only need static lines or simple karaoke color changes.
- **FFmpeg `drawtext`**: a single static line or a watermark. Word-by-word animation means
  generating and escaping a filter per word, which gets unmanageable fast.

## Licensing note

Remotion uses its own license: free for individuals and small teams, paid for companies
above a size threshold. Check their current terms. captions.js is MIT and stays MIT, free
for commercial use.

## Try it

```bash
npx captions.js burn talk.mp4 words.json --preset Karaoke
```

Then see [Animated captions with FFmpeg in Node.js](/docs/guides/ffmpeg-animated-captions-nodejs)
and the [styles gallery](/styles).

Source: https://captionsjs.dev/docs/guides/captions-js-vs-remotion-ass-drawtext
