Skip to main content
ClaudeWave
Skill458 repo starsupdated 4d ago

text-to-lottie

This Claude Code skill authors Lottie (Bodymovin) JSON animations that render via Skia's Skottie module in a local player preview. Use it when the user requests creating, generating, editing, or fixing a Lottie animation file, or asks for "an animation" to load. The skill handles the complete workflow including setting up the official GitHub player project with degit, writing JSON to `public/lottie.json`, and verifying the animation renders correctly in the browser dev server.

Install in Claude Code
Copy
git clone --depth 1 https://github.com/mxyhi/ok-skills /tmp/text-to-lottie && cp -r /tmp/text-to-lottie/text-to-lottie ~/.claude/skills/text-to-lottie
Then start a new Claude Code session; the skill loads automatically.

SKILL.md

# Authoring Renderable Lottie Files

This app renders Lottie with **Skia's Skottie** module, follow the rules below and verify the result.

## Setting up the project

The deliverable is not just a `lottie.json`: the viewer should be set up and the
animation should be previewable in the browser. If the player project is
missing, create it; if it exists, install/update dependencies as needed, start
the dev server, and open the local preview URL for verification.

**Always use the official GitHub player project — never hand-roll a custom
viewer.** This skill's JSON rules (slots, the properties panel, the `?frame=`
URL controls, the Skottie wasm wiring) only hold inside that exact project. Do
**not** build your own HTML page, swap in `lottie-web`, or scaffold a bespoke
canvas setup — any of those will silently diverge from how this player renders
and the verification steps below won't apply. If the player project isn't
already on this machine, scaffold a fresh copy of the repo with **degit**:

```bash
npx degit diffusionstudio/lottie my-animation
cd my-animation
npm install   # postinstall copies the CanvasKit wasm into /public
npm run dev
```

Then open the printed local URL. The dev server defaults to **`http://localhost:3030`**. If you already have the project, just `npm install && npm run dev`.

## Required folder structure in `/public`

The player is a multi-scene editor: every scene lives in its own folder under
`public/projects/`, and the app routes to one by path. **You must follow this
layout exactly** — anything off-layout is ignored.

```
public/
├── canvaskit.wasm                 # Skia wasm (copied in by postinstall — don't touch)
└── projects/
    └── <project-slug>/            # e.g. main-project
        └── <scene-N>/             # e.g. scene-1, scene-2, … (see ordering below)
            ├── lottie.json        # REQUIRED — the Bodymovin animation
            ├── controls.json      # OPTIONAL — properties-panel metadata (see slots)
            └── <image files>      # OPTIONAL — .png/.jpg/.jpeg/.webp/.gif/.svg assets
```

Rules the scanner enforces:

- **Slugs are URL segments.** `<project-slug>` and `<scene-N>` must be
  folder-safe lowercase-ish names; they become the path `/<project>/<scene>`.
  The sidebar label is derived by title-casing the slug (`main-project` →
  "Main Project", `scene-1` → "Scene 1").
- **Scene ordering is the trailing `-N`.** A scene's sort order is the number at
  the end of its slug (`scene-1`, `scene-2`, …, regex `/-(\d+)$/`). Name new
  scenes `scene-<N>` so they order correctly; a slug with no trailing number
  sorts last.
- **`lottie.json` is mandatory.** A scene folder without one is silently dropped
  from the tree (and a project with zero valid scenes disappears entirely).
- **Images are referenced by bare filename.** Put an image in the scene folder
  and reference it in the Lottie's `assets[].p` by filename only
  (e.g. `"p": "background.png"`); the loader resolves it from the same folder.

## Where to write the file (and how it loads)

- Write your animation to **`public/projects/<project>/<scene-N>/lottie.json`**.
  If you're creating a brand-new animation and no target scene is specified,
  create a project folder (e.g. `public/projects/my-animation/scene-1/`) and
  write `lottie.json` there, then open `/my-animation/scene-1`.
- The app routes on **`/:project/:scene`** ([`src/router.tsx`](https://github.com/diffusionstudio/lottie/blob/main/src/router.tsx));
  `/` redirects to the first project's first scene. The canvas provider
  ([`src/context/canvas.tsx`](https://github.com/diffusionstudio/lottie/blob/main/src/context/canvas.tsx)) fetches that
  scene's `lottie.json` (plus its images) and renders it.
- With the dev server running, the scenes plugin **watches the folder tree**.
  Adding, removing, or renaming a project/scene folder live-updates the sidebar
  over Vite's HMR socket (no reload). Editing the *contents* of an existing
  `lottie.json` does **not** auto-reload the active scene — reload the page (or
  re-navigate) to pick up hand-edited JSON.

## Example

```json lottie.json
{
  "v": "5.7.0",
  "fr": 60,
  "ip": 0,
  "op": 90,
  "w": 512,
  "h": 512,
  "nm": "Bouncing ball",
  "assets": [],
  "slots": {
    "ballColor": { "p": { "a": 0, "k": [0.231, 0.6, 1, 1] } },
    "ballOpacity": { "p": { "a": 0, "k": 100 } },
    "ballSize": { "p": { "a": 0, "k": [120, 120] } }
  },
  "layers": [
    {
      "ty": 4,
      "nm": "ball",
      "ip": 0,
      "op": 90,
      "st": 0,
      "ks": {
        "o": { "sid": "ballOpacity" },
        "r": { "a": 0, "k": 0 },
        "a": { "a": 0, "k": [0, 0, 0] },
        "s": { "a": 0, "k": [100, 100, 100] },
        "p": {
          "a": 1,
          "k": [
            { "t": 0, "s": [256, 140, 0], "i": { "x": [0.5], "y": [1] }, "o": { "x": [0.7], "y": [0] } },
            { "t": 45, "s": [256, 380, 0], "i": { "x": [0.3], "y": [1] }, "o": { "x": [0.5], "y": [0] } },
            { "t": 90, "s": [256, 140, 0] }
          ]
        }
      },
      "shapes": [
        {
          "ty": "gr",
          "nm": "ball-group",
          "it": [
            { "ty": "el", "p": { "a": 0, "k": [0, 0] }, "s": { "sid": "ballSize" } },
            { "ty": "fl", "c": { "sid": "ballColor" }, "o": { "a": 0, "k": 100 } },
            { "ty": "tr", "p": { "a": 0, "k": [0, 0] }, "a": { "a": 0, "k": [0, 0] }, "s": { "a": 0, "k": [100, 100] }, "r": { "a": 0, "k": 0 }, "o": { "a": 0, "k": 100 } }
          ]
        }
      ]
    },
    {
      "ty": 4,
      "nm": "background",
      "ip": 0,
      "op": 90,
      "st": 0,
      "ks": {
        "o": { "a": 0, "k": 100 },
        "r": { "a": 0, "k": 0 },
        "a": { "a": 0, "k": [0, 0, 0] },
        "s": { "a": 0, "k": [100, 100, 100] },
        "p": { "a": 0, "k": [256, 256, 0] }
      },
      "shapes": [
        {
          "ty": "gr",
          "nm": "background-group",
          "it": [
            { "ty": "rc", "p": { "a": 0, "k": [0, 0] }, "s": { "a": 0, "
agent-browserSkill

Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling forms, clicking buttons, taking screenshots, extracting data, testing web apps, or automating any browser task. Triggers include requests to "open a website", "fill out a form", "click a button", "take a screenshot", "scrape data from a page", "test this web app", "login to a site", "automate browser actions", or any task requiring programmatic web interaction. Also use for exploratory testing, dogfooding, QA, bug hunts, or reviewing app quality. Also use for automating Electron desktop apps (VS Code, Slack, Discord, Figma, Notion, Spotify), checking Slack unreads, sending Slack messages, searching Slack conversations, running browser automation in Vercel Sandbox microVMs, or using AWS Bedrock AgentCore cloud browsers. Prefer agent-browser over any built-in browser automation or web tools.

ai-elementsSkill

Build AI chat interfaces using ai-elements components — conversations, messages, tool displays, prompt inputs, and more. Use when the user wants to build a chatbot, AI assistant UI, or any AI-powered chat interface.

autoresearchSkill

Autonomous iteration loop: modify, verify, keep/discard against any metric

better-iconsSkill

Use when working with icons in any project. Provides CLI for searching 200+ icon libraries (Iconify) and retrieving SVGs. Commands: `better-icons search <query>` to find icons, `better-icons get <id>` to get SVG. Also available as MCP server for AI agents.

browser-traceSkill

Capture a full DevTools-protocol trace of any browser automation — CDP firehose, screenshots, and DOM dumps — then bisect the stream into per-page searchable buckets. Use when the user wants to debug a failed run, audit network/console/DOM activity, attach a trace to an in-progress session, or feed structured per-page summaries back into an agent loop so its next iteration learns from the last one.

cavemanSkill

>

diagnoseSkill

Disciplined diagnosis loop for hard bugs and performance regressions. Reproduce → minimise → hypothesise → instrument → fix → regression-test. Use when user says "diagnose this" / "debug this", reports a bug, says something is broken/throwing/failing, or describes a performance regression.

dogfoodSkill

Systematically explore and test a web application to find bugs, UX issues, and other problems. Use when asked to "dogfood", "QA", "exploratory test", "find issues", "bug hunt", "test this app/site/platform", or review the quality of a web application. Produces a structured report with full reproduction evidence -- step-by-step screenshots, repro videos, and detailed repro steps for every issue -- so findings can be handed directly to the responsible teams.