{"_id":"@afromero/kin3o","_rev":"8-62cc41a48d071525d99996c4e8873be6","name":"@afromero/kin3o","dist-tags":{"latest":"0.3.0"},"versions":{"0.1.0":{"name":"@afromero/kin3o","version":"0.1.0","keywords":["lottie","animation","ai","dotlottie","state-machine","cli","motion","claude","codex"],"author":{"name":"Andres Romero","email":"me@afromero.co"},"license":"MIT","_id":"@afromero/kin3o@0.1.0","maintainers":[{"name":"afromero","email":"andres2912@gmail.com"}],"homepage":"https://github.com/affromero/kin3o#readme","bugs":{"url":"https://github.com/affromero/kin3o/issues"},"bin":{"kin3o":"dist/index.js"},"dist":{"shasum":"8d72cf0cf7ed232ba60bcb93724ed4a1149330ea","tarball":"https://registry.npmjs.org/@afromero/kin3o/-/kin3o-0.1.0.tgz","fileCount":45,"integrity":"sha512-ea2BbHVsIIGF2Yzei2mM3F2wBcB3mJ2hOO+c4TQQd1Kjd0c9eePzk9ud/emwnO5MZ9xspgQ1fBF7n+yxES8rmA==","signatures":[{"sig":"MEUCIQDY/Pm96MKBAzTKqUVCwRGDOnBiZwvMf79zEC8Ji1rbMAIgcT+hc0AmemPIMI+M/QA7Y26JDE5WtHlMGt2COy/rJmw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":163649},"type":"module","engines":{"node":">=18"},"gitHead":"d4abac8bea8ef606235eaebf366a3b6f4cd9a58c","scripts":{"ci":"npm run typecheck && npm run test","dev":"tsx src/index.ts","test":"node --import tsx/esm --test 'src/**/*.test.ts'","build":"tsc -p tsconfig.build.json","generate":"tsx src/index.ts generate","typecheck":"tsc --noEmit","prepublishOnly":"npm run ci && npm run build"},"_npmUser":{"name":"afromero","email":"andres2912@gmail.com"},"repository":{"url":"git+https://github.com/affromero/kin3o.git","type":"git"},"_npmVersion":"10.9.2","description":"AI-powered Lottie animation generator — text to motion from your terminal","directories":{},"_nodeVersion":"23.11.0","dependencies":{"open":"^10.1.0","commander":"^13.0.0","@anthropic-ai/sdk":"^0.78.0","@dotlottie/dotlottie-js":"^1.6.3"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","typescript":"^5.7.0","@types/node":"^22.13.0"},"_npmOperationalInternal":{"tmp":"tmp/kin3o_0.1.0_1773578307769_0.697762301830817","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@afromero/kin3o","version":"0.2.0","keywords":["lottie","animation","ai","dotlottie","state-machine","cli","motion","claude","codex"],"author":{"name":"Andres Romero","email":"me@afromero.co"},"license":"MIT","_id":"@afromero/kin3o@0.2.0","maintainers":[{"name":"afromero","email":"andres2912@gmail.com"}],"homepage":"https://github.com/affromero/kin3o#readme","bugs":{"url":"https://github.com/affromero/kin3o/issues"},"bin":{"kin3o":"dist/index.js"},"dist":{"shasum":"5056196350500e70c1a01a9d07236c4ed42df4a1","tarball":"https://registry.npmjs.org/@afromero/kin3o/-/kin3o-0.2.0.tgz","fileCount":54,"integrity":"sha512-LutYVYiK9SG3PJk4OjzatzK+OBSo7yDhkvt4X2oa0klYu+YEVjlfeNJ2YEKAnmpO36kyEK2KPtlT/reCMduzMA==","signatures":[{"sig":"MEYCIQDIjUx0qB426n31sTaTdFV1gx/Aon8kVsm8kMo+nm9AiAIhAOpMXKeJaa5ASHP2BXR4PGpIitbiI1IrdUQ7kV/f9yGv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@afromero%2fkin3o@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":210182},"type":"module","engines":{"node":">=18"},"gitHead":"b1f82a3c6fcc4dd0c5dbd502f1c6ea9d3eb9209e","scripts":{"ci":"npm run typecheck && npm run test","dev":"tsx src/index.ts","test":"node --import tsx/esm --test 'src/**/*.test.ts'","build":"tsc -p tsconfig.build.json","generate":"tsx src/index.ts generate","typecheck":"tsc --noEmit","prepublishOnly":"npm run ci && npm run build"},"_npmUser":{"name":"afromero","email":"andres2912@gmail.com"},"repository":{"url":"git+https://github.com/affromero/kin3o.git","type":"git"},"_npmVersion":"10.9.4","description":"AI-powered Lottie animation generator — text to motion from your terminal","directories":{},"_nodeVersion":"22.22.0","dependencies":{"open":"^10.1.0","commander":"^13.0.0","@anthropic-ai/sdk":"^0.78.0","@dotlottie/dotlottie-js":"^1.6.3"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","typescript":"^5.7.0","@types/node":"^22.13.0"},"_npmOperationalInternal":{"tmp":"tmp/kin3o_0.2.0_1773583601058_0.31748243050743574","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@afromero/kin3o","version":"0.2.1","keywords":["lottie","animation","ai","dotlottie","state-machine","cli","motion","claude","codex"],"author":{"name":"Andres Romero","email":"me@afromero.co"},"license":"MIT","_id":"@afromero/kin3o@0.2.1","maintainers":[{"name":"afromero","email":"andres2912@gmail.com"}],"homepage":"https://github.com/affromero/kin3o#readme","bugs":{"url":"https://github.com/affromero/kin3o/issues"},"bin":{"kin3o":"dist/index.js"},"dist":{"shasum":"914ca3ac352ef18941fc6ffa53bdc2f3bb03ed02","tarball":"https://registry.npmjs.org/@afromero/kin3o/-/kin3o-0.2.1.tgz","fileCount":54,"integrity":"sha512-3K0Rb3IS5qudt2nCE/IC/5bm7phXKyzp+0fPsc6BZq7eRt+MYQ8GvMlyUEtxIf82+nmE9TuO8mmyFX4plLNd8w==","signatures":[{"sig":"MEUCIF7QWTkhQjXC4S7mTwN6QWIz26fITYSseGs39E3YL3qBAiEAhXdm7IBr+OtGomyd9J4+94qHQP70ZuaIOqLjCea6O5A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@afromero%2fkin3o@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":210182},"type":"module","engines":{"node":">=18"},"gitHead":"fcc6ced3f579e6435faa1c0bfff4f45106c9bf67","scripts":{"ci":"npm run typecheck && npm run test","dev":"tsx src/index.ts","test":"node --import tsx/esm --test 'src/**/*.test.ts'","build":"tsc -p tsconfig.build.json","generate":"tsx src/index.ts generate","typecheck":"tsc --noEmit","prepublishOnly":"npm run ci && npm run build"},"_npmUser":{"name":"afromero","email":"andres2912@gmail.com"},"repository":{"url":"git+https://github.com/affromero/kin3o.git","type":"git"},"_npmVersion":"10.9.4","description":"AI-powered Lottie animation generator — text to motion from your terminal","directories":{},"_nodeVersion":"22.22.0","dependencies":{"open":"^10.1.0","commander":"^13.0.0","@anthropic-ai/sdk":"^0.78.0","@dotlottie/dotlottie-js":"^1.6.3"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","typescript":"^5.7.0","@types/node":"^22.13.0"},"_npmOperationalInternal":{"tmp":"tmp/kin3o_0.2.1_1773584655318_0.29158146578649813","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@afromero/kin3o","version":"0.2.2","keywords":["lottie","animation","ai","dotlottie","state-machine","cli","motion","claude","codex"],"author":{"name":"Andres Romero","email":"me@afromero.co"},"license":"MIT","_id":"@afromero/kin3o@0.2.2","maintainers":[{"name":"afromero","email":"andres2912@gmail.com"}],"homepage":"https://github.com/affromero/kin3o#readme","bugs":{"url":"https://github.com/affromero/kin3o/issues"},"bin":{"kin3o":"dist/index.js"},"dist":{"shasum":"08ebc02782dfe058f91f6ca14367e3f5323ee32b","tarball":"https://registry.npmjs.org/@afromero/kin3o/-/kin3o-0.2.2.tgz","fileCount":54,"integrity":"sha512-QGnYHJDuIQXWRR+PgxxIZKVwEgE3v+7BDWlAE7GLxuHPGUecTAAzsMWFw62gaGmshXDdpUv6f8qsqhsFygTA8g==","signatures":[{"sig":"MEQCICHjL9j+9pNf9ieZv+MrwBkKd34+fQW4phJb1qPznVngAiBvaUvxGKCyBi/jSJkbN+DOpS7CCNfDNP2Iu8bMdI8wYw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@afromero%2fkin3o@0.2.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":210182},"type":"module","engines":{"node":">=18"},"gitHead":"1206fbc3dabe04cb9623b0e49192f93674a7105f","scripts":{"ci":"npm run typecheck && npm run test","dev":"tsx src/index.ts","test":"node --import tsx/esm --test 'src/**/*.test.ts'","build":"tsc -p tsconfig.build.json","generate":"tsx src/index.ts generate","typecheck":"tsc --noEmit","prepublishOnly":"npm run ci && npm run build"},"_npmUser":{"name":"afromero","email":"andres2912@gmail.com"},"repository":{"url":"git+https://github.com/affromero/kin3o.git","type":"git"},"_npmVersion":"10.9.4","description":"AI-powered Lottie animation generator — text to motion from your terminal","directories":{},"_nodeVersion":"22.22.1","dependencies":{"open":"^10.1.0","commander":"^13.0.0","@anthropic-ai/sdk":"^0.78.0","@dotlottie/dotlottie-js":"^1.6.3"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","typescript":"^5.7.0","@types/node":"^22.13.0"},"_npmOperationalInternal":{"tmp":"tmp/kin3o_0.2.2_1773585548180_0.019896480544554507","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@afromero/kin3o","version":"0.2.3","keywords":["lottie","animation","ai","dotlottie","state-machine","cli","motion","claude","codex"],"author":{"name":"Andres Romero","email":"me@afromero.co"},"license":"MIT","_id":"@afromero/kin3o@0.2.3","maintainers":[{"name":"afromero","email":"andres2912@gmail.com"}],"homepage":"https://github.com/affromero/kin3o#readme","bugs":{"url":"https://github.com/affromero/kin3o/issues"},"bin":{"kin3o":"dist/index.js"},"dist":{"shasum":"a82f5cd7c2690296bc775114107c8d0e9ca42cff","tarball":"https://registry.npmjs.org/@afromero/kin3o/-/kin3o-0.2.3.tgz","fileCount":57,"integrity":"sha512-uJpqMC94//edfyZ6lr3P6LTdoFVDshYrOYZjX4PSSsgfNyRfjlwnlrKWH9VhF7ufRZ/BOR79HPRdZS9kbDIA1w==","signatures":[{"sig":"MEQCIBxDDWXOUQ6UMs4Zyb1fbn1Ly6IXxI+4dz6oqUkQ7jXiAiBu64dculD3aGgfUq9C6e+bClQe4/tpJ33HRJgQZG9mhg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@afromero%2fkin3o@0.2.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":227388},"type":"module","engines":{"node":">=18"},"gitHead":"5aa70ba6e52e991a427275b2b8ff97d61df244cc","scripts":{"ci":"npm run typecheck && npm run test","dev":"tsx src/index.ts","test":"node --import tsx/esm --test 'src/**/*.test.ts'","build":"tsc -p tsconfig.build.json","generate":"tsx src/index.ts generate","typecheck":"tsc --noEmit","prepublishOnly":"npm run ci && npm run build"},"_npmUser":{"name":"afromero","email":"andres2912@gmail.com"},"repository":{"url":"git+https://github.com/affromero/kin3o.git","type":"git"},"_npmVersion":"10.9.4","description":"AI-powered Lottie animation generator — text to motion from your terminal","directories":{},"_nodeVersion":"22.22.0","dependencies":{"open":"^10.1.0","commander":"^13.0.0","puppeteer-core":"^24.0.0","@anthropic-ai/sdk":"^0.78.0","@dotlottie/dotlottie-js":"^1.6.3"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","typescript":"^5.7.0","@types/node":"^22.13.0"},"_npmOperationalInternal":{"tmp":"tmp/kin3o_0.2.3_1773601357938_0.018138055947331644","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@afromero/kin3o","version":"0.2.4","keywords":["lottie","animation","ai","dotlottie","state-machine","cli","motion","claude","codex"],"author":{"name":"Andres Romero","email":"me@afromero.co"},"license":"MIT","_id":"@afromero/kin3o@0.2.4","maintainers":[{"name":"afromero","email":"andres2912@gmail.com"}],"homepage":"https://github.com/affromero/kin3o#readme","bugs":{"url":"https://github.com/affromero/kin3o/issues"},"bin":{"kin3o":"dist/index.js"},"dist":{"shasum":"094f4a15c9e667b9bc901053216d83612ce2f9f8","tarball":"https://registry.npmjs.org/@afromero/kin3o/-/kin3o-0.2.4.tgz","fileCount":57,"integrity":"sha512-iNmrHdm5/SKc8gTyBQfpglIVJXb8eeqmwZogOHayBa3+mdEWkddND2HsrRTdw5PjBiOeeX6DA4uoxvCrM6kZ/w==","signatures":[{"sig":"MEYCIQDwr5CWs6E2Abi3+KatM56DHtBv8VAA3JqSy7vODAw4cAIhAK1fq0OB7KRiU2Q6i+Tj0oCL1wJFmPIK6k61lEaDQRkr","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@afromero%2fkin3o@0.2.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":229096},"type":"module","engines":{"node":">=18"},"gitHead":"b910c0b75005f9ec5d6ea03b39008f59f6d45dc2","scripts":{"ci":"npm run typecheck && npm run test","dev":"tsx src/index.ts","test":"node --import tsx/esm --test 'src/**/*.test.ts'","build":"tsc -p tsconfig.build.json","generate":"tsx src/index.ts generate","typecheck":"tsc --noEmit","prepublishOnly":"npm run ci && npm run build"},"_npmUser":{"name":"afromero","email":"andres2912@gmail.com"},"repository":{"url":"git+https://github.com/affromero/kin3o.git","type":"git"},"_npmVersion":"10.9.4","description":"AI-powered Lottie animation generator — text to motion from your terminal","directories":{},"_nodeVersion":"22.22.1","dependencies":{"open":"^10.1.0","commander":"^13.0.0","lottie-react":"^2.4.1","puppeteer-core":"^24.0.0","@anthropic-ai/sdk":"^0.78.0","@dotlottie/dotlottie-js":"^1.6.3"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","typescript":"^5.7.0","@types/node":"^22.13.0"},"_npmOperationalInternal":{"tmp":"tmp/kin3o_0.2.4_1774180801607_0.932825768669072","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"@afromero/kin3o","version":"0.2.5","keywords":["lottie","animation","ai","dotlottie","state-machine","cli","motion","claude","codex"],"author":{"name":"Andres Romero","email":"me@afromero.co"},"license":"MIT","_id":"@afromero/kin3o@0.2.5","maintainers":[{"name":"afromero","email":"andres2912@gmail.com"}],"homepage":"https://github.com/affromero/kin3o#readme","bugs":{"url":"https://github.com/affromero/kin3o/issues"},"bin":{"kin3o":"dist/index.js"},"dist":{"shasum":"86d818840a57feb616e8dfaf0859a8b382c94f07","tarball":"https://registry.npmjs.org/@afromero/kin3o/-/kin3o-0.2.5.tgz","fileCount":57,"integrity":"sha512-yekpZ6AaYkE6vtzcpdEymr8li8OQIaokFAW4kN7L0PIKuOyI/W1dWa2+FU4RgXbKk/9q4O7lELvjc/viChiGnw==","signatures":[{"sig":"MEUCICZRtvPAN1EUByXKJTSZsG3jtWbTMXX/VAxU137uzOReAiEAp2XRlEqmlhTT8EJgaTzaAeXRpKGUoU4xm7eRkmwQV0c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@afromero%2fkin3o@0.2.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":231025},"type":"module","engines":{"node":">=18"},"gitHead":"26722eaef16700cd9006497b69160fd6d590b011","scripts":{"ci":"npm run typecheck && npm run test","dev":"tsx src/index.ts","test":"node --import tsx/esm --test 'src/**/*.test.ts'","build":"tsc -p tsconfig.build.json","generate":"tsx src/index.ts generate","typecheck":"tsc --noEmit","prepublishOnly":"npm run ci && npm run build"},"_npmUser":{"name":"afromero","email":"andres2912@gmail.com"},"repository":{"url":"git+https://github.com/affromero/kin3o.git","type":"git"},"_npmVersion":"10.9.7","description":"AI-powered Lottie animation generator — text to motion from your terminal","directories":{},"_nodeVersion":"22.22.2","dependencies":{"open":"^10.1.0","commander":"^13.0.0","lottie-react":"^2.4.1","puppeteer-core":"^24.0.0","@anthropic-ai/sdk":"^0.78.0","@dotlottie/dotlottie-js":"^1.6.3"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","typescript":"^5.7.0","@types/node":"^22.13.0"},"_npmOperationalInternal":{"tmp":"tmp/kin3o_0.2.5_1775665794836_0.3138991428985578","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@afromero/kin3o","version":"0.3.0","description":"AI-powered Lottie animation generator — text to motion from your terminal","type":"module","license":"MIT","author":{"name":"Andres Romero","email":"me@afromero.co"},"repository":{"type":"git","url":"git+https://github.com/affromero/kin3o.git"},"keywords":["lottie","animation","ai","dotlottie","state-machine","cli","motion","claude","codex"],"bin":{"kin3o":"dist/index.js"},"scripts":{"dev":"tsx src/index.ts","generate":"tsx src/index.ts generate","build":"tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","test":"node --import tsx/esm --test 'src/**/*.test.ts'","ci":"npm run typecheck && npm run test","prepublishOnly":"npm run ci && npm run build"},"dependencies":{"@anthropic-ai/sdk":"^0.78.0","@dotlottie/dotlottie-js":"^1.6.3","commander":"^13.0.0","lottie-react":"^2.4.1","open":"^10.1.0","puppeteer-core":"^24.0.0"},"devDependencies":{"@types/node":"^22.13.0","tsx":"^4.0.0","typescript":"^5.7.0"},"engines":{"node":">=18"},"_id":"@afromero/kin3o@0.3.0","gitHead":"e8a7e7cefa6e52f3e36bfdf86bcaefa73af522eb","bugs":{"url":"https://github.com/affromero/kin3o/issues"},"homepage":"https://github.com/affromero/kin3o#readme","_nodeVersion":"22.22.2","_npmVersion":"10.9.7","dist":{"integrity":"sha512-fYuXt8TTP5PuB7SVjslVVXxBgCtyzG/JunL0BAvDhU9rRvCh0kmLAPFKHiZmeK6X8m0DHjuCslY8a0xWj1xABA==","shasum":"5e117b0685e361b5500515d1d998da4967918872","tarball":"https://registry.npmjs.org/@afromero/kin3o/-/kin3o-0.3.0.tgz","fileCount":59,"unpackedSize":245664,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@afromero%2fkin3o@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDXyVB2uxQc7FN1YX/hD74tx8WbHBZluhSnW3mW6pZDqwIgWv7dTI0P1k9XxvjcLYVz2HFlAkm1G2jGdz3n07mdw8U="}]},"_npmUser":{"name":"afromero","email":"andres2912@gmail.com"},"directories":{},"maintainers":[{"name":"afromero","email":"andres2912@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/kin3o_0.3.0_1776276437182_0.1534832226365772"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-15T12:38:27.702Z","modified":"2026-04-15T18:07:17.604Z","0.1.0":"2026-03-15T12:38:27.911Z","0.2.0":"2026-03-15T14:06:41.209Z","0.2.1":"2026-03-15T14:24:15.502Z","0.2.2":"2026-03-15T14:39:08.344Z","0.2.3":"2026-03-15T19:02:38.084Z","0.2.4":"2026-03-22T12:00:01.854Z","0.2.5":"2026-04-08T16:29:54.985Z","0.3.0":"2026-04-15T18:07:17.337Z"},"bugs":{"url":"https://github.com/affromero/kin3o/issues"},"author":{"name":"Andres Romero","email":"me@afromero.co"},"license":"MIT","homepage":"https://github.com/affromero/kin3o#readme","keywords":["lottie","animation","ai","dotlottie","state-machine","cli","motion","claude","codex"],"repository":{"type":"git","url":"git+https://github.com/affromero/kin3o.git"},"description":"AI-powered Lottie animation generator — text to motion from your terminal","maintainers":[{"name":"afromero","email":"andres2912@gmail.com"}],"readme":"<div align=\"center\">\n\n# kin3o\n\n**Text to Motion. From your terminal.**\n\n[![npm](https://img.shields.io/npm/v/@afromero/kin3o)](https://www.npmjs.com/package/@afromero/kin3o)\n[![downloads](https://img.shields.io/npm/dm/@afromero/kin3o)](https://www.npmjs.com/package/@afromero/kin3o)\n[![CI](https://github.com/affromero/kin3o/actions/workflows/ci.yml/badge.svg)](https://github.com/affromero/kin3o/actions/workflows/ci.yml)\n[![TypeScript](https://img.shields.io/badge/TypeScript-strict-blue)](https://www.typescriptlang.org/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT)\n[![Socket](https://img.shields.io/badge/Socket-protected-blueviolet?logo=socket.dev)](https://socket.dev)\n[![min-release-age](https://img.shields.io/badge/min--release--age-7%20days-brightgreen)](https://docs.npmjs.com/cli/v10/using-npm/config#min-release-age)\n[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/affromero/kin3o/pulls)\n\nAI-powered Lottie animation generator. Turns natural language prompts into valid, playable Lottie JSON and interactive dotLottie state machines using your existing Claude or Codex subscription.\n\n<img src=\"assets/stick-figure-demo.gif\" alt=\"Interactive state machine demo — hover to walk, press to run\" width=\"640\" />\n\n</div>\n\n## Why?\n\nGreat tools like [LottieFiles](https://lottiefiles.com), [Lottielab](https://www.lottielab.com), and [Rive](https://rive.app) offer powerful visual editors, massive animation libraries, and team collaboration — if you need a full design workflow, they're excellent choices.\n\nkin3o takes a different approach: it's a CLI tool for developers who want to generate animations from their terminal using AI subscriptions they already pay for. Search and download from the [LottieFiles](https://lottiefiles.com) marketplace (122K+ community animations), refine with AI, and publish back — all without leaving the terminal.\n\n## Choosing the right tool\n\nThere are great tools for different animation workflows. Here's an honest look at where each shines:\n\n| Tool | Best for | Strengths |\n|------|----------|-----------|\n| **kin3o** | Developers who want animations from their terminal | CLI-first, uses your existing AI subscription, open source, git-friendly JSON output, interactive state machines from text |\n| [**Rive**](https://rive.app) | Complex interactive animations with a visual editor | Skeletal animation, mesh deformation, runtime inputs (cursor tracking, sliders), built-in state machines, beautiful visual editor |\n| [**LottieFiles**](https://lottiefiles.com) | Finding and sharing animations | Massive community library, Motion Copilot AI, After Effects integration, team collaboration — kin3o integrates directly for search, download, and publish |\n| [**Lottielab**](https://www.lottielab.com) | Designing Lottie animations visually | Polished editor with timeline and keyframes, team collaboration, export to Lottie JSON |\n| [**Recraft**](https://www.recraft.ai) | AI-powered design with animation export | Visual AI design tool, vector and animation output, broad creative capabilities |\n\n## Quick Start\n\n```bash\n# Install globally\nnpm install -g @afromero/kin3o\n\n# Generate a static animation\nkin3o generate \"loading spinner with 3 dots\"\n\n# Generate an interactive state machine\nkin3o generate \"toggle switch with on/off states\" --interactive\n```\n\nOr use without installing:\n\n```bash\nnpx @afromero/kin3o generate \"pulsing circle\"\n```\n\n## CLI Usage\n\n```bash\n# Static animations (.json)\nkin3o generate \"pulsing circle that breathes\"\nkin3o generate \"5-bar audio waveform\" --provider claude-code --model sonnet\nkin3o generate \"notification bell\" --no-preview --output bell.json\nkin3o generate \"loading dots\" --tokens sotto\n\n# Motion personality\nkin3o generate \"bouncy loading dots\" --personality playful\nkin3o generate \"dashboard chart entrance\" --personality corporate\nkin3o generate \"luxury brand reveal\" --personality premium\nkin3o generate \"sports highlight reel\" --personality energetic\nkin3o generate \"happy celebration confetti\"                        # auto-detects personality + emotion\n\n# Interactive state machines (.lottie)\nkin3o generate \"toggle switch with on/off states\" --interactive\nkin3o generate \"like button with hover and click\" --interactive\n\n# Refine an existing animation\nkin3o refine output/animation.json \"make it faster and add easing\"\nkin3o refine output/animation.lottie \"add a bounce on the pressed state\"\n\n# Preview\nkin3o preview output/animation.json\nkin3o preview output/animation.lottie\n\n# Validate\nkin3o validate output/animation.json\nkin3o validate output/animation.lottie\n\n# List available AI providers\nkin3o providers\n\n# Marketplace (LottieFiles)\nkin3o search \"loading spinner\"                         # Search marketplace\nkin3o search --featured --limit 10                     # Browse featured\nkin3o search --popular                                 # Browse popular\nkin3o search \"button\" --no-browser                     # Terminal output only\nkin3o download abc12345                                # Download by UUID\nkin3o download <url> --lottie                          # Download as .lottie\nkin3o login                                            # Authenticate for publishing\nkin3o publish output/anim.json --name \"My Anim\" --tags \"loading,ui\"\nkin3o logout                                           # Clear auth token\n\n# Export to video\nkin3o export output/animation.json                     # MP4 (default: 1080p 30fps)\nkin3o export output/animation.json --format gif        # GIF\nkin3o export output/animation.json --format webm       # WebM (supports transparency)\nkin3o export output/animation.lottie --res 720p        # dotLottie → MP4 at 720p\nkin3o export output/animation.json --bg white -o out.mp4  # Custom background + path\n\n# Live preview with hot reload\nkin3o view output/animation.json                       # File watcher + auto-reload\nkin3o view output/animation.lottie --port 3000         # Specific port\n```\n\n### Options\n\n| Flag | Description |\n|------|-------------|\n| `-p, --provider <name>` | AI provider (`claude-code`, `codex`, `anthropic`) |\n| `-m, --model <name>` | Model (`sonnet`, `opus`, `haiku`, `codex`) |\n| `-o, --output <path>` | Output filename |\n| `--no-preview` | Skip browser preview |\n| `-i, --interactive` | Generate interactive state machine (`.lottie` output) |\n| `--personality <type>` | Motion personality: `playful`, `premium`, `corporate`, `energetic` |\n| `-t, --tokens <path>` | Design tokens JSON or `sotto` preset |\n| `--featured` | Browse featured marketplace animations |\n| `--popular` | Browse popular marketplace animations |\n| `--recent` | Browse recent marketplace animations |\n| `--limit <n>` | Number of search results (default: 20) |\n| `--no-browser` | Print search results in terminal |\n| `--lottie` | Download `.lottie` format instead of `.json` |\n| `--port <n>` | Port for view server (auto-selects if omitted) |\n| `--format <fmt>` | Export format: `mp4`, `webm`, `gif` (default: `mp4`) |\n| `--res <res>` | Export resolution: `1080p`, `720p`, `480p`, `4k`, or `WxH` |\n| `--fps <n>` | Export frames per second (default: `30`) |\n| `--bg <color>` | Export background color (hex or name) |\n\n## Using Generated Animations\n\n### Static animations (`.json`)\n\n```tsx\n// React (lottie-react)\nimport Lottie from 'lottie-react';\nimport animationData from './pulsing-circle.json';\n\n<Lottie animationData={animationData} loop autoplay />\n```\n\n```html\n<!-- Vanilla JS (lottie-web) -->\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/lottie-web/5.12.2/lottie.min.js\"></script>\n<div id=\"anim\"></div>\n<script>\n  lottie.loadAnimation({\n    container: document.getElementById('anim'),\n    path: './pulsing-circle.json',\n    loop: true,\n    autoplay: true,\n  });\n</script>\n```\n\n```swift\n// iOS (lottie-ios)\nlet animationView = LottieAnimationView(name: \"pulsing-circle\")\nanimationView.loopMode = .loop\nanimationView.play()\n```\n\n### Interactive state machines (`.lottie`)\n\n```html\n<!-- dotlottie-web — hover, click, and tap state transitions -->\n<script type=\"module\">\n  import { DotLottie } from 'https://esm.sh/@lottiefiles/dotlottie-web';\n  const dotLottie = new DotLottie({\n    canvas: document.querySelector('canvas'),\n    src: './toggle-switch.lottie',\n    autoplay: true,\n  });\n</script>\n```\n\n## Why Lottie?\n\nkin3o generates [Lottie](https://airbnb.io/lottie/) because its JSON format is ideal for AI generation — structured, text-based, and diffable. [Rive](https://rive.app) is a fantastic tool with capabilities Lottie doesn't have (skeletal animation, mesh deformation, runtime inputs), but its binary `.riv` format can't be generated by LLMs today.\n\n| What you need | Best tool |\n|--------------|-----------|\n| AI-generated animations from text | **kin3o** (Lottie JSON) |\n| Interactive state machines from text | **kin3o** (dotLottie) |\n| Skeletal animation, mesh deformation | [Rive](https://rive.app) (visual editor) |\n| Massive animation library + community | [LottieFiles](https://lottiefiles.com) |\n| Polished visual animation editor | [Lottielab](https://www.lottielab.com) or [Rive](https://rive.app) |\n| Runtime inputs (cursor tracking, sliders) | [Rive](https://rive.app) |\n| Search, download, publish to marketplace | **kin3o** + [LottieFiles](https://lottiefiles.com) |\n\nLottie covers shapes, paths, easing, color transitions, masking, and — via dotLottie — interactive state machines (hover, click, tap). That handles the vast majority of UI animations, loading states, and micro-interactions.\n\n## Architecture\n\n```\nStatic:      prompt → generate() → extractJson() → validateLottie() → autoFix() → .json → preview\nInteractive: prompt → generate() → extractInteractiveJson() → validate animations + state machine → .lottie → preview\nExport:      .json/.lottie → headless Chrome (lottie-web) → frame capture → FFmpeg → MP4/WebM/GIF\nMarketplace: search → browse → download → validate → .json/.lottie → refine → publish\nLive preview: view <file> → HTTP server + fs.watch → SSE → browser auto-reload\n```\n\n### Prompt System\n\nAll prompts live in `src/prompts/` with a barrel export at `src/prompts/index.ts`:\n\n| Module | Purpose |\n|--------|---------|\n| `system.ts` | Static Lottie generation prompt + `LOTTIE_FORMAT_REFERENCE` |\n| `system-interactive.ts` | Interactive state machine prompt (imports shared ref) |\n| `examples.ts` | Few-shot: pulsing circle, waveform bars |\n| `examples-interactive.ts` | Few-shot: interactive button (idle/hover/pressed) |\n| `examples-mascot.ts` | kin3o mascot/logo (static + interactive) |\n| `motion-design.ts` | Motion design principles — personality archetypes, emotion mapping, timing, easing, choreography |\n| `tokens.ts` | Design token loader (hex → Lottie RGBA) |\n\n## Prerequisites for Export\n\nThe `export` command requires Chrome/Chromium and FFmpeg installed on your system:\n\n```bash\n# macOS\nbrew install --cask google-chrome\nbrew install ffmpeg\n\n# Linux\nsudo apt install chromium-browser ffmpeg\n```\n\nOr set `CHROME_PATH` and `FFMPEG_PATH` environment variables to custom paths.\n\n## Development\n\n```bash\nnpm install\nnpm run typecheck    # Type check\nnpm run test         # Run tests (node --test)\nnpm run ci           # typecheck + test\nnpm run build        # Compile to dist/\n```\n\n## Related Projects\n\n| Project | Description |\n|---------|-------------|\n| [**Fairtrail**](https://github.com/affromero/fairtrail) | Flight price evolution tracker with natural language search |\n| [**PriceToken**](https://github.com/affromero/pricetoken) | Real-time LLM pricing API, npm/PyPI packages, and live dashboard |\n| [**gitpane**](https://github.com/affromero/gitpane) | Multi-repo Git workspace dashboard for the terminal |\n\n## Acknowledgments\n\nMotion design principles (personality archetypes, emotion mapping, timing tables, easing curves, choreography rules) are adapted from the [LottieFiles motion-design-skill](https://github.com/LottieFiles/motion-design-skill) (MIT), condensed and translated into Lottie-native parameters (tangent values, frame counts at 60fps).\n\n## License\n\nMIT\n","readmeFilename":"README.md"}