agentleFS
soilmasssoilmass/motion-design-agent/skills/export/SKILL.md

export

Skill7 starsChanged 10 months agoMITView on GitHub

Animation export configurations including format selection, resolution, framerate, quality, and optimization settings. Use when rendering animations for web, mobile, video, or social media. Provides tokens for all export parameters across Lottie, GIF, video, and sprite sheet formats.

24 other projects use a version of this.

Adopted by

Most recently taken up by

Used with

Projects with it also use menu, import and 8 more.

Other files people use alongside this one.

Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
  • sasly2048Skill

    menu

    Point the user to cc-atlas's full interactive menu (dashboard, project comparison, session replay, team activity, anomalies, goals) — screens that need a real terminal.

    Also in 3 projects that use this

  • michaelenglandSkill

    import

    This skill should be used when the user wants to import an existing .pptx file into deckwright, bring in a PowerPoint that was created outside this tool, reverse-engineer a presentation for editing, or invoke /deckwright:import. Converts a .pptx into a PptxGenJS generation script so it can be edited and regenerated through the deckwright pipeline.

    Also in 3 projects that use this

  • kv0906Skill

    preview

    Render vault notes as styled HTML and open in browser. Turn markdown docs, decisions, progress reports into readable previews. Use for "/preview docs/project-a/checkout-flow.md", "/preview progress all", "/preview decide auth-approach", or when user wants to see a doc before sharing.

    Also in 3 projects that use this

  • AnthropicSkill

    search

    Search across all connected sources in one query. Trigger with "find that doc about...", "what did we decide on...", "where was the conversation about...", or when looking for a decision, document, or discussion that could live in chat, email, cloud storage, or a project tracker.

    Also in 4 projects that use this

  • GoogleSkill

    dashboard

    Configures and launches the GKE Capacity & Triage Dashboard scoped to a GCP project ID, GKE cluster name, or target ML workload ID. Uses the configure-and-launch-dashboard action and launch-workload-dashboard workflow to verify local dashboard health, discover cluster capacity, trigger live scans, and generate deep-linked URLs. Use when the user types "/dashboard", says "launch dashboard", "open dashboard", "show capacity", or "view triage dashboard" with a project, cluster, or workload. Don't use for general workload log querying or automated failure attribution (use the troubleshoot skill).

    Also in 4 projects that use this

  • MicrosoftSkill

    report

    Turn an exploration (threads, findings, charts) into a single Markdown report — note, blog post, executive summary, KPI dashboard, slide brief, or multi-section analytical report, with embedded charts.

    Also in 4 projects that use this

The file

We split this skill into the rules it gives an agent

3 rules. 0 are common, 3 are distinctive, and 0 are very specific to this project.

  • 0

    Common

    Most of the 17 edited versions we read keep these.

  • 3

    Distinctive

    This author's own choices. Worth a look.

  • 0

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Always provide static fallback images

    line 342
  2. Distinctive:

    Consider lower framerate exports for reduced motion

    line 343
  3. Distinctive:

    No additional references needed for this skill

    line 369

“Common” is measured: kept by at least 6 in 10 of the 17 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Export

Animation rendering and export configuration.

Standards Reference

StandardDocumentation
W3C DTCGdesigntokens.org
Lottie Speclottie.github.io
WebMwebmproject.org
H.264/MP4mpeg.org

Quick Reference

Load from: tokens/export.tokens.json

Output Formats

TokenFormatUse
format.lottieJSONWeb/mobile vector
format.gifGIFUniversal compat
format.webmWebMWeb video
format.mp4MP4Broad compat
format.apngAPNGTransparency

Resolution Presets

TokenSizeUse
resolution.1080p1920x1080Full HD
resolution.720p1280x720HD
resolution.social-square1080x1080Instagram
resolution.social-story1080x1920Stories

Framerate

TokenFPSUse
framerate.web60Web animations
framerate.video30Standard video
framerate.film24Cinematic
framerate.gif15GIF optimization

Selection Guide

What's the target platform?
│
├── WEB → Vector or video
│   ├── Interactive → format.lottie + framerate.web
│   ├── Background → format.webm + framerate.video
│   └── Legacy → format.gif + framerate.gif
│
├── MOBILE → Native or web
│   ├── iOS/Android → format.lottie
│   ├── Cross-platform → format.lottie or format.gif
│   └── High quality → format.mp4
│
├── SOCIAL MEDIA
│   ├── Instagram → resolution.social-square + format.mp4
│   ├── Stories → resolution.social-story + format.mp4
│   └── Twitter → resolution.720p + format.mp4
│
├── VIDEO PRODUCTION
│   ├── 4K → resolution.4k + framerate.video
│   ├── 1080p → resolution.1080p + framerate.film
│   └── Preview → resolution.720p + quality.preview
│
└── GAME/APP
    ├── Sprite sheet → format.sprite-sheet
    ├── Vector → format.lottie
    └── Video bg → format.webm

Patterns

Lottie Export Configuration

Remotion:

import { renderMedia } from '@remotion/renderer';
import { bundle } from '@remotion/bundler';

const exportLottie = async (composition) => {
  // Note: Remotion doesn't export Lottie directly
  // Use for video, then convert or use Lottie-specific tools

  await renderMedia({
    composition,
    serveUrl: bundled,
    codec: 'h264',
    outputLocation: 'output.mp4',
    fps: 30, // {motion.export.framerate.video}
    crf: 18, // High quality
  });
};

Lottie Optimization:

// Lottie optimization settings
const lottieOptimize = {
  precision: 2, // {motion.export.optimization.lottie.precision}
  compress: true, // {motion.export.optimization.lottie.compress}

  // Remove unnecessary data
  removeExpressions: true,
  removeGuides: true,

  // Reduce keyframe density
  keyframeTolerance: 0.01,

  // Flatten transforms where possible
  flattenTransforms: true
};

GIF Export Configuration

Node.js with gif-encoder:

const GIFEncoder = require('gifencoder');

function createGifEncoder(width, height) {
  const encoder = new GIFEncoder(width, height);

  encoder.start();
  encoder.setRepeat(0); // 0 = loop forever
  encoder.setDelay(1000 / 15); // {motion.export.framerate.gif}
  encoder.setQuality(10); // Lower = better quality

  return encoder;
}

// Add frames
frames.forEach(frame => {
  encoder.addFrame(frame);
});

encoder.finish();

FFmpeg GIF:

# High quality GIF with palette
ffmpeg -i input.mp4 \
  -vf "fps=15,scale=480:-1:flags=lanczos,palettegen" \
  palette.png

ffmpeg -i input.mp4 -i palette.png \
  -filter_complex "fps=15,scale=480:-1:flags=lanczos[x];[x][1:v]paletteuse" \
  -loop 0 \
  output.gif

Video Export (Remotion)

1080p Standard:

import { renderMedia } from '@remotion/renderer';

await renderMedia({
  composition: myComp,
  serveUrl: bundled,
  codec: 'h264',
  outputLocation: 'output.mp4',
  imageFormat: 'jpeg',
  jpegQuality: 90, // {motion.export.quality.high}
  fps: 30, // {motion.export.framerate.video}
  crf: 18, // ~high quality
  width: 1920, // {motion.export.resolution.1080p}
  height: 1080,
});

4K High Quality:

await renderMedia({
  composition: myComp,
  serveUrl: bundled,
  codec: 'h264',
  outputLocation: 'output-4k.mp4',
  fps: 30,
  crf: 15, // Very high quality
  width: 3840, // {motion.export.resolution.4k}
  height: 2160,
  videoBitrate: '10M', // {motion.export.optimization.video.bitrate-high}
});

WebM for Web:

await renderMedia({
  composition: myComp,
  serveUrl: bundled,
  codec: 'vp8', // or 'vp9' for better quality
  outputLocation: 'output.webm',
  fps: 60, // {motion.export.framerate.web}
  width: 1920,
  height: 1080,
  videoBitrate: '5M', // {motion.export.optimization.video.bitrate-medium}
});

Social Media Presets

Instagram Square:

const instagramSquare = {
  width: 1080, // {motion.export.resolution.social-square}
  height: 1080,
  fps: 30,
  codec: 'h264',
  crf: 18,
  videoBitrate: '5M'
};

Instagram/TikTok Story:

const storyFormat = {
  width: 1080, // {motion.export.resolution.social-story}
  height: 1920,
  fps: 30,
  codec: 'h264',
  crf: 18,
  videoBitrate: '8M'
};

Sprite Sheet Export

Canvas-based:

function exportSpriteSheet(animation, options = {}) {
  const {
    columns = 8, // {motion.export.sprite.columns.grid-8}
    padding = 2, // {motion.export.sprite.padding.medium}
    frameWidth,
    frameHeight,
    frameCount
  } = options;

  const rows = Math.ceil(frameCount / columns);
  const sheetWidth = columns * (frameWidth + padding) - padding;
  const sheetHeight = rows * (frameHeight + padding) - padding;

  const canvas = document.createElement('canvas');
  canvas.width = sheetWidth;
  canvas.height = sheetHeight;
  const ctx = canvas.getContext('2d');

  for (let i = 0; i < frameCount; i++) {
    const col = i % columns;
    const row = Math.floor(i / columns);
    const x = col * (frameWidth + padding);
    const y = row * (frameHeight + padding);

    // Render frame i to position x, y
    renderFrame(ctx, animation, i, x, y);
  }

  return canvas.toDataURL('image/png');
}

Quality/Size Tradeoffs

const exportPresets = {
  highQuality: {
    // Maximum quality, larger files
    quality: 90, // {motion.export.quality.high}
    fps: 60, // {motion.export.framerate.web}
    crf: 15,
    bitrate: '10M'
  },
  balanced: {
    // Good quality, reasonable size
    quality: 75, // {motion.export.quality.medium}
    fps: 30, // {motion.export.framerate.video}
    crf: 23,
    bitrate: '5M'
  },
  webOptimized: {
    // Smaller files for web
    quality: 75,
    fps: 30,
    crf: 28,
    bitrate: '2M' // {motion.export.optimization.video.bitrate-low}
  },
  preview: {
    // Quick preview, small files
    quality: 30, // {motion.export.quality.preview}
    fps: 15, // {motion.export.framerate.gif}
    crf: 35,
    bitrate: '1M'
  }
};

Format Selection Helper

function selectExportFormat(requirements) {
  const { platform, transparency, fileSize, quality, interactivity } = requirements;

  if (interactivity) {
    return 'lottie'; // {motion.export.format.lottie}
  }

  if (transparency) {
    if (platform === 'web' && !isLegacyBrowser()) {
      return 'webp'; // {motion.export.format.webp}
    }
    return 'apng'; // {motion.export.format.apng}
  }

  if (fileSize === 'small') {
    return 'gif'; // {motion.export.format.gif}
  }

  if (platform === 'web') {
    return 'webm'; // {motion.export.format.webm}
  }

  return 'mp4'; // {motion.export.format.mp4}
}

Reduced Motion

Export considerations for accessibility:

  • Always provide static fallback images
  • Consider lower framerate exports for reduced motion
  • Provide poster frames for video
const accessibleExport = {
  // Main animation
  animation: { format: 'lottie', fps: 60 },

  // Reduced motion version
  reducedMotion: { format: 'png', static: true },

  // Poster frame
  poster: { format: 'png', frame: 0 }
};

Cross-References

  • See lottie/ for Lottie-specific features
  • See remotion/ for video rendering details
  • See frame-timing/ for framerate calculations
  • See duration/ for animation length planning
  • See accessibility/ for fallback requirements

References

  • No additional references needed for this skill

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.