Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Deploy Anima design-to-code service as a backend API endpoint. Use when building a design-to-code microservice, deploying Anima SDK as a serverless function, or creating an internal design tool API. Trigger: "deploy anima", "anima service deploy", "anima serverless".
.claude/skills/jeremylongshore-anima-deploy-integration/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | -9% | 0% |
| case-01 | ✗→✓ | ▲ Improved | -14% | 0% |
| case-05 | ✗→✓ | ▲ Improved | -23% | 0% |
| case-07 | ✗→✓ | ▲ Improved | -30% | 0% |
| case-09 | ✗→✓ | ▲ Improved | -17% | 0% |
Deploy the Anima SDK as a backend service. The SDK is server-side only, so deploy it behind an API endpoint that accepts Figma file/node references and returns generated code.
registry; do not expose arbitrary fileKey and nodesId generation to the public internet.
request limits, and an audit trail that excludes token values and design content.
for every deployment revision.
typescript// src/server.ts import express from 'express'; import { Anima } from '@animaapp/anima-sdk'; const app = express(); app.use(express.json()); const anima = new Anima({ auth: { token: process.env.ANIMA_TOKEN! } }); app.post('/api/generate', async (req, res) => { const { fileKey, nodesId, settings } = req.body; if (!fileKey || !nodesId?.length) { return res.status(400).json({ error: 'fileKey and nodesId required' }); } try { const { files } = await anima.generateCode({ fileKey, figmaToken: process.env.FIGMA_TOKEN!, nodesId, settings: settings || { language: 'typescript', framework: 'react', styling: 'tailwind' }, }); res.json({ files, count: Object.keys(files).length }); } catch (err: any) { res.status(502).json({ error: 'Generation failed', requestId: req.id }); } }); app.get('/health', (_req, res) => res.json({ status: 'ok' })); app.listen(3000, () => console.log('Anima service on :3000'));
typescript// api/generate.ts import { Anima } from '@animaapp/anima-sdk'; const anima = new Anima({ auth: { token: process.env.ANIMA_TOKEN! } }); export default async function handler(req: any, res: any) { if (req.method !== 'POST') return res.status(405).end(); const { fileKey, nodesId, settings } = req.body; const { files } = await anima.generateCode({ fileKey, figmaToken: process.env.FIGMA_TOKEN!, nodesId, settings: settings || { language: 'typescript', framework: 'react', styling: 'tailwind' }, }); res.json({ files }); }
bash# Vercel vercel secrets add anima_token "$ANIMA_TOKEN" vercel secrets add figma_token "$FIGMA_TOKEN" vercel --prod # Cloud Run gcloud run deploy anima-service \ --source . \ --set-secrets=ANIMA_TOKEN=anima-token:latest,FIGMA_TOKEN=figma-token:latest \ --region us-central1 --no-allow-unauthenticated
Use Read and Grep to inspect the existing integration and generated diff before changing anything. Use Write or Edit only inside the approved generated-code, test, or configuration paths. Use the declared Bash commands only for the explicit install, validation, or diagnostic steps in this workflow; never print tokens, source designs, generated source, or private website captures.
Deploy the service to a staging environment behind the organization’s existing identity proxy and invoke /api/generate with one allowlisted file/node pair. Verify the request is authorized, output remains in the approved generated-code location, logs contain only request metadata, and generated files pass the downstream formatter and test gate before a human reviews them. If an unauthenticated caller, unknown node, or secret-binding error reaches the service, reject the request, alert the operator, and keep the prior revision active rather than opening broad access or embedding credentials in the client.
| Failure | Response | |---------|----------| | Caller is not authenticated or file/node is not allowlisted | Reject before contacting Anima or Figma. | | Managed secret is unavailable | Fail closed and repair the deployment binding; never use a plaintext fallback. | | Generation or validation fails | Return a sanitized failure, preserve the prior revision, and quarantine the output. | | Rate limit or repeated bad requests occur | Apply bounded throttling and alert the owning service team. |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-03 | fail→pass | 16,191 | 10,556 | -35% | 1 | 1 | 0% | 3,401 | 3,099 | -9% | 0 | 0 | — |
case-01 | fail→pass | 15,936 | 9,531 | -40% | 1 | 1 | 0% | 3,619 | 3,119 | -14% | 0 | 0 | — |
case-02 | fail→fail | 15,668 | 11,947 | -24% | 1 | 1 | 0% | 3,478 | 3,739 | +8% | 0 | 0 | — |
case-04 | pass→pass | 13,290 | 13,942 | +5% | 1 | 1 | 0% | 2,779 | 3,616 | +30% | 0 | 0 | — |
case-05 | fail→pass | 17,700 | 10,047 | -43% | 1 | 1 | 0% | 3,838 | 2,961 | -23% | 0 | 0 | — |
case-06 | pass→pass | 10,651 | 6,846 | -36% | 1 | 1 | 0% | 2,189 | 2,255 | +3% | 0 | 0 | — |
case-07 | fail→pass | 11,987 | 3,968 | -67% | 1 | 1 | 0% | 2,274 | 1,587 | -30% | 0 | 0 | — |
case-08 | pass→pass | 6,838 | 4,963 | -27% | 1 | 1 | 0% | 1,360 | 1,799 | +32% | 0 | 0 | — |
case-09 | fail→pass | 7,594 | 2,642 | -65% | 1 | 1 | 0% | 1,384 | 1,144 | -17% | 0 | 0 | — |
case-10 | pass→pass | 8,706 | 5,531 | -36% | 1 | 1 | 0% | 1,558 | 1,785 | +15% | 0 | 0 | — |
case-11 | fail→pass | 14,374 | 3,408 | -76% | 1 | 1 | 0% | 2,966 | 1,392 | -53% | 0 | 0 | — |
case-12 | fail→pass | 8,778 | 3,317 | -62% | 1 | 1 | 0% | 1,668 | 1,420 | -15% | 0 | 0 | — |
case-13 | fail→pass | 9,453 | 5,601 | -41% | 1 | 1 | 0% | 1,906 | 1,786 | -6% | 0 | 0 | — |
case-14 | fail→pass | 4,258 | 2,786 | -35% | 1 | 1 | 0% | 896 | 1,351 | +51% | 0 | 0 | — |
case-15 | fail→pass | 6,502 | 5,558 | -15% | 1 | 1 | 0% | 1,331 | 1,833 | +38% | 0 | 0 | — |
case-16 | fail→pass | 8,541 | 9,314 | +9% | 1 | 1 | 0% | 1,801 | 2,670 | +48% | 0 | 0 | — |
case-17 | fail→pass | 6,342 | 1,956 | -69% | 1 | 1 | 0% | 1,240 | 1,178 | -5% | 0 | 0 | — |
case-18 | fail→pass | 8,226 | 3,287 | -60% | 1 | 1 | 0% | 1,631 | 1,504 | -8% | 0 | 0 | — |
case-19 | pass→pass | 2,366 | 2,475 | +5% | 1 | 1 | 0% | 422 | 1,229 | +191% | 0 | 0 | — |
case-20 | pass→pass | 2,559 | 2,459 | -4% | 1 | 1 | 0% | 429 | 1,228 | +186% | 0 | 0 | — |
case-21 | pass→pass | 2,082 | 2,909 | +40% | 1 | 1 | 0% | 349 | 1,125 | +222% | 0 | 0 | — |
case-22 | fail→pass | 6,471 | 3,280 | -49% | 1 | 1 | 0% | 1,316 | 1,046 | -21% | 0 | 0 | — |
case-23 | fail→pass | 6,581 | 5,455 | -17% | 1 | 1 | 0% | 1,345 | 1,966 | +46% | 0 | 0 | — |
case-24 | pass→pass | 9,694 | 8,151 | -16% | 1 | 1 | 0% | 1,910 | 2,526 | +32% | 0 | 0 | — |
case-25 | fail→pass | 5,415 | 2,053 | -62% | 1 | 1 | 0% | 875 | 1,122 | +28% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 25 cases were attempted. The headline lift of +64 percentage points is the difference between those two pass rates over the 25 comparable cases.
The publisher has shipped newer versions since this run, so these numbers describe v1, not the version currently listed.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.