Captionseasy

io.github.Ishaan-Gpt由 GitHub 帳號 Ishaan-Gpt 發布v0.1.1更新於 Oct 24, 2026

99 designed animated caption looks for AI video editors: list, inspect and build styled captions.

已驗證STDIO僅桌面開發者工具媒體與設計

概覽

AI 產生的概覽

一個本機 MCP 伺服器,讓助理瀏覽 99 種動畫字幕樣式,並把帶時間戳記的詞轉成經驗證的 Remotion 字幕屬性。

可以做什麼
列出並搜尋 99 種設計好的字幕樣式,或依編號或 id 檢視某個樣式的預設值和可調控制項。依帶時間戳記的詞和樣式產生可直接算繪的字幕屬性,並依該樣式驗證樣式與節奏覆寫項。安裝選用的算繪附加套件後,可從本機影片檔算繪出帶字幕的成品或透明字幕疊加層。安裝選用的轉寫附加套件後,可用本機 Whisper 模型把本機影片轉寫成帶時間戳記的詞。
適用情境
當你已有詞級時間戳記,或有影片需要轉寫,並希望為 Remotion 時間軸或成品影片取得帶樣式的動畫字幕,而不想逐一研究原始樣式設定時適用。
執行需求
透過 stdio 在本機執行,通常以 npx 啟動,因此需要 Node.js 和 npm。無需帳號、API 金鑰或環境變數。影片算繪和轉寫是需另行安裝的選用附加套件;算繪還會下載無頭 Chrome,轉寫會下載語音模型。
安裝前請注意
算繪和轉寫工具會讀取本機影片檔並寫入輸出檔到你指定的路徑,執行前請確認路徑。選用附加套件體積較大(算繪約 75 MB 另加無頭 Chrome,轉寫約 540 MB 另加語音模型)。算繪時字型會從 Google Fonts 載入。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Captionseasy,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

captionseasy

[npm] [downloads] [GitHub stars] [license]

Bring your words, get styled captions. CaptionsEasy is a caption style layer for developers and AI editing agents: 99 designed, animated caption looks, a validator that turns timed words + a look into ready-to-render caption props, the React/Remotion components that draw them, a CLI and an MCP server.

  • Tiny and dependency-free. npm i captionseasy adds one package, about 1.6 MB, with zero runtime dependencies.
  • Designed looks, not settings soup. Every look has a permanent number (#12 Jumping Box, #105 Classic Subtitle). Each look lists the few controls it really responds to. Anything else is rejected with a clear error instead of silently doing nothing.
  • Agent-ready. Every CLI command has --json. The MCP tools take JSON and return JSON.
  • Runs 100% locally, free. No servers and no API keys. Rendering and speech-to-text are optional add-ons that also run on your machine.

30-second quickstart

You already have word timings, for example from your editor, your ASR or your agent:

json
[{ "text": "Stop", "startMs": 380, "endMs": 840 }, { "text": "scrolling", "startMs": 840, "endMs": 1080 }]
bash
npx captionseasy looks bold                     # pick a look (search: neon, karaoke, subtitle, "one word" ...)npx captionseasy look 12                        # what can I change on look #12?npx captionseasy build --words words.json --look 12 --set active.boxColor=#FF3366 --out props.json

props.json holds { doc, style, settings }, validated and complete. Render it with the CaptionsEasy composition in your own Remotion timeline (see Use the props in Remotion). If you would rather get a finished video file, add rendering.

Library

ts
import { listLooks, describeLook, buildCaptions } from "captionseasy";
listLooks({ query: "bold" });   // [{ number, id, name, section, tags, description, layout, wordsPerCard }]describeLook(12);               // { ...summary, defaults, controls: [{ key, type, min, max, options, default, dependsOn }], settings: [...] }
const props = buildCaptions({  words,                                                    // [{ text, startMs, endMs }]  look: 12,                                                 // number or id ("hormozi_box")  overrides: { "active.boxColor": "#FF3366", "position.y": 0.6 },  settings: { maxWordsPerCard: 2 },                         // pacing});// { doc, style, settings, look: { number, id, name }, warnings }

Errors are CaptionsEasyError objects with a stable code: UNKNOWN_LOOK, BAD_OVERRIDE, BAD_SETTINGS, BAD_WORDS, BAD_ARGS, FILE_NOT_FOUND, ADDON_MISSING, NO_AUDIO, NO_VIDEO, TRANSCRIBE_FAILED or RENDER_FAILED. The details field carries machine-readable context, such as the valid keys, the allowed range or the install command.

Overrides can be flat dot paths ({"active.color": "#FF3366"}) or nested objects. Colours can be written as #RGB, #RRGGBB, #RRGGBBAA, rgb()/rgba()/hsl(), or a basic name.

A control with dependsOn only works once another key is set:

  • Harmless switches (outline, shadow, glow, background, gradient) are turned on for you, with a warning.
  • Switches that change the motion are never turned on for you; you get an error saying what to set.

Use the props in Remotion

captionseasy/remotion exports the same composition the CaptionsEasy studio uses. Its peer dependencies are react and remotion (^4.0.484).

tsx
import { Composition } from "remotion";import { CaptionedVideo, CaptionsOverlay, calculateMetadata } from "captionseasy/remotion";
// captions only, transparent: put it on a track above your video<Composition id="Captions" component={CaptionsOverlay} calculateMetadata={calculateMetadata}  fps={30} width={1080} height={1920} durationInFrames={300}  defaultProps={{ ...props, media: { width: 1080, height: 1920, fps: 30, durationMs: 10000 } }} />
// or captions burned over a video<CaptionedVideo src={staticFile("talk.mp4")} media={{ width: 1080, height: 1920, fps: 30, durationMs: 10000 }} {...props} />

CaptionsEasyCompositions registers both compositions (CaptionedVideo, CaptionsOverlay). Fonts load from Google Fonts while rendering (free, no key).

CLI

text
captionseasy looks [query] [--tag <tag>] [--section <id>]   list the lookscaptionseasy look <number|id>                             one look: defaults + the controls it honourscaptionseasy build --words <words.json> --look <n|id> [--set key=value ...] [--out props.json]captionseasy mcp                                          MCP server on stdiocaptionseasy <video> --look <n|id> [--words w.json] ...   render a video          (add-on captionseasy-render)captionseasy transcribe <video> [--out words.json]        speech to timed words   (add-on captionseasy-transcribe)
optionmeaning
--look, -l <n|id>look number (12) or id (hormozi_box)
--words <file.json>[{text,startMs,endMs}] or { "words": [...] }
--set key=valuechange the look, repeatable. Style keys and pacing keys (maxWordsPerCard, pauseMs, gapBehavior ...) both come from captionseasy look <n>
--overlay / --format mov|webmrender transparent captions only (ProRes 4444 .mov, or VP9 .webm)
--out, -o <path>output file
--language en|hinglish|autospeech language when transcribing
--jsonone JSON document on stdout. Progress goes to stderr. Errors are printed as {"error":{"code","message","details"}} and exit with code 1

MCP server

The tools are list_looks, describe_look, build_captions, caption_video and transcribe. All take JSON and use local file paths.

  • build_captions works with the core package alone.
  • caption_video and transcribe need their add-on. Without it they return ADDON_MISSING with the exact install command.

To add it to Claude Code:

bash
claude mcp add captionseasy -- npx -y captionseasy mcp# with video rendering:claude mcp add captionseasy -- npx -y -p captionseasy -p captionseasy-render captionseasy mcp

For Cursor (~/.cursor/mcp.json), Claude Desktop, or any client that takes the usual shape:

json
{ "mcpServers": { "captionseasy": { "command": "npx", "args": ["-y", "captionseasy", "mcp"] } } }

On Windows, if your client cannot start npx directly, use "command": "cmd", "args": ["/c", "npx", "-y", "captionseasy", "mcp"].

Optional: rendering (captionseasy-render)

bash
npm i captionseasy captionseasy-render        # ~75 MB; a headless Chrome (~100 MB) downloads on first rendernpx captionseasy talk.mp4 --look 12 --words talk.words.json               # -> talk.captioned.mp4npx captionseasy talk.mp4 --look 12 --words talk.words.json --overlay     # -> talk.captions.mov (alpha)# without a local install:npx -p captionseasy -p captionseasy-render captionseasy talk.mp4 --look 12 --words talk.words.json
ts
import { render } from "captionseasy";   // loads captionseasy-render on demandawait render({ video: "talk.mp4", words, look: 12, mode: "overlay", overlayFormat: "webm", out: "captions.webm" });// { out, mode, durationMs, width, height, fps, look, words, renderMs, warnings }
  • Burn mode writes an H.264 MP4 with the original audio.
  • Overlay mode writes ProRes 4444 .mov or VP9 .webm, both with an alpha channel, at the video's size and length.
  • The add-on ships the composition pre-bundled, so no webpack runs on your machine. It uses the ffmpeg that comes with Remotion.

Optional: transcription (captionseasy-transcribe)

No word timings yet? This add-on runs Whisper locally, using whisper-base with word timestamps through transformers.js on onnxruntime-node.

  • onnxruntime-node ships prebuilt binaries, so nothing is compiled.
  • The add-on is about 540 MB installed, plus a speech model downloaded once into your user cache (about 200 MB for English, about 77 MB for Hinglish).
bash
npm i captionseasy captionseasy-transcribenpx captionseasy transcribe talk.mp4 --out talk.words.json       # [{ text, startMs, endMs }]

With both add-ons installed, captionseasy talk.mp4 --look 12 transcribes and renders in one step.

JSON shapes

jsonc
// describe_look / captionseasy look 12 --json (trimmed){ "number": 12, "id": "hormozi_box", "name": "Jumping Box", "section": "popular", "layout": "sentence", "wordsPerCard": 3,  "defaults": { "fontSize": 58, "active.boxColor": "#22C55E", "position.y": 0.72 },  "controls": [    { "key": "fontSize", "label": "Size", "type": "number", "min": 24, "max": 140, "step": 1, "default": 58 },    { "key": "active.effect", "label": "Spoken-word effect", "type": "enum", "options": ["none", "color", "box"], "default": "box" },    { "key": "stroke.width", "label": "Outline width", "type": "number", "min": 1, "max": 16, "default": 3, "dependsOn": "stroke.enabled=true" }  ],  "settings": [{ "key": "maxWordsPerCard", "type": "number", "min": 1, "max": 12, "default": 3 }] }
// build_captions / buildCaptions{ "doc": { "version": 2, "language": "en", "words": [{ "id": "a1b2c3d4e5f6", "text": "Stop", "startMs": 380, "endMs": 840 }] },  "style": { "templateId": "boxed_word", "fontId": "Montserrat", "...": "every field filled in" },  "settings": { "maxWordsPerCard": 3, "pauseMs": 400, "...": "..." },  "look": { "number": 12, "id": "hormozi_box", "name": "Jumping Box" }, "warnings": [] }
// any error{ "error": { "code": "BAD_OVERRIDE", "message": "Unknown style key \"wobble\". Jumping Box (#12) accepts: fontId, fontSize, ...", "details": { "validKeys": ["fontId", "..."] } } }

Licences

  • captionseasy: MIT (see LICENSE).
  • Rendering uses Remotion. Remotion is free for individuals and for companies of up to 3 people; larger companies need a Remotion company licence. This applies whether you render with captionseasy-render or render the components in your own Remotion project.
  • Speech models (transcribe add-on): OpenAI Whisper (MIT), via onnx-community/whisper-base_timestamped. The Hinglish model is ishaan-g/whisper-hinglish-swift_timestamped.
  • Fonts: Google Fonts (open licences).

來源:packages/cli/README.md,提交 9dbbb30

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

1
  1. v0.1.1最新Oct 16, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分