Skip to content
Back to skills

motion-graphics

ASecurity

Deterministic motion-graphics rendering execution Skill for the AI Video Production Ecosystem. Use it when a caller (normally video-production-agent) has already decided what graphic to show, when to show it, and roughly how it should look, and needs it rendered safely: title cards, lower thirds, free-form text overlays, image/logo overlays, video-on-video picture-in-picture/chroma-key overlays, persistent corner "bug" watermarks, chapter chips, a bottom progress bar, and a countdown, with bu...

  • 9 stars
  • 0 votes
  • 2 copies
  • 10 views
  • Added October 26, 2026
designgoshellbashtestinggitsecurity

Security analysis

A96/100
  • mediumInstalls packages at runtime which could introduce malicious dependencies

Pro scans all 18 files and shows the line behind each finding

Scanned October 26, 2026

npx -y skills add kajisho5/motion-graphics-skill --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of motion-graphics?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for motion-graphics
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/kajisho5-motion-graphics/badge)](https://www.skillsdirectory.com/skills/kajisho5-motion-graphics)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: motion-graphics
description: Deterministic motion-graphics rendering execution Skill for the AI Video Production Ecosystem. Use it when a caller (normally video-production-agent) has already decided what graphic to show, when to show it, and roughly how it should look, and needs it rendered safely: title cards, lower thirds, free-form text overlays, image/logo overlays, video-on-video picture-in-picture/chroma-key overlays, persistent corner "bug" watermarks, chapter chips, a bottom progress bar, and a countdown, with built-in template animation (title/lower-third/bug/chapter/countdown fade, slide, or pulse) or a configurable linear fade (text/image overlays only). Do NOT use it to decide what graphic to show, when, or how it should look (video-production-agent), to edit video (video-editing-skill), to grade color (color-grading-skill), to generate or translate subtitles (subtitle-skill), to measure or QC media (qc-skill, media-analysis-skill), or to run arbitrary ffmpeg commands or filters (it refuses them).
---

# motion-graphics-skill

Deterministic motion-graphics rendering execution for the AI Video Production Ecosystem, built on top of
[ffmpeg-skill](https://github.com/kajisho5/ffmpeg-skill). See `README.md` and `docs/` for the full contract,
graphics model, security boundary, and testing notes.

## Ask for this, not that

Ask this Skill to render: an exact `title`/`lower_third`/`text_overlay`/`image_overlay`/`video_overlay`/`bug`/
`chapter`/`progress`/`countdown` element, with exact `start`/`end` seconds and exact parameter values already
decided. Every field is typed and range-checked; there is no free-text "make it look nice" input.

Do not ask it to: choose what text or image to show, choose when something should appear, choose colors/fonts/
layout for aesthetic reasons, animate anything beyond a linear `fade` (no slide/move/scale — see
`unsupported_animations` in the contract), draw an arbitrary shape (no typed delegate for that yet), or accept a
raw ffmpeg filter/command/argv/shell/env — those field names are rejected wherever they appear in the request,
recursively (`INVALID_REQUEST`). All of that is `video-production-agent`'s job, not this Skill's.

## Workflow

```bash
pip install -e .
motion-graphics doctor --json --ffmpeg-skill /path/to/ffmpeg-skill   # 1. confirm the environment once
motion-graphics validate request.json --json                          # 2. structural check, no file access
motion-graphics plan request.json --json --workspace .                # 3. optional: resolve/probe, write nothing
motion-graphics run request.json --json --workspace .                 # 4. render
```

1. **`doctor`** once per environment (or when a render fails with `TOOL_ERROR`) — read `checks.element_types` to
   confirm the element types this request needs are `supported`, not `unsupported`/`unknown`.
2. **`validate`** a programmatically-built request before render if there's any doubt it's well-formed — it never
   touches the file system, so it's cheap to call speculatively.
3. **`plan`** (or `run --dry-run`) when the caller wants to catch a missing asset/font/out-of-range timeline
   before spending a real render on it. It resolves and probes inputs but writes no media.
4. **`run`** to actually render. Read `output.sha256`/`output.path` for the artifact and `provenance` for the full
   chain (source video, per-element asset/font identities, operation chain, output hash).

Full request/response shapes: `motion-graphics contract --json` (`request.shape`, `response.success.{run,plan,validate}`).

## On failure

Every failure is `{"ok": false, "error": {"code", "message", "retryable", "details"}}` with a fixed exit code
(`contract --json` → `errors.exit_codes`). Branch on `error.code`/`error.retryable`, never on `error.message`:

- `error.retryable: true` (`TOOL_ERROR`, `CANCELLED`) — safe to retry as-is; the request was fine, the engine or
  environment had a transient problem.
- Anything else — the request itself needs to change before retrying. In particular:
  - `UNSUPPORTED_OPERATION` on an element `type` or an `animation.kind` — it is not implemented (check
    `unsupported_element_types` / `unsupported_animations` in the contract for why and what to use instead); do
    not retry the same request, and do not approximate it with a different element type without deciding that
    explicitly upstream.
  - `MISSING_INPUT` (unknown `font_id`) / `INVALID_INPUT` (missing/unreadable asset or video) / `PATH_NOT_ALLOWED`
    (asset or output outside the allowed workspace/roots) — fix the reference or the path, this Skill never
    substitutes a different font or asset and calls it success.
  - `INVALID_TIME_RANGE` — an element's `start`/`end` (or `animation.duration`) doesn't fit the element's own
    window or the video's real, probed duration.
  - `VALIDATION_ERROR` — the render completed but the output failed its own post-render check (resolution,
    duration, video stream); treat as a real failure, not a transient one, even though media was written.

## What this Skill is not

It does not reason about content, pick templates, decide timing, or judge whether a design "looks good". Those
are `video-production-agent`'s job. This Skill only renders a typed, already-decided Graphics Document.

Files in this skill

  • CHANGELOG.md1.5 KB
  • CLAUDE.md15.7 KB
  • SECURITY.md2 KB
  • SKILL.md5.2 KB
  • brand/app-icon-dark.png63.9 KB
  • brand/app-icon.png57.2 KB
  • docs/architecture.md4.2 KB
  • docs/decisions.md33.2 KB
  • docs/ffmpeg-skill.md6.2 KB
  • docs/security.md4.3 KB
  • docs/testing.md4.5 KB
  • pyproject.toml807 B
  • tests/conftest.py4.2 KB
  • tests/test_compat.py9.7 KB
  • tests/test_contract.py6.9 KB
  • tests/test_integration.py29.6 KB
  • tests/test_security.py7.6 KB
  • tests/test_unit.py43.3 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.