Hand Drawn Film logo

Hand Drawn Film

Community
anzal1
hand-drawn-film

Make short hand-drawn films in JavaScript and Canvas 2D (pencil, ink, risograph, screen print, brush-pen doodles on photos, sand animation, pop-up paper) and export an MP4 with a synthesized score. Whole-pose drawings authored as SVG path data, exposure sheets, draw-on reveals, boiling holds, and a review loop (onion skins, motion report) that lets you judge animation without watching it. Use for hand-drawn cartoons, animated explainers, sketch-style intros, rotoscope, sand stories or drawings that interact with photos. Not for UI animation or slide decks.

Overview

Publisheranzal1
Repositoryhand-drawn-film
Skill namehand-drawn-film
Stars
3
Forks
0
Bundled files
77
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 77 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by anzal1 on GitHub. Read the source before you install it.

Installation

Install the Hand Drawn Film AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/anzal1/hand-drawn-film/tree/main
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/anzal1/hand-drawn-film.git \
  .claude/skills/hand-drawn-film
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Hand Drawn Film in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Hand Drawn Film on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Hand Drawn Film is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Hand-drawn film

You are making a film that must feel drawn by hand in its marks and its movement. You cannot watch playback, so this skill gives you instruments that turn motion into stills and numbers. Use them after every change. The loop is the method:

draw keys -> render one still -> build the exposure sheet -> onion / strip the hard action
-> review.mjs -> fix -> full render -> review.mjs on the final -> deliver with limitations

1. Start a project (1 minute)

bash
node <skill>/scripts/new.mjs ~/films/my-film --ar 16:9 --look pencil --title "My film"
cd ~/films/my-film && npm i --no-audit --no-fund
node render.mjs film.html --grid 24

film.html is a complete, working starter (a ball hops onto a box) with the canonical structure: drawings, one exposure sheet, the shot, a score whose cues read the sheet. Keep the structure, replace the drawings. Fill brief.md first; infer routine choices, ask the user only about decisions that change the film (subject, length, look, format, ending). Needs Node 22+, Chrome, ffmpeg. For looks other than pencil/ink, or photos, sand and paper, start from the matching example in examples/ (table below) and copy its modules locally.

2. Draw (the part that decides quality)

Author each key pose as a whole drawing in SVG path data with svgCel (see redrawn-animation.md and sketch.md).

  • Same stroke names in every key; start each stroke at the same landmark; pass points: N so inbetweenCel matches strokes by arc length. A new view, a closed eye or a changed overlap is a replacement drawing (put), never a morph.
  • Give closed forms fill: 'paper' so a front shape hides the lines behind it. Stroke order is painter's order: background first, near limbs last. Add an invisible silhouette (opacity: 0, fill: 'paper') first when a body is built from open strokes.
  • Line weight: pencil weight 1.8-2.2, value 1.3; ink weight 1.1-1.3. Weight is judged at thumbnail size, not full size. Target ink contrast 110+ in the review table.
  • Render each key alone (?pose= pattern in examples/cat-and-mug.html) and look at them side by side before animating. A texture never rescues an unclear silhouette.
  • Composition: subject in the middle 60% of the frame, horizon or table around 60-65% down, nothing important within 5% of an edge. Frame with cam() rather than moving every drawing.
  • Call setFormat() before any file-scope constant reads W, H, CX, CY. defineFilm() runs last; without this the film is laid out on the 1:1 default (the starter shows the pattern).

3. Animate (exposure sheet)

Use sheetBuilder({library: RAW}): key, between(a, b, spacing(n, kind), frames), hold (optionally {boil: 3, every: 4}), put for replacements, mark('name') for cues. Numbers that work at 24 fps are in craft.md. The short version:

  • Moves on twos; fast actions (a swipe, a hit, a fall) on ones; holds 8-24 frames, boiling on fours with keep for eyes and contacts. Never boil on ones.
  • Spacing is the acting: slowInOut for most moves, slowIn into a landing or a look, slowOut out of a crouch into a throw or fall, even only for machines and ballistics along the horizontal.
  • Anticipation 4-8 frames before any fast action; a settle after it. Give the viewer about one second to read a new idea before the next one starts.
  • Props with physics (a falling mug) use formulas on continuous time, not keys. Cue sound from marks (film.time('contact')) so it cannot drift.

4. Look at the motion (every iteration)

bash
node render.mjs film.html --grid 24          # composition across the film (faithful thumbnails)
node render.mjs film.html --onion 96,16      # one action overlaid blue->red, with a spacing trail
node render.mjs film.html --strip 96,12      # consecutive frames at readable size
node render.mjs film.html --only 96          # one full-size frame for line detail
node review.mjs film.html                    # motion report: pops, flicker, shimmer, blank,
                                             # frozen, faint lines, pacing, exposure per scene

Read review.md for how to interpret each finding. In an onion, the dots are the ink centroid per frame: evenly spaced dots are even spacing, bunched dots are a slow in or out, a straight chain on a jump means the arc is missing. Fix every warn or state why it is intended; confirm each finding by eye with --strip around the frame. The numbers are measurements, not taste.

5. Deliver

bash
node render.mjs film.html                    # frames, mp4, contact sheet, -final.mp4 with score
node review.mjs film.html                    # on the finished film

Full renders run on parallel browser processes (--jobs N) and are bit-identical to serial renders. Deliver the source folder, the MP4, the contact sheet, the review report and a short list of known limitations. Verify duration, dimensions and frame count (ffprobe). Never call a film finished because code or checks passed; say what you looked at (onions, strips, stills) and that you did not watch it at speed if you could not.

Choose references by task

taskreadstart from
any character in pencil or inkredrawn-animation.md, sketch.md, craft.mdexamples/cat-and-mug.html, examples/sketchbook-bird.html
timing, spacing, contacts, weathermotion.md, craft.mdexamples/weight-study.html
looks: ink, pencil, riso, screen, doodlestyle.md, palettes.mdexamples/four-looks.html
several looks in one filmmixed-media.mdexamples/becoming-phoenix/
drawings on real photosdoodle.mdexamples/held-once.html, examples/night-shift.html
traced real motionfound-motion.mdexamples/gallop.html
sand animationsand.mdexamples/one-year.html
pop-up paper in 3Dpaper3d.mdexamples/moon-book.html
engine APIs, export, pitfallsarchitecture.md, studio.md
reading review outputreview.md

scenes.md and reference-films.md hold optional scene devices and historical references, not required structures.

Invariants

  • 24 fps by default. Scenes get continuous tau; quantize a pose once (twos(t) or an exposure sheet), never twice. Camera and physics usually run on ones.
  • No output-frame seeds. A held drawing holds its marks; a boil is a finite set of drawings. Every frame must reproduce after seeking (render workers depend on it).
  • Contacts stay planted until their planned release; IK clamps and reports unreachable targets.
  • Record sources and licences for external media (photos, fonts).
  • Engine edits belong in the skill's assets/, then get copied to films; do not fork core.js inside one film.

Quality gates

  • Drawing: clear silhouette at 240 px; consistent proportions across keys; line hierarchy (outer contour heavier than interior detail); purposeful taper and gaps; no accidental tangents; front forms hide what is behind them.
  • Motion: readable keys, anticipation and settle where the action needs them, deliberate spacing (check the onion), planted contacts, no pops or two-drawing flicker in the review.
  • Material: texture tied to the paper or object, not the screen; no shimmer unless intended; line contrast 110+ at thumbnail size for line films.
  • Delivery: no page errors, no unintended blank frames, the ending holds 0.5-1.5 s, text and cards stay up long enough to read (about 3 words per second plus one second), the encoded MP4 decodes and has the expected frame count.

node scripts/verify.mjs runs the engine's regression suite (20 checks) after engine edits.

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

and 17 more files.

Frequently asked questions

What does the Hand Drawn Film AI skill do?

Make short hand-drawn films in JavaScript and Canvas 2D (pencil, ink, risograph, screen print, brush-pen doodles on photos, sand animation, pop-up paper) and export an MP4 with a synthesized score. Whole-pose drawings authored as SVG path data, exposure sheets, draw-on reveals, boiling holds, and a review loop (onion skins, motion report) that lets you judge animation without watching it. Use for hand-drawn cartoons, animated explainers, sketch-style intros, rotoscope, sand stories or drawings that interact with photos. Not for UI animation or slide decks.

Why use Hand Drawn Film on TypingMind?

Because you install it once and use it with any model. Hand Drawn Film is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Hand Drawn Film in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/anzal1/hand-drawn-film/tree/main. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Hand Drawn Film?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Hand Drawn Film?

As many as you like. As long as a model supports skills, you can use Hand Drawn Film with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Hand Drawn Film AI skill free?

Yes. It is published on GitHub by anzal1 under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇