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.
Listener binds to 127.0.0.1. Loopback is double-checked per request. Per-launch bearer token, 0600 mode. Nothing leaves your machine.
Single dispatch endpoint, verb.noun command shape, --json mode. Built so an AI agent can chain calls without burning context on JSON-RPC chatter.
Official Skill on GitHub. One command installs it into Claude Code, Cursor, Cline, Continue, and 40+ other agents simultaneously.
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.
Easiest. Open the desktop app → Settings → Local automation → Install to PATH. Type pandastudio from any terminal.
pandastudio system.statusSame binary, distributed via npm. Useful if you want to script the editor before walking through the in-app install.
npx @writepanda/cli system.status
# or globally:
npm install -g @writepanda/cliStandard Model Context Protocol server. Add to your client's MCP config; the agent gets 30+ typed tools.
{
"mcpServers": {
"pandastudio": {
"command": "npx",
"args": ["-y", "@writepanda/mcp"]
}
}
}Pick any install path above, then walk through this 4-step sanity check.
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 PandaStudioToggle Allow local automation on. A green panel appears with two install buttons:
/usr/local/bin/pandastudio symlink (macOS, with system password prompt) or appends to your user PATH (Windows, no admin needed).~/.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-skillspandastudio system.status
pandastudio commandsIf PandaStudio isn't running, the CLI auto-launches it and waits up to 60 s. Pass --no-launch to opt out.
# 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'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.
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'The same surface serves AI agents and humans writing shell scripts. Both flows are first-class.
Install the official Skill once — it teaches your agent the full command surface and is picked up by every agent you have installed.
npx skills add kamskans/pandastudio-skillsMake me a 9:16 title card for my next Short:
title "How I Spent $10k in 24 Hours",
in MrBeast colors.Pipe through jq, batch across CSVs, chain into your existing build pipeline.
# 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.csvReal 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.
“Make me a 9:16 title card for my next Short: title "How I Spent $10k in 24 Hours", in MrBeast colors.”
“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.”
“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.”
“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.”
“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.”
“Add a 2-second logo intro and a subscribe-CTA outro. Logo is the file at ~/brand/logo.png. Brand colors: #34B27B and #0F1513.”
“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.”
“Generate a clickable thumbnail and a YouTube-style title + description for this video, then upload it as unlisted to my channel.”
Every command is shaped verb.noun. The list below is a snapshot — for the live, version-accurate registry, run:
pandastudio commands --jsonDiscovery + 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.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.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.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.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).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.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).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.Local automation is a high-trust surface. We treat it accordingly.
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.
Every PandaStudio launch generates a fresh 256-bit token, written 0600 to ~/.config/pandastudio/token. Closing and reopening the app rotates it.
The toggle in Settings → Local automation defaults to OFF. The HTTP listener never binds until the user explicitly opts in.
Trial-expired and unlicensed users can hit only system.* and window.focus. Every other command returns trial_expired with a clear remediation message.
Project read/write paths are validated to live under the user's recordings directory. Out-of-tree absolute paths are rejected.
Every authenticated request is appended to ~/.config/pandastudio/audit.log as one JSON line per request. Rotated at 5 MB.
If your question isn't here, send it via the in-app feedback form.
The CLI is included with every PandaStudio install. Free to try.