Zoom blur
Use it in Tella
- Open any video in Tella, then open the AI chat.
- Paste the skill:
tellahq/community-skills/zoom-blur - Then ask for what you want, for example:
When the board pops at 0:04, hit the footage with a zoom blur pulling from the board and let it settle.
Use it in Claude Code
Add it to Claude Code, or any agent that reads skills:
npx skills add tellahq/community-skills --skill zoom-blurInstructions
What the AI chat follows when the skill is pasted, from its SKILL.md.
Zoom blur
One treatment for a short stretch of the user's own footage: on the hit, the frame bursts into streaks that radiate from a point on the subject, the colour splitting red-outside, blue-inside at their ends, and under a second and a half later the clip is clean again. It sits over the clip as a full-frame Tella Motion overlay that filters whatever is beneath it, so it works on camera footage, b-roll or a screen recording in any layout. Audio is untouched. It is an accent: one or two per video.
Builds on tella-motion-design (timing to words, checking) and tella-camera-moves (pair it with a punch-in layout for more impact; it is not a camera move itself). For a rainbow edge split without the blur, a glow, or a ripple, this is the wrong skill.
Ask once
Work these out yourself and never ask:
- The hit: from
get_transcriptword timings, the stressed word of the line (an impact word, "and then…", a reveal, a number); with music,get_music_beatson the background music (or the clip's source); with no speech, the loudest transient inget_audio_levels(10 ms steps) or, from frames, the moment of action (a pop, a landing, a cut-in). Pick the strongest one in the clip the user means, or in the current selection. - The subject's position at each key, from
get_clip_frameat hit − 0.25 s, hit + 0.2 s and hit + 0.5 s. - The canvas size, the clip and overlay times, and the video's flashes already there.
Then one ask_form, every field prefilled so submit alone builds it:
| Field | Type | Required | Prefill / default | Limits |
|---|---|---|---|---|
| The moment | text | yes | the hit you found, as 0:04.3 – "pop" (or 0:04.3 – board pops) | a time on the video, or a range 0:12–0:20 for beat mode; ≤ 40 characters |
| Strength | slider, % | yes | 100 % (the example) | 20–100 %; peak amount = 0.7 × value. 60 % is a subtle accent |
| Pulls from | pick | yes | The subject, tracked | The subject, tracked · The face · Frame centre |
| Colour fringes | switch | no | on | on = fringe 0.4, off = fringe 0 |
| Length of the punch | slider, s | yes | 1.3 s (the example) | 0.6–2.0 s, rise to the end of the decay |
| Hits | pick | yes | One hit | One hit · Every bar (downbeats) · Every other beat |
| Whoosh | switch | no | off | on adds a quiet whoosh sound effect under each hit |
- Show the pick options as words only; no pictures are needed.
- No media to ask for: the effect uses the clip's own footage. If the stretch has no footage (a blank clip, a pure Tella Motion clip), say so with
ask_questionand offer "lay it over the next clip", "add a vintage library clip fromlist_libraryscopevintageas b-roll first", or "skip". - Beat mode without background music or a range: ask with
ask_question"Which stretch should hit on the beat?" with up to three suggested ranges from the transcript. - Skipped form: build with the prefilled values.
Timing
Times are on the overlay's own clock (hit = the moment − the overlay's start; the overlay starts at least 0.9 s before the first hit and ends about 0.45 s after the last decay).
Key on amount | Time | Value | Easing into the next key |
|---|---|---|---|
| hold | 0 | 0 | hold |
| rise starts | hit − 0.3 s | 0 | easeOutCubic |
| peak | hit | peak | linear |
| shoulder | hit + 0.2 s | 0.9 × peak (0.62 in the example) | easeInOutSine |
| clean | hit + length − 0.3 s (1.0 s in the example) | 0 | linear |
- The peak lands on the word's first syllable or the beat, not before it.
- Beat mode (untested): the same five-key envelope per hit, one overlay per clip the range covers (see "Across clips" below); each envelope must reach 0 before the next one's rise. Keep hits at least 1.5 s apart (at most two in any 3 s, for viewers sensitive to flashing); drop beats to get there, and shorten the length to fit.
- Never let a peak sit over a name, number or on-screen text the viewer has to read.
The look (from the example, 1920 × 1080)
amountpeak 0.7, shoulder 0.62,fringe0.4,clear0.04: a tight sharp spot and streaks that reach almost to the centre.centerx 0.52 fixed; y keyed witheaseInOutSine0.47 at hit − 0.25 s → 0.36 at hit + 0.2 s → 0.30 at hit + 0.5 s, so the sharp spot rides up with the board as it rises. Follow whatever the subject does the same way: one key per position, about 0.3 s apart, only while the blur is visible.- "The face": centre on the bridge of the nose. "Frame centre": 0.5, 0.5, no keys.
- At full strength the frame is mostly streaks for about 0.4 s; the subject must stay readable in the sharp spot, which is why the centre tracks it.
Building it
create_motion_documentwith thevideoId, namedZoom blur: <what it hits>;canvas.setits duration to the overlay's. Show it withadd_overlaymotionDocumentIdon the clip:point0,0,dimensionsthe video size,depth: "front",transition: "hard_cut", noanimation.- One node
fx:addShapeshape: "fill",color: "#00000000". addEffectonfx:kind: "shader",backdrop: true, the source fromreferences/shader.mdas written, uniformsamount 0,center [0.52, 0.47](or your point),fringe 0.4,clear 0.04.- Key with
setKeyframeson the pathsinspect_motion_node_propertieslists (a backdrop has a doubledeffect):field:common/effects/0/effect/effect/uniforms/amount/values/0and…/center/values/1(and/values/0for x). Times in seconds on the document's clock. - Whoosh:
list_libraryscopedefaultsound effects, a short whoosh,add_sound_effectstarting about 0.15 s before the hit, volume 0.3–0.5.
Across clips
An overlay belongs to one clip and can't span a cut, and a document plays in one place only. The moment and the range are on whole-video time; overlay times are on each clip's playback timeline (cuts applied). So:
- Beat mode (untested): split the range at clip boundaries from
list_clips(each clip's start = the sum of the earlier clips' cut durations). Build one document and one overlay per clip, each covering only its part of the range, and convert every key to that document's own clock (video time − clip start − overlay start). - A punch that straddles a cut (a beat or the one hit within a punch-length of a clip's end): part 1 on the outgoing clip, ending on its last frame, with the keys before the cut; part 2 on the incoming clip from 0, with the rest of the keys shifted back and a first key holding the envelope value (and
center) in force at the cut, so the blur carries on without a step. If the hit is in the last clip, shorten the decay to end on its last frame instead. - A hit less than 0.9 s into a clip: start the overlay at the clip's 0 and keep the keys on its clock; the rise may be shortened, never moved off the hit.
A second hit elsewhere: duplicate_motion_document (a document plays in one place only), then move the keys. Name them in order ("Zoom blur 02: landing").
Checking it
get_filmstripof the clip at the overlay start, hit − 0.3 s, the hit, hit + 0.2 s, the end of the decay and the overlay end: clean before and after, the peak on the moment, no pop at the overlay's edges.- One
get_clip_frameat the hit, 1920 wide: the subject sharp in the clear spot, streaks even all round, red outside and blue inside at the ends. A blur pulling from empty floor or sky means the centre keys are off. - A 10 fps
get_video_previewacross the range: the ramp moves smoothly, no snap where a key jumps. - Report each hit's time, what it lands on, the peak and the centre.
Gotchas
- The fill must stay clear and its blend mode
normal: any other blend mode drops the backdrop and shows the footage unfiltered. addAdjustmentinside an overlay only sees the overlay's own layers; the clear backdrop fill is what reaches the footage.- A brand-new document refuses a raw shader insert through
node.patch; useaddEffect. A shader that fails to compile poisons the document's renders: rebuild in a fresh document. - Changing the source means
removeEffect,addEffectagain, then re-keying. - Keep
amount × (1 + fringe)≤ 1 (seereferences/shader.md), so with fringes on never push past 0.71. - Built-in
blurorfx.chromaticAberrationcan't make this: one is not radial, the other draws three ghosts and coloured edge bands.
Variations
- Subtle accent under a talking head: 50–60 %, fringes off, length 0.8 s, centre on the face.
- Stack with a punch-in layout on the same word for a harder hit.
Files
The other files in the skill, such as reference videos it copies from.