{"_id":"@anymotion-agent/anymotion","_rev":"5-7b361d97ecd5db9b144faeb88a93392f","name":"@anymotion-agent/anymotion","dist-tags":{"latest":"1.1.2"},"versions":{"1.0.0":{"name":"@anymotion-agent/anymotion","version":"1.0.0","keywords":["motion-graphics","ai-agent","claude","anymotion","animation","video-editor","saas-explainer","1080p"],"author":{"url":"https://aliusman.site","name":"Ali Usman"},"license":"MIT","_id":"@anymotion-agent/anymotion@1.0.0","maintainers":[{"name":"anymotion-agent","email":"the4liusman@gmail.com"}],"homepage":"https://github.com/anymotion/anymotion#readme","bugs":{"url":"https://github.com/anymotion/anymotion/issues"},"bin":{"motion":"bin/motion-cli.js","anymotion":"bin/motion-cli.js"},"dist":{"shasum":"17d13d6478f92fe530174ece0b6370a04ae952d4","tarball":"https://registry.npmjs.org/@anymotion-agent/anymotion/-/anymotion-1.0.0.tgz","fileCount":32,"integrity":"sha512-+Ga3Ta31W6M7mHNqjDjHv8JtbQ4RhXcj9WBVZsdhYhbZO4Z3Mi76tpfPXBGlSDxCDUm1sIrqRt22lXuTUi72kQ==","signatures":[{"sig":"MEQCIGjUZdRvj+ZLM5kj7GIc+gYLWfXXIhK3fSta+Fl05xdvAiBCRA+7xSSTZj3thv+RcHXi6/YDnn+D7y9vB0Rt5OLDBA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":865190},"main":"bin/motion-cli.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"d9a7acb134840a4f69a4bb42d93b9b9c1980f7d4","scripts":{"test":"node --test test/","agent":"node bin/motion-cli.js generate --serve","serve":"node bin/motion-cli.js serve","setup":"node scripts/install.js --setup","start":"node bin/motion-cli.js","doctor":"node scripts/install.js --doctor","render":"node bin/motion-cli.js render","generate":"node bin/motion-cli.js generate","projects":"node bin/motion-cli.js projects","install:anymotion":"node scripts/install.js"},"_npmUser":{"name":"anymotion-agent","email":"the4liusman@gmail.com"},"repository":{"url":"git+https://github.com/anymotion/anymotion.git","type":"git"},"_npmVersion":"10.9.3","description":"Anymotion — AI motion graphics agent for the terminal. Describe an animation, get a rendered MP4: planned, built, and visually checked by the agent itself.","directories":{},"_nodeVersion":"22.20.0","dependencies":{"cors":"^2.8.6","chalk":"^5.3.0","express":"^4.19.2","inquirer":"^9.2.15","commander":"^12.0.0","puppeteer":"^22.6.0","@anthropic-ai/sdk":"^0.115.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/anymotion_1.0.0_1786198500290_0.9142321276554917","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@anymotion-agent/anymotion","version":"1.0.1","keywords":["motion-graphics","ai-agent","claude","anymotion","animation","video-editor","saas-explainer","1080p"],"author":{"url":"https://aliusman.site","name":"Ali Usman"},"license":"MIT","_id":"@anymotion-agent/anymotion@1.0.1","maintainers":[{"name":"anymotion-agent","email":"the4liusman@gmail.com"}],"homepage":"https://github.com/anymotion-agent/anymotion#readme","bugs":{"url":"https://github.com/anymotion-agent/anymotion/issues"},"bin":{"motion":"bin/motion-cli.js","anymotion":"bin/motion-cli.js"},"dist":{"shasum":"785c918224575b7a137887ad3c6ec3ea9366148e","tarball":"https://registry.npmjs.org/@anymotion-agent/anymotion/-/anymotion-1.0.1.tgz","fileCount":32,"integrity":"sha512-b97zZYfJw6TQwKP0VHxUdyt9+1qSnOH/Zi/bEEgXV4oVyxxbRMXcwBCBGIcf5IVfgI0nEzT5GDaIts5ILAiO3w==","signatures":[{"sig":"MEQCIESwLB6KGpx4q9hgDI5JgKSATFjacABdOBc1et7V8fyEAiAxfmEAH44D4nrhZaw6yKTMmmpJQhRBEFDIEMxvDO57GQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":862647},"main":"bin/motion-cli.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"1f35509299995b04a147ed232f882bc54c01e935","scripts":{"test":"node --test test/","agent":"node bin/motion-cli.js generate --serve","serve":"node bin/motion-cli.js serve","setup":"node scripts/install.js --setup","start":"node bin/motion-cli.js","doctor":"node scripts/install.js --doctor","render":"node bin/motion-cli.js render","generate":"node bin/motion-cli.js generate","projects":"node bin/motion-cli.js projects","install:anymotion":"node scripts/install.js"},"_npmUser":{"name":"anymotion-agent","email":"the4liusman@gmail.com"},"repository":{"url":"git+https://github.com/anymotion-agent/anymotion.git","type":"git"},"_npmVersion":"10.9.3","description":"Anymotion — AI motion graphics agent for the terminal. Describe an animation, get a rendered MP4: planned, built, and visually checked by the agent itself.","directories":{},"_nodeVersion":"22.20.0","dependencies":{"cors":"^2.8.6","chalk":"^5.3.0","express":"^4.19.2","inquirer":"^9.2.15","commander":"^12.0.0","puppeteer":"^24.15.0","@anthropic-ai/sdk":"^0.115.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/anymotion_1.0.1_1786358410597_0.8102212119141672","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@anymotion-agent/anymotion","version":"1.1.0","keywords":["motion-graphics","ai-agent","claude","anymotion","animation","video-editor","saas-explainer","1080p"],"author":{"url":"https://aliusman.site","name":"Ali Usman"},"license":"MIT","_id":"@anymotion-agent/anymotion@1.1.0","maintainers":[{"name":"anymotion-agent","email":"the4liusman@gmail.com"}],"homepage":"https://github.com/anymotion-agent/anymotion#readme","bugs":{"url":"https://github.com/anymotion-agent/anymotion/issues"},"bin":{"motion":"bin/motion-cli.js","anymotion":"bin/motion-cli.js"},"dist":{"shasum":"6563d1d525af4ec2d7b21d0263dee024986fb211","tarball":"https://registry.npmjs.org/@anymotion-agent/anymotion/-/anymotion-1.1.0.tgz","fileCount":32,"integrity":"sha512-OwLZawIDdJX5MfEcuLm08igNGXZ+Z129ScnpofLDTzreAwCDqBWIvR58xpfn/LlDafWrD/7124eDCpkw3fdzAg==","signatures":[{"sig":"MEUCIEGhO47Tq43cUqdhB6caXELoWXi9Z+3RXM6A1pFN2ry1AiEA2eQbyqjkWk5uIYFWBg3aiFEcagwUl4gEe1lFKjKfQXc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":934007},"main":"bin/motion-cli.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"5392ba4ff66b1ad1f24e1fab0e684a21bd9058d5","scripts":{"test":"node --test test/","agent":"node bin/motion-cli.js generate --serve","serve":"node bin/motion-cli.js serve","setup":"node scripts/install.js --setup","start":"node bin/motion-cli.js","doctor":"node scripts/install.js --doctor","render":"node bin/motion-cli.js render","generate":"node bin/motion-cli.js generate","projects":"node bin/motion-cli.js projects","install:anymotion":"node scripts/install.js"},"_npmUser":{"name":"anymotion-agent","email":"the4liusman@gmail.com"},"repository":{"url":"git+https://github.com/anymotion-agent/anymotion.git","type":"git"},"_npmVersion":"10.9.3","description":"Anymotion — AI motion graphics agent for the terminal. Describe an animation, get a rendered MP4: planned, built, and visually checked by the agent itself.","directories":{},"_nodeVersion":"22.20.0","dependencies":{"cors":"^2.8.6","chalk":"^5.3.0","express":"^4.19.2","inquirer":"^9.2.15","commander":"^12.0.0","puppeteer":"^24.15.0","@anthropic-ai/sdk":"^0.115.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/anymotion_1.1.0_1787324773641_0.7298105238917638","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@anymotion-agent/anymotion","version":"1.1.1","keywords":["motion-graphics","ai-agent","claude","anymotion","animation","video-editor","saas-explainer","1080p"],"author":{"url":"https://aliusman.site","name":"Ali Usman"},"license":"MIT","_id":"@anymotion-agent/anymotion@1.1.1","maintainers":[{"name":"anymotion-agent","email":"the4liusman@gmail.com"}],"homepage":"https://github.com/anymotion-agent/anymotion#readme","bugs":{"url":"https://github.com/anymotion-agent/anymotion/issues"},"bin":{"motion":"bin/motion-cli.js","anymotion":"bin/motion-cli.js"},"dist":{"shasum":"5cefa9432c080ec53611a42f5498ccf288a18272","tarball":"https://registry.npmjs.org/@anymotion-agent/anymotion/-/anymotion-1.1.1.tgz","fileCount":32,"integrity":"sha512-GLyWNF+jSjHA6hIdUS9hksKxpseJQ3649q8TQ6mS55Vi/OY03T75PSV9cabpTRuJLpjv2HlHPbO6krR2Dg/ipQ==","signatures":[{"sig":"MEUCIEYOt3coqzmbkvms+NDUdUhGX9apNzoC4RSxDHfwbIzDAiEAgk+M5i7OXiQIgRpXDCCyx7+YsGFPEXNXWZHJFoQixbU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":935360},"main":"bin/motion-cli.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"c2b17780f0b713692df5af3d994a37471a8dbbe6","scripts":{"test":"node --test test/","agent":"node bin/motion-cli.js generate --serve","serve":"node bin/motion-cli.js serve","setup":"node scripts/install.js --setup","start":"node bin/motion-cli.js","doctor":"node scripts/install.js --doctor","render":"node bin/motion-cli.js render","generate":"node bin/motion-cli.js generate","projects":"node bin/motion-cli.js projects","install:anymotion":"node scripts/install.js"},"_npmUser":{"name":"anymotion-agent","email":"the4liusman@gmail.com"},"repository":{"url":"git+https://github.com/anymotion-agent/anymotion.git","type":"git"},"_npmVersion":"10.9.3","description":"Anymotion — AI motion graphics agent for the terminal. Describe an animation, get a rendered MP4: planned, built, and visually checked by the agent itself.","directories":{},"_nodeVersion":"22.20.0","dependencies":{"cors":"^2.8.6","chalk":"^5.3.0","express":"^4.19.2","inquirer":"^9.2.15","commander":"^12.0.0","puppeteer":"^24.15.0","@anthropic-ai/sdk":"^0.115.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/anymotion_1.1.1_1787326323300_0.7477047833318113","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@anymotion-agent/anymotion","version":"1.1.2","publishConfig":{"access":"public"},"description":"Anymotion — AI motion graphics agent for the terminal. Describe an animation, get a rendered MP4: planned, built, and visually checked by the agent itself.","main":"bin/motion-cli.js","type":"module","bin":{"anymotion":"bin/motion-cli.js","motion":"bin/motion-cli.js"},"engines":{"node":">=18.0.0"},"scripts":{"start":"node bin/motion-cli.js","install:anymotion":"node scripts/install.js","setup":"node scripts/install.js --setup","doctor":"node scripts/install.js --doctor","generate":"node bin/motion-cli.js generate","render":"node bin/motion-cli.js render","serve":"node bin/motion-cli.js serve","projects":"node bin/motion-cli.js projects","agent":"node bin/motion-cli.js generate --serve","test":"node --test \"test/*.test.js\""},"keywords":["motion-graphics","ai-agent","claude","anymotion","animation","video-editor","saas-explainer","1080p"],"author":{"name":"Ali Usman","url":"https://aliusman.site"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/anymotion-agent/anymotion.git"},"bugs":{"url":"https://github.com/anymotion-agent/anymotion/issues"},"homepage":"https://github.com/anymotion-agent/anymotion#readme","dependencies":{"@anthropic-ai/sdk":"^0.115.0","chalk":"^5.3.0","commander":"^12.0.0","cors":"^2.8.6","express":"^4.19.2","inquirer":"^9.2.15","puppeteer":"^24.15.0"},"_id":"@anymotion-agent/anymotion@1.1.2","gitHead":"edbe38f9ea1775927d7718ef54afac4a602e8579","_nodeVersion":"22.20.0","_npmVersion":"10.9.3","dist":{"integrity":"sha512-hpVh6Rjjd86l4d82Q/gcPu7brxDLlvg3Q3JeO83qbluymjDr28JJifDBikXWfGUjsuw6ODAg/7Yvawf2zTcjfA==","shasum":"1b9e83398f87c6bd30a87f68dc064fcd39ae373e","tarball":"https://registry.npmjs.org/@anymotion-agent/anymotion/-/anymotion-1.1.2.tgz","fileCount":34,"unpackedSize":993430,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIBrPT193SRvHXdBICjGuuEsolFwESHkCbqpBeqLShLJTAiEArc/Qba5yMvjTPP1NQSFfgwdClaJWrbnqFaF4NH+AG3A="}]},"_npmUser":{"name":"anymotion-agent","email":"the4liusman@gmail.com"},"directories":{},"maintainers":[{"name":"anymotion-agent","email":"the4liusman@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/anymotion_1.1.2_1788439378824_0.7600427928007623"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-08T14:15:00.127Z","modified":"2026-09-03T12:42:59.131Z","1.0.0":"2026-08-08T14:15:00.449Z","1.0.1":"2026-08-10T10:40:10.753Z","1.1.0":"2026-08-21T15:06:13.801Z","1.1.1":"2026-08-21T15:32:03.466Z","1.1.2":"2026-09-03T12:42:58.963Z"},"bugs":{"url":"https://github.com/anymotion-agent/anymotion/issues"},"author":{"name":"Ali Usman","url":"https://aliusman.site"},"license":"MIT","homepage":"https://github.com/anymotion-agent/anymotion#readme","keywords":["motion-graphics","ai-agent","claude","anymotion","animation","video-editor","saas-explainer","1080p"],"repository":{"type":"git","url":"git+https://github.com/anymotion-agent/anymotion.git"},"description":"Anymotion — AI motion graphics agent for the terminal. Describe an animation, get a rendered MP4: planned, built, and visually checked by the agent itself.","maintainers":[{"name":"anymotion-agent","email":"the4liusman@gmail.com"}],"readme":"# Anymotion\r\n\r\n**AI motion graphics agent and studio, in your terminal.**\r\n\r\nBuilt by [Ali Usman](https://aliusman.site) — AI product builder and product manager.\r\n\r\nDescribe an animation in plain language. Anymotion plans it, writes the HTML/CSS/JS, *looks at what it built* with a headless browser, fixes what is wrong, and renders a 1080p MP4.\r\n\r\nVisit the official landing page: [anymotion.art](https://anymotion.art)\r\n\r\n```\r\nanymotion\r\n› Build a 20-second SaaS analytics explainer, dark glass UI, teal accent\r\n```\r\n\r\n---\r\n\r\n## What's New in v1.1.0 (Major Update)\r\n\r\n- **🎨 Brand-Adaptive Semantic Theme Engine:** Automatically detects Dark/Light mode, extracts official brand palettes, and maps semantic color roles (`--bg-primary`, `--bg-secondary`, `--accent-primary`, `--accent-secondary`, contrast text).\r\n- **✨ Modern Brand-Customized Cursor System:** Replaced generic retro arrows with sleek precision stealth pointers, frosted glass avatar badges (`backdrop-filter: blur(12px)`), and kinetic click ripple waves.\r\n- **🛡️ Zero-Bug First-Pass Architecture:** Strict engineering standards that guarantee bulletproof scene isolation, 100% pure deterministic `window.seek(t)`, and centered 1920×1080 stage bounds from turn 1.\r\n- **⚡ Interactive 60fps Playback Engine:** In-browser 60fps `requestAnimationFrame` loop, Spacebar keyboard shortcut, Play/Pause toggle, and real-time scrubber synchronization.\r\n- **⏱️ Smart Duration Normalization:** Auto-converts millisecond/second units (e.g., `25000ms` → `25s`) and bounds clamps in the MP4 video renderer, preventing frame calculation freezes.\r\n- **📊 Pre-Plan Action Transparency:** Live step-by-step terminal narration during website scraping, brand asset probing, craft intelligence loading, and beat-sheet choreography synthesis.\r\n\r\n---\r\n\r\n## Why it is not just a code agent\r\n\r\nA general coding agent writing an animation is working blind. The HTML parses, the CSS is valid, and the result is still a card sitting on top of a headline at 3.2 seconds. Nothing in the source says so.\r\n\r\nAnymotion gives the model eyes:\r\n\r\n| Tool | What it does |\r\n| --- | --- |\r\n| `preview_frames` | Seeks to N timestamps, screenshots, hands the images back to the model |\r\n| `check_composition` | Headless audit — console errors, element overlap, off-canvas elements, determinism |\r\n\r\nBoth drive the same Puppeteer + `window.seek(t)` contract the renderer uses, so anything that passes the audit also renders correctly.\r\n\r\n---\r\n\r\n## Install\r\n\r\n**Requirements:** Node.js 18+ (and FFmpeg for MP4 video export).\r\n\r\n### Quick Install (Recommended)\r\n\r\n```bash\r\n# Install globally from NPM\r\nnpm install -g @anymotion-agent/anymotion\r\n\r\n# Or install directly from GitHub\r\nnpm install -g git+https://github.com/anymotion-agent/anymotion.git\r\n\r\n# Or initialize directly via npx\r\nnpx @anymotion-agent/anymotion@latest init\r\n\r\n# Run setup wizard (configures provider, API key & model)\r\nanymotion setup\r\n```\r\n\r\n### Install from Source\r\n\r\n```bash\r\ngit clone https://github.com/anymotion-agent/anymotion.git\r\ncd anymotion\r\nnpm install\r\nnpm link          # makes `anymotion` available globally\r\n\r\nanymotion install # initializes ~/.anymotion configuration & skills\r\nanymotion setup   # configures provider, API key and model\r\nanymotion doctor  # verifies environment & dependencies\r\n```\r\n\r\n### FFmpeg\r\n\r\n| Platform | Command |\r\n| --- | --- |\r\n| Windows | `winget install Gyan.FFmpeg` |\r\n| macOS | `brew install ffmpeg` |\r\n| Linux | `sudo apt install ffmpeg` |\r\n\r\nOnly `anymotion render` needs it. Everything else works without it.\r\n\r\n---\r\n\r\n## Bring your own API key\r\n\r\nAnymotion ships with no credentials. `anymotion setup` reads your key without echoing it and stores it in `~/.anymotion/motion.config.json`, which is outside the repo and gitignored. `anymotion config` masks it on output, so sharing your terminal is always safe.\r\n\r\n### Supported AI Providers (22+ Ready)\r\n\r\nAnymotion supports all major official APIs, high-speed routing gateways, and local offline models:\r\n\r\n| Provider | Endpoint | Environment Variable | Default Model |\r\n| --- | --- | --- | --- |\r\n| **Anthropic** | `https://api.anthropic.com` | `ANTHROPIC_API_KEY` | `claude-3-7-sonnet-20250219` |\r\n| **OpenRouter** | `https://openrouter.ai/api/v1` | `OPENROUTER_API_KEY` | `anthropic/claude-3.7-sonnet` |\r\n| **AgentRouter** | `https://agentrouter.org` | `ANTHROPIC_AUTH_TOKEN` | `claude-opus-5` |\r\n| **OpenCode Zen** | `https://opencode.ai/zen/v1` | `OPENCODE_API_KEY` | `deepseek-v4-flash-free` |\r\n| **OpenCode Go** | `https://opencode.ai/zen/go/v1` | `OPENCODE_API_KEY` | `deepseek-v4-flash-free` |\r\n| **TokenRouter** | `https://api.tokenrouter.com/v1` | `TOKENROUTER_API_KEY` | `gpt-4o` |\r\n| **OpenAI** | `https://api.openai.com/v1` | `OPENAI_API_KEY` | `gpt-4o` |\r\n| **Groq** | `https://api.groq.com/openai/v1` | `GROQ_API_KEY` | `llama-3.3-70b-versatile` |\r\n| **DeepSeek** | `https://api.deepseek.com/v1` | `DEEPSEEK_API_KEY` | `deepseek-chat` |\r\n| **Google Gemini** | `https://generativelanguage.googleapis.com/v1beta/openai` | `GEMINI_API_KEY` | `gemini-2.0-flash` |\r\n| **xAI (Grok)** | `https://api.x.ai/v1` | `XAI_API_KEY` | `grok-2-latest` |\r\n| **Kie AI** | `https://api.kie.ai/v1` | `KIE_API_KEY` | `deepseek-chat` |\r\n| **PiAPI** | `https://api.piapi.ai/v1` | `PIAPI_API_KEY` | `gpt-4o` |\r\n| **Together AI** | `https://api.together.xyz/v1` | `TOGETHER_API_KEY` | `meta-llama/Llama-3.3-70B-Instruct-Turbo` |\r\n| **Mistral AI** | `https://api.mistral.ai/v1` | `MISTRAL_API_KEY` | `mistral-large-latest` |\r\n| **Fireworks AI** | `https://api.fireworks.ai/inference/v1` | `FIREWORKS_API_KEY` | `llama-v3p3-70b-instruct` |\r\n| **Perplexity AI** | `https://api.perplexity.ai` | `PPLX_API_KEY` | `sonar-pro` |\r\n| **Cerebras** | `https://api.cerebras.ai/v1` | `CEREBRAS_API_KEY` | `llama-3.3-70b` |\r\n| **SambaNova** | `https://api.sambanova.ai/v1` | `SAMBANOVA_API_KEY` | `Meta-Llama-3.3-70B-Instruct` |\r\n| **SiliconFlow** | `https://api.siliconflow.cn/v1` | `SILICONFLOW_API_KEY` | `deepseek-ai/DeepSeek-V3` |\r\n| **Ollama (Local)** | `http://localhost:11434/v1` | `OLLAMA_API_KEY` | `llama3.3` |\r\n| **LM Studio (Local)** | `http://localhost:1234/v1` | `LM_STUDIO_API_KEY` | `local-model` |\r\n\r\nYou can skip the config file entirely and use the environment instead:\r\n\r\n```bash\r\nexport ANTHROPIC_API_KEY=sk-...\r\nanymotion\r\n```\r\n\r\nAn environment key fills in for a placeholder but never overwrites a real saved one — see [.env.example](.env.example) for every variable.\r\n\r\n---\r\n\r\n## Commands\r\n\r\n| Command | What it does |\r\n| --- | --- |\r\n| `anymotion` | Conversational agent REPL — the main way to use it |\r\n| `anymotion generate \"<prompt>\"` | One-shot generation into a new project folder |\r\n| `anymotion render` | Export to MP4 (`-r 720p\\|1080p\\|1440p\\|4k`, `-f <fps>`) |\r\n| `anymotion serve` | Web Studio Editor (Coming Soon 🚀) |\r\n| `anymotion render` | Export to MP4 (`-r 720p\\|1080p\\|1440p\\|4k`, `-f <fps>`) |\r\n| `anymotion projects` | List every generated project, marking the active one |\r\n| `anymotion config [key] [value]` | View or change settings (secrets shown masked) |\r\n| `anymotion install` | First-run setup |\r\n| `anymotion setup` | Provider / key / model wizard |\r\n| `anymotion doctor` | Health check — Node, key, skills, FFmpeg, Puppeteer |\r\n| `anymotion --version` | Print the installed version |\r\n\r\n---\r\n\r\n## How a project is laid out\r\n\r\nEvery generation gets its own folder, so a second request never overwrites the first:\r\n\r\n```\r\n~/anymotion-projects/\r\n  saas-analytics-explainer/\r\n    index.html        the composition\r\n    style.css         glassmorphism & tokens\r\n    timeline.js       seek engine & animation logic\r\n    project.json      prompt, plan, model, timestamps\r\n    exports/          rendered MP4s for this project only\r\n```\r\n\r\nThe newest project becomes the active one — `serve` and `render` follow it automatically.\r\n\r\n---\r\n\r\n## The animation contract\r\n\r\nAnymotion renders **deterministically**. It does not screen-record; it seeks. Every composition must expose two globals:\r\n\r\n```js\r\nwindow.DURATION = 20;        // seconds\r\n\r\nwindow.seek = function (t) { // t in seconds — must be pure\r\n  // position everything for exactly time t\r\n};\r\n```\r\n\r\nCalling `seek(5)` must produce an identical frame every time, whether it is called first or last. That is what makes a 60fps export possible without dropped frames, and it is what `check_composition` verifies.\r\n\r\nThe stage is `1920×1080`, `#stage`.\r\n\r\n---\r\n\r\n## Web Studio Editor (Coming Soon 🚀)\r\n\r\nThe interactive Web Studio editor is currently being upgraded and will be released in an upcoming update. Currently, Anymotion outputs clean HTML5 compositions, beat-sheets, and 1080p 60fps MP4 renders directly into your project directory.\r\n\r\n\r\n---\r\n\r\n## Configuration\r\n\r\nResolution order for the config file:\r\n\r\n1. `ANYMOTION_CONFIG` — explicit override, for CI and tests\r\n2. `./motion.config.json` — a per-project config in the current folder\r\n3. `~/.anymotion/motion.config.json` — the installed default\r\n\r\nSee [motion.config.example.json](motion.config.example.json) for every key.\r\n\r\n| Key | Default | Notes |\r\n| --- | --- | --- |\r\n| `model` | `claude-opus-5` | |\r\n| `provider` | `anthropic` | Picks the endpoint when `apiEndpoint` is empty |\r\n| `thinking` | `high` | `off`, `low`, `medium`, `high`, `xhigh`, `max` |\r\n| `defaultResolution` | `1080p` | `720p`, `1080p`, `1440p`, `4k`, or `WIDTHxHEIGHT` |\r\n| `fps` | `60` | |\r\n| `port` | `3000` | Live editor |\r\n| `fileApprovalMode` | `manual` | `manual`, `auto`, `always` |\r\n\r\n---\r\n\r\n## Safety\r\n\r\nThe agent writes real files and can run shell commands, so both go through [src/agent/sandbox.js](src/agent/sandbox.js):\r\n\r\n- Every path is resolved against the project root and refused if it escapes — absolute paths are rejected outright rather than silently re-rooted.\r\n- `project.json` is managed by Anymotion and cannot be written by the model.\r\n- Destructive shell commands are blocked *before* the approval prompt, so a mis-keyed `y` cannot authorise them: recursive deletes (POSIX and PowerShell), disk formats, raw device writes, pipe-to-shell installs, `git push`, `npm publish`, fork bombs.\r\n- File writes default to `manual` approval.\r\n\r\n---\r\n\r\n## Troubleshooting\r\n\r\n| Symptom | Fix |\r\n| --- | --- |\r\n| `No API key` | `anymotion setup`, or export `ANTHROPIC_API_KEY` |\r\n| Render fails immediately | FFmpeg is not on PATH — see the install table above |\r\n| `does not define window.seek(t)` | The composition is not seekable; ask the agent to fix it |\r\n| Editor will not start | It is off by default — `anymotion config editorEnabled true`. If enabled, the port is in use: `anymotion serve --port 3100` |\r\n| Anything else | `anymotion doctor` |\r\n\r\n---\r\n\r\n## Contributing\r\n\r\nAnymotion is an open-source project and we welcome contributions of all kinds — from adding new motion skills and expanding LLM provider support to fixing bugs and refining the CLI UI studio.\r\n\r\n### Quick Developer Setup\r\n\r\n```bash\r\ngit clone https://github.com/anymotion-agent/anymotion.git\r\ncd anymotion\r\nnpm install\r\nnpm link          # links your local development build to your global PATH\r\n\r\nanymotion doctor  # verifies local dev setup\r\n```\r\n\r\nCheck out our complete [CONTRIBUTING.md](CONTRIBUTING.md) for codebase architecture maps, skill matrix authoring guides, and pull request guidelines.\r\n\r\n---\r\n\r\n## Author\r\n\r\n**Ali Usman** — AI product builder and product manager. [aliusman.site](https://aliusman.site)\r\n\r\nAnymotion started from a product question rather than a coding one: why does an agent that writes an animation never look at the animation? The rest follows from answering it — the plan-first loop, the two visual audit tools, and the deterministic `seek(t)` contract that makes reviewing a single frame possible at all.\r\n\r\n## License and name\r\n\r\nThe code is MIT — see [LICENSE](LICENSE). Fork it, change it, ship it commercially, no permission needed. Two things sit outside that grant:\r\n\r\n- **Attribution.** MIT asks that the copyright notice travel with any copy or substantial portion of the code. Keep [LICENSE](LICENSE) in your fork and you have satisfied it.\r\n- **The name.** *Anymotion* is the project's name, not part of the licence — copyright and trademark are separate things. Please ship a fork under your own name rather than as Anymotion, so users can tell the two apart.\r\n\r\nMIT © 2026 Ali Usman\r\n","readmeFilename":"README.md"}