Community코딩 & 개발github.com

makerjackie/short-film

프로그래밍 방식의 단편 영화 — 하나의 주제를 세로형 애니메이션 숏폼(1080×1920, 24fps, 15~90초)으로 변환합니다. 모든 비주얼은 Canvas에 JavaScript로 그려지고, 음악과 효과음은 Web Audio API로 합성되며, 함께 공개 가능한 커버 이미지, 제목, 설명이 최종 산출물로 제공됩니다.

short-film란 무엇인가요?

이 스킬은 사용자가 입력한 하나의 주제를 완전히 프로그래밍 방식으로 제작된 24fps 세로형 단편 애니메이션(1080×1920)으로 변환하는 엔드투엔드 파이프라인입니다. 모든 비주얼(손으로 그린 듯한 먹선 스타일의 '종이 판' 및 남색 청사진 스타일의 '청사진 판' 장면 교차)은 순수 JavaScript Canvas API로 렌더링되며, 음악과 음향 효과는 Web Audio API로 실시간 합성되어 템포(bpm)에 맞춰 미리 정해진 그리드 위에서 정확하게 재생됩니다. 또한 TikTok 등 플랫폼에 바로 게시할 수 있는 커버 이미지(HTML 스크린샷)와 추천 제목/설명도 함께 생성하여 배포 준비를 완료합니다. 이 스킬은 Claude Code, Cursor, Codex와 같은 AI 에이전트 환경에서 실행되도록 설계되었습니다. 영화 제작 과정은 11단계(브리핑, 설정, 리서치, 아트 바이블, 스토리보드, 타임라인, 스텁 패스, 씬 제작, 음악 제작, 비평 웨이브, 배포, 퍼블리시 팩)로 구성되어 있으며, 각 단계는 `node tools/check.cjs`라는 게이트(gate)를 통과해야만 다음 단계로 넘어갈 수 있습니다. 이 게이트는 미디어 스캔, 결정론(deterministic) 검증, 소스 코드 스캔, 타임라인 정확성, 드로잉 일관성, 프레임 시간 소모 등 6가지 항목을 검사하여 전체 파이프라인의 품질과 신뢰성을 보장합니다. 핵심 엔진(src/core.js, lib.js, player.js, music.js, timeline.js)과 도구(tools/ 디렉토리)는 자체 템플릿과 참고 자료(templates/, reference/)와 함께 제공되며, 모든 프로젝트는 이 foundation을 복사하여 시작하므로 매번 새로운 도구를 작성할 필요가 없습니다. 완전한 예시(`examples/llm-evolution`)가 포함되어 있어, 뉴런에서 대규모 AI 모델까지를 다루는 24개 장면의 커스텀 스타일 영화가 어떻게 제작되는지 보여줍니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/makerjackie/short-film/tree/main

Installed? Explore more 코딩 & 개발 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

Programmatic Short Film (short-film)

Turn a topic into a short film: approximately 30 seconds (configurable 15–90 seconds), portrait 1080×1920, 24 fps; alternating hand-drawn ink-style paper plate shots and deep-blue blueprint plate shots; every event lands on the beat grid (bpm → beat → frame); every pixel and every audio sample is computed with pure browser JavaScript. Deliverables are dist/<slug>.html (self-contained player), exports/<slug>.mp4 (with phone and preview transcodes), and a publish pack: a TikTok cover image (HTML screenshot), recommended title, and description.

This skill encapsulates a proven pipeline. It comes with three things:

  • foundation/ — The engine and tools, copied into each new project: src/core.js, src/lib.js, src/player.js, src/music.js (engine + a sample soundtrack), and tools/ (build, check, snapshot, render, stub generation, audio analysis, publish pack, test fixtures). Everything is driven by src/timeline.js, so each film requires no changes to the tooling code.
  • templates/ — Four planning documents to bootstrap each film.
  • reference/ — Read when needed: shot types, scene anatomy, music, platform presets; start with the three reference images.

Start in reference/: contact-sheet.jpg is a full contact sheet of the example film (examples/llm-evolution, a custom "ATLAS" style) — that level of detail and polish is the bar; paper-frame.jpg and blueprint-frame.jpg are full frames of each plate from the default style (rendered by tools/fixtures), serving as the visual target for films using the default style.

See the full example at examples/llm-evolution/: a 24-shot film from neurons to large language models, with planning docs, source code, dist/, and publish pack. Note it is a custom-style production (deviating from the default paper × blueprint style via reference analysis), showcasing the skill's full capabilities. When a template leaves you unsure what a filled-in document looks like, read its counterpart there.

The Gate

node tools/check.cjs is the gate: six checks (media scan, determinism, source scan, timeline, draw, frame time), exit code 0 means pass. From the stub pass onward, no step is complete if the gate is red. On a real film it takes under a minute — let it run.

Pipeline

0. Brief

Ask only one round of questions: what is the topic, what must the film include about it, duration (default 30 sec), and which platform to publish to (determines aspect ratio and safe zones, see reference/platform-presets.md). Invent everything else and explain what you invented.

Completion criteria: The topic is phrased as a sentence the user has seen, and duration and platform are decided.

1. Setup

Create the project folder named after the film slug, copy foundation/ into it. Run npm install in tools/ (Playwright; if browser missing, add npx playwright install chromium), confirm ffmpeg is on PATH or set FFMPEG to the binary path. Copy templates into docs/, write the topic into the Goal of docs/CONTRACT.md.

Completion criteria: node tools/smoke.cjs passes, node tools/check.cjs --fixtures is green, and node tools/render.cjs --fixtures --scale 0.5 produces a exports/fixtures.mp4 with sound. This fixtures mini-film proves the toolchain works before any effort goes into planning.

2. Research

List the stages of the topic story, run a web search for each open question, capture 2–4 authoritative full-text sources into .tmp/research/. Research ultimately lands in only two downstream places: the art bible's topic references and each shot's Subject section.

Completion criteria: Every story stage traces to a captured source.

3. Art Bible

Fill in docs/art-bible.md per template. Sections 1–9 are the established style — fixed; section 2.2 (topic palette, each color a named hex and mirrored to src/lib.js annotation block), 2.3's identity tones, and section 10 (topic references) are rewritten per film. Section 10 ends with "mistakes to avoid", each with a correct drawing.

If the user wants a different look than the established style, first do a reference analysis following templates/reference-analysis.md, then update sections 1–9 accordingly.

Completion criteria: Every element to be drawn in the storyboard has draw rules and palette names; src/lib.js agrees with 2.2; the mistake list exists; and node tools/snap.cjs --fixtures --shot palette --samples 5 --sheet has been viewed.

4. Storyboard

Read reference/shot-types.md, fill in docs/storyboard.md per template: logline; numbers (choose bpm first, beat = 60/bpm seconds, duration lands on integer measures); summary table; acts mapped to measures; a shared geometry table for each shape that survives across match cuts; then one entry per shot — 1 to 3 seconds, boundaries on beat grid, alternating plates — with all eight subsections, Sound cues timestamped to the grid.

Completion criteria: Shots exactly tile [0, duration] without gaps; every shot has all eight subsections; every match-cut shape has shared geometry; the document passes a critic's self-review (body numbers match tables, required content inside safe zones — including arithmetic content). Storyboard errors compound into every scene; this is the cheapest moment to catch them.

5. Timeline

Write src/timeline.js per storyboard (shape in storyboard template): title, bpm, duration, shots array (id, file, start, end, mode, title, transitionIn, brief), and flat cues collected from each Sound subsection. The stub pass tests this step — timeline format errors fail loudly.

6. Stub Pass

node tools/stubgen.cjs generates placeholder scenes for each shot, run the gate, then node tools/render.cjs --scale 0.5 --out exports/draft-stubs.mp4 and watch the whole draft from start to end. This is the tracer bullet: before any real scene is drawn, prove that timeline, scenes, gate, render, and audio all work together.

Completion criteria: Gate is green and draft MP4 shows every shot in order, every transition on grid.

7. Scenes

One agent per scene file — file ownership is law (docs/CONTRACT.md). Each scene agent reads reference/scene-anatomy.md, its storyboard entry, the art bible and shared geometry, then writes src/scenes/NN-<id>.js, takes a contact sheet (node tools/snap.cjs --shot <id> --samples 6 --sheet), views each frame, iterates to match the brief. snap --only can render a single shot while sibling files are half-written, so scene agents can freely parallelize.

Shots may also share a draw module (centralized layout, see "Two layouts for scene code" in docs/CONTRACT.md) — then each src/scenes/NN-*.js is just a few lines of registration wrapper, with drawing centralized in FILM.art. The example examples/llm-evolution uses this; it is more efficient when shots share the same geometry and differ only in parameters.

Completion criteria: Each shot's contact sheet has been visually inspected and judged to match the brief, and the gate is green.

8. Music

Write src/music.js per reference/music.md: keep the engine, replace the CH chord table, MIX.ride automation, and the entire score() function, implement every cue at the exact time from FILM.TIMELINE.cues, making accents land on transitions.

Completion criteria: After node tools/audio/render-audio.cjs, node tools/audio/analyze.cjs .tmp/audio/score.wav --cues shows start and cue within 10ms, node tools/audio/peaks.cjs .tmp/audio/score.wav shows headroom below the limiter ceiling, and the gate is green.

9. Critic Waves

First put the whole film on one sheet: node tools/snap.cjs --samples 24 --sheet --scale 0.25. Shots that are unreadable at this size are P1 — fix composition, not detail.

Then review each shot based on rendered frames: re-take contact sheets, use a critic sub-agent to score composition, faithfulness to storyboard, motion, and density. Critics must measure pixel-level critical geometry proportions (band scores, rule of thirds, safe zone arithmetic, shared geometry positions), not just eyeball; and screenshot both sides of each match cut for comparison.

Fix in waves — P1 first, each citing evidence frames, maintaining file ownership (restore the agent that owns the file), re-snapshot after each fix. The director spot-checks each P1 fix on new frames. Check determinism by snapshotting the same frames in two different orders and comparing file hashes.

Completion criteria: Every P1 and P2 fix verified on new frames, and the gate is green.

10. Deliver

node tools/render.cjs writes the master (crf 16). Then transcode:

ffmpeg -i exports/<slug>.mp4 -vf scale=720:1280 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k exports/<slug>-phone.mp4
ffmpeg -i exports/<slug>.mp4 -c:v libx264 -crf 23 -preset medium -c:a copy exports/<slug>-preview.mp4

node tools/build.cjs writes dist/<slug>.html. Then watch the master with sound from start to end, and open the HTML player once (click or space to play, arrow keys to step frame by frame, ?shot=<id> for single-shot loop).

Write exports/<slug>-shots.md: one line per shot explaining what it shows.

Completion criteria: Master, phone transcode, HTML file, and exports/<slug>-shots.md exist; gate is green; final viewing finds nothing to fix.

11. Publish Pack

Use tools/publish.cjs to generate publish-ready cover art and copy scaffolding:

node tools/publish.cjs                          # defaults to hook frame of shot 1 as cover
node tools/publish.cjs --at 2.5 --title "From One Neuron to a Language Machine" --platform tiktok

It does two things:

  1. Cover image (HTML screenshot, default 1080×1920): renders the film's frame at --at as the main visual, overlays title/subtitle/badge, outputs exports/<slug>-cover.png. The cover page may use system fonts and images because it doesn't enter the delivered HTML, bypassing the "no media" rule.
  2. Copy scaffolding exports/<slug>-publish.md: title candidates, description, tags, shot list, duration/aspect/platform, etc. Titles and descriptions are starting points; you polish them into final recommendations per reference/publish.md rules.

Completion criteria: exports/<slug>-cover.png generated and visually inspected (title inside safe zone, legible, has hook); titles and descriptions in exports/<slug>-publish.md have been polished to final recommendations by you; platform and aspect match the brief from step 0.

관련 스킬