THE INTRO CARD is free — what an AI skill card is and how to use one Download →Lost Lauren, contact us

THE INSTRUMENTS · Nº 1189 · EDITION 1 · LAUNCHING SOON

LUND CARDS · THE INSTRUMENTSNº 1189 PROPOSED
THE DOPE SHEET CARD — the LSC-1 face
THE CARD AS TEXT · FOR EYES AND FOR MACHINES

THE DOPE SHEET CARD · acting turned into frame numbers

WAKES WHEN an animation looks robotic or floaty, or a gag needs its timing to land

THE LOOP

  1. new · the shot, its rate, its parts
  2. beat, key, offset · the acting in frames
  3. lint · stock timing named by frame
  4. bake · CSS, Lottie, glTF, Blender, CSV
  5. chart · the spacing to read and keep

NEVER

  • Time every part to start on one frame
  • Stop a big move dead with no settle
  • Flash, strobe or cut light on and off

IT MAKES new — an empty exposure sheet; key — one key and its spacing; beat — a stock acting beat as keys; offset — overlap: a part dragged behind; hold — a hold, or a moving hold; say — a line and its sounds by frame; bake — per-frame values for a tool; lint — STOCK TIMING flags by frame, or CLEAN; chart — the spacing chart.

THE STANDARD frames, not feelings; ease what lives; anticipate, overshoot, settle; overlap; hold to read; no flashes.

IN THE BOX SKILL.md · CARD.md · TIN.md · START-HERE.md · LICENSE-NOTE.md · THE-CLAUSES.md · MY-LEDGER.md · WITNESS.md · SELFTEST.md · AUDIT.md · MANIFEST.md · HOSTS.md · scripts/dopesheet.py · references/THE-XSHEET.md · rules/ (4 doors) · system/ (2 prompts) · mcp/mcp_card.py · card.json · card.svg · card-machine.svg · card.html.

PROOF SELFTEST 14/14 · witnessed in Claude 2026-10-12 · Edition 1.

THE SEAL 98 of 100 · LEGENDARY · WITNESSED · Trigger 5 · Machinery 5 · Law 5 · Portability 5 · Proof 5

IT CAN BE WRONG an AI reading a text file: it can be wrong and can invent a number, a rule, a name or a date; check what matters against your own records and the source; the risk is yours. THE-CLAUSES.md rides in the packet and is part of the licence.

THE PUNCH · SHA-256 OF SKILL.MD · C0EC7152B8616ED168C2BB22

THE FACE, FULL SIZE → · THE MACHINE FACE → · card.json →

THE DOPE SHEET CARD

acting turned into frame numbers

NEW · KEY · BEAT · OFFSET · HOLD · SAY · BAKE · LINT · CHART

98LEGENDARYWITNESSEDIN CLAUDEIN LUNDRIN CHATGPT

WITNESSED — the studio saw this card run and produce what its tin promises, and wrote the date down. What the marks mean →

THE SPEC SHEET · READ BEFORE YOU BUY · THE STANDARD EVERY CARD MEETS →

SEAL
98 of 100 · LEGENDARY · WITNESSED
EDITION
E1 · witnessed 2026-10-12
MACHINE
scripts/dopesheet.py · 9 commands · selftest 14/14
RUNS
On your own computer. Standard library only, offline; no account, no key, no telemetry.
HOSTS
Claude · Claude Code · ChatGPT · Gemini · any AI that reads a file (HOSTS.md names each door)
LICENCE
One person, any number of their own AIs and computers · editions replace files · nothing renews · freeze, not loss
PUNCH
C0EC7152B8616ED168C2BB22 · sha-256 of SKILL.md · check any file against it →

CITE THIS CARDTHE DOPE SHEET CARD, Edition 1. Lund Studio LLC, Westminster, Colorado. https://lundr.tech/?view=dope-sheet-card. Punch C0EC7152B8616ED168C2BB22. Retrieved 2026-10-12.

What it is.

Acting turned into frame numbers. new opens an exposure sheet for a shot; key sets a key with its spacing (even, slow-in, slow-out, slow-in-out, favour-start, favour-end, or a chart) on ones or twos; beat writes a stock acting beat (take, double-take, anticipate-and-dash, slow-burn, settle, overshoot); offset drags a part behind the part it hangs from; hold and say add holds and dialogue sounds; bake writes per-frame values as CSS keyframes, Lottie, glTF, a Blender script or CSV; lint flags stock timing by frame number; chart draws the spacing.

It carries a machine that shows its working: new — an empty exposure sheet; key — one key and its spacing; beat — a stock acting beat as keys; offset — overlap: a part dragged behind; hold — a hold, or a moving hold; say — a line and its sounds by frame; bake — per-frame values for a tool; lint — STOCK TIMING flags by frame, or CLEAN; chart — the spacing chart — 14 checks in its selftest, every command on the record. It will never time every part to start on one frame; never stop a big move dead with no settle; never flash, strobe or cut light on and off.

Six laws, written into the card.

They are in the card itself, so the AI follows them.

FRAMES, NOT FEELINGSTiming is written as frame numbers on a sheet before any key is set in a tool.
EASE WHAT LIVESLiving motion slows in and out; even spacing is for machines, and the lint says so.
ANTICIPATE, OVERSHOOT, SETTLEA big move gets a small move the other way first, and a settle after.
OVERLAPParts that hang from others start a few frames later and finish later.
HOLD TO READAfter a big stop the pose rests at least a quarter of a second so the audience reads it.
NO FLASHESNothing it writes flashes or strobes; light changes are eased like any other move.

What rides in the card.

In the card’s own voice, with a machine that shows its working.

THE GUIDEreferences/THE-XSHEET.md
THE MACHINEdopesheet.py · 9 commandsnew — an empty exposure sheet; key — one key and its spacing; beat — a stock acting beat as keys; offset — overlap: a part dragged behind; hold — a hold, or a moving hold; say — a line and its sounds by frame; bake — per-frame values for a tool; lint — STOCK TIMING flags by frame, or CLEAN; chart — the spacing chart. Every command prints its working and refuses a bad input; 14 checks in its selftest, every command on the record.

What it does once your AI has it.

  • new An empty exposure sheet
  • key One key and its spacing
  • beat A stock acting beat as keys
  • offset Overlap: a part dragged behind
  • hold A hold, or a moving hold
  • say A line and its sounds by frame
  • bake Per-frame values for a tool
  • lint STOCK TIMING flags by frame, or CLEAN
  • chart The spacing chart
  • On the record The stock jump (even spacing, every part starting on frame 1, no anticipation, a dead stop) is flagged on every count; the same jump built from the anticipate-and-dash beat, with the tail two frames behind, a moving hold and a timed line, lints CLEAN and bakes to CSS, Lottie (2 layers at 24 fps), glTF, Blender and CSV; a key past the end of the shot is refused.

What it will never do.

It will never time every part to start on one frame; never stop a big move dead with no settle; never flash, strobe or cut light on and off.

It times values, not drawings: each part is a number or a list that a rig, a layer or a property reads. The Blender output is a script to run in Blender, which the card never opens; the lint applies the principles as rules and a person still judges the acting. It is an AI reading a text file: it can be wrong, so check what matters against your own records and the source.

What’s in the buy.

  • CARD.md — the whole card: who it is, its laws, when it says no, what it carries · SKILL.md — the door your AI reads first · START-HERE.md — the first five minutes, for you
  • THE-XSHEET.md — the guide in references/, in the card's own voice
  • scripts/dopesheet.py — the machine: new · key · beat · offset · hold · say · bake · lint · chart, standard library only, selftest 14/14
  • WITNESS.md + SELFTEST.md — every command on the record, as it printed · MANIFEST.md, every file hashed · AUDIT.md, the twelve checks
  • MY-LEDGER.md — the card's memory, on your own machine · TIN.md · LICENSE-NOTE.md · THE-CLAUSES.md · HOSTS.md
  • card.svg + card-machine.svg + card.json · card.html, the card as one offline file · the doors for ChatGPT, Gemini, Cursor, Claude Code and MCP hosts (rules/, system/, mcp/)

PROOF · SELFTEST 14/14 · 9 COMMANDS ON THE RECORD · WITNESSED IN CLAUDE 2026-10-12 · EDITION 1 · PUNCH C0EC7152B8616ED168C2BB22

ON EVERY DOOR · A CARD FOR YOUR AI, A FILE FOR YOUR COMPUTER

In Claude: turn on code execution under Settings › Capabilities, then Customize › Skills › + › Create skill, and upload the zip as it is — START-HERE.md in the box walks you through it, and tells you how to keep the ledger. In ChatGPT, Gemini and the rest: a Project, a GPT or a Gem with the card’s files attached and the short door in the box pasted as its instructions. The words run anywhere an AI reads Markdown; the machines run wherever the host runs Python. Witnessed in Claude only. The host marks →

Take it.

Nº 1189 PROPOSED — LAUNCHING SOON

Sold as is under the term printed. A card instructs an AI you operate; results depend on your model, your files and your judgement. Not medical, legal, tax or financial advice, never the person’s boss, and not a licence to practise. The terms →

ONE PAYMENT · NOTHING RENEWS ITSELF

OFFLINE · ONE LICENCE · PUNCH-CHECKABLE · THE STANDARD

One payment. The file is yours to keep and keeps working at its edition; new editions issued in the year after you buy reach you by email as replacement files. Tax is added at checkout where it applies. Nothing auto-renews.

One email when it is on sale, from the studio; nothing else, ever.

A TERM, NOT A SUBSCRIPTION: NOTHING RENEWS ITSELF AND NOBODY IS CHARGED AGAIN. WHEN A TERM ENDS THE FILES STAY ON YOUR COMPUTER AND STAY READABLE — FREEZE, NOT LOSS.

THE MACHINE · IN THE OPEN · FROM THE WITNESSED RUN OF 2026-10-12

dopesheet.py, every command showing its working.

A small Python program, standard library only. Your AI runs it; you can too. Every block below is pasted from the card’s own WITNESS.md, as printed.

newan empty exposure sheet
keyone key and its spacing
beata stock acting beat as keys
offsetoverlap: a part dragged behind
holda hold, or a moving hold
saya line and its sounds by frame
bakeper-frame values for a tool
lintSTOCK TIMING flags by frame, or CLEAN
chartthe spacing chart
selftest14 checks that prove the machine; it must print 14/14
new · AN EMPTY EXPOSURE SHEET
$ python3 scripts/dopesheet.py new --fps 24 --frames 48 --parts body,tail --shot SQ010_SH0020 --slot 48 --out stock.xsheet.json
new · SQ010_SH0020 · 48 frames at 24 fps (2.00s) · parts body, tail → stock.xsheet.json
key · ONE KEY AND ITS SPACING
$ python3 scripts/dopesheet.py key stock.xsheet.json body --at 1 --value 0 --spacing even
key · body frame 1 = 0 · even
key · ONE KEY AND ITS SPACING
$ python3 scripts/dopesheet.py key stock.xsheet.json body --at 9 --value 10 --spacing even
key · body frame 9 = 10 · even
key · ONE KEY AND ITS SPACING
$ python3 scripts/dopesheet.py key stock.xsheet.json tail --at 1 --value 0 --spacing even
key · tail frame 1 = 0 · even
key · ONE KEY AND ITS SPACING
$ python3 scripts/dopesheet.py key stock.xsheet.json tail --at 12 --value 4 --spacing even
key · tail frame 12 = 4 · even
lint · STOCK TIMING FLAGS BY FRAME, OR CLEAN
$ python3 scripts/dopesheet.py lint stock.xsheet.json
FLAG · SAME START      every part starts moving on frame 1; offset the ones that hang from others (overlap)
FLAG · EVEN SPACING    body 1→9 moves at an even rate; living motion eases (slow-in, slow-out)
FLAG · NO ANTICIPATION body 1→9 is a big, fast move with no small move the other way before it
FLAG · NO SETTLE       body stops dead on frame 9 after a big move; add an overshoot and a settle
FLAG · EVEN SPACING    tail 1→12 moves at an even rate; living motion eases (slow-in, slow-out)
FLAG · NO ANTICIPATION tail 1→12 is a big, fast move with no small move the other way before it
FLAG · NO SETTLE       tail stops dead on frame 12 after a big move; add an overshoot and a settle
STOCK TIMING · SQ010_SH0020 · 7 flags
new · AN EMPTY EXPOSURE SHEET
$ python3 scripts/dopesheet.py new --fps 24 --frames 48 --parts body,tail --shot SQ010_SH0020 --slot 48 --out pell-jump.xsheet.json
new · SQ010_SH0020 · 48 frames at 24 fps (2.00s) · parts body, tail → pell-jump.xsheet.json
beat · A STOCK ACTING BEAT AS KEYS
$ python3 scripts/dopesheet.py beat pell-jump.xsheet.json body --kind anticipate-and-dash --at 5 --from 0 --to 10
beat · anticipate-and-dash on body · frames 5 to 15 (0.42s) · keys 5=0 slow-in · 9=-2 favour-start · 12=10.8 slow-in · 15=10 slow-in-out
beat · A STOCK ACTING BEAT AS KEYS
$ python3 scripts/dopesheet.py beat pell-jump.xsheet.json tail --kind anticipate-and-dash --at 5 --from 0 --to 4 --size small
beat · anticipate-and-dash on tail · frames 5 to 17 (0.50s) · keys 5=0 slow-in · 9=-0.4 favour-start · 14=4.16 slow-in · 17=4 slow-in-out
offset · OVERLAP: A PART DRAGGED BEHIND
$ python3 scripts/dopesheet.py offset pell-jump.xsheet.json --parts tail --by 2
offset · tail shifted +2 frames (overlap: they drag behind what they hang from)
hold · A HOLD, OR A MOVING HOLD
$ python3 scripts/dopesheet.py hold pell-jump.xsheet.json body --from 22 --to 32 --moving
hold · body frames 22 to 32 (moving: it drifts, never freezes)
say · A LINE AND ITS SOUNDS BY FRAME
$ python3 scripts/dopesheet.py say pell-jump.xsheet.json --from 34 --to 42 --text "up we go" --phones "AH:2,P:2,W:2,OW:2"
say · "up we go" frames 34 to 42 · AH 34-36 P 36-38 W 38-40 OW 40-42
lint · STOCK TIMING FLAGS BY FRAME, OR CLEAN
$ python3 scripts/dopesheet.py lint pell-jump.xsheet.json
CLEAN · SQ010_SH0020 · 0 flags
bake · PER-FRAME VALUES FOR A TOOL
$ python3 scripts/dopesheet.py bake pell-jump.xsheet.json --to css --out pell-jump.css
bake · SQ010_SH0020 → css · 48 keyframes → pell-jump.css
bake · PER-FRAME VALUES FOR A TOOL
$ python3 scripts/dopesheet.py bake pell-jump.xsheet.json --to lottie --out pell-jump.lottie.json
bake · SQ010_SH0020 → lottie · 2 null layers with eased keys → pell-jump.lottie.json
bake · PER-FRAME VALUES FOR A TOOL
$ python3 scripts/dopesheet.py bake pell-jump.xsheet.json --to gltf --out pell-jump.gltf
bake · SQ010_SH0020 → gltf · 2 animated nodes (translation, LINEAR, one sample a frame) + the .bin beside it → pell-jump.gltf
bake · PER-FRAME VALUES FOR A TOOL
$ python3 scripts/dopesheet.py bake pell-jump.xsheet.json --to blender --out pell-jump-blender.py
bake · SQ010_SH0020 → blender · 96 keyframe_insert lines → pell-jump-blender.py
bake · PER-FRAME VALUES FOR A TOOL
$ python3 scripts/dopesheet.py bake pell-jump.xsheet.json --to csv --out pell-jump.csv
bake · SQ010_SH0020 → csv · 48 frame rows → pell-jump.csv
chart · THE SPACING CHART
$ python3 scripts/dopesheet.py chart pell-jump.xsheet.json body --out pell-jump-body-chart.svg
chart · body · 3 spacing rows → pell-jump-body-chart.svg
key · ONE KEY AND ITS SPACING
$ python3 scripts/dopesheet.py key pell-jump.xsheet.json body --at 60 --value 1
refused: frame 60 is outside the shot (1 to 48)

THE NUMBERS, NAMES AND DATES IN THESE RUNS ARE THE STUDIO’S OWN EXAMPLES, INVENTED FOR THE RECORD; NO REAL COMPANY, PERSON OR PROPERTY IS NAMED.

QUESTIONS AT THE TABLE

Asked before the wire.

What does it need from me?

New · the shot, its rate, its parts. It asks first for the shot's rate, length and animatic slot, the parts that move, and what each part does when; the dialogue line and its sounds if it talks.

Does it send anything anywhere?

No. The machine is a standard-library Python program that runs on your own computer and sends nothing anywhere; the words run wherever an AI reads Markdown. No server, no account, no key.

What is on the record?

The self-test (14/14) and every command run on real example inputs, pasted into WITNESS.md as they printed; the punch on the face is the SHA-256 of SKILL.md, so a downloaded copy can be checked against this room.

Can it be wrong?

Yes — it is an AI reading a text file. It times values, not drawings: each part is a number or a list that a rig, a layer or a property reads. The Blender output is a script to run in Blender, which the card never opens; the lint applies the principles as rules and a person still judges the acting.

What will it never do?

It will never time every part to start on one frame; never stop a big move dead with no settle; never flash, strobe or cut light on and off.

← THE INSTRUMENTS · THE FLOOR →

AT YOUR ELBOW, NEVER THE BOSS · NOT LEGAL, MEDICAL, TAX OR FINANCIAL ADVICE · NOT A PAYMENT CARD · © 2026 LUND STUDIO LLC

PAY BYAmerican Express Apple Pay Diners ClubDiscoverGoogle Pay Mastercard PayPalShop Pay Visa
CART · 0