skills/data-viz-commercials/SKILL.md
Expert in turning data visualizations into compelling video and animation content for social media and marketing. Activate on: data commercial, animated chart, data storytelling video, chart animation, Remotion data video, Motion Canvas, Flourish animation, D3 animation, data viz social media, dashboard recording, data narrative video. NOT for: static data visualization (use data-viz-2025), general video editing (use video-processing-editing), full video production pipeline (use ai-video-production-master).
npx skillsauth add curiositech/windags-skills data-viz-commercialsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Expert in turning data stories into compelling video and animation content — the intersection of data visualization, motion design, and narrative storytelling that makes data shareable on social media.
IF need 100+ personalized videos from dataset
→ Use Remotion (React-based, data-driven)
ELSE IF need explainer with voice-over sync
→ Use Motion Canvas (TypeScript generators)
ELSE IF need bar chart race for social media quickly
→ Use Flourish (no-code, built-in templates)
ELSE IF recording existing dashboard
→ Use OBS Studio + screen capture
ELSE IF custom web interactive
→ Use D3 + GSAP
IF audience = social media (Twitter/LinkedIn)
→ Hook (0-3s) → Insight (3-15s) → Proof (15-25s) → CTA (25-30s)
ELSE IF audience = presentation/explainer
→ Context (0-10s) → Problem (10-20s) → Data reveal (20-45s) → Solution (45-60s)
ELSE IF audience = educational
→ Question (0-5s) → Setup (5-15s) → Step-by-step reveal (15-50s) → Summary (50-60s)
IF showing magnitude/comparison
→ Grow bars from zero (1-2s per group)
ELSE IF showing trend over time
→ Line drawing left-to-right (2-3s total path)
ELSE IF showing transformation
→ Morph transition (1-1.5s between states)
ELSE IF showing multiple categories
→ Cascade reveal (0.2s stagger between items)
IF target = Instagram/TikTok/YouTube Shorts
→ 9:16 aspect, <60s duration, mobile-first text sizing
ELSE IF target = Twitter/LinkedIn
→ 16:9 or 1:1 aspect, 30-90s duration, high contrast colors
ELSE IF target = presentations
→ 16:9 aspect, 60-300s duration, detailed annotations
| Anti-Pattern | Detection Rule | Diagnosis | Fix |
|--------------|----------------|-----------|-----|
| Over-Animation Chaos | If every element bounces/spins/zooms simultaneously | Too much motion competing for attention | Remove decorative animations; animate only to reveal data insights |
| Unclear Data Arc | If viewer asks "what am I supposed to see?" after 15 seconds | No narrative thread connecting charts | Apply Hook→Context→Insight→Proof→CTA structure; one insight per video |
| Long Render Blocks | If Remotion render takes >10min for 60s video | Inefficient frame calculations or complex animations | Profile with npx remotion studio; simplify interpolations; cache expensive computations |
| Mobile Text Illegibility | If text <24pt or thin fonts used | Optimized for desktop, fails on phone | Test on actual phone at 480p; use bold fonts; minimum 24pt size |
| Audio-Visual Desync | If narration doesn't match chart reveals | Timeline not planned with audio script | Storyboard frame-by-frame; use waitFor() in Motion Canvas; sync points every 5-10s |
Scenario: Client needs 500 personalized "Year in Review" videos for enterprise customers, each showing their specific usage data.
Decision Process:
Remotion Implementation:
export const CustomerReview: React.FC<{data: CustomerData}> = ({data}) => {
return (
<AbsoluteFill style={{backgroundColor: '#0f172a'}}>
<Sequence from={0} durationInFrames={90}>
<Txt fill="white" fontSize={60}>
{data.companyName}'s 2025 Growth
</Txt>
</Sequence>
<Sequence from={90} durationInFrames={120}>
<AnimatedCounter
from={0}
to={data.totalUsers}
suffix=" users added"
/>
</Sequence>
</AbsoluteFill>
);
};
Batch Render:
npx remotion render src/index.ts CustomerReview \
--props-from-file=customers.json \
--concurrency=4 \
out/
Result: 500 videos rendered overnight vs. weeks of manual work. Engagement increased 340% vs. static PDFs.
Scenario: Complex financial dashboard with 12 charts showing quarterly performance.
Novice Approach: Animate all 12 charts in sequence (3+ minute video) Expert Decision: Too much cognitive load; attention will drop after 30 seconds
Solution:
Animation Strategy:
Result: 45-second focused video + static comprehensive report drove 85% more click-throughs than 3-minute version.
[ ] Audio-text sync verified (narration matches chart reveals within 0.5s)
[ ] Color contrast meets WCAG AA (4.5:1 ratio minimum for text)
[ ] Call-to-action text is legible at 480p on mobile device
[ ] Each scene duration is <3 seconds (maintains social media attention)
[ ] Data trends are visible when viewed at phone screen size
[ ] Animation serves comprehension (every motion reveals data insight)
[ ] Single clear narrative thread connects all charts
[ ] Data source, units, and timeframe are labeled
[ ] Background music does not overpower narration (≤-12dB relative)
[ ] Video file under 100MB for social media upload limits
[ ] Thumbnail frame compelling without playing video
[ ] Exported in platform-native aspect ratio (no black bars)
This skill should NOT be used for:
data-viz-2025 insteadvideo-processing-editing insteadai-video-production-master insteaddata-viz-2025 with D3 interactivityai-video-production-master for multi-chapter structureDelegate when:
tools
Building resilient distributed systems with circuit breakers, retries with full-jitter exponential backoff, retry budgets (per-request 3-attempt + per-client 10% ratio per Google SRE), deadline propagation, and the cascading-failure math (4 layers × 3 retries = 64x amplification). Grounded in Resilience4j, Microsoft Cloud Patterns, AWS Architecture Blog (Marc Brooker), and Google SRE Book.
testing
Designing HTTP cache headers that work correctly across browsers, CDNs, and shared proxies — `Cache-Control` directives per RFC 9111, `stale-while-revalidate` and `stale-if-error` per RFC 5861, the Vary header for varying responses, and surrogate keys for tag-based purging. Grounded in IETF RFCs and Cloudflare/Fastly docs.
development
Use when designing or fixing a Content Security Policy on a real site, choosing between nonce-based and hash-based CSP, adding strict-dynamic, debugging "Refused to execute inline script" errors, deploying CSP in report-only mode first, configuring report-to / report-uri, or auditing an existing policy for unsafe-inline / unsafe-eval / wildcards. Triggers: "CSP blocks legitimate inline script", strict-dynamic, nonce-{RANDOM}, sha256-{HASH}, object-src none, base-uri none, frame-ancestors, Trusted Types, X-Content-Security-Policy obsolete, report-only vs enforced. NOT for general HTTP security headers (HSTS, COOP/COEP), Trusted Types deep dive, CORS configuration, or building a WAF.
tools
Choosing and operating an HTTP API versioning strategy that doesn't break clients — Stripe's date-based pinned versions, the Deprecation/Sunset header pair (RFC 9745 + RFC 8594), URI vs header vs media-type approaches, and the version-transformer pattern. Grounded in Stripe's published architecture and IETF RFCs.