Video Overlay Kit

io.github.alichherawalla由 GitHub 帳號 alichherawalla 發布v1.0.0更新於 Oct 24, 2026

Animated b-roll overlays for short-form video. Paste a script, get an mp4. Free, MIT, local.

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

概覽

AI 產生的概覽

本機 MCP 伺服器,依助手撰寫的場景規格渲染短影音動畫疊圖素材(MP4 或含透明通道的 MOV)。

可以做什麼
  • 以子字串搜尋 Tabler 圖示庫,為場景挑選圖示
  • 在渲染前依 schema 驗證場景規格
  • 將場景規格渲染成 MP4,背景透明時輸出含 alpha 通道的 ProRes MOV,並回傳檔案路徑
  • 以標題、清單、流程、對比、中心輻射、圖示、文字與 Lottie 軌道組合場景,可設定主題、配色與背景圖
適用情境
適合大量製作短影音、希望助手把一句自然語言需求變成 4 到 6 秒疊圖片段的人,不必學動效設計軟體,也沒有每次渲染的費用。
執行需求
以本機 stdio 程序執行:複製儲存庫並執行 npm install 後以 node 啟動;README 提供讓助手自動複製儲存庫並寫入 MCP 設定的提示詞。首次渲染會下載約 93 MB 的無頭 Chrome。未宣告帳號、API 金鑰或環境變數。
安裝前請注意
渲染會把影片檔寫入本機磁碟並佔用本機 CPU,首次執行會下載無頭 Chrome 二進位檔。場景規格可用 URL 或路徑引用背景圖與 Lottie 動畫,渲染器會去取得這些資源。README 提醒商業發佈前須自行確認各相依套件的授權。

安裝

在 SourceWeft 中

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

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

其他 MCP 客戶端

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

README

[VideoOverlayKit logo]

VideoOverlayKit

Make b-roll for your videos. Tell an agent what you want. Get an MP4 back.

Free · zero per-render cost · MIT · MCP-driven · runs on your machine

[VideoOverlayKit cover]


Make b-roll for your videos. Tell an agent what you want. Get an MP4 back.

Zero per-render cost. Wednesday Solutions design system as the default theme. Built for people who ship a lot of short-form video and don't want to learn After Effects. Works with any MCP-compatible agent — Claude Code, Codex, OpenCode, Cursor, Cline, or anything else that speaks the Model Context Protocol.

Same scene spec, both orientations. Portrait fits TikTok / Instagram Reels / YouTube Shorts. Landscape fits YouTube / desktop / TV. The kit auto-flips the layout based on the canvas aspect.

list-reveal · a title and three points appearing on cue

[list-reveal portrait]
Portrait · 1080×1920
[list-reveal landscape]
Landscape · 1920×1080

Portrait spec · mp4   •   Landscape spec · mp4

flow · a process from A to B to C

[flow portrait]
Portrait · 1080×1920
[flow landscape]
Landscape · 1920×1080

Portrait spec · mp4   •   Landscape spec · mp4

comparison · two things in contrast

[comparison portrait]
Portrait · 1080×1920
[comparison landscape]
Landscape · 1920×1080

Portrait spec · mp4   •   Landscape spec · mp4

hub · a centre concept with satellites pointing in

[hub portrait]
Portrait · 1080×1920
[hub landscape]
Landscape · 1920×1080

Portrait spec · mp4   •   Landscape spec · mp4

Every clip above is real output. 5 to 6 seconds. Wednesday Solutions design system as the default theme. Click any mp4 link for the full-quality version.


Start here

Paste this into a fresh session of any MCP-compatible coding agent (Claude Code, Codex, OpenCode, Cursor, Cline, etc). The agent does the whole setup. It clones the repo, installs deps, wires the MCP into your config, and verifies it works.

Set up github.com/alichherawalla/video-overlay-kit as an MCP server inmy coding agent.
1. Clone the repo to ~/code/video-overlay-kit (or ask me where to put it   if that path is taken).2. Run `npm install` inside the cloned directory.3. Find my MCP config file and add a `video-overlay-kit` entry that runs   `node <absolute-cloned-path>/bin/mcp.mjs`. Pick the right path for my   agent:     - Claude Code: `.mcp.json` in the current repo, otherwise       `~/.claude/mcp_settings.json`.     - Codex / OpenCode: their MCP config (usually `~/.codex/mcp.json`       or similar — ask me if you can't find it).     - Cursor / Cline: their MCP settings in the IDE config.   Preserve any existing MCP servers in the config.4. Verify the server starts by sending it a `tools/list` JSON-RPC request   over stdio and confirming the tools `list_icons`, `validate_scene`, and   `render_scene` come back.5. Tell me to restart my agent so the new MCP server is picked up.
After setup, read the README at the cloned repo so you know how to authorscene specs. Default to the Wednesday Solutions light theme and 5-secondduration unless I say otherwise.

Restart Claude Code. Now ask for a video:

"Make me a 5-second overlay titled 'A runbook for every incident' with three rows: drift, prompt injection, exfil attempts."

The agent picks the icons, writes the scene spec, renders the MP4, hands you the file path. Drop it into your editor.

If you want to wire the MCP yourself instead, skip to Manual setup.


What you can make

Eight building blocks. Combine any of them inside a single 4-to-6-second scene.

title-overlay

The deliverable bar at the top of the frame. Use this on every scene. It is the one-line promise of what the viewer is about to see.

If a stranger reads the title and can't immediately tell what the video is about, rewrite it.

The bar lives at the top of the frame with a thin lavender accent underneath. 80pt bold, centered. You don't pick the position, it is fixed.

jsonc
{ "kind": "title-overlay", "id": "agenda",  "text": "How to control AI traffic",  "startFrame": 0, "endFrame": 150 }

list-reveal

A vertical list of 1 to 5 rows. Each row gets an optional icon and reveals on a frame you specify.

Use this when you have a list of things to show, between 1 and 5 of them.

[list-reveal preview]

jsonc
{ "kind": "list-reveal", "id": "outcomes",  "position": { "x": 0.5, "y": 0.55 },  "startFrame": 20, "endFrame": 150,  "rows": [    { "text": "One gateway in front of every model",          "iconName": "IconShield",   "revealAtFrame":  0 },    { "text": "Input policy. Output policy.",                 "iconName": "IconFilter",   "revealAtFrame": 35 },    { "text": "Every prompt, every dollar, every output",     "iconName": "IconChartBar", "revealAtFrame": 70 }  ]}

flow

A horizontal sequence of 2 to 5 nodes. Each node appears, an arrow draws toward the next one, the next node appears.

Use this when the meaning is in the sequence. Incident detected leads to runbook activated leads to contained.

[flow preview]

jsonc
{ "kind": "flow", "id": "incident-flow",  "startFrame": 20, "endFrame": 150,  "nodes": [    { "iconName": "IconAlertOctagon", "label": "Incident" },    { "iconName": "IconBook2",        "label": "Runbook" },    { "iconName": "IconCircleCheck",  "label": "Contained" }  ]}

comparison

Two icons side by side with a configurable divider in the middle. Each side has a label and an optional sub-label.

Use this for binary contrasts. Old way against new way is the canonical example.

The divider word is configurable. "vs" is the default for opposition; swap to "+" or "→" when the relationship is additive or transitional.

[comparison preview]

jsonc
{ "kind": "comparison", "id": "old-vs-new",  "startFrame": 20, "endFrame": 180,  "left":  { "iconName": "IconClockHour3", "label": "Old way", "subLabel": "Manual review" },  "right": { "iconName": "IconBolt",       "label": "New way", "subLabel": "Automated checks" },  "divider": { "label": "vs", "showLine": true }}

hub

A central icon with 2 to 4 satellites around it. The center appears first, then each satellite reveals with a line drawing in from the center.

Use this when one thing is at the centre and other things hang off it. A gateway that controls policy, logging, cost, and swap is a hub.

[hub preview]

jsonc
{ "kind": "hub", "id": "gateway-hub",  "startFrame": 20, "endFrame": 150,  "center": { "iconName": "IconShield", "label": "Gateway" },  "satellites": [    { "iconName": "IconLock",     "label": "Policy" },    { "iconName": "IconActivity", "label": "Logging" },    { "iconName": "IconCoin",     "label": "Cost" },    { "iconName": "IconRefresh",  "label": "Swap" }  ]}

icon, text, lottie

The escape hatches. Drop a single Tabler icon anywhere on the canvas, a free-position text block, or a pre-animated Lottie animation. Use these when the composite components above don't fit.

jsonc
{ "kind": "icon", "id": "hero", "name": "IconShieldCheck",  "position": { "x": 0.5, "y": 0.45 }, "sizePx": 240,  "startFrame": 10, "endFrame": 150 }

Most users never read the full field reference for these. The agent reads the schema for you. If you want every field listed out, jump to the reference section.


Customize the look

The kit ships with the Wednesday Solutions palette. Lavender accent on a warm off-white canvas. Every scene also gets an ambient bloom gradient behind the tracks and a sunset gradient on the title text by default. This is what "polished" looks like out of the box.

Everything is configurable through the scene spec. You don't edit JSON, you ask the agent in plain language.

Tell the agentWhat happens in the spec
"Render it in dark mode"theme: "dark"
"Use a black background"background: "#000000"
"Flat background, no bloom"bloom: false
"Solid colour title, no gradient"titleGradient: false
"Put the team photo behind it"backgroundImage: { source: "team.jpg" }
"Make the accent red instead of lavender"palette: { accent: "#E74C3C" }
"Transparent background, I'll composite it myself"background: "transparent"

The codec auto-switches. Solid backgrounds render as H.264 MP4. The transparent setting renders as ProRes 4444 MOV with a real alpha channel.

If you want to change the default theme for every scene without saying so each time, edit src/scene/theme.ts. The palette is one object. Change the hex values and every component picks them up.


Manual setup

Skip this if you used the one-shot prompt above.

bash
git clone [email protected]:alichherawalla/video-overlay-kit.gitcd video-overlay-kitnpm install

Add the kit to your project's .mcp.json or your global ~/.claude/mcp_settings.json:

json
{  "mcpServers": {    "video-overlay-kit": {      "command": "node",      "args": ["/absolute/path/to/video-overlay-kit/bin/mcp.mjs"]    }  }}

Restart Claude Code. Three tools appear under video-overlay-kit:

  • list_icons(query?, limit?) searches the Tabler library by substring. About 5,000 line icons.
  • validate_scene(spec) runs the schema check before render.
  • render_scene(spec, outPath?) renders to an MP4 (or .mov if the background is transparent) and returns the file path.

First render downloads a headless Chrome (about 93 MB) one time.


CLI

Skip the MCP entirely if you want.

bash
npm run render examples/list-reveal.json# -> examples/list-reveal.mp4
npm run render path/to/spec.json /where/to/save.mp4

For live iteration on a spec with auto-reload as you edit the JSON:

bash
npm run preview# opens Remotion Studio at http://localhost:3000

Why this exists

Most short-form B2B video is a talking head with overlay graphics. A title at the top. A list of three points on cue. An icon or two. Done well, the overlays carry as much of the message as the speaker.

The three paths today: hire an editor (₹500-2000 per reel, slow loop, dependency on a person), subscribe to a SaaS like Submagic ($20/month, fixed style, AI-generated quality varies), or learn After Effects (real time investment, not scriptable from your terminal).

This kit is the fourth path. A small library of components keeps the visual language consistent across every reel. The agent writes the scene spec, the renderer produces the MP4, everything runs locally.


Reference

Everything below is the full schema. Keep it open as a lookup when you author specs by hand.

Scene spec, top-level

FieldTypeDefaultDescription
idstringrequiredSlug for the scene. Used as the default output filename.
durationFramesintrequiredTotal length in frames. Must be 4 to 6 seconds at the given fps. Validated.
fpsint30Frame rate.
widthint1080Canvas width in px.
heightint1920Canvas height in px. Default is 9:16 vertical.
theme"light" | "dark""light"Selects the palette. Light is the Wednesday Solutions default.
backgroundstring(from theme)CSS color or "transparent". Overrides the theme's canvas color.
backgroundImageobjectnone{ source, opacity, fit, tint, tintOpacity }. Renders behind the tracks.
paletteobjectnonePer-scene partial palette override. See Palette.
tracksTrack[]requiredThe list of tracks.

Common track fields

FieldTypeDefaultDescription
kindenumrequiredtitle-overlay, list-reveal, flow, comparison, hub, icon, text, lottie.
idstringrequiredUnique within the scene.
startFrameintrequiredFrame at which the track becomes visible.
endFrameintrequiredFrame at which the track is removed.
enterMotion{ kind: "fade", durationFrames: 8 }Entry animation.
exitMotion{ kind: "none", durationFrames: 8 }Exit animation.

Motion (enter and exit)

{ kind, durationFrames, ease }. Available kind values:

kindBehavior
fadeOpacity ramp.
slide-up / slide-down / slide-left / slide-rightEnters translating from 80px in the named direction.
scaleScale-in from 0.85 to 1.0 with opacity.
noneNo motion.

ease: linear, easeIn, easeOut, easeInOut. Default easeOut.

Position

All track position fields are { x, y } as 0..1 fractions of the canvas. The track's geometric center is placed at that point.

Palette

Tokens defined in src/scene/theme.ts. The light palette (default):

TokenColorUsed for
background#F0EDF8Canvas
ink#0B0B0DPrimary text and icon strokes
inkMuted#3A3A4ASecondary text
inkDim#6B6B7ETertiary text
accent#7A5BDCLavender, used for connectors and the title accent bar
accentDeep#5A3DB8Deeper lavender, reserved for pressed states
hairline#CCCAE0Hairline borders

Dark palette inverts these. Per-scene override via palette: { accent: "#E74C3C", ... }.

Per-track field reference

Each track kind below lists the fields it accepts beyond the common fields above.

title-overlay
FieldTypeDescription
textstringThe title text.

Position is fixed at the top of the frame. There is no position field.

list-reveal
FieldTypeDescription
position{ x, y }Center of the list block.
rowsRow[] (1-5)The list rows.
rows[].textstringRow label.
rows[].iconNamestring?Optional Tabler icon name.
rows[].revealAtFrameintFrame (relative to startFrame) when this row appears.
flow
FieldTypeDescription
position{ x, y }Center of the flow block.
nodesNode[] (2-5)The sequence.
nodes[].iconNamestringTabler icon.
nodes[].labelstringLabel below the icon.
direction"horizontal"Only horizontal in v1.
revealCadenceFramesintFrames between successive nodes. Default 35.
comparison
FieldTypeDescription
position{ x, y }Center of the comparison block.
left, rightSideEach: { iconName, label, subLabel? }.
divider.labelstringCenter text. Default "vs".
divider.showLinebooleanWhether to draw the vertical line. Default true.
revealCadenceFramesintFrames between left, right, and divider reveal. Default 25.
hub
FieldTypeDescription
position{ x, y }Center of the hub.
center.iconName, center.labelstringThe central node.
satellitesSatellite[] (2-4)Each: { iconName, label }.
revealCadenceFramesintFrames between center and each satellite reveal. Default 22.

Layout is automatic by count. 2 satellites sit top and bottom. 3 form a triangle pointing up. 4 sit at cardinal positions.

icon
FieldTypeDefaultDescription
namestringrequiredTabler icon name.
position{ x, y }requiredPosition on the canvas.
sizePxint160Icon size.
colorstring(theme ink)CSS color.
strokeWidthnumber2Stroke width.
text
FieldTypeDefaultDescription
textstringrequiredThe text. Supports \n.
position{ x, y }requiredPosition on the canvas.
fontSizePxint56Font size.
colorstring(theme ink)CSS color.
fontWeight400 | 500 | 600 | 700 | 800600Weight.
fontFamilystring(kit's Aeonik stack)CSS font stack.
align"left" | "center" | "right""center"Alignment.
maxWidthPxintunboundedWrap width.
lottie
FieldTypeDefaultDescription
sourcestringrequiredURL or path relative to public/.
position{ x, y }requiredPosition.
sizePxint400Width and height (square).
loopbooleanfalseLoop the animation.
playbackRatenumber1Speed multiplier.

backgroundImage

FieldTypeDefaultDescription
sourcestringrequiredURL, data:, or public/ path.
opacitynumber10..1.
fit"cover" | "contain""cover"CSS object-fit.
tintstring?noneCSS color drawn over the image.
tintOpacitynumber0Opacity of the tint layer.

Layers stack as background color, then image, then tint, then tracks.

Constraints

  • Duration is 4 to 6 seconds. Validated.
  • Aspect is 9:16, 1080×1920. Default.
  • Frame rate is 30 fps.
  • Only Tabler icons and line-style Lottie are supported.
  • Theme is the Wednesday Solutions palette. Editable in src/scene/theme.ts.

Output formats

BackgroundCodecContainerUse case
Any CSS colorH.264.mp4Full-frame b-roll cut into your reel.
"transparent"ProRes 4444.movCompositing over talking-head footage with alpha.

Project structure

video-overlay-kit/├── bin/mcp.mjs              # MCP launcher├── mcp/server.ts            # MCP server: list_icons, validate_scene, render_scene├── scripts/render.ts        # CLI entry (npm run render)├── src/│   ├── Root.tsx, index.ts   # Remotion entry│   ├── scene/│   │   ├── types.ts         # Zod schema for the whole spec│   │   ├── theme.ts         # Palette and font family│   │   └── Scene.tsx        # Top-level renderer│   ├── components/          # One file per track kind│   ├── motion/              # Enter and exit transforms│   └── lib/render.ts        # Shared by CLI and MCP└── examples/                # Sample specs with their rendered MP4s and GIFs

Extending

To add a new track kind (quote for example):

  1. Add QuoteTrackSchema in src/scene/types.ts, include it in TrackSchema, export the type.
  2. Build src/components/Quote.tsx. Use useCurrentFrame() from Remotion and trackStyle from ../motion/primitives. Read colors from usePalette() and the font from FONT_FAMILY in src/scene/theme.ts.
  3. Register the case in src/scene/Scene.tsx.
  4. Update the schema hint in mcp/server.ts so the agent knows the new kind exists.

The renderer and MCP tool handlers do not need changes. Copy Flow.tsx or Hub.tsx as a starting point for choreographed components.


Cost

Zero per render. Local CPU and disk only. Free for individual use and small teams. Check each dependency's license if you are shipping commercially.

Credits

Support the project

VideoOverlayKit is free and MIT-licensed. If the kit saves you time or render budget, the easiest way to give back is to sponsor the project on GitHub. Sponsorships fund new components, better defaults, and bug fixes that ship faster than I can do them in evenings.

Wednesday Solutions (wednesday.is) is the studio behind the design system. If you want a custom build, a theme that matches your brand, or production help shipping AI features for a regulated industry, that's the way to reach the team.


Made with ♥ by Wednesday Solutions

License

MIT.

Issues, contributions

File issues at github.com/alichherawalla/video-overlay-kit. The schema in src/scene/types.ts is the contract. Propose the spec shape first when adding a new track kind, then the component.

來源:README.md,提交 6589b45

工具

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

版本歷史

1
  1. v1.0.0最新Sep 16, 2026

評分

已滿足適用檢查項的 50%

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

  • 近 30 天內可連通25 分

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

  • 已宣告認證方式10 分

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

  • 已列出工具15 分

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

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