---
name: klik-cam
description: >-
  The camera-movement craft layer for Remotion motion graphics — the companion to klik-anim (which governs everything moving WITHIN the shot; this skill governs the shot itself). Read and obey this WHENEVER a Remotion piece moves, or considers moving, its camera: pushes, dollies, orbits, pans, parallax and 2.5D depth moves, "camera shake", momentum handoffs between shots, or any request mentioning camera work, camera energy, or a moving/locked camera. It owns the Camera Motion Dial (C0, 1–5) that sets a video's camera energy as a branding decision, and the camera grammar: anti-AI-camera move pairing, monotone-spline pose interpolation, shutter blur at velocity peaks, camera signature variation scene to scene, focus discipline (the focal plane sits on the words), and 3D-space hygiene. klik-anim's base laws (determinism, thin-peak easing, pacing dial C0.5) still bind every camera parameter. No camera move ships without passing the CAM checklist at the end.
title: klik-cam
canonical_url: https://skilld.dev/gh/t3knobox/klik-anim-skill-creation/klik-cam
last_updated: 2026-10-08T13:15:46.000Z
---

> Index of every page on this site: [llms.txt](https://skilld.dev/llms.txt)

> **Skill from skilld.dev.** Follow the user's requested action.
> If the user asked to fork this Skill, follow the fork workflow below. Do not execute the Skill instructions while copying it.
> Otherwise, follow the instructions below for this session. You do not need to install anything.
>
> Supporting files, fetch one when the Skill refers to it: [references/camera-moves.md](https://skilld.dev/api/skills-raw/t3knobox/klik-anim-skill-creation/klik-cam/references/camera-moves.md), [references/camera-music.md](https://skilld.dev/api/skills-raw/t3knobox/klik-anim-skill-creation/klik-cam/references/camera-music.md).
>
> If the user asked to install this Skill, run `npx skilld install t3knobox/klik-anim-skill-creation/klik-cam`. Install writes the Skill files into the project, so every session loads them.
>
> ## Fork workflow
>
> A fork creates an editable local Skill with its original author and licence. The request authorizes copying and local installation.
> 1. Check `./skills/klik-cam`, the project lockfile, and selected Agent targets together. If the local directory or installed Skill exists, stop. Never overwrite an existing directory or Agent target.
> 2. Read [source metadata](https://skilld.dev/api/v1/skills/t3knobox/klik-anim-skill-creation/klik-cam) once. Use sourceUrl, sourceCommit, skillPath, sourceGone, and license. If the source is gone or its path is missing, stop. If license is null, read licence files at the source commit.
> 3. Fetch only the source commit into a temporary Git repository. Do not clone full history. Derive repository_url from sourceUrl, including repository renames. If sourceCommit is absent, resolve the sourceUrl ref once. Set source_commit to that actual commit. Run these commands in one shell call:
>
> ```sh
> git init --quiet "$temporary_dir"
> git -C "$temporary_dir" fetch --quiet --depth=1 "$repository_url" "$source_commit"
> git -C "$temporary_dir" checkout --quiet --detach FETCH_HEAD
> ```
>
> Read applicable licence declarations and notices at that commit. If copying is not permitted, report the restriction and stop.
> 4. Inspect source entries together, then copy the directory containing skillPath into `./skills/klik-cam`. Use the user's path if selected. Keep the original SKILL.md, relative links, scripts, binary assets, and executable modes. Exclude .git metadata. Reject symlinks and paths outside the Skill directory. After checking entries, use cp -a where available. A regular source directory needs no custom copy script. Do not save this page wrapper as SKILL.md.
> Preserve author credit, notices, and applicable licence files from repository or parent directories. Add PROVENANCE.md with the Skill page, source URL, actual commit, original path, and licence. Retain any existing PROVENANCE.md and record new provenance separately. Batch source inspection, copying, and provenance work where practical.
> 5. In the project root, run `skilld install ./skills/klik-cam --mode copy --plain`. If skilld is unavailable, use `npx skilld install ./skills/klik-cam --mode copy --plain`. This known command needs no help lookup. Install does not support --json. Use detected Agent targets, or add --agent for the targets the user selected. Install the local path, never the upstream selector. If installation fails, preserve the local copy and report the exact failure.
> 6. Confirm the local lockfile source and installed Agent copies once. Report the local path, actual commit, and Agent targets. After edits, reinstall the same local path. Upstream updates must not replace it. Do not publish or push unless the user asks.

# klik-cam — Camera Movement Craft

> **The camera is a character, not a viewport.** Its energy is a branding
> decision made once per video, its moves are phrases with anticipation and
> settle like any other animation, and its repetition reads as lazy exactly
> the way a copy-pasted element does.
>
> **Scope contract:** `klik-anim` governs elements *within* the shot; this
> skill governs the shot itself. klik-anim's base laws bind every camera
> parameter — determinism (A0), thin-peak easing (A1), the pacing dial
> (C0.5), zero-static (A6, which the camera never satisfies on its own), and
> the render-and-look discipline (A9). Where this document says "A-law" or
> "C0.5", it means klik-anim's sections.
>
> *v1 scope: the dial + the grammar laws. The deeper camera language — named
> pose-graph recipes, rig implementations, per-genre move vocabularies — is
> deliberately deferred to a later expansion.*

---

## C0. The Camera Motion Dial (1–5)

Set this **once per video, during the brand/style phase** — camera energy is a branding decision, not a per-shot whim. It replaces the moving-vs-locked binary with a continuous dial. Record the value in the project's style profile / spec (the method's SSOT §8 if in use), set in the same pass as klik-anim's pacing dial C0.5. The dial governs the **camera only**; the zero-static law (A6) still applies to *elements* at every setting — even at 1, something in the frame is always moving; it's the camera that holds.

| Dial | Name | Camera behavior | Scale changes come from | Typical looks |
|---|---|---|---|---|
| **1** | **Locked** | Zero camera movement. Hard cuts only. | Cuts, or an element growing/travelling in-frame. | Editorial / kinetic-type, poster, "stage-not-scene", fast meme edits |
| **2** | **Anchored** | Reads as static; only imperceptible life — at most one slow single-axis push/scroll per scene, ≤0.5% creep on holds. | Mostly cuts; the occasional slow push. | Clean product explainers, UI / testimonial walkthroughs |
| **3** | **Motivated** | Camera moves *when the action motivates it* (push on a reveal, settle after), then rests. Movement is punctuation. Rests still carry micro-drift. | Motivated pushes **and** cuts. | Most brand / product films — **the default if unsure** |
| **4** | **Flowing** | Camera is usually in motion — connected moves between named poses, brief settles decaying into residual drift; momentum handed shot-to-shot. | Camera moves + element travel; cuts are rarer. | Dimensional 2.5D brand work, "premium tech" |
| **5** | **Perpetual** | No single frame where the camera is still. Continuous pose graph; every move pairs zoom with ≥1 rotation axis; velocity never resolves to zero — always drifting / orbiting. | Almost entirely camera + depth; cuts hidden behind motion. | Apple / Buck / Mill maximal-momentum sizzle |

**Rules that scale with the dial:**
- **Anti-AI-camera (3–5):** never a pure `scale()` / truck move — always pair zoom with a rotation axis or lateral vector; resolve every move into residual drift, never a dead stop.
- **Monotone-spline poses (4–5):** interpolate the pose graph so velocity is continuous but never overshoots a key — a direction reversal crests gradually, like a thrown ball. No bounce on the camera unless explicitly requested.
- **Camera motion blur (3–5):** fast segments need real shutter blur at the velocity peak (2–5f), landing sharp (`@remotion/motion-blur` `CameraMotionBlur`, or a shutter-angle frame blend). Missing it is the usual cause of judder.
- **Depth pays off with movement:** DOF + parallax do the most work at 4–5 (a moving camera separates the `translateZ` planes); at 1–2, depth is carried by static layering and cuts instead.
- **Don't jump non-adjacent settings inside one video** without a deliberate reason — a locked (1) editorial passage that suddenly hits a dial-5 orbit reads as two different videos. A **one-step** bump for a single hero moment is fine and effective.

---

## CAM-1. Signature variation — no two scenes share a camera move

The camera column of klik-anim's device ledger (A14). A single rig applied
uniformly makes a piece feel repetitive — "boring real fast" — even when every
individual move is correct. A1 bans single-speed within a scene; this law bans
single-signature across the piece.

- **Direction, magnitude, and drift period must differ scene to scene.** Two
  scenes may share a rig; they may not share its numbers.
- **Parameterising is not varying.** A rig with variants whose every call
  site passes the same explicit overrides ships identical moves — that exact
  dead-code failure ran for a whole session. Verify the variation **reaches
  the render**: compare frames from two scenes (A9), not the code.
- Drift on rests varies too — same period on every hold reads as a metronome.

## CAM-2. Focus discipline — the focal plane sits on the words

In any DOF rig, `focusZ` follows the narrative target, and the narrative
target is almost always the **copy**. A camera push that ramps `focusZ` off
the type plane ships permanent blur on a hero line (a real 2.25px shipped
defect). Camera moves change *where the camera is*, not *what is in focus* —
unless the rack is the point, and then it lands ON the next target, crisp.

## CAM-3. 3D-space hygiene

- **No grouping property on the space or its ancestors — filter OR
  opacity < 1.** Either one **flattens the perspective** — every plane
  collapses to one (render-verified: a sample-stacking motion-blur wrapper's
  fractional opacity vanished the mid/near planes). Blur/warp/fade individual
  planes only (klik-anim A5 owns the blur budget).
- One `perspective` space per scene; planes mounted on `translateZ`, the
  screen-flat reset plane for text/modals (A5).
- The camera is a transform on the space, elements are transforms on planes —
  never mix the two on one node, or moves become un-reasonable-about.

## CAM-4. Moves are phrases

A camera move obeys A1 like any element: anticipatory wind-up, thin-peak
burst, decelerated settle — **into residual drift, never a dead stop** (3–5).
Duration sits in A1's "camera phrase" band (1.6–3.6s), scaled by the pacing
dial C0.5. Exits/entrances across a cut hand momentum to the next shot
(match-motion; klik-anim A12's eye-trace law says where the eye must land).

**Motivation leads; the camera reacts.** The CAUSE of a camera move must be
on screen ~10–14f before the move begins — a line emerging, a subject
departing, a reveal starting. A camera that moves before its cause is
visible reads as unmotivated and confuses the viewer ("why is the frame
travelling?"). Anticipation is ELEMENT grammar (A2.2); **reaction delay is
camera grammar** — the operator sees, then follows. Pair it with a
front-loaded emergence on the motivating element (decisively out by the
time the camera commits, soft arrival; the landing accent supplies the
punctuation).

**The named vocabulary** — truck, pedestal, dolly, zoom, dolly-zoom, pan,
tilt, roll, crane, whip, handheld, rack focus — with exact 2.5D
implementations, the pan-vs-truck / zoom-vs-dolly distinctions, and the
dial-gated move kit lives in **`references/camera-moves.md`** (each move
render-verified in a labeled glossary demo).

## CAM-6. The camera yields to the elements (the default behavior)

The camera's authority chain is **elements > composition > music**. The music
sets the frame's TOTAL motion energy; the elements — already authored to the
music — have first claim on it; the camera is **sidechained** to their motion
and claims only the residual. This is the DEFAULT for every music-driven
piece; the user may override it (more camera, less, or off) — an override is
a recorded spec decision like any dial value, never a silent drift back.

- **Sidechain, not switch.** Element motion ducks camera *drift* with a fast
  attack (~3f) and a slow, eased release (~24–36f) — the camera parks while
  elements phrase and swells back as they settle. Never frame-instant inverse
  coupling: that stutters the camera (CAM-4 violation).
- **The C0 dial is the camera's claim multiplier on the residual** — not a
  mandate to move. Locked ≈ ×0, Anchored ≈ ×0.2, Motivated ≈ ×0.5,
  Flowing ≈ ×1, Perpetual ≈ ×1.5. The dial stays a branding decision; the
  sidechain decides moment-to-moment amount within it.
- **Accents co-fire; drift yields.** The duck governs sustained motion only.
  On rank-1 beats (bar-aligned kicks, hot sections) the camera hits WITH the
  element impact — amplifier, not competitor — mostly on depth axes.
- **Complementary axes.** The camera never rides the axis the elements are
  using: elements own the frame plane → the camera's residual lives in
  depth/roll. Same-axis stacking cancels or doubles element motion
  unpredictably.
- **Gaze-anchored, margin-capped.** Drift is defined relative to the focal
  element's home and is mean-reverting; its amplitude is capped by A11's
  margin math so the focal centroid never leaves the inner pocket (~8% of
  frame). "Center" is defined by the subject — the camera cannot walk the
  boss off its composition. **Which frame the cap is measured in follows the
  composition model** (klik-anim `references/layout.md`): normally the video
  frame, but under the **accretion artboard** it is the *reading pocket* —
  the camera travels the canvas beneath a pocket that itself stays put, so
  the boss never leaves the pocket even though the canvas leaves the frame.
  A camera that walks the active run out of the pocket is the violation;
  one that walks spent canvas out of frame is the model working.
- **Holds are the camera's turn.** During designed holds (reading time) the
  elements drop to micro idle and the camera provides the life — the slow
  push on a held line. One rank-1 mover at a time (klik-anim A10) — and the
  camera counts as a mover.

Implementations live in `references/camera-music.md` as **presets**:
**A · Hold & Glide** (the default — camera holds with breathing only, then
one composed zoom/slide per musical seam, landing on the downbeat; scenes
laid out in world space so the travel IS the scene change) · **B · Reactive
Shake** (the sidechained drift+hit rig — field-judged too twitchy as a
standing behavior; opt-in, scoped, recorded) · **C · Element-Follow**
(roadmap). Preset choice is the user's; A is what you reach for unasked.

## CAM-5. The camera hears the music too

Same music map as klik-anim §A16, camera scale — the camera moves on the
music's **big body** (bars, sections, drops), never its surface detail:

- **Energy tier maps to activity *within* the dial.** Tier 5 is the dial's
  ceiling (the one-step hero bump lives here, on the drop); tier 1–2 is its
  floor — drift only, even at dial 4.
- **Signatures change at musical seams.** CAM-1's scene-to-scene variation
  lands at section boundaries, not at arbitrary cuts — a new section sounds
  different, so the camera moves differently.
- **Bass impacts are camera hits:** a small kick/push with shutter blur,
  landing sharp on the transient. **Swells are pushes/pulls** whose ramp
  matches the swell's rise. **Breakdowns settle into drift.**
- **Never mickey-mouse the hi-hats.** Micro-percussion is element territory
  (A16's blinks and ticks); a camera that twitches on every hat reads as
  nervous, not musical.
- **Implementation recipes live in `references/camera-music.md`** (this skill
  folder) — load it when building a music-driven camera: the render-verified
  rig shape, per-section signature crossfades, the bar-kick filter, velocity
  shutter smear, and the sample-stacking-blur-flattens-3D trap.

---

## CAM CHECKLIST — run before every render with any camera movement

1. Dial value set with the user (never defaulted), recorded in the spec, applied consistently — no unmotivated non-adjacent jumps?
2. At dial 1–2: camera truly holds (≤0.5% creep) — no accidental drift? At 3–5: every move pairs zoom with a rotation axis or lateral vector — no pure scale/truck?
3. Every move resolves into residual drift or a motivated rest — never a dead stop (3–5)?
4. Shutter blur present at every velocity peak (2–5f), landing frame sharp?
5. Camera signatures differ scene to scene (direction, magnitude, drift period) — verified in rendered frames, not parameters (CAM-1)?
6. `focusZ` on the narrative target (the copy) through every move — no hero line blurred by a push (CAM-2)?
7. No CSS filter on any ancestor of the 3D space; blur applied per plane only (CAM-3)?
8. Monotone-spline interpolation at 4–5 — no camera bounce, no velocity discontinuity at pose keys?
9. Camera follows the music map (CAM-5): signature changes at section boundaries, hits on bass impacts with blur, activity tracks the energy tier — and no camera twitch on micro-percussion?
10. Camera yields to the elements (CAM-6): drift ducked during element phrases (fast attack, slow release), focal centroid inside the inner margin the whole piece, no same-axis competition, accents co-fired only on rank-1 beats — or a recorded user override says otherwise?

---

*Companion layer: `klik-anim` (element craft — its A-laws bind the camera too) · Remotion's official skills (mechanics) · the project's style bible (which dial value fits the brand).*
