
Procedural Fish Render
- 782 installs
- 987 repo stars
- Updated July 25, 2026
- vibe-motion/skills
procedural-fish-render is a Claude skill that clones or updates the vibe-motion/procedural-fish repository and renders procedural fish animation videos on demand using the project's Remotion render command.
About
procedural-fish-render is an agent skill from vibe-motion/skills for generating procedural fish animation videos from chat. The workflow resolves the skill directory across agents, clones or updates https://github.com/vibe-motion/procedural-fish, and runs that project's native render command to export Remotion-based 程序鱼 video output. Developers reach for procedural-fish-render when asked to render procedural fish, export a 程序鱼视频, or run procedural-fish Remotion rendering without manually wiring the repo each time. The skill includes a helper script to locate skill_dir across common agent home paths before executing the render pipeline.
- Clones or updates the official vibe-motion/procedural-fish repository automatically
- Runs the project's own Remotion render command to export MP4 or MOV video
- Accepts optional workspace, output path, and JSON preset parameters
- Returns the absolute path of the rendered video file
- Works with Claude Code, Cursor, and Codex agent environments
Procedural Fish Render by the numbers
- 782 all-time installs (skills.sh)
- +37 installs in the week ending Jul 27, 2026 (Skillselion tracking)
- Ranked #320 of 1,335 Generative Media skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/vibe-motion/skills --skill procedural-fish-renderAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 782 |
|---|---|
| repo stars | ★ 987 |
| Last updated | July 25, 2026 |
| Repository | vibe-motion/skills ↗ |
How do you render procedural fish animation videos?
Generate high-quality procedural fish animation videos on demand directly from agent chat.
Who is it for?
Developers or media builders who want on-demand procedural fish video exports via agent-driven Remotion rendering.
Skip if: General Remotion projects unrelated to procedural-fish or teams that already maintain a custom render pipeline outside that repository.
When should I use this skill?
The user asks to render procedural fish, export a 程序鱼视频, or run the procedural-fish Remotion render workflow.
What you get
A rendered procedural fish video file produced by the procedural-fish Remotion render command.
- Rendered procedural fish video file
Files
Procedural Fish Render
Workflow
1. Resolve skill_dir and run the helper script:
skill_dir=""
for base in "${AGENTS_HOME:-$HOME/.agents}" "${CLAUDE_HOME:-$HOME/.claude}" "${CODEX_HOME:-$HOME/.codex}"; do
if [ -d "$base/skills/procedural-fish-render" ]; then
skill_dir="$base/skills/procedural-fish-render"
break
fi
done
[ -n "$skill_dir" ] || { echo "procedural-fish-render skill not found under ~/.agents, ~/.claude, or ~/.codex"; exit 1; }
/usr/local/bin/python3 "$skill_dir/scripts/render_procedural_fish.py"2. Optional parameters:
/usr/local/bin/python3 "$skill_dir/scripts/render_procedural_fish.py" \
--workspace "$(pwd)" \
--output "out/procedural-fish-custom.mov" \
--props-file "shared/project/render-presets/default.json"3. Return the final absolute video path printed by the script.
Behavior
- Repository source is fixed to
https://github.com/vibe-motion/procedural-fishby default. - If local repo exists, the script performs
git fetch+git checkout main+git pull --ff-only. - If local repo does not exist, the script clones it.
- Rendering always uses project command
pnpm run remotion:render. - Default output is
out/procedural-fish-transparent.mov. - Default props file is
shared/project/render-presets/default.json.
#!/usr/local/bin/python3
"""Clone/update procedural-fish repo and render video with the project's command."""
from __future__ import annotations
import argparse
import os
import shutil
import subprocess
from pathlib import Path
DEFAULT_REPO_URL = "https://github.com/vibe-motion/procedural-fish.git"
DEFAULT_BRANCH = "main"
DEFAULT_REPO_DIR = "procedural-fish"
DEFAULT_OUTPUT = "out/procedural-fish-transparent.mov"
DEFAULT_PROPS_FILE = "shared/project/render-presets/default.json"
def run(cmd: list[str], cwd: Path | None = None, env: dict[str, str] | None = None) -> None:
shown_cwd = str(cwd) if cwd else os.getcwd()
print(f"[cmd] (cwd={shown_cwd}) {' '.join(cmd)}")
subprocess.run(cmd, cwd=cwd, env=env, check=True)
def resolve_pnpm_cmd() -> list[str]:
if shutil.which("pnpm"):
return ["pnpm"]
if shutil.which("corepack"):
return ["corepack", "pnpm"]
raise RuntimeError("pnpm/corepack not found. Install pnpm or enable corepack first.")
def ensure_repo(repo_url: str, branch: str, workspace: Path, repo_dir: str) -> Path:
workspace.mkdir(parents=True, exist_ok=True)
repo_path = workspace / repo_dir
if (repo_path / ".git").exists():
run(["git", "fetch", "origin"], cwd=repo_path)
run(["git", "checkout", branch], cwd=repo_path)
run(["git", "pull", "--ff-only", "origin", branch], cwd=repo_path)
return repo_path
if repo_path.exists():
raise RuntimeError(f"Path exists but is not a git repo: {repo_path}")
run(["git", "clone", "--branch", branch, repo_url, repo_dir], cwd=workspace)
return repo_path
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(
description="Clone/update procedural-fish and render video with pnpm run remotion:render"
)
parser.add_argument("--workspace", default=".", help="Workspace directory for repo checkout")
parser.add_argument("--repo-url", default=DEFAULT_REPO_URL, help="Git repository URL")
parser.add_argument("--branch", default=DEFAULT_BRANCH, help="Git branch to pull")
parser.add_argument("--repo-dir", default=DEFAULT_REPO_DIR, help="Local directory name for checkout")
parser.add_argument("--output", default=DEFAULT_OUTPUT, help="REMOTION_OUTPUT relative to repo root")
parser.add_argument(
"--props-file",
default=DEFAULT_PROPS_FILE,
help="REMOTION_PROPS_FILE relative to repo root; empty string disables it",
)
parser.add_argument("--props-json", default="", help="REMOTION_PROPS_JSON value")
parser.add_argument("--composition-id", default="", help="REMOTION_COMPOSITION_ID override")
parser.add_argument("--fps", default="", help="REMOTION_FPS override")
parser.add_argument("--skip-install", action="store_true", help="Skip pnpm install")
return parser.parse_args()
def main() -> int:
args = parse_args()
workspace = Path(args.workspace).expanduser().resolve()
repo_path = ensure_repo(
repo_url=args.repo_url,
branch=args.branch,
workspace=workspace,
repo_dir=args.repo_dir,
)
pnpm_cmd = resolve_pnpm_cmd()
if not args.skip_install:
run(pnpm_cmd + ["install"], cwd=repo_path)
env = os.environ.copy()
env["REMOTION_OUTPUT"] = args.output
if args.props_file:
env["REMOTION_PROPS_FILE"] = args.props_file
else:
env.pop("REMOTION_PROPS_FILE", None)
if args.props_json:
env["REMOTION_PROPS_JSON"] = args.props_json
else:
env.pop("REMOTION_PROPS_JSON", None)
if args.composition_id:
env["REMOTION_COMPOSITION_ID"] = args.composition_id
else:
env.pop("REMOTION_COMPOSITION_ID", None)
if args.fps:
env["REMOTION_FPS"] = args.fps
else:
env.pop("REMOTION_FPS", None)
run(pnpm_cmd + ["run", "remotion:render"], cwd=repo_path, env=env)
output_path = (repo_path / args.output).resolve()
print(f"OUTPUT_VIDEO={output_path}")
return 0
if __name__ == "__main__":
raise SystemExit(main())
Related skills
How it compares
Use procedural-fish-render for the procedural-fish Remotion repo rather than generic Remotion project scaffolding.
FAQ
Which repository does procedural-fish-render use?
procedural-fish-render clones or updates https://github.com/vibe-motion/procedural-fish and uses that repository's own render command to produce procedural fish animation video output.
What triggers procedural-fish-render?
procedural-fish-render runs when users request procedural fish rendering, 程序鱼视频 export, or procedural-fish Remotion rendering, after resolving the skill directory on the agent machine.