Show HN: Use After Effects with Claude Code, Cursor and Antigravity Aftr, a new open-source Node.js tool, lets developers control Adobe After Effects programmatically via WebSocket and MCP, enabling AI agents like Claude Code to build and render video compositions autonomously. The tool provides ~100 commands for comps, layers, effects, and an autonomous pipeline that self-corrects by rendering, reviewing, and revising clips without manual AE work. A Node controller sends JSON commands over a WebSocket to a CEP panel inside AE, which runs them as ExtendScript and returns JSON. On top sits an autonomous, spec-driven pipeline that builds clips and self-corrects them by rendering, reviewing, and revising. Everything is driven programmatically over the socket, with no manual After Effects work. A title sequence built and rendered entirely through aftr. No manual After Effects work.Video made for tilion / fortress.Watch the full demo Wire aftr into Claude Code in two commands. Start the controller it serves the MCP endpoint , then point Claude Code at it. npx aftr-studio controller no install, needs Node 18+ pip install aftr-studio && aftr controller pip docker run -p 8787:8787 ghcr.io/arman-luthra/aftr docker claude mcp add --transport http aftr http://127.0.0.1:8787/mcp Open After Effects and the panel Window Extensions aftr; deploy it once from a clone with npm run deploy:panel . Then ask Claude Code in plain language: Create a 1080p 5s comp, add a title "LAUNCH" with fire behind it, animate blurFade, then render to mp4. Claude Code sees every command as a tool: it calls ae status first, lists the set with ae list commands , and runs anything through ae command . Prefer a stdio server? Use claude mcp add aftr -- npx -y aftr-studio mcp keep the controller running too . | Method | Command | |---|---| | npm global CLI | npm install -g aftr-studio , then aftr controller | | npx no install | npx aftr-studio controller | | pip Python launcher | pip install aftr-studio , then aftr controller needs Node 18+ | | Docker | docker run --rm -p 8787:8787 ghcr.io/arman-luthra/aftr | | From source | clone this repo below | The npm, npx, and Docker paths run the controller, MCP server aftr mcp , and simulator aftr sim . Deploying the CEP panel into After Effects is done from a clone npm run deploy:panel , since it self-signs and installs the extension. The pip package is a thin launcher that forwards to the npm CLI through npx . git clone https://github.com/Arman-Luthra/aftr.git cd aftr npm install 1 prove it's healthy with NO After Effects headless simulator + tests npm run build:jsx && npm test 2 install the panel into AE self-signs + deploys on Windows and macOS npm run deploy:panel then quit and relaunch AE, Window Extensions aftr 3 start the bridge + open the UI npm run controller http://127.0.0.1:8787 Then drive it from the UI, REST, WebSocket, or as a library: node examples/flaming-title.mjs "ON FIRE" Requires After Effects 2024 to 2026, Node 18+, and ffmpeg on your PATH . Full Windows and macOS setup is in section 4 4-full-setup-with-real-after-effects . | Capability | What it does | |---|---| | ~100 commands | Comps, layers, keyframes with easing, expressions, effects by matchName or display name, including deeply nested params and third-party plugins , masks, layer styles, text animators, render. | | Discovery | listFonts , listInstalledEffects returns matchNames , findEffectMatchName , listPlugins , getEnvironment . Find what's installed instead of guessing. | | One-call VFX | fireEffect , smokeEffect , glitchEffect , neonGlow , cinematicGrade , and a friendly applyLumetri grade. | | Text animation | Four Animate-panel presets wordReveal , charScale , bunchRotate , blurFade plus a full range-selector builder. | | Autonomous pipeline | Declarative segment specs realize, render, get a visual review, take a structured delta, re-render, and concat. It self-corrects. | | MCP server | Drive AE from Claude Desktop, Claude Code, or any MCP client. Every command is a tool npm run mcp . | | Fast and batched | batch runs N edits in one round-trip and one undo sub-200 ms for 20 ops . Non-blocking aerender streams progress events, with a parallel render engine. | | Testable without AE | A headless simulator runs the real JSX against a mock DOM. 96 tests plus e2e, CI on Node 18, 20, and 22. | | Cross-platform | Windows and macOS, one-command sign and deploy. | ┌──────────────────────────────────────────────┐ │ Controller Node + ws + Express + web UI │ <- you / the UI / an agent drive this │ • hosts a WebSocket server panel + agents │ │ • REST surface + interactive UI │ │ • the HLD orchestrator agentic loop │ └───────────────┬────────────────────────────────┘ │ WebSocket JSON request/response/event envelopes ┌───────────────▼────────────────────────────────┐ │ CEP panel inside After Effects │ ┐ │ • WebSocket CLIENT, dials the controller │ │ build once, │ • routes commands to the JSX dispatch layer │ │ identical on Win & Mac │ • spawns aerender for non-blocking renders │ │ └───────────────┬────────────────────────────────┘ │ │ evalScript string in / JSON string out ┌───────────────▼────────────────────────────────┐ │ │ JSX command layer host.jsx + commands/ .jsx │ │ │ • dispatch command, paramsJson - JSON │ │ │ • ~90 commands: layers, keyframes, effects, │ │ │ text animators, masks, VFX presets, render │ │ └───────────────┬────────────────────────────────┘ ┘ │ AE scripting DOM app.project, comps, layers ┌───────────────▼────────────────────────────────┐ │ After Effects │ └──────────────────────────────────────────────────┘ What you can do with it 1-what-you-can-do-with-it Prerequisites 2-prerequisites Quick start, no AE needed the simulator 3-quick-start-no-ae-needed-the-simulator Full setup with real After Effects 4-full-setup-with-real-after-effects Run order 5-run-order Driving the bridge 6-driving-the-bridge Command vocabulary 7-command-vocabulary VFX and text presets 8-vfx-and-text-presets The orchestrator autonomous pipeline 9-the-orchestrator-autonomous-pipeline Configuration 10-configuration Dev workflow hot reload + signing 11-dev-workflow-hot-reload--signing Architecture 12-architecture Project structure 13-project-structure Testing 14-testing Troubleshooting 15-troubleshooting Cross-platform notes 16-cross-platform-notes Control AE from code: create comps and layers solids, text, shapes, nulls, cameras, lights, adjustment, footage , set any transform or effect property, add keyframes with easing, write expressions, and parent, trim, move, or duplicate layers, all over a socket. Add any effect by matchName and drive any of its parameters, even deeply nested ones, animated via keyframes or expressions. Animate text with four ready-made Animate-panel styles wordReveal , charScale , bunchRotate , blurFade plus a full text-animator builder Based On, Shape, Ease High to Low, keyframed Offset and Start . Reach for one-call VFX presets: fireEffect realistic fire , smokeEffect , glitchEffect , neonGlow , cinematicGrade , and a friendly applyLumetri grade. Batch and introspect: run many edits in one round-trip and one undo batch , then read back layer or comp state getLayerDetails , getProperty . Render without blocking: render spawns aerender and streams progress and renderComplete events, so AE stays responsive. Run the autonomous pipeline: describe a video as JSON segments, and the orchestrator realizes each one applySpec , renders it scoped, reviews it visually, applies a structured spec delta if it's wrong, re-renders until it passes, then concatenates the result with FFmpeg. | Requirement | Notes | |---|---| | Adobe After Effects | 2024 24.x , 2025 25.x , or 2026 26.x . Licensed and activated. Record your exact version. | | Node.js 18+ | The controller, simulator, and build scripts are Node ESM . | | FFmpeg | Needed by the orchestrator's visual reviewer and final concat. ffmpeg must be on your PATH . | | Git | To clone and push. | Check them: node --version v18+ v22 recommended ffmpeg -version any recent build CEP version maps to AE version: AE 2024 uses CEP 11 CSXS.11 ; AE 2025 and 2026 use CEP 12 CSXS.12 . The panel manifest targets 24.0,99.9 and a low required runtime, so it loads on all of them. You can validate the entire architecture controller-to-bridge protocol, command dispatch, render plumbing without After Effects, using the headless simulator. It is a Node process that speaks the exact same WebSocket protocol as the real panel and runs the real bundled JSX against a mock AE DOM. git clone https://github.com/Arman-Luthra/aftr.git cd aftr npm install build the JSX bundle once npm run build:jsx run the full headless test suite unit + simulator + JSX dispatch npm test end-to-end: controller + simulator round-trip, incl. render events npm run e2e Or run it interactively: terminal 1: controller WS server + REST + UI on http://127.0.0.1:8787 npm run controller terminal 2: the simulator pretends to be the AE panel npm run sim now open http://127.0.0.1:8787 and click commands, or: curl -X POST http://127.0.0.1:8787/command \ -H "Content-Type: application/json" \ -d '{"command":"createComp","params":{"name":"Main","width":1920,"height":1080}}' This is how M0 , M3 , and M4 architecture, round-trip, vocabulary are validated with zero AE. The real panel drops in unchanged for M1 , M2 , and M5 . The panel is a CEP extension. On modern AE 2025+ , the old trick of enabling unsigned panels via PlayerDebugMode is unreliable: AE ignores it and rejects unsigned extensions with "Signature verification failed." The reliable, supported path is to self-sign and install the panel, which this repo automates with one command: npm run deploy:panel deploy:panel builds the JSX bundle, creates a self-signed dev certificate cached in dist/ , signs panel/ into a .zxp , and unpacks the signed extension into your per-user CEP extensions folder. It works on both Windows and macOS the zxp-sign-cmd https://www.npmjs.com/package/zxp-sign-cmd tool ships the signer for both . After it runs, fully quit and relaunch After Effects, then open Window Extensions aftr. A signed extension is a snapshot. After you edit panel source, re-run npm run deploy:panel and reopen AE to make it permanent, or use the hot-reload dev loop see section 11 11-dev-workflow-hot-reload--signing while iterating. from the repo root npm install npm run deploy:panel then quit AE, relaunch, Window Extensions aftr The signed panel installs to: %APPDATA%\Adobe\CEP\extensions\com.ae-bridge.panel You may also set debug mode for remote DevTools, but it is not required once signed: reg add HKCU\Software\Adobe\CSXS.12 /v PlayerDebugMode /t REG SZ /d 1 /f use CSXS.11 for AE 2024 . from the repo root npm install npm run deploy:panel then quit AE, relaunch, Window Extensions aftr The signed panel installs to: ~/Library/Application Support/Adobe/CEP/extensions/com.ae-bridge.panel macOS specifics: - If the signer binary is quarantined by Gatekeeper, clear it once: xattr -dr com.apple.quarantine node modules/zxp-sign-cmd path may vary . aerender lives at the app root: /Applications/Adobe After Effects