Promoshot

io.github.GarAlex由 GitHub 帳號 GarAlex 發布v0.4.7更新於 Oct 30, 2026

Headless MCP: author and render PromoShot .promo video projects (stills, GIFs, video).

概覽

AI 產生的概覽

無頭 PromoShot 引擎,讓助理撰寫、驗證、檢視並算繪 .promo 影片專案,輸出靜態影格、GIF、影格序列或 mp4。

可以做什麼
  • 建立與編輯專案:初始化 .promo 資料夾,加入圖片、影片、字幕或模型圖層,設定關鍵影格,批次套用編輯指令,產生幻燈片,解釋與比對變更
  • 驗證與檢視:依格式 schema 驗證專案,列出畫布、圖層、缺少的素材與未定義顏色,並提供撰寫用 schema 與範例配方
  • 算繪:輸出靜態影格、影格序列、GIF 與可續算的 mp4(含混音),並為長素材建立代理檔
  • 分析素材:讀取媒體資訊,產生轉台圖與縮圖表,偵測靜音區段與場景切換
  • 配音:列出音色,以服務商金鑰或本機音色合成語音,並將語音轉寫為字幕
適用情境
適合讓助理不開桌面應用程式,就用圖片與素材製作產品宣傳短片、應用程式商店風格片段或動態靜態圖,也適合在 Mac、Linux 機器或容器中建立腳本化、代理驅動的算繪流程。
執行需求
以本機 stdio 程序執行,通常使用已發布的 Docker 映像或預先編譯的執行檔;promo 命令列須位於伺服器同目錄或 PATH 中,算繪影片還需要 ffmpeg 與 ffprobe。算繪需要支援 Vulkan 的 GPU 或隨附的軟體算繪器;Linux 執行檔需 glibc 2.39。可選參數指定工作區與根目錄。使用服務商配音需把金鑰存入系統鑰匙圈或密鑰檔案(如 OPENAI_API_KEY_FILE)。
安裝前請注意
配音會花用使用者自己的服務商帳戶額度;金鑰不經過工具參數,而是從鑰匙圈或密鑰檔案讀取,需妥善保護該檔案。工具會寫入專案檔案與算繪輸出,promo_apply 可刪除或移動圖層。本機音色包會從上游網址下載。Mac 應用程式內建的伺服器是另一套,可操作目前開啟的文件。

安裝

在 SourceWeft 中

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

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

其他 MCP 客戶端

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

README

promoshot

See it work: demo.md — technique prompts and open-ended creative briefs, each given to a fresh agent with only the skill and the MCP, its result beside the hand-built reference. The suite is in demos/.

[A frame rendered by the engine on Linux: a bordered video card over a themed background, with a stroked, shadowed caption reading 'Rendered on Linux'.]

The rendering engine behind PromoShot (App Store), and an open implementation of its project format. A .promo project is a folder — metadata.json plus its media — and this workspace is everything needed to validate, inspect, and render one to stills, image sequences, or mp4 with mixed audio: no app attached, byte-for-byte the same compositor the apps ship.

The design bet is that the format is the interface. An assistant, a script, or a person writes metadata.json; the engine renders it the same everywhere — the Mac and iOS apps (Metal + VideoToolbox), this repo's CLI, or a headless Linux box with no GPU at all (wgpu on lavapipe, ffmpeg as a subprocess). The format has three faces behind one truth: an authoring subset with four validated recipes (promo schema), the full document (--full), and a types-only JSON Schema generated from the parser's own structs (--types) — and the parser the validator runs is the parser the renderers use, so "validates" means "renders".

Not the other PromoShot

This is the open engine (and App Store app) for PromoShot by Alexander Garmash — a full layer / keyframe / timeline editor for screen recordings, video, and photos (Mac; iPhone and iPad open the same .promo projects).

It is not the similarly named App Store apps that turn screenshots into template videos (for example “PromoShot: Screenshot to Video”). If you want keyframes, masks, GPU compositing, and an open .promo format, you want this one: promoshot.app · App Store.

Product listing / PAD

Consumer apps: promoshot.app · App Store. Software directories can ingest this PAD 4.0 file:

https://raw.githubusercontent.com/GarAlex/promoshot/main/promoshot.pad.xml

Crates

CrateWhat it owns
promo-modelThe format: wire structs, migrations, palette roles, schema.md
promo-timelineTimeline math: keyframes, trims, attachments, waits, validation
promo-gpuwgpu compositing: quads, borders, letterbox, vectors, color conversion
promo-textCaption shaping and effects (cosmic-text)
promo-enginePreview/export orchestration, frame cache, memory governor, PCM mixer
promo-mediaDecoder/encoder trait registry; ffmpeg-subprocess backend + conformance suite
promo-editorThe document's edit vocabulary: commands with undo, the wizard's arrangement, theme rules — what promo_apply and promo_slideshow are built on
promo-clipromo — render a project from the command line
promoshot-mcpMCP server over stdio, for agents

Build and verify

./check-all.sh          # fmt, clippy -D warnings, all tests, release build

Rendering video needs ffmpeg (and ffprobe) on PATH — frames are composited on the GPU and piped to it raw; ffmpeg only decodes and encodes. On a headless Linux machine, mesa-vulkan-drivers (lavapipe) is enough of a GPU.

Headless Linux, no GPU

The Linux release tarball carries its own CPU renderer: a lavapipe/ folder (Mesa's lavapipe, its libraries and a Vulkan loader; licences in lavapipe/NOTICES.txt) beside promo. Keep the folder next to the binary and a machine with no Vulkan driver at all — a fresh container, or a redeploy that dropped mesa-vulkan-drivers — still renders. promo picks, in order: a real GPU; the system's lavapipe; the bundled lavapipe (saying so once on stderr); SwiftShader, with a warning, since it is 10–50× slower than lavapipe. With none of them it lists what it tried and the fix (sudo apt-get install -y mesa-vulkan-drivers libvulkan1). PROMO_LAVAPIPE=<dir> points at the folder elsewhere; PROMO_LAVAPIPE=off never uses it. The binaries need glibc 2.39 (Ubuntu 24.04, Debian 13). A machine with no fonts at all still renders: text falls back to a built-in face (Tuffy) with a warning; install fonts-dejavu-core and fonts-liberation for real ones.

What a CPU costs, measured on a 703-frame 1080×1920 reel with narration:

Rendererpromo video
Mac GPU (Apple silicon, Metal)13.7 s
lavapipe, 8 cores18.9 s
lavapipe, 2 cores77 s
lavapipe, 1 core179 s

(lavapipe in an amd64-emulated ubuntu:24.04 container; SwiftShader took about half an hour on a comparable reel.)

promo video survives being killed. It encodes in segments (10 s of video each; --segment <s>) into <out>.promo-parts/ beside the output, and the same command run again skips the finished segments and goes on from there, saying how many it found. The segments are joined without re-encoding, the soundtrack is mixed once for the whole range and muxed in at the join — no edge in the sound, in sync to the sample — and the folder is removed on success. The folder is keyed by a digest of the project's files and the render settings, so an edited project starts over instead of reusing stale segments. --from/--to take seconds (12.5) or frames (375f), to split a long render into chunks.

The CLI

cargo build --release -p promo-cli     # -> target/release/promo
promo schema                            # authoring subset + recipes; --full, --typespromo validate <project> [--strict]     # "NOT OK" lists what will not render; --strict exits 1 on any findingpromo inspect  <project>                # canvas, layers, missing media, undefined colourspromo upsert-keyframe <project> --args '{"layer":"bg","time":2,"zoom":1.2}'                                        # the MCP authoring tools as verbs (init, upsert-layer,                                        # upsert-keyframe, apply, slideshow, explain, diff)promo still    <project> --out f.png --time 2.5promo frames   <project> --out frames/ --fps 30 --from 0 --to 4promo video    <project> --out out.mp4 --fps 30      # resumable; --from/--to 12.5 or 375f

Add --json to any project command for machine output — one object on stdout, errors included, exit codes unchanged.

promo video mixes the soundtrack the apps would: trims and media cuts, held frames, speed with pitch preserved, keyframed volume, a focused narration ducking everything under it, and only the audio tracks the project keeps.

Headless renders are CLEAN — no watermark, and no license, serial or key will ever be asked for. (The Mac and iOS apps watermark free-tier renders; that is their App Store Pro line, and it stays on their side of the fence.)

The MCP server

promoshot-mcp speaks Model Context Protocol over stdio, so any MCP client can author, inspect and render projects. It owns no rendering code — every render shells to promo (found next to the executable, or on PATH, or via --promo), so the CLI stays the single contract.

Connect an agent

Two pieces: the MCP server (tools) and the skill (workflow). Neither is vendor-specific. Agents do not find this repo by themselves.

The apps open what this engine writes from PromoShot 3.0 on. The App Store's 2.3.1 reads projects up to minReaderVersion 17 (no nested compositions, no 3D) and cannot be launched with --mcp-stdio.

1. Build — or don't

bash
cargo build --release -p promo-cli -p promoshot-mcp# binaries: target/release/promo  target/release/promoshot-mcpscripts/install-local.sh   # …and on PATH, linked from target/release,                           # so every later build is what runs

No Rust toolchain? Grab the prebuilt pair from Releases (linux-x64, macos-arm64; each asset's sha256 is on the release), or pull the image: docker pull ghcr.io/garalex/promoshot-mcp — both carry promo and promoshot-mcp together.

Put both on PATH, or pass --promo to the server. Rendering video also wants ffmpeg/ffprobe on PATH. promo skill install then puts the agent skill where every agent tool on the machine reads it — the shared ~/.agents/skills (Codex, Gemini CLI, Cursor, GitHub Copilot, Grok Build) and the own folder of each tool found that reads only its own (Claude Code, Antigravity); promo skill prints it.

2. MCP (required for tools)

Claude Code / Cursor / any mcp.json:

json
{  "mcpServers": {    "promoshot-headless": {      "command": "/ABS/PATH/target/release/promoshot-mcp",      "args": ["--workspace", "/ABS/PATH/Promo", "--root", "/ABS/PATH/Promo"]    }  }}

--workspace is where new projects go; --root fences which projects the server will touch — pointing both at one folder is the tidy setup. Both optional. --log <file> appends one line per tool call — when, which tool, how many milliseconds, how it went — for a session's own accounting; the demo pages are built from it.

Client one-liners:

bash
# Claude Codeclaude mcp add promoshot-headless /ABS/PATH/target/release/promoshot-mcp
# Grok Buildgrok mcp add promoshot-headless -- /ABS/PATH/target/release/promoshot-mcp \  --workspace /ABS/PATH/Promo --root /ABS/PATH/Promogrok inspect   # confirms the server registered
# Docker — the host needs nothing but docker (details below)docker build -t promoshot-mcp .# then command: docker, args: ["run","-i","--rm","-v","/ABS/PATH/Promo:/projects","promoshot-mcp"]

On a Mac with PromoShot 3.0 installed, the app is a server too — the same tools, with the person's open document, undo and approvals behind them. Switch Automation on in PromoShot's Settings, then register the app itself; it launches when the client starts it:

bash
claude mcp add promoshot -- "/Applications/PromoShot.app/Contents/MacOS/PromoShot" --mcp-stdio

Settings ▸ Automation shows that line with this Mac's own path, and the URL form for clients that take one. promoshot names the app and promoshot-headless the binary, so both can be registered side by side; the skill asks which to use when both are there.

3. Skill (the workflow)

Same file everywhere: skill/SKILL.md.

bash
REPO=https://github.com/GarAlex/promoshotgit clone --depth 1 $REPO /tmp/promoshot
# Claude Code (Grok Build also scans this folder)mkdir -p ~/.claude/skills/promoshotcp /tmp/promoshot/skill/SKILL.md ~/.claude/skills/promoshot/SKILL.md
# Grok Build explicit pathmkdir -p ~/.grok/skills/promoshotcp /tmp/promoshot/skill/SKILL.md ~/.grok/skills/promoshot/SKILL.md
# OpenAI Codex / many othersmkdir -p ~/.agents/skills/promoshotcp /tmp/promoshot/skill/SKILL.md ~/.agents/skills/promoshot/SKILL.md
# Cursor project (in the repo the user is editing, not this engine repo)mkdir -p .cursor/rulescp /tmp/promoshot/skill/SKILL.md .cursor/rules/promoshot.md# or: mkdir -p .agents/skills/promoshot && cp SKILL.md there

Any agent that reads instructions can be handed the file directly; it assumes only these tools (or the CLI).

4. Verify — ask the agent for a render:

Render examples/ProductCard.promo to a still at 3s.

One promo_validate, one promo_render_still, and a device-framed app demo comes back as a path. From there, "make me a promo for " is the loop the skill teaches.

The tools

Tools: promo_schema (authoring subset + four validated recipes; promo_schema_full is the whole format; promo_schema_types is the format as a generated, types-only JSON Schema — also checked in at docs/promo.schema.json for $schema editor autocomplete), promo_validate, promo_inspect (each layer listed with its id — the handle the editing tools take), promo_render_still, promo_render_frames, promo_render_video, promo_render_gif, promo_proxy, promo_workspace; the senses — promo_media_probe, promo_media_turntable (a model seen from around), promo_media_filmstrip (a contact sheet of a SOURCE clip, times per cell), promo_media_silences (silence spans and their inverse) and promo_media_scenes (scene cuts and the shots between them), so an agent knows what footage holds before composing with it; the editor trio, promo_init, promo_upsert_layer and promo_upsert_keyframe: create a project, add image/video/caption layers with placements, then animate — a second placement keyframe is a push-in, viewport keyframes a Ken Burns; your short ids are used verbatim, unnamed ones get canonical UUIDs, pixel sizes are stamped, and the composition keeps covering its layers. Device frames bake headless too — the same slab the apps draw. promo_slideshow is the wizard: pictures and clips in, a complete classic, carousel or store-listing show out, a caption on any slide becoming a layer that lives with its picture. promo_apply reaches the whole vocabulary: a batch of editor commands (delete, move, update any layer, upsert any keyframe, patch a resource) applied atomically, the command schema served with it. promo_explain answers why a layer is where it is at a time, and promo_diff what changed since a project was last looked at; promo_transcribe drafts captions from speech. promo_voices lists a provider's voices and promo_speak synthesizes narration with the person's own provider key — or with no key at all, from local voices — reusing unchanged text by receipt. The authoring tools answer with an inline thumbnail of the composition, so a misplaced layer is caught at the moment it happens. The tools write ordinary metadata.json through the format's own parser — the schema stays the source of truth, and hand-editing remains first-class. Renders default their output BESIDE the project, into <Name> Exports/, and return the path written, never the bytes.

Flags, all optional: --workspace <dir> (where promo_workspace points; else $PROMOSHOT_WORKSPACE, else the XDG data dir), --root <dir> (refuse projects outside this tree), --promo <path>.

Narration keys

Narration spends the person's own provider account, and the key never passes through the agent: no tool takes one, none shows one. Register it once in the OS keyring — macOS Keychain, the Secret Service on Linux (GNOME Keyring, KWallet), the Credential Manager on Windows:

bash
promoshot-mcp key set openai        # reads the key from stdin: paste, then Ctrl-Dpromoshot-mcp key status            # where each provider's key comes from, never the keypromoshot-mcp key remove openai

Providers: openai, elevenlabs, google. The key is read from stdin so it lands in no shell history, no config file and no argument list.

Where there is no keyring — the Docker image, a CI runner — the key is read from a secrets file, the way Docker, Kubernetes and CI systems hand secrets over: /run/secrets/OPENAI_API_KEY (likewise ELEVENLABS_API_KEY, GOOGLE_API_KEY), or the path named by OPENAI_API_KEY_FILE. A mode-0400 file, never an environment variable that docker inspect and every same-user process can read:

bash
docker run -i --rm \  -v "$HOME/.secrets/openai:/run/secrets/OPENAI_API_KEY:ro" \  -v /path/to/your/projects:/projects promoshot-mcp

An agent can ask before it plans: promo_speak with {"check": true} spends nothing and reports, per provider, whether a key is present and what a real call would synthesize. A real call checks every pending narration's key before buying anything, and writes each receipt back the moment it is paid for, so a failure part-way never makes the next call pay twice. Keys travel in request headers, never URLs, and nothing logs them.

Local voices — no key

Provider local narrates on this machine with local-tts: English voices with Apache-2.0 weights, so the audio is yours to publish (a system voice like macOS's is licensed for personal use only). No key, no account, nothing spent; after a one-time download, no network. Install a voice package once:

bash
promoshot-mcp voices list                      # packages, sizes, licences, what is installedpromoshot-mcp voices install kokoro-en-q8      # 106 MB: 28 voices, US and UK, the best Englishpromoshot-mcp voices install kitten-nano-en    # 31 MB, 8 voices

Every file comes from its pinned upstream URL (Hugging Face or GitHub at a fixed commit) and is checked against its SHA-256 before the package appears. Packages live in ~/Library/Application Support/PromoShot/Voices on macOS, ~/.local/share/promoshot/voices on Linux, or wherever PROMOSHOT_VOICES points; PROMOSHOT_VOICES_MIRROR names a mirror tried first.

A script then says "speech": {"text": "…", "provider": "local", "voiceID": "kokoro-en-q8/af_heart"}; promo_voices with provider local lists every id with upstream's listening grade, best first (af_heart, af_bella, af_nicole, bf_emma, …). British voices read with American pronunciation. Running the install again over an older Kokoro package adds the voices it lacks without downloading the model again. Takes are .wav. The English dictionary refuses words it does not know rather than guessing — a product name, mostly. Spell those once per project in Resources/pronunciations.dict, CMU format:

text
PROMOSHOT  P R OW1 M OW0 SH AA2 T

Words the dictionary lacks are otherwise guessed — split at capitals into known words (YouTube, ChatGPT), spelled when an acronym (API), or guessed by a small model trained on the dictionary — and promo_speak lists every guess as a ready-to-paste line. Pin or correct one in that file and call promo_speak again: editing it re-voices the project's local takes.

Docker

The image is the whole render environment — server, CLI, ffmpeg, a software Vulkan and the fonts — so a client needs nothing on the host:

docker build -t promoshot-mcp .
json
{  "mcpServers": {    "promoshot-headless": {      "command": "docker",      "args": ["run", "-i", "--rm",               "-v", "/path/to/your/projects:/projects",               "promoshot-mcp"]    }  }}

For keyless narration, give the image a voices volume and install a package into it once; every later run reads it:

bash
docker run --rm -v promoshot-voices:/voices --entrypoint promoshot-mcp \  promoshot-mcp voices install kokoro-en-q8

and add "-v", "promoshot-voices:/voices" to the args above.

Projects live under the mount; promo_workspace answers /projects. All the examples are baked in, so the image proves itself with no mount at all — render ProductCard.promo first; the device-framed app demo is the one that teaches the product-promo path. server.json is the MCP Registry manifest (io.github.GarAlex/promoshot) for the published image (ghcr.io/garalex/promoshot-mcp). GitHub's MCP Registry consumes that feed after mcp-publisher publish.

mcp-name: io.github.GarAlex/promoshot

The skill is drift-tested: a test pins it to the server's actual tool list, so it cannot teach tools that do not exist.

The Mac app carries its own MCP server (Settings → Automation) sharing the core tool names, plus app-only abilities — opening the editor, speech synthesis. The authoring pair, the senses and the types schema are headless-first.

What a session looks like — three requests in, a validated project and a rendered frame out (the frame at the top of this page was made exactly this way):

json
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18"}}{"jsonrpc":"2.0","method":"notifications/initialized"}{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"promo_validate","arguments":{"project":"examples/LinuxSmoke.promo"}}}{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"promo_render_still","arguments":{"project":"examples/LinuxSmoke.promo","time":5.5}}}
json
{"id":2,"result":{"content":[{"type":"text","text":"ok — nothing the renderer would quietly correct"}]}}{"id":3,"result":{"content":[{"type":"text","text":"wrote examples/LinuxSmoke Exports/still-5.5s.png (1280x720 at 5.50s)"}]}}

One engine, every platform

The same project rendered on macOS (Metal, VideoToolbox) and on a bare Linux container (lavapipe software Vulkan, no GPU; ffmpeg) — SSIM 0.983 over the full 240-frame video. The visible difference is the font: the caption asks the question, the two frames answer it.

Try it yourself — examples/ holds one runnable project per promo_schema recipe (each metadata.json IS its recipe, pinned by a test), from the device-framed product card to the 9:16 re-stamp — plus the kitchen-sink LinuxSmoke.promo:

promo video examples/ProductCard.promo --out card.mp4

Authoring a project

Start with promo schema. The short version: a project folder holds metadata.json and Resources/; ids are unique strings (short mnemonics are fine, and the apps keep them as written); layers place resources on a timeline with keyframes (hold-then-ease), placement rules, transitions and palette-named colours (@accent). Validate before rendering — the answer starts NOT OK when something will not render or has no effect (a field nothing reads, with the name that was meant; a value that does nothing where it is; missing media), then names what the renderer would quietly adjust, undefined colour names included.

mkdir -p Demo.promo/Resources# write Demo.promo/metadata.json, copy media into Resources/promo validate Demo.promo --strict && promo still Demo.promo --out look.png --time 1

Or let the MCP server spend the boilerplate (promo_init, promo_upsert_layer), and give your editor autocomplete by pointing "$schema" at docs/promo.schema.json.

Invariants and plans

  • SPECS.md — the invariants the tests pin.

Versions

Releases are 0.MINOR.PATCH until 1.0. MINOR moves for a new format rung (a higher minReaderVersion), a new tool, or any change in behaviour a user or an agent would notice; PATCH is for fixes only. Every GitHub release carries generated notes and build provenance for its binaries, and releases come at most weekly. 0.3.0 is the first release under this rule: the reader is at rung 47. (0.2.x ran 79 patch releases in 11 days while it added rungs 19–47 — the numbers said nothing, which is what this rule fixes.)

License

Apache-2.0. The PromoShot applications built on this engine are separate, proprietary products.

Proxies for long sources

promo proxy <project> builds a tier-1 proxy (960 px long edge, every frame a keyframe) for each video resource, in a cache outside the package ($PROMO_PROXY_DIR, else the platform cache directory under promoshot/proxies). still, frames, gif and video take --proxy auto|on|off: auto (default) reads a built proxy when the output's long edge fits it, on builds missing proxies first, off reads the source — and a full-size render always does. The MCP tools take the same proxy argument; promo_proxy builds them.

Markers and chapters

A project may carry markers — named moments on the output timeline. kind: "chapter" markers are written into an exported mp4's chapter list (a player's chapter menu); inspect lists them all.

Audio effects

A video or audio resource may carry audioEffects — compressor and one-band eq entries, applied in list order before the mix, and normalize, which moves the whole resource to a target loudness (ITU BS.1770 LUFS, pauses gated out) with one static gain at the end of the chain. The apps' exports and their live preview take the same effects, and the core plans the normalize gain for every host.

Chroma key

A video or image layer may carry chromaKey — a colour, a tolerance and a softness: the plate becomes transparent before the layer's grade, border and mask, in the compositor, so a green-screen clip composes over anything on every host alike.

Models

A resource of kind model is a glTF 2.0 binary (.glb) in Resources/; a layer of kind model draws it through a PBR-lite pass into a texture at the layer's size, and from there it is a picture like any other: placement, opacity, transitions, masks, effects and the contact shadow all apply. Keyframes carry a camera (yaw, pitch, roll, distance in bounds radii, fov) and a light; materials on the resource bind a slot name to a colour — a palette name works, so @accent re-skins the body with the theme — and, in the object form, to a finish: metallic and roughness (each 0…1) over the file's own, so one body is chrome in this project and matte in the next (rung 32) — or, better, to a finish WORD (rung 44): chrome, brushed, anodized, gloss, satin, matte, rubber, ceramic, lacquer, paper, glass, frosted, each expanded by the engine into the numbers, the coat, the grain, the transmission and the refraction it stands for, so nobody levels a reflection by hand; on a screen the word is the coat over the picture, and glass on a stage bends the bodies behind it. Lighting defaults come from the theme; a scene environment (studio, sunset, night; rung 35 — or, rung 46, a resourceID naming a panorama in the project, a picture of the world the bodies mirror) is what metals mirror; a file's normal map and metallic-roughness texture are honoured. Rung 29. Built-in device bodies (phone, tablet, tablet-portrait, laptop; promo device) ship as generated .glb files with Body and Screen slots, so the device shot is a model too. A model can also be a recipe the engine builds at load instead of a file — text as a body first: real type in the 3D world with Face and Side slots, lit and finished like any body (rung 34); a device body; and a body of PARTS — boxes, spheres, cylinders, tori, a lathe, an extrude, each under a slot, placed by position, rotation and scale — the 3D counterpart of a drawing, authored the way an SVG is (rung 37). Layers naming the same stage draw through one camera into one depth buffer, models at their depth and pictures as billboards, the first member's placement carrying the whole scene (rung 30). A stage can also be one layer of kind stage holding its members, the camera and light on its own keyframes (rung 33) — the same picture, with the stage's ownership written down. A stage's floor word (rung 45) — matte, satin, glossy, mirror — puts a plane under the lowest body that catches the key light's shadow, the darkening where a body touches, and the stage mirrored in it, blurred less and less; whatever lies beneath the stage layer shows through, so the table is the project's own background. The light's keyframes move the shadow; the floor stays.

A picture worn by a body

A slot's picture is a screen by default: unlit, fitted, what a screenshot on a phone wants. "mode": "surface" on the binding wears it instead — the image or video becomes the slot's colour under the light and the finish, tiled by repeat and shifted by offset, the slot's own colour showing through where the picture is transparent — so a label sits on a vase, a print on a box, and a video plays on a glossy wall that the key light and the environment still shade. Rung 38.

Particles

A resource of kind particles is a recipe, not a file — an emitter, a rate or a burst, life, speed, gravity, wind, drag, turbulence, size and colour over life, a shape — played by a drawing layer. Every particle is a closed-form function of its birth time and the seed, so any frame renders alone and identically on every host. Rung 36.

A path resource can carry a route in the stage (rung 40): 3D points in stage radii that a member's or a camera's motionPath follows, fitted between two keyframes exactly as the 2D motion path is, with a camera target — the centre, ahead, a member or a point — saying where it looks on the way. A spiral that keeps looking inward is one route and one keyframe.

Particles in a stage are a morph (rung 39): the recipe names two bodies, samples the first's surface, and as a drawing member's progress keyframe ramps from 0 to 1 the points fly out and gather on the second body — a cube bursts into points that settle into a word. A parts box with faces: true has six slots, one picture per side, which is what such a cube is made of.

Text with a side

Legacy: the caption depth below is the flat compositor's 2.5D. A title with a real side is a text body (rung 34) standing in a stage; the validator names the old form. It still renders.

A caption style may carry depth: copies of the words stacked under the face, each a little further along and darker, so the type reads as solid letters with a side — the classic extrusion, pure 2D, lit by choosing the offset. A reveal extrudes each arriving piece the same way. tiltX / tiltY keyframes on a caption lean it in perspective, on the same camera the device frames use, and the side leans with the face. A reveal's flip, tumble and slide modes bring each word in on its own axes — kinetic type from one rule, no keyframes.

Follow the pointer

A video the Mac recorder made carries pointer, where the pointer went and where it clicked, in the recording's own time and coordinates. A layer showing it may say follow: its viewport becomes a window 1/zoom of the source that follows the smoothed pointer, and each click draws a ring that grows and fades. A rule, not keyframes: re-trim the recording and it stays true, on every host alike.

Image effects

A layer may carry effects: a blur (round, or directional along a blurAngle), a glow of its bright parts, a vignette toward its own corners, film grain and an unsharp sharpen, each on the layer's own pixels in the compositor. Blur, glow and vignette are keyframe tracks too, so a focus pull or a glow that pulses ramps like the grade does. Five transitions ride the same passes — blurDissolve, zoom, flash, glitch and dip — beside the fade, wipe, slide, push and scale that were there, at a layer's edges and at a resource swap alike. A video layer's swap may name a composition (rung 47): the takeover, the next film arriving through any of those cuts where its sourceTime says, or where its clock already is. The same keyframes carry the consumer's transport for anything with a clock — a video, an audio, a composition, a sprite: sourceTime seeks it, playback pauses and resumes it, and its sound follows.

Looks from a .cube

A resource of kind lut is a .cube file in Resources/; a layer's adjustments.lutResourceID (with lutAmount) applies it in the compositor after the layer's own grade — a trilinear lookup on every host alike.

ProRes and alpha

promo video … --codec prores422|prores4444 --out x.mov writes ProRes; --alpha renders the project over nothing and keeps the frames' alpha in a ProRes 4444 (--alpha on still/frames gives transparent PNGs). Sources that carry alpha (ProRes 4444, WebM with alpha, PNG sequences) decode premultiplied and compose with their transparency.

來源:README.md,提交 af3f636

工具

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

版本歷史

16
  1. v0.4.7最新Oct 29, 2026
  2. v0.4.5Oct 26, 2026
  3. v0.4.4Oct 23, 2026
  4. v0.4.3Oct 22, 2026
  5. v0.4.1Oct 22, 2026
  6. v0.4.0Oct 22, 2026
  7. v0.3.15Oct 21, 2026
  8. v0.3.14Oct 21, 2026
  9. v0.3.10Oct 18, 2026
  10. v0.3.8Oct 18, 2026
  11. v0.3.7Oct 18, 2026
  12. v0.3.4Oct 2, 2026
  13. v0.3.3Oct 1, 2026
  14. v0.3.2Sep 28, 2026
  15. v0.3.1Sep 27, 2026
  16. v0.2.78Sep 16, 2026

評分

已滿足適用檢查項的 50%

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

  • 近 30 天內可連通25 分

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

  • 已宣告認證方式10 分

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

  • 已列出工具15 分

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

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