Skip to main content
Glama
README.md
<div align="center">

<img src="apps/ios/OpenCaptions/Resources/Assets.xcassets/AppIcon.appiconset/icon.png" alt="OpenCaptions" width="96" height="96">

# OpenCaptions

**Animated captions for your videos. Open source, self-hosted, and on your iPhone.**

Transcribe with Whisper or Parakeet, style every word, and export a burned-in video or subtitle files.
Nothing leaves your machine unless you say so.

**[Get the iPhone app](https://apps.apple.com/app/id6820548922)** · **[Try it in your browser](https://opencaptions.app)** · **[Self-host it](#quick-start)** · **[Documentation](https://docs.opencaptions.app)**

[![License: AGPL v3](https://img.shields.io/badge/License-AGPL_v3-blue.svg)](LICENSE)
[![CI](https://github.com/leogaudin/opencaptions/actions/workflows/ci.yml/badge.svg)](https://github.com/leogaudin/opencaptions/actions/workflows/ci.yml)
[![Release](https://img.shields.io/github/v/release/leogaudin/opencaptions)](https://github.com/leogaudin/opencaptions/releases)

![OpenCaptions editor: a video with word-by-word animated captions next to the style panel, over the caption timeline](docs/screenshot.webp)

<sub>Clip: <a href="https://studio.blender.org/projects/sprite-fright/">Sprite Fright</a> by Blender Studio, CC BY 4.0</sub>

</div>

## Features

- **Word-level transcription** with Parakeet or Whisper on your machine, the OpenAI API with your own
  key, or another OpenCaptions server (a GPU box at home, say)
- **Animated styles** with presets and a full custom panel: fonts, colours, outline, background,
  animation, position
- **A real editor**: a timeline to retime captions, fix a misheard word right on the video
- **Export** a burned-in MP4, WebM or ProRes, SRT, VTT and JSON, or just the captions on a green
  screen to key out in your video editor
- **The preview is the export**: one Rust engine draws both, so what you see is what you get
- **[iPhone, iPad and Mac app](https://apps.apple.com/app/id6820548922)** with on-device Whisper, Parakeet and Apple Speech, no
  server and no account. One purchase covers all three
- **Many scripts and languages**: Latin, Cyrillic, Arabic, Hebrew, Indic, Thai, CJK and more, and
  an interface in 13 languages
- **From Claude and other agents**: an MCP server and a command line (`npx opencaptions`) that caption
  a video on your computer, with no server, or on yours: for Claude Code, Claude Desktop, Cursor or a
  video pipeline
- **Private by design**: no telemetry, no tracking, accounts are local to your instance

## Quick start

You need Docker Compose v2.24 or newer and one file:

```bash
curl -O https://raw.githubusercontent.com/leogaudin/opencaptions/main/docker-compose.yml
docker compose up -d
```

Open <http://localhost:5173>, create an account, drop a video in.

The compose file runs the `edge` images, which follow the main branch. To stay on a release, pin it:
`OPENCAPTIONS_VERSION=1.0.0 docker compose up -d`.

To build from source instead, clone the repository and run `docker compose up -d --build`
(or `make up`).

> The web UI listens on every interface and signup is open. On a shared network or a public
> host, read [Security](docs/self-hosting/security.md) first.

## From Claude and other agents

No server needed: with Node.js and FFmpeg installed, the speech model and the engine run on your computer.
Claude Code installs the tools in one step:

```text
/plugin install opencaptions --marketplace leogaudin/opencaptions
```

Any other MCP client runs `npx -y opencaptions mcp`, and a script runs
`npx opencaptions caption reel.mp4 --look Bold`. With an API key from your server, the same tools run there
instead, with every language and the web editor. Setup for each is in
[From Claude and other agents](https://docs.opencaptions.app/guides/agents/).

## More

- [Documentation](https://docs.opencaptions.app): the guides, self-hosting, the HTTP API and the
  reference. It is plain Markdown in [docs/](docs/index.md), built into that site with [Starlight](apps/docs)
- [Try it in your browser](https://opencaptions.app): the looks on a sample clip, nothing to install
- [Self-hosting](docs/self-hosting/installation.md): installation, configuration, security, GPU
  acceleration, backups
- [Architecture](docs/project/architecture.md): how it works, including the engine and the iOS app
- [iOS app](apps/ios/README.md): building and running it
- [Contributing](CONTRIBUTING.md): dev setup and the acceptance gate (`make ci`)
- [Security policy](SECURITY.md): threat model and reporting a vulnerability

## Status

The iPhone, iPad and Mac app is on the App Store, and the self-hosted stack has tagged releases. What changed in
each one is in the [changelog](CHANGELOG.md).

## Why is there a Pro?

The iPhone app is free. Pro is one purchase, with no subscription: it removes the mark on saved videos
and adds 4K, 60 fps, HDR and every caption style. All of that code is here, and
[a build you make yourself](apps/ios/README.md) has everything unlocked. The App Store version costs
money so that someone signs it, ships it and keeps it working.

## License

[AGPL-3.0-only](LICENSE). If you offer a hosted version of OpenCaptions, the AGPL requires you to
publish your modifications. Contributors accept a [CLA](CLA.md) so the maintainer can also ship
the code where the AGPL cannot go, such as the App Store. Third-party components keep their own
licences, see [NOTICE](NOTICE). The name and the icon are covered by the
[trademark policy](TRADEMARK.md).

Built and maintained by [Leo Gaudin](https://github.com/leogaudin).

## Support the project

OpenCaptions is free and has no tracking. If it is useful to you, you can support it with crypto:

<table>
  <tr>
    <td align="center"><b>BTC</b><br><img src="docs/donate/btc.png" alt="BTC address QR code" width="160"></td>
    <td align="center"><b>ETH</b><br><img src="docs/donate/eth.png" alt="ETH address QR code" width="160"></td>
    <td align="center"><b>XMR</b><br><img src="docs/donate/xmr.png" alt="XMR address QR code" width="160"></td>
  </tr>
</table>

```text
BTC  bc1qac8u7xc5zan6a6fng8gqp7drapau9208d0l9wp
ETH  0xc5C9fE87f10BdC4FecEF9De48cD3ba942640774e
XMR  86bcvPxVaqpTgXuk7FPuJa9sYXbUZnAAFj1sdSiSpr8bWpmW2VhMAF4dzXP2Lead3XFRDurqHnYcKNC2RLPQWvVJ9hbM2Kg
```