For AI agents and power users

Drive PandaStudio
from the command line

A localhost HTTP API and matching pandastudio CLI so Claude Code, Claude Desktop, and your own scripts can list projects, generate motion graphics, and browse exports — without ever touching the cloud.

Local-only

Listener binds to 127.0.0.1. Loopback is double-checked per request. Per-launch bearer token, 0600 mode. Nothing leaves your machine.

Token-frugal

Single dispatch endpoint, verb.noun command shape, --json mode. Built so an AI agent can chain calls without burning context on JSON-RPC chatter.

Agent-ready

Official Skill on GitHub. One command installs it into Claude Code, Cursor, Cline, Continue, and 40+ other agents simultaneously.

Three ways to install

The desktop app provides the underlying automation server. How you talk to it depends on who's calling — humans use the CLI, MCP clients (Cursor / Continue / Cline / Claude Desktop) use the MCP server, and any agent that supports skills gets the official Skill bundle from kamskans/pandastudio-skills.

Bundled with the app

Easiest. Open the desktop app → Settings → Local automation → Install to PATH. Type pandastudio from any terminal.

bash
pandastudio system.status

npm — for shell scripts & CI

Same binary, distributed via npm. Useful if you want to script the editor before walking through the in-app install.

bash
npx @writepanda/cli system.status
# or globally:
npm install -g @writepanda/cli

MCP — Cursor, Continue, Cline, Claude Desktop

Standard Model Context Protocol server. Add to your client's MCP config; the agent gets 30+ typed tools.

json
{
  "mcpServers": {
    "pandastudio": {
      "command": "npx",
      "args": ["-y", "@writepanda/mcp"]
    }
  }
}
All three need the desktop app installed. The CLI / npm package / MCP server are thin clients to PandaStudio's localhost-only automation API. The desktop app does the actual rendering, transcription, export, and license checking. Get the app from the homepage.

Quickstart

Pick any install path above, then walk through this 4-step sanity check.

  1. 01

    Install PandaStudio + activate your license

    Download from the homepage and activate a license (or start a trial). The CLI is gated behind a valid license — diagnostic commands work without one, but everything useful needs activation.

    Download PandaStudio
  2. 02

    Open Settings → Local automation

    Toggle Allow local automation on. A green panel appears with two install buttons:

    • Install to PATH — drops a /usr/local/bin/pandastudio symlink (macOS, with system password prompt) or appends to your user PATH (Windows, no admin needed).
    • Install Skill — one-click shortcut that copies the Skill into ~/.claude/skills/pandastudio/ for Claude Code and Claude Desktop. To install for Cursor, Cline, Continue, and 40+ other agents in one shot, run this in your terminal instead: npx skills add kamskans/pandastudio-skills
  3. 03

    Verify from your terminal

    bash
    pandastudio system.status
    pandastudio commands

    If PandaStudio isn't running, the CLI auto-launches it and waits up to 60 s. Pass --no-launch to opt out.

  4. 04

    Render your first motion graphic

    bash
    # Async render — returns { jobId } immediately
    JOB=$(pandastudio motion.generate \
      --templateId=title-card-vox \
      --slots='{"title":"How I Built This","subtitle":"in 24 hours"}' \
      --aspectRatio=16:9 \
      --json | jq -r '.data.jobId')
    
    # Block server-side until the MP4 is ready (max 5 min)
    pandastudio job.wait --id="$JOB" --json | jq '.data.job.result.outputPath'

Custom motion graphics — beyond the templates (new in 1.9.5)

When the 19 bundled templates don't fit the brief, agents like Claude Code can author full HTML/CSS/JS animations directly. Pass them to motion.render-html and we render through the same Chromium → capturePage → FFmpeg pipeline — no slot machinery, no template wall.

bash
cat > /tmp/intro.html <<'HTML'
<!doctype html><html><head><style>
  html,body{margin:0;background:#0f172a;color:#e2e8f0;
    font:700 96px/1 system-ui;height:100%;
    display:grid;place-items:center;overflow:hidden}
  h1{opacity:0;transform:translateY(40px);
    animation:rise .9s cubic-bezier(.2,.7,.2,1) .3s forwards}
  @keyframes rise{to{opacity:1;transform:none}}
</style></head><body><h1>Q4 Wrap</h1></body></html>
HTML

JOB=$(pandastudio motion.render-html \
  --htmlPath=/tmp/intro.html \
  --aspectRatio=16:9 --durationMs=2500 \
  --json | jq -r '.data.jobId')

pandastudio job.wait --id="$JOB" --json | jq '.data.job.result.outputPath'

Built for two audiences

The same surface serves AI agents and humans writing shell scripts. Both flows are first-class.

AI agents (Claude Code, Cursor, Cline, Continue…)

Install the official Skill once — it teaches your agent the full command surface and is picked up by every agent you have installed.

bash
npx skills add kamskans/pandastudio-skills
Then just describe what you want:
prompt
Make me a 9:16 title card for my next Short:
title "How I Spent $10k in 24 Hours",
in MrBeast colors.

Shell scripts (bash, zsh, PowerShell)

Pipe through jq, batch across CSVs, chain into your existing build pipeline.

bash
# Bulk-render intros from a CSV of episode titles
while IFS=, read -r EP TITLE SUB; do
  SLOTS=$(jq -nc --arg t "$TITLE" --arg s "$SUB" \
    '{title:$t, subtitle:$s}')
  pandastudio motion.generate \
    --templateId=title-card-vox \
    --aspectRatio=16:9 \
    --outputName="intro-ep$EP" \
    --slots="$SLOTS" --json
done < episodes.csv

Prompt examples

Real prompts you can paste into Claude, Cursor, Continue, or any agent that has the PandaStudio Skill installed. The agent handles the verb sequencing — you just describe the outcome.

Shorts / TikTok / Reels

Make me a 9:16 title card for my next Short: title "How I Spent $10k in 24 Hours", in MrBeast colors.

YouTube long-form

Edit this recording into a YouTube video like Ali Abdaal's. Clean the audio, remove filler words, add captions, and every time I introduce a tool, shrink the camera to a portrait card on the right and show the tool's name on the left.

Tutorial / screencast

I'm walking through a SaaS dashboard. Find every moment I click something important in the transcript and add a 1.5× zoom there with a swoosh — keep the rest of the recording at full size.

Talking-head explainer

This is a 9:16 talking-head clip. When I say "three reasons", split the screen — keep me in the bottom half and play a motion graphic with the three reasons in the top half. Hold for 6 seconds, then back to full frame.

Quick polish

Clean up this raw recording — remove fillers, drop silences longer than 600ms, add my standard lower-third (Kamal · Founder) at 2s, and export as 1080p MP4.

Brand intro / outro

Add a 2-second logo intro and a subscribe-CTA outro. Logo is the file at ~/brand/logo.png. Brand colors: #34B27B and #0F1513.

Repurpose long → short

This is a 12-min YouTube video. Find the three most quotable 30-second segments in the transcript and turn each one into a 9:16 Short with auto-captions.

Publish to YouTube

Generate a clickable thumbnail and a YouTube-style title + description for this video, then upload it as unlisted to my channel.

Tip: the more specific the outcome, the better the edit. “Make it engaging” is vague; “cut every silence longer than 600 ms and add a 1.5× zoom on the word ‘click’” is actionable. The agent reads the transcript and the cursor-telemetry alongside your prompt, so timestamps and on-screen events are fair game.

Command catalogue

Every command is shaped verb.noun. The list below is a snapshot — for the live, version-accurate registry, run:

bash
pandastudio commands --json

system.*

Discovery + heartbeat. Always start a session with system.status to confirm the license gate isn't engaged.

  • system.statusApp version + license block.
  • system.listEvery available verb.noun with arg hints.
  • system.pingHeartbeat probe.
  • system.echoEcho args back for transport debugging.

project.*

Read, create, save, delete .pandastudio project files. All paths are validated to live under the user's recordings directory.

  • project.listEvery project on disk, newest-first.
  • project.readRead a project's full JSON content.
  • project.newCreate an empty v3 project.
  • project.saveOverwrite a project file.
  • project.deletePermanently delete a project file.
  • project.openBoot the editor window.
  • project.showResolve recordings + userData directories.

motion.*

Render motion-graphic title cards, lower thirds, and FX intros from bundled templates. Style packs let you re-skin without re-authoring.

  • motion.listEvery template (id, slots, defaults, aspectRatios).
  • motion.themesEvery style-pack theme.
  • motion.generateAsync render. Returns a jobId; poll job.wait for the MP4.
  • motion.render-htmlAsync render of arbitrary HTML/CSS/JS to MP4 — escape hatch when no template fits.

asset.*

Bundled sound effects + FX overlay videos that ship inside the installer.

  • asset.list-soundsEvery bundled sound.
  • asset.list-fxEvery bundled FX overlay.
  • asset.resolveResolve an asset id to a file path.

export.*

Browse the export library (the rows shown in MyExports). Read + patch only — fresh exports require the editor.

  • export.listEvery export entry, newest-first.
  • export.getRead a single entry by id.
  • export.updatePatch fields like generatedTitle, generatedDescription.
  • export.deleteDelete the row (not the underlying MP4).

llm.*

PandaStudio bundles a local LLM (Gemma 4 E2B). Good for summaries, classification, and short structured output.

  • llm.statusModel status: downloaded, downloading, path.
  • llm.inferOne-shot prompt → generated text.

job.*

Async job tracker. Use job.wait (server-side block) over client-side polling.

  • job.getSnapshot of a job's status, progress, result.
  • job.listEvery job in memory (last hour).
  • job.waitBlock until terminal state (max 5-min timeout).

window.*

Open or focus app windows from a script.

  • window.editorOpen (or focus) the editor window.
  • window.homeOpen (or focus) the home dashboard.
  • window.exportsOpen (or focus) the MyExports window.
  • window.focusBring the front window to the foreground.
  • window.listEvery open window with URL + title.

How it stays safe

Local automation is a high-trust surface. We treat it accordingly.

Loopback only

The HTTP listener binds explicitly to 127.0.0.1. Non-loopback connections are rejected at the request level even if the listener somehow becomes reachable.

Bearer token, rotated per launch

Every PandaStudio launch generates a fresh 256-bit token, written 0600 to ~/.config/pandastudio/token. Closing and reopening the app rotates it.

Off by default

The toggle in Settings → Local automation defaults to OFF. The HTTP listener never binds until the user explicitly opts in.

License-gated

Trial-expired and unlicensed users can hit only system.* and window.focus. Every other command returns trial_expired with a clear remediation message.

Path-validated

Project read/write paths are validated to live under the user's recordings directory. Out-of-tree absolute paths are rejected.

Audit log

Every authenticated request is appended to ~/.config/pandastudio/audit.log as one JSON line per request. Rotated at 5 MB.

Frequently asked

If your question isn't here, send it via the in-app feedback form.

Ready to script your video pipeline?

The CLI is included with every PandaStudio install. Free to try.