{"id":50747500,"url":"https://github.com/deeflect/castkit","last_synced_at":"2026-06-10T22:30:49.926Z","repository":{"id":353690485,"uuid":"1173037188","full_name":"deeflect/castkit","owner":"deeflect","description":"CLI demo videos from a single command. No recording, no editing, no retakes. Built in Rust.","archived":false,"fork":false,"pushed_at":"2026-04-25T02:08:19.000Z","size":7238,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-04-25T04:11:26.495Z","etag":null,"topics":["cli","demo","developer-tools","rust","screencast","terminal","video"],"latest_commit_sha":null,"homepage":"https://github.com/deeflect/castkit","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/deeflect.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-03-05T00:16:29.000Z","updated_at":"2026-04-25T02:08:24.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/deeflect/castkit","commit_stats":null,"previous_names":["deeflect/castkit"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/deeflect/castkit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deeflect%2Fcastkit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deeflect%2Fcastkit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deeflect%2Fcastkit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deeflect%2Fcastkit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/deeflect","download_url":"https://codeload.github.com/deeflect/castkit/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deeflect%2Fcastkit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34174148,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-10T02:00:07.152Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","demo","developer-tools","rust","screencast","terminal","video"],"created_at":"2026-06-10T22:30:49.057Z","updated_at":"2026-06-10T22:30:49.915Z","avatar_url":"https://github.com/deeflect.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ch1 align=\"center\"\u003ecastkit\u003c/h1\u003e\n  \u003cp align=\"center\"\u003e\n    \u003cstrong\u003eOne command. Polished demo video. No manual recording.\u003c/strong\u003e\n  \u003c/p\u003e\n  \u003cp align=\"center\"\u003e\n    Agent-native CLI demo video generator with ScreenStudio-style rendering.\n  \u003c/p\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/language-Rust-orange?style=flat-square\" alt=\"Rust\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/output-MP4%20%7C%20WebM%20%7C%20GIF-blue?style=flat-square\" alt=\"MP4/WebM/GIF\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/agent--native-yes-brightgreen?style=flat-square\" alt=\"Agent-native\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/license-MIT-green?style=flat-square\" alt=\"MIT\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#install\"\u003eInstall\u003c/a\u003e •\n  \u003ca href=\"#quick-start\"\u003eQuick Start\u003c/a\u003e •\n  \u003ca href=\"#agent-flow\"\u003eAgent Flow\u003c/a\u003e •\n  \u003ca href=\"#presets\"\u003ePresets\u003c/a\u003e •\n  \u003ca href=\"#branding\"\u003eBranding\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"examples/castkit-meta-demo.gif\" alt=\"castkit meta demo\" width=\"640\" /\u003e\n\u003c/p\u003e\n\n## What is castkit?\n\nPoint castkit at any CLI binary. It auto-discovers help text, README, and file structure — then generates polished demos in either terminal mode or web mode with typed commands/actions, camera motion, branding, and optional typing sounds.\n\nBuilt for AI agents, works for humans.\n\n```bash\n# Full pipeline: discover → plan → validate → render\ncastkit handoff init ./my-cli --json\ncastkit plan scaffold --session $SESSION --json\ncastkit validate --session $SESSION --script demo.json --json\ncastkit execute --session $SESSION --script demo.json --non-interactive --preset polished --output demo.mp4\n```\n\n### Key features\n\n- 🔍 **Auto-discovery** — Extracts help text, README, file structure, and probes to build an evidence graph\n- 🛡️ **Evidence-first** — Every demo step requires `source_refs` from real discovery. No invented commands\n- ✅ **Strict validation** — Rejects scripts with unknown commands, missing refs, or invalid patterns\n- 🎬 **ScreenStudio-quality rendering** — Auto camera zoom, cursor tracking, crossfade transitions\n- 🖼️ **Overlay artifacts** — Image and result-card overlays declared directly in `script.steps[].artifacts`\n- 🌐 **Web mode** — Deterministic `goto/click/type/assert/screenshot` action scripts with focus zoom\n- 🎨 **Branding** — Intro/outro cards, watermark, avatar, custom color themes\n- 🔒 **Auto-redaction** — Built-in secret detection (API keys, tokens, paths) with configurable patterns\n- 🤖 **Agent-native** — Deterministic non-interactive mode with JSON I/O for any coding agent\n- 📦 **Self-contained** — Single Rust binary + ffmpeg + Node renderer. No Docker, no browser recording\n\n## Install\n\n### Requirements\n\n- Rust 1.75+\n- Node 20+\n- `ffmpeg` in `PATH`\n- Playwright Chromium\n\n### Build from source\n\n```bash\ngit clone https://github.com/deeflect/castkit.git\ncd castkit\ncargo install --path .\n\n# Set up the renderer\nnpm install --prefix renderer-runtime\nnpx --prefix renderer-runtime playwright install chromium\n```\n\n## Quick Start\n\n```bash\n# 1. Point at any CLI\ncastkit handoff init ./my-tool --json\n\n# 2. Auto-generate a demo script\ncastkit plan scaffold --session $SESSION --max-scenes 3 --json\n\n# 3. Validate (catches invented commands, missing refs)\ncastkit validate --session $SESSION --script demo-script.json --json\n\n# 4. Render the video\ncastkit execute --session $SESSION --script demo-script.json \\\n  --non-interactive --preset polished --output demo.mp4\n```\n\n### Script Modes\n\n- Terminal mode with overlays:\n  `examples/demo-script.terminal-overlay.json`\n- Web mode:\n  `examples/demo-script.web.json`\n\n```bash\n# Terminal mode\ncastkit execute --session $SESSION --script examples/demo-script.terminal-overlay.json \\\n  --non-interactive --preset polished --output demo-terminal.mp4 --json\n\n# Web mode\ncastkit execute --session $SESSION --script examples/demo-script.web.json \\\n  --non-interactive --preset polished --output demo-web.mp4 --json\n```\n\n## Agent Flow\n\ncastkit is designed for AI agents to use programmatically. Full JSON I/O, deterministic execution, no human intervention needed.\n\n```\nBinary → Discover → Plan → Validate → Execute → MP4/GIF\n```\n\n### Step by step\n\n```bash\n# Bootstrap: load contract + schema\ncastkit --json agent contract\ncastkit --json schema\n\n# Initialize handoff session (auto-discovers the target)\ncastkit handoff init \u003ctarget\u003e --json\n\n# Browse discovered evidence\ncastkit handoff list --session \u003cid\u003e --source help --page 1 --per-page 20 --json\ncastkit handoff list --session \u003cid\u003e --source readme --page 1 --per-page 20 --json\n\n# Fetch specific refs\ncastkit handoff get --session \u003cid\u003e --ref \u003cref_id\u003e --json\n\n# Generate scaffold script\ncastkit plan scaffold --session \u003cid\u003e --output demo.json --max-scenes 3 --json\n\n# Validate → Execute\ncastkit validate --session \u003cid\u003e --script demo.json --json\ncastkit execute --session \u003cid\u003e --script demo.json --non-interactive --preset polished --output demo.mp4 --json\n```\n\n\u003e **Rule:** A step succeeds only if exit code is `0` and JSON contains `\"ok\": true`.\n\n### Session chaining\n\nCastkit automatically captures `session_id` from step output and makes it available as `$SESSION` in subsequent steps — no manual wiring needed.\n\n## Presets\n\n| Preset | Speed | Theme | Keystrokes | FPS | Use case |\n|--------|-------|-------|------------|-----|----------|\n| `quick` | fast | minimal | laptop | 30 | Fast iteration |\n| `balanced` | quality | clean | laptop | 45 | Good enough |\n| `polished` | quality | clean | mechanical | 60 | Showcase / launch |\n\n```bash\ncastkit execute --preset polished --output demo.mp4 ...\n```\n\nOverride any preset default with explicit flags: `--fps`, `--speed`, `--theme`, `--keystroke-profile`.\n\n## Branding\n\nCustomize intro/outro cards, colors, watermark, and avatar.\n\n```json\n{\n  \"title\": \"my-tool\",\n  \"bg_primary\": \"#0A1020\",\n  \"bg_secondary\": \"#14243B\",\n  \"text_primary\": \"#EAF2FF\",\n  \"text_muted\": \"#9CB2D1\",\n  \"command_text\": \"#8ED0FF\",\n  \"accent\": \"#69C2FF\",\n  \"watermark_text\": \"github.com/you/tool\",\n  \"avatar_x\": \"yourhandle\",\n  \"avatar_label\": \"@yourhandle\"\n}\n```\n\nSources merge in order: `--theme` base → `script.branding` → `--branding file.json` → CLI overrides.\n\nReady-made palettes in `examples/`: `branding-clean.json`, `branding-bold.json`, `branding-minimal.json`.\n\n## Output\n\n| Format | Flag | Notes |\n|--------|------|-------|\n| MP4 | `--format mp4` (default) | H.264, best quality |\n| WebM | `--format webm` | VP9, smaller files |\n| GIF | `--format gif` | For READMEs and tweets |\n\n### Rendering details\n\n- Auto camera zoom follows cursor during typing\n- Crossfade transitions between scenes\n- Long output paginated with `-- page x/y --` markers\n- `--no-zoom` for static framing\n- Typing sounds (optional, via `audio.typing` in script)\n\n## Validation\n\nEvery script is validated before execution:\n\n- Each step must have non-empty `source_refs` from the handoff session\n- Each `source_ref` must exist in the session\n- Unknown commands fail unless marked `manual_step=true` with a `manual_reason`\n- Invalid redaction regex patterns are caught\n- Built-in secret redaction is always applied\n- Overlay artifact paths must be safe relative paths\n- `mode=web` requires a valid `web.actions[]` block with evidence-backed actions\n\n## Project Structure\n\n```\ncastkit/\n├── src/                    # Rust CLI source\n│   ├── execute/            # Step runner, redaction, transcripts\n│   ├── handoff/            # Session management, ref discovery\n│   ├── render/             # Renderer orchestration\n│   ├── validate/           # Script validation engine\n│   └── plan/               # Script scaffold generation\n├── renderer-runtime/       # Node.js ScreenStudio-style renderer\n│   ├── render.mjs          # Terminal renderer\n│   ├── web-runner.mjs      # Deterministic Playwright action executor\n│   └── render-web.mjs      # Web-mode renderer\n├── examples/               # Demo scripts, branding presets, sample videos\n├── AGENTS.md               # Full agent contract + scenario design playbook\n└── SPEC.md                 # Technical specification\n```\n\n## License\n\nMIT\n\n---\n\n### Built by\n\nBuilt by [Dee](https://deeflect.com). Started as \"I just need one demo gif\" and ended up as a Rust binary plus a Node renderer plus a whole agent contract. Sorry.\n\nStar if castkit shipped you a demo without you having to record it. [File an issue](https://github.com/deeflect/castkit/issues) if it crashes on a CLI it should have understood.\n\nNeed ridiculous tooling like this for your product? [dee.agency](https://dee.agency?utm_source=castkit\u0026utm_medium=readme).\n\n[deeflect.com](https://deeflect.com) · [Wikidata](https://www.wikidata.org/entity/Q138828544) · [LinkedIn](https://www.linkedin.com/in/dkargaev/) · [X](https://x.com/deeflectcom)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeeflect%2Fcastkit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdeeflect%2Fcastkit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeeflect%2Fcastkit/lists"}