trey retweeted
i recreated this Ricksclip style animation completely in claude + blender
it took me a week of researching polishing figuring out and becoming BETTER then the original
and as promised im LEAKING the prompt for FREE
he got 100M views in the past 30 days averaging 8M views per vid
this style is a mix of a 2d character with a 3d background
ive seen a few people try to recreate this but they dont end up like the og
so how did i make this?
-> Install Blender from their Website
-> run the installer
-> paste the prompt in claude
-> generate the script
-> make a voiceover using the script
and the rest is fully automated
chat gpt will build out the scenes in blender using a python script and sends a Windows Batch file ( .bat ) to a folder you specify
u just simply double click the Render .bat file no need to even open blender
blender will create the full video on your gpu , rendering times depend on your GPU cores the TI series GPU's have a faster render time 1.5-3sec per frame
this video in particular was 1900 frames and took me 1.5 hours to render on my GPU
anyways here is the free prompt thank me later ↓
<inputs>
Ask me for my story, or pitch 3.
- A good one is true and little known. Someone does something that looks ridiculous, someone laughs at them, and the reveal flips who was smart: a trick, a scheme, a bluff, a loophole, revenge.
- Give each pitch with its first line, the mocker, the twist, and a title that hides the ending.
Ask which voice I want:
- Free, the default: Kokoro, run locally on the CPU.
- Optional upgrade: ElevenLabs with a stock library voice. Tell me the credit cost before you generate anything, and make one take.
Ask what GPU I have. Any GPU works: Blender EEVEE renders on all of them, just slower on older cards.
Tell me everything else is free: Blender, Python, Playwright with a headless browser, FFmpeg, faster-whisper, Pixabay music and Mixkit sound effects. No image, video or 3D model generator is used anywhere.
Then write the script and the beat list with seconds, and show me both before you build anything.
</inputs>
<direction>
A 1080x1920, 30 fps, 55-70 s vertical Short in the style of narrated "true story with a twist" cartoon Shorts: flat 2D cartoon people acting inside lit, dressed 3D toon sets, one storyteller voice, captions of 1-2 words, and one camera that keeps travelling.
Sets (Blender, built by a Python script):
- Build every place in the story from simple shapes in code (boxes, cylinders, cones, tori, bevelled boxes), never a downloaded model.
- Materials: flat toon colours with low roughness, so it reads like a cartoon, not a photo.
- Ink outlines: an inverted-hull shell on every object (a Solidify modifier with flipped normals and a dark backface-only material), so the world has the same line as the characters.
- Draw surfaces on a canvas and use them as textures: signs, chalkboards, brick, planks, plaques.
- Put the story's words inside the world (signs, boards, counters) instead of floating titles.
Palette and light:
- Pick a warm key against cool shadows for each place. Balance cream, ochre and amber against blue, teal and purple.
- Costumes contrast with the set.
- Interiors: warm practical lamps plus a soft cool fill. Exteriors: a strong sun, a blue sky and a lighter horizon.
- Render with EEVEE, the Standard view transform, a slight lowered exposure, and a soft glow added in the finish.
People:
- 2D characters are drawn in code (HTML canvas) and exported as transparent images, one per pose and expression. In Blender they sit on camera-facing cards that turn around the vertical axis only.
- Use an emission material on the cards so faces stay clean white whatever the lighting.
- The look, kept simple:
- a big round white head with a thick dark brush outline
- big expressive eyes and brows, a small nose, a mouth that changes shape
- thin stick legs and chunky flat-colour clothes
- one signature prop or accessory each (glasses, a hat, a cigar, a tool)
- The face set: smug, grin, shock, laughing, worried, sweat drops.
- Pose-to-pose acting: point, hold up a prop, hands on hips, arms up. Blinks and small breathing keep holds alive.
- A new, original cast for every video. Show me a character sheet before building.
Camera:
- One camera that travels between beats. Each beat holds with a slow push, then the camera moves to the next.
- Fit every camera key to what it should show: compute the distance so the named faces or props sit fully in frame.
- Inserts carry the proof: a close-up on the key object while the change happens.
- The payoff is the biggest frame in the video: a reveal coming at the lens.
- Soft dissolves or camera moves between places, few hard cuts.
Captions:
- 1-2 words at a time; short words (a, the, so, to) ride with the next word.
- A bold rounded font, white with a thick dark outline, centred in the lower third.
- No full stops on screen.
Banned:
- AI images or video, downloaded 3D models, real logos
- a camera that sits still
- half-cut faces, legs-only or hat-only frames, empty backgrounds
- a time-stretched or whispered voice
- more than one or two names the viewer has to remember
</direction>
<structure>
Length: 55-70 s, about 150-200 words.
Beat map for a 62 s Short (scale it to your voice):
0-4 s, HOOK: one plain sentence about an act that makes no sense, with the reason hidden. Picture it in one frame.
4-12 s, SETUP: who, where, and what's at stake, with one exact number.
12-20 s, THE MOCKER: a quoted joke line said to the hero. Big close-up.
20-40 s, THE METHOD: it gets weirder in steps. One close-up insert per step.
40-50 s, "YOU SEE,": the trick explained through an everyday thing the viewer has done.
50-62 s, THE PAYOFF and THE TWIST: shown, not explained. The last line is the biggest reveal and calls back to the hook.
</structure>
<build>
1. Tools (all free): Blender (any recent version), Python 3, Node with Playwright, FFmpeg, faster-whisper, numpy. Install what's missing and tell me what you installed.
2. Script:
- Tell it the way a kid tells a friend: plain words, sentences joined with "and" and "so", one funny comparison, no dates or jargon.
- Join related sentences with commas, because a voice resets after every full stop and leaves a gap.
- Show me the word count and the seconds per line.
3. Voice:
- Free route: Kokoro on the CPU, one line per call, joined with short gaps.
- Paid route: ElevenLabs, one take, cost stated first.
- Only trim silence, never inside a word. Then run faster-whisper on the finished track to get word times.
4. Characters: draw the cast in code, show me a sheet, then export every pose/expression the story needs as transparent WebP.
5. Story timeline: one file that, for any frame, returns the camera (position, look-at, fov, roll), the focus distance, and each character's card, position and scale. Anchor every beat and sound to a word time, never a typed time.
6. Exporter: a headless browser page runs the timeline for every frame and writes frames.json plus the card images and sign textures.
7. Blender scene script (blender -b -P scene.py -- --data data --out frames):
- builds every set, light and prop
- reads frames.json, places the camera and cards each frame, animates the props
- renders JPG frames, skips frames that already exist so it can resume
8. Contact sheet before the full render: stills from the middle of every shot, labelled with time and the line being spoken. I approve or ask for changes.
9. Sound:
- Music: one playful bed under a free licence, about 20 dB under the voice.
- Effects: real Mixkit sounds placed on the actions (whooshes on camera travels, pops on reveals, impacts, dings).
- Duck music and effects under speech. Normalise to -14 LUFS.
10. Finish with FFmpeg: a soft glow (screen-blend a blurred highlight pass at about 0.4 opacity), burned-in captions, the mix, H.264.
11. Give me a one-click .bat (or .sh) that runs the export, the Blender render and the finish. It must refuse to encode if any frame is missing, and never overwrite an older video.
12. Upload text:
- Title: "The [thing] That [strange act]", hiding the ending.
- Cover: a clean frame of the payoff with no text.
</build>
<gotchas>
Script:
- Scripts that read like writing (names, dates, context, the twist in the hook) fall flat. Line 1 is the strange act with the reason hidden.
Voice:
- Short full-stop sentences make the voice stop-start. Join lines with commas.
- Trimming at whisper timestamps clips words. Trim on silence only, with a small guard.
Look:
- Empty sets read as cheap. Dress every place with props and background detail.
- Characters scaled too small look like kids next to tables. Scale them so they stand about 1.9 m against the real-size sets.
Camera:
- Hand-placed cameras crop faces at 9:16; the frame is narrow. Fit keys to the subjects and scan every frame for cut faces before rendering.
- A camera that flies through a wall, a canopy or a post reads as a glitch. Pick another angle or cut.
Render:
- 3D props attached to a 2D card must follow the card's turn, or they drift off the drawn body.
- A render that stops early (sleep, crash) must not be encoded into a short video. Check the frame count first.
- Turn off PC sleep before a long render.
Sound:
- Music only a few dB under the voice makes the narrator hard to hear. Keep it low and measure.
</gotchas>
<start>
Ask me for my story, or pitch 3. Then show me the script (word count and seconds per line) and the beat list before any voice is generated or any scene is built.
</start>
trey retweeted
I did the f*cking work for you.
Tested this guy's viral cartoon prompt on my own Claude Opus 5.5 and screen-recorded the whole thing.
The first video is the result after a couple of small tweaks. The second is my screen recording, 37 minutes sped up to one.
Full prompt is in the reply. Keep scrolling to see what other people made with it, or paste it into Claude with your own story.
Story: Casanova, Venice 1754, and a betting system that "couldn't lose". Every frame is drawn in code (three.js + headless Chrome), the voice is a free local model, the music is written in numpy. $0 on image or video tools.
i made this ricksclips style animation completely from scratch using opus 5.5
the style is going extremely viral rn on the internet and people are paying money just to be able to make them
well today is ur lucky day cause am giving away the full prompt to guys for free
all u need is voiceover and claude to be able to make this, $0 spent on images or videos
-> here's the prompt
{
"task": "Make a vertical animated cartoon short of MY story, built in code: three.js r160 world + canvas-drawn 2D character cards, rendered frame by frame in headless Chromium (Playwright, swiftshader), encoded with ffmpeg. 1080x1920, 30fps, exactly as long as my voiceover. Work start to finish; only ask if script and audio don't match.",
"my_inputs": {
"story": "[your idea, true event, legend or full script]",
"script": "[optional exact script]",
"voiceover": "[optional: attach mp3/wav]",
"length_seconds": 30,
"voice_speed": 1.0,
"captions": false,
"notes": "[optional: era, setting, characters, jokes]"
},
"stages": [
"A. No script: write one at ~3.7 words/s (30s~110 words): 1) hook = absurd fact, no setup 2) setting in 1-2 lines with a concrete detail 3) 2-4 escalating beats, others doubt/mock, one exaggeration joke 4) pivot 'But...'/'You see,' revealing the real mechanism with an everyday analogy 5) short ironic twist = last words. Spoken English, contractions, numbers as words, never describe what's on screen. If presented as true, web-check facts and say history/disputed/legend.",
"B. No voiceover: give script in a copyable block + word count + est. length, a short shot plan, recording tips (one warm narrator; ElevenLabs speed 1.05-1.1, stability 45-55%; pauses at sentence ends; no music). Stop and ask for the upload.",
"C. With voiceover: build everything below without stopping. Task list for progress; send a stills contact sheet before the long render."
],
"setup": [
"mkdir -p web/lib work stills frames out",
"npm pack [email protected] -> copy package/build/three.module.js to web/lib (fallback: sparse git clone of mrdoob/three.js branch r160, folder build)",
"Playwright + Chromium (npm i -g playwright && npx playwright install chromium); launch args --use-angle=swiftshader --enable-unsafe-swiftshader --ignore-gpu-blocklist",
"python3 numpy Pillow, ffmpeg (with rubberband)",
"Serve web/ with a tiny Node http server; render.mjs loads index.html, waits for window.ready, calls window.renderFrame(f), saves canvas.toDataURL('image/jpeg',.95) to frames/f0000.jpg. Support RESUME=1 (skip existing) and a frame list 'a-b' or '1,5,9'."
],
"timing": "If voice_speed!=1: ffmpeg -af rubberband=tempo=<speed> (pitch kept). Claude can't hear audio: align my script to speech using ffmpeg silencedetect (-35dB, 0.12s): split script into phrases at punctuation, DP-match phrases to speech segments by syllable count vs duration, penalise sentence ends inside a segment. Spread words by syllables. Write work/phrases.json; check pauses fall at sentence ends. Frames = round(duration*30). Every reaction lands 0-3 frames before its word; the final payoff lands on the final word.",
"architecture": {
"files": "web/index.html (canvas#c 1080x1920 + module main.js), main.js (renderer, materials, world, cards, sprites, passes), story.js (SHOTS, LIGHTS, lightFor, camAt, dofAt, worldAt, actorsAt, fxAt: all pure functions of frame f), motion.js, paint.js (canvas textures), toon.js (character + creature drawing), audio.py, mix.py, finish.sh, sheet.py (contact sheets).",
"renderer": "WebGLRenderer antialias:false, preserveDrawingBuffer, PCFSoft shadows 2048, sun = DirectionalLight from az/el per light preset, shadow camera centred on each shot's action (ext 8-60m), HemisphereLight, Fog(colour = sky horizon). Camera Perspective, near .08 far 1500.",
"materials": "MeshToonMaterial with a 2-texel gradientMap [90,255] Nearest = hard 2-step toon shading. Textures are CanvasTextures painted in code: flat base + soft blotches + dark seams/strokes, repeat-wrapped, colorSpace sRGB. Boxes use world-scaled UVs (constant texel density).",
"passes": [
"1 colour: render scene to HalfFloat RT (samples 4).",
"2 normal+depth: swap every mesh material to a ShaderMaterial writing vec4(normal*.5+.5, viewDepth) (handle USE_INSTANCING: pos=instanceMatrix*pos). Cards/sprites write rgb 0 + depth with alpha-test (so they block but are never outlined). Hide sky, clouds, blob shadows. Fog and shadows off for this pass.",
"3 ink+grade fullscreen: 16 taps on a ring of radius 2.5px*clamp(7/depth,.62,1.25); edge = smoothstep(.006,.02,(dS-d)/d) on the NEAR side of depth jumps only; crease = smoothstep(.88,.72,dot(n,nS))*.9 when depths are within 6%; skip card samples; sky counts as depth 1e4; fade ink 140-520m. colour = mix(c, #030203, e); saturation 1.08-1.15; gain/lift tint; vignette .2-.34; white flash uniform.",
"4 lens: per-pixel CoC = cinf*(1-focus/d) (near side capped 1.4x); 48-tap golden-angle disc, each tap weighted by its own CoC so sharp foreground never bleeds; skip when cinf<.5. Output linearToOutputTexel."
],
"sky": "inverted sphere following camera: mix(horizon, top, pow(y,.55)) + optional sun disc. Painted cloud billboards far away (650-900m), fog off, facing camera."
},
"characters": {
"card": "Each character is a 1200x2000 CanvasTexture on a 1.35x2.25m plane with origin at the soles (design space 600x1000, soles at y=975, 1 design unit = 2.25mm). MeshBasicMaterial alphaTest .02, DoubleSide; shadow via customDepthMaterial with the same map (alphaTest .5); soft dark radial blob under the feet. Billboard on yaw only: rotY = atan2(cam.x-x, cam.z-z). Redraw a card only when its key (JSON of q()-rounded pose values) changes.",
"proportions": "Bean body: head blob ~236 wide, legs 1.38xHH, torso 1.08xHH (stout 1.12), eyes ~1.47m high. Head = superellipse blob with slight egg + per-seed asymmetry. Torso = egg blob with a tunic skirt below. Legs/arms = thin curved strokes (5.8u/5.2u, u=headWidth/100) in a darker shade of the outfit; round dot hands; small boots.",
"ink": "Outline colour #241726 (plum), width 5u, thicker on the side away from the light (light from upper-left, -120deg). Fills: base colour with a soft shadow gradient toward lower-right. Skin default #ffe2c2, also #f5c9a0 #ecd0b6 #c99067.",
"faces": "Eyes 13u apart either side of centre. Kinds: dot, lid (half-closed), happy (arc), squeeze, shock (big white + small pupil + raised arc brows), slit, dash. Mouths: dash, frown, smirk, smile, grin (open with teeth line), laugh, o, O, wave (nervous), teeth. Brows are short tapered strokes; angle sets mood. Expressions: neutral, stern, grin, laugh, nervous (+sweat drop), shock, smile, pained, squint, smug/side-eye (half lids, pupils to one side). Blinks every 1.3-2.3s for 4 frames.",
"outfits": "Built from parts: tunic colour, belt, buttons, pockets, sash, hat (slouch hat, cap, top hat, bonnet, helmet, crown, hair), beard/moustache, apron, dress, props in hands. Design new outfits for each story in the same flat style.",
"arm_poses": "hang, point (+finger), up, wave, hip, belly, cheek (both = shock), salute (flat hand at brim, drawn over the head), thumb (thumbs-up), shrug, reach, lift, cross, prop-holding (pen, stamp, wrench, spear, sign). Whole upper body tilts about the hip; head tilts separately.",
"creatures": "Animals are side-view canvas sprites (600x800 design, feet at y=780) on shared textures cached by pose key, so flocks of 50+ cost little: shaggy shaded body blob with fringe strokes, thick inked limbs, small head, big googly white eye with pupil that can look/side-eye, simple beak/snout. Legs via 2-bone IK with joint bent backward; run cycle 16 phases (foot x = hip + stride*cos, lift = max(0,sin)); poses: stand, run, peck/graze, smug. Flip the sprite when travel direction dot camera-right < 0."
},
"world": {
"build": "Primitives only: boxes, cylinders, cones, squashed spheres, extrusions; group set-pieces with pivots driven by 0..1 progress from worldAt(f) with eased, staggered parts. Instanced meshes for crops/grass/rocks; clear a patch where the action happens.",
"background": "low half-buried hill spheres, distant mesas or mountains (cone + snow cap), trees (trunk cylinder + 4-6 squashed sphere canopies), far houses, fog to the horizon colour.",
"secondary_motion": "windmills turn, flags/cloth wave (vertex sine), smoke/dust/leaves/Zzz/stars as cached 2D fx sprites, water shader scroll, wheels roll with distance/radius, vehicles bounce.",
"text": "Diegetic text (signs, crates, letters, stamps) painted on canvas with real fonts; place on +z faces or planes so it never reads mirrored. Swap textures to animate (e.g. stamp appears on impact)."
},
"lights": {
"day": "sun az64 el50 #fff3df 2.45, hemi sky #d2e2f6 ground #a8905e 1.1, sky top #2d74d4 horizon #cfe3f5, fog 120-1300, sat 1.12, vig .2",
"golden": "sun az30 el11 #ffb46a 2.9, hemi #a99bcc/#7a5040 .98, sky #6474c0 -> #ffc485 + sun disc, gain #fff0e0, sat 1.15, vig .26, tint cards #ffe2c4",
"dusk": "sun el5 #ff9a72 .9, hemi #5d6cab/#3a3048 .8, sky #18234f -> #d18a7c, gain #e2e8ff, lift #04050b, vig .34, a warm point-light lamp, tint cards #c9cff2",
"use": "day = normal story, golden = decline or time passing, dusk-blue = explanation or ending. Time jump = 6-frame white flash."
},
"motion": {
"helpers": "smooth(t)=t^3(t(6t-15)+10); easeOut=1-(1-t)^3; back(t)=overshoot s=1.7; spring settle; Catmull-Rom spline through via-points; idle(f,seed)={bob .006 sin(.11f), tilt 1.2deg sin(.05f), headTilt 1.5deg sin(.037f)}; blinkAt(f,seed); q(x)=round for card keys.",
"camera": "Keys {f,pos,look,fov,roll,ease,path} inside cut-free segments; glides 18-45 frames; easeOut for whips/reveals; every hold creeps (fov *= 1-.00012*(f-f0)); 3-5deg roll on drama; impact kick = 7-frame alternating look offset + roll that decays. Vehicles: track alongside, match speed, slight judder.",
"continuity": "prefer one continuous move: MCU pull-back into a wide, crane up and over a fence into the establishing shot, lateral truck along a lineup, crane down into an insert, rack focus to the background gag. Hard cut only on place/time jumps.",
"acting": "anticipation -> back overshoot -> spring settle; pop-ins scale 0->1 with back easing + dust puff; stamp = 2-frame dip + puff + kick; laughs = alternating tilt + bob; head bobs on stressed words; nothing static for 4+ frames.",
"walks_runs": "feet planted, bob 3-7%; run phase = speed/stride; fast movers must stay in frame until their beat is done."
},
"shot_grammar": {
"plan_first": "work/PLAN.md: one row per shot (frames, words, setting, light, camera, cast/poses/expressions, fx, sfx). Usually one shot per phrase; merge tiny ones. Illustrate every sentence literally; props carry the jokes.",
"order": "frame 0 = hook MCU of the hero mid-action -> pull-back reveal on the punch of sentence 1 -> wide establishing crane -> lineup/two-shot with pop-ins on each listed item -> reaction close-up (a creature or extra slides in with a side-eye on the question line) -> action wide (chase, scatter, collapse) -> time-jump flash -> insert on the key object -> twist: music stops, low sting, push-in with roll, payoff on the last word.",
"framing": "Bean cards 2.25m tall: MCU = camera ~3.5m away at fov 32-34 looking at 1.35m; wides fov 40-52. Vertical frame half-width = d*tan(hfov/2), hfov = 2*atan(tan(vfov/2)*.5625): at 4m and fov 40 only +/-0.8m, so stage people in depth.",
"lens": "DOF on close-ups/mediums (cInf 7-14, focus on the eyes), wides sharp, racks ~14 frames."
},
"audio": {
"stems": "audio.py writes only music.wav + sfx.wav (48k mono, numpy synth). Music: short loop in the story's mood (march: kick/snare, plucked bass, brass pad, little fanfare; or plucky comedy; or eerie pad); stops on the twist line, then a low drone. SFX in frames/30: whoosh (low-passed noise with sine^2 envelope) on big moves, thunk (pitched sine drop + noise) on pops/stamps, rustle/leaves, feet patter, engine (pulse train low-passed), scrape, ting (2-4 kHz bells), sting (41 Hz + noise hit + brass stab) on the twist.",
"mix": "mix.py: gated RMS of the voice (0.4s blocks above -40dB of max); scale music so its gated RMS = 0.5x voice (-6 dB); SFX = min(0.5x voice RMS, peaks 0.7x voice peak); sum; one linear gain only. No ducking, no compression. Print the measured levels and confirm.",
"finish": "measure integrated loudness (ffmpeg ebur128), apply one volume gain to -14 LUFS + alimiter -1 dBFS; encode: ffmpeg -framerate 30 -i frames/f%04d.jpg -i mix.wav -c:v libx264 -preset slow -crf 17 -pix_fmt yuv420p -c:a aac -b:a 192k -shortest -movflags +faststart. QA: freezedetect (n=.0005, d=.4) and blackdetect must find nothing; make a 2fps tiled QA sheet and look at it."
},
"look_check": "Before the full render, render stills at every shot's middle plus key actions, tile them into a contact sheet, look at it and fix: cropped heads/hats, characters hidden by props or crops, camera inside objects, fast movers already out of frame, mirrored text, missing ink, empty frames. Send me the sheet, then render all frames in the background (about 3-6 s/frame on CPU), lock picture before sound.",
"code_core": {
"ink_shader_glsl": "uniform sampler2D col, nd; uniform vec2 res; uniform float px, sat, vig, flash; uniform vec3 fogCol, lift, gain; varying vec2 vUv;\nfloat edgeAt(vec2 uv, float r){\nvec4 c = texture2D(nd, uv); if (dot(c.rgb,c.rgb) < .01) return 0.; float d = c.a; vec3 n = c.rgb*2.-1.;\nfloat e = 0.; float rr = r * clamp(7./d, .62, 1.25);\nfor (int i=0;i<16;i++){ float a = float(i)*.785398 + (i>7 ? .39 : 0.); float k = i>7 ? .5 : 1.;\nvec2 o = vec2(cos(a), sin(a))*rr*k/res; vec4 s = texture2D(nd, uv+o);\nfloat ds = s.a; bool card = dot(s.rgb,s.rgb) < .01;\nif (card && ds > 0.) continue; // character cards: never outlined by the world ink\nif (card) ds = 1e4; // sky\nvec3 ns = s.rgb*2.-1.;\ne = max(e, smoothstep(.006, .02, (ds - d)/d)); // depth jump, near side only\nif (!card && abs(ds-d)/d < .06) e = max(e, smoothstep(.88, .72, dot(n, ns)) * .9); // crease\n}\nreturn e * (1. - smoothstep(140., 520., d)*.8);\n}\nvoid main(){\nvec3 c = texture2D(col, vUv).rgb;\nfloat e = edgeAt(vUv, px);\nc = mix(c, vec3(.012,.01,.014), e);\nif (flash < -0.5) c = vec3(e);\nfloat l = dot(c, vec3(.299,.587,.114)); c = mix(vec3(l), c, sat);\nc = c*gain + lift;\nvec2 q = vUv-.5; c *= 1. - vig*dot(q*vec2(1.,.75), q*vec2(1.,.75))*2.2;\nc = mix(c, vec3(1.), flash);\ngl_FragColor = vec4(c,1.); }",
"dof_shader_glsl": "uniform sampler2D src, nd; uniform vec2 res; uniform float focus, cinf, near; varying vec2 vUv;\nfloat coc(vec2 uv){ float d = texture2D(nd, uv).a; if (d <= 0.) d = 2000.; float k = 1. - focus/d; return k > 0. ? cinf*k : min(-k*cinf*near, cinf*1.4); }\nvoid main(){\nfloat c0 = coc(vUv);\nif (cinf < .5 || c0 < .6) { gl_FragColor = linearToOutputTexel(vec4(texture2D(src, vUv).rgb, 1.)); return; }\nvec3 acc = vec3(0.); float wsum = 0.;\nfor (int i=0;i<48;i++){ float fi = float(i); float r = sqrt((fi+.5)/48.); float a = fi*2.39996;\nvec2 o = vec2(cos(a), sin(a))*r*c0/res; float cs = coc(vUv+o);\nfloat w = smoothstep(r*c0-1.5, r*c0+.5, cs + .5);\nacc += texture2D(src, vUv+o).rgb*w; wsum += w; }\ngl_FragColor = linearToOutputTexel(vec4(acc/max(wsum,1e-3), 1.)); }",
"motion_js": "export const clamp = (x, a = 0, b = 1) => Math.max(a, Math.min(b, x));\nexport const lerp = (a, b, t) => a + (b - a) * t;\nexport const lerp3 = (a, b, t) => a.map((v, i) => lerp(v, b[i], t));\nexport const ramp = (f, a, b) => clamp((f - a) / (b - a));\nexport const M = {\nsmooth: (t) => { t = clamp(t); return t * t * t * (t * (t * 6 - 15) + 10); }, \neaseOut: (t) => 1 - Math.pow(1 - clamp(t), 3), \neaseIn: (t) => Math.pow(clamp(t), 3),\nback: (t, s = 1.7) => { t = clamp(t) - 1; return t * t * ((s + 1) * t + s) + 1; }, \nanticip: (t, s = 0.12) => { t = clamp(t); return t < 0.25 ? -s * Math.sin(t / 0.25 * Math.PI) : M.back((t - 0.25) / 0.75); }, \nspring: (t, freq = 3, damp = 5) => { t = Math.max(0, t); return 1 - Math.exp(-damp * t) * Math.cos(freq * 2 * Math.PI * t); }, \n};\nexport const spline = (pts, u) => {\nconst n = pts.length - 1, x = clamp(u) * n, i = Math.min(n - 1, Math.floor(x)), t = x - i;\nconst p0 = pts[Math.max(0, i - 1)], p1 = pts[i], p2 = pts[i + 1], p3 = pts[Math.min(n, i + 2)];\nreturn p1.map((_, k) => 0.5 * ((2 * p1[k]) + (-p0[k] + p2[k]) * t + (2 * p0[k] - 5 * p1[k] + 4 * p2[k] - p3[k]) * t * t + (-p0[k] + 3 * p1[k] - 3 * p2[k] + p3[k]) * t * t * t));\n};\nexport const camFromKeys = (K, f, { creep = 0.0012, kicks = [] } = {}) => {\nlet c;\nif (f <= K[0].f) c = { ...K[0] };\nelse if (f >= K[K.length - 1].f) c = { ...K[K.length - 1] };\nelse {\nconst i = K.findIndex((k, j) => f >= k.f && f <= K[j + 1].f), a = K[i], b = K[i + 1];\nconst ease = M[b.ease || 'smooth'], t = ease((f - a.f) / (b.f - a.f));\nif (b.path) { \nconst pts = [a.pos, ...b.path, b.pos]; c = { pos: spline(pts, t), look: lerp3(a.look, b.look, t), fov: lerp(a.fov, b.fov, t), roll: lerp(a.roll || 0, b.roll || 0, t) };\n} else c = { pos: lerp3(a.pos, b.pos, t), look: lerp3(a.look, b.look, t), fov: lerp(a.fov, b.fov, t), roll: lerp(a.roll || 0, b.roll || 0, t) };\n}\nc.fov *= 1 - creep * Math.max(0, f - K[0].f) * 0.15; \nfor (const k of kicks) { const d = f - k.f; if (d >= 0 && d < 7) { const s = (d % 2 ? -1 : 1) * k.a * (1 - d / 7); c.look = [c.look[0], c.look[1] + s * 3, c.look[2] + s * 2]; c.roll = (c.roll || 0) + s * 20; } }\nreturn c;\n};\nexport const idle = (f, seed = 1) => ({\nbob: 0.006 * Math.sin((f + seed * 11) * 0.11),\ntilt: 1.2 * Math.sin((f + seed * 7) * 0.05),\nheadTilt: 1.5 * Math.sin((f + seed * 5) * 0.037 + 1),\n});\nexport const blinkAt = (f, seed) => { const per = 38 + (seed * 17) % 31, ph = (f + seed * 13) % per; return ph < 2 ? 0.5 : ph < 4 ? 1 : 0; };\nexport const walk = (f, f0, speed = 1.1, stride = 0.8) => { const t = Math.max(0, f - f0) / 30; return { dist: t * speed, phase: (t * speed / (2 * stride)) % 1 }; };\nexport const q = (x, n = 2) => Math.round(x * 10 ** n) / 10 ** n;",
"note": "Use the shaders and motion helpers verbatim. creature_template_js is the reference creature (uses Pen helpers: line, poly, ell, dot, stroke, shadedFill, inkRing, clip, curve, ellPts, mul, rad, thickAngle, INK): write a small Pen class with these, then design THIS story's creatures in the same way. Write everything else from the spec.",
"creature_template_js": "const EMU = { body: \"#4d3b2c\", bodyDk: \"#2f241b\", streak: \"#7a6048\", neck: \"#7f90ad\", neckDk: \"#56627c\", head: \"#3a2f28\", beak: \"#cdb68e\", leg: \"#8c8780\", legDk: \"#5e5a55\" };\nconst ik2 = (h, f, L1, L2, back = -1) => { \nconst dx = f[0] - h[0], dy = f[1] - h[1], d = Math.min(L1 + L2 - 1, Math.hypot(dx, dy));\nconst a = Math.atan2(dy, dx), c = Math.acos(Math.max(-1, Math.min(1, (L1 * L1 + d * d - L2 * L2) / (2 * L1 * d))));\nconst s = back < 0 ? 1 : -1; \nreturn [h[0] + Math.cos(a + s * c) * L1, h[1] + Math.sin(a + s * c) * L1];\n};\nexport const emuSide = (p, opts = {}) => {\nconst { phase = 0, run = 0, peck = 0, blink = 0, expr = \"calm\", look = 0.3, seed = 1, tilt = 0, ruffle = 0 } = opts;\nconst g = p.g, two = Math.PI * 2, ow = 6;\nconst bob = run * 16 * Math.abs(Math.sin(two * phase)) + (1 - run) * 3 * Math.sin(seed * 3.1);\nconst lean = run * 0.16 + peck * 0.1 + tilt;\nconst hip = [292, 528 + bob * 0.6];\nconst bc = [290, 432 + bob], brx = 168, bry = 112;\nconst rot = (pt, c, a) => { const x = pt[0] - c[0], y = pt[1] - c[1]; return [c[0] + x * Math.cos(a) - y * Math.sin(a), c[1] + x * Math.sin(a) + y * Math.cos(a)]; };\nconst legs = [1, 0].map((k) => {\nconst ph = phase + k * 0.5, sx = Math.cos(two * ph), sy = Math.max(0, Math.sin(two * ph));\nconst h = [hip[0] + (k ? -14 : 14), hip[1]];\nconst foot = [h[0] + run * 135 * sx + (1 - run) * (k ? -22 : 26), 776 - run * 92 * sy];\nconst knee = ik2(h, foot, 138, 150, -1);\nreturn { h, foot, knee, k, lift: sy * run };\n});\nconst drawLeg = (L, far) => {\nconst col = far ? EMU.legDk : EMU.leg;\np.line([L.h, L.knee, L.foot], col, 15);\nconst fx = L.foot[0], fy = L.foot[1], ta = L.lift * 0.6;\nfor (const [dx, dy] of [[34, 2], [26, -6], [-14, 0]]) p.line([[fx, fy], [fx + dx * Math.cos(ta) - dy * Math.sin(ta), fy + dy * Math.cos(ta) + dx * Math.sin(ta) * 0.6]], col, 7);\np.dot(L.knee[0], L.knee[1], 9, col);\n};\ndrawLeg(legs[0], true);\nconst nb = rot([392, 372 + bob], bc, -lean * 0.4);\nlet hd = [448 + run * 70, 128 + run * 72 + bob * 0.5];\nhd = [hd[0] * (1 - peck) + 548 * peck, hd[1] * (1 - peck) + 712 * peck];\nconst nm = [ (nb[0] + hd[0]) / 2 + 30 - run * 10 + peck * 40, (nb[1] + hd[1]) / 2 + (peck ? -60 * peck : 10)];\nconst neckPts = curve(nb, nm, hd, 14);\np.line(neckPts, EMU.neck, 40);\nfor (let i = 2; i < 12; i++) { const [x, y] = neckPts[i]; p.stroke([[x - 6, y + 4], [x + 2, y - 4]], 3, EMU.neckDk); }\nconst bp = [];\nfor (let i = 0; i <= 64; i++) {\nconst a = Math.PI * 2 * i / 64, c = Math.cos(a), s = Math.sin(a);\nlet rx = brx, ry = bry;\nif (c < -0.3) rx *= 1 + 0.12 * (-c - 0.3); \nlet x = bc[0] + rx * c, y = bc[1] + ry * s + (c < 0 ? 26 * (-c) * (s > -0.2 ? 1 : 0.2) : 0);\nif (s > 0.15) { const j = (i % 2 ? 1 : -0.4) * (16 + 6 * Math.sin(i * 1.7 + seed + ruffle)); y += j; } \nbp.push(rot([x, y], bc, -lean));\n}\np.shadedFill(bp, EMU.body, EMU.bodyDk, rad(-110), brx, 0.4);\np.clip(bp, () => {\nfor (let i = 0; i < 26; i++) {\nconst x = bc[0] - 150 + ((i * 53 + seed * 31) % 300), y = bc[1] - 80 + ((i * 37) % 150);\np.stroke([[x, y], [x - 26, y + 22 + (i % 3) * 6]], 4, i % 2 ? EMU.streak : EMU.bodyDk);\n}\n});\np.inkRing(bp, ow, thickAngle(rad(-110)));\nconst th = rot([hip[0] + 12, hip[1] - 26], bc, -lean);\np.ell(th[0], th[1], 46, 40, EMU.body, ow);\nfor (let i = 0; i < 5; i++) p.stroke([[th[0] - 30 + i * 14, th[1] + 18], [th[0] - 34 + i * 14, th[1] + 44]], 4, EMU.bodyDk);\ndrawLeg(legs[1], false);\nconst hx = hd[0], hy = hd[1], ha = peck * 1.1 + run * 0.25;\nconst H = (dx, dy) => [hx + dx * Math.cos(ha) - dy * Math.sin(ha), hy + dx * Math.sin(ha) + dy * Math.cos(ha)];\nconst beak = [H(22, -10), H(76, 2), H(74, 8), H(20, 14)];\np.poly(beak, EMU.beak, ow * 0.9);\np.stroke([H(28, 4), H(70, 5)], 2.5, INK);\nconst head = ellPts(hx, hy, 46, 38, 0, 360, ha * 57.3, 32);\np.shadedFill(head, EMU.head, mul(EMU.head, [0.7, 0.7, 0.75]), rad(-110), 40, 0.3);\np.stroke([H(-18, -28), H(-26, -44)], 5, EMU.head); p.stroke([H(-4, -31), H(-6, -48)], 5, EMU.head);\np.inkRing(head, ow, thickAngle(rad(-110)));\nconst ec = H(8, -6), er = expr === \"shock\" ? 22 : 18;\np.ell(ec[0] + 4, ec[1] + 6, 22, 18, \"#9fb6d6\", 0);\np.ell(ec[0], ec[1], er, er, \"#ffffff\", 4);\nconst lid = expr === \"side\" ? 0.5 : expr === \"smug\" ? 0.42 : 0;\nconst lk = Math.max(-1, Math.min(1, look));\nif (blink < 0.75) {\np.dot(ec[0] + lk * (er - 9), ec[1] + (expr === \"side\" ? 3 : 1), expr === \"shock\" ? 6 : 8, INK);\np.dot(ec[0] + lk * (er - 9) - 2, ec[1] - 2, 2.4, \"#ffffff\");\n}\nconst L = Math.max(lid, blink);\nif (L > 0.02) { const top = ec[1] - er, yb = top + 2 * er * L; p.poly([[ec[0] - er - 1, top - 2], [ec[0] + er + 1, top - 2], [ec[0] + er + 1, yb], [ec[0] - er - 1, yb]], EMU.head, 0); p.stroke([[ec[0] - er, yb], [ec[0] + er, yb]], 4); }\nif (expr === \"smug\" || expr === \"side\") p.stroke([H(-8, -30), H(26, -24)], 5, INK);\nif (expr === \"shock\") p.arc(ec[0], ec[1] - 30, 14, 5, 200, 340, 4);\n};"
},
"rules": [
"Original story, characters, world and jokes; never copy another creator's video shot for shot.",
"No real named living people as characters, no brand logos or mascots.",
"No captions unless captions=true.",
"Never edit my voice beyond voice_speed."
],
"deliver": "The MP4 plus a few lines on what each shot shows; offer tweaks."
}
trey retweeted
i just recreated this viral roblox animation style in claude code for $0 (except the claude subscription)
claude wrote the whole script character shots camera angle in code
then it ran blender on my pc to render the frames on my gpu and stitched the captions and sound together in the cloud
ALL WHILE I WAS SLEEPING
this is my first post on here and i just want to introduce myself a bit ,
i will NEVER ask you to pay for anything and will leak and opensource everything i post the only thing i ask in return is a follow to the account
anyways here is the free prompt steal it for yourself
People are paying hundreds for guides on how to make these viral cartoons.
I just ran the free prompt from @treyscalez.
Zero images. Zero stock video.
Everything in this clip is code Claude wrote.
A three.js room, characters drawn on canvas, ink outlines, rendered frame by frame in headless Chromium, stitched with ffmpeg. Even the music and sound effects are generated in Python.
The story is real: Harvard, 1947. A moth stuck in a computer relay and taped into the logbook.
What worked out of the box:
• toon shading looks hand-drawn
• every frame is a function of time
• timing stayed tight
What still needed fixes:
• wide shots cropped signs
• stamps came out huge
• logbook text ran off the page
A few rounds of stills, then ~20 minutes of CPU render.
Bookmark it if you want animated shorts without paying for video tools.
i made this ricksclips style animation completely from scratch using opus 5.5
the style is going extremely viral rn on the internet and people are paying money just to be able to make them
well today is ur lucky day cause am giving away the full prompt to guys for free
all u need is voiceover and claude to be able to make this, $0 spent on images or videos
-> here's the prompt
{
"task": "Make a vertical animated cartoon short of MY story, built in code: three.js r160 world + canvas-drawn 2D character cards, rendered frame by frame in headless Chromium (Playwright, swiftshader), encoded with ffmpeg. 1080x1920, 30fps, exactly as long as my voiceover. Work start to finish; only ask if script and audio don't match.",
"my_inputs": {
"story": "[your idea, true event, legend or full script]",
"script": "[optional exact script]",
"voiceover": "[optional: attach mp3/wav]",
"length_seconds": 30,
"voice_speed": 1.0,
"captions": false,
"notes": "[optional: era, setting, characters, jokes]"
},
"stages": [
"A. No script: write one at ~3.7 words/s (30s~110 words): 1) hook = absurd fact, no setup 2) setting in 1-2 lines with a concrete detail 3) 2-4 escalating beats, others doubt/mock, one exaggeration joke 4) pivot 'But...'/'You see,' revealing the real mechanism with an everyday analogy 5) short ironic twist = last words. Spoken English, contractions, numbers as words, never describe what's on screen. If presented as true, web-check facts and say history/disputed/legend.",
"B. No voiceover: give script in a copyable block + word count + est. length, a short shot plan, recording tips (one warm narrator; ElevenLabs speed 1.05-1.1, stability 45-55%; pauses at sentence ends; no music). Stop and ask for the upload.",
"C. With voiceover: build everything below without stopping. Task list for progress; send a stills contact sheet before the long render."
],
"setup": [
"mkdir -p web/lib work stills frames out",
"npm pack [email protected] -> copy package/build/three.module.js to web/lib (fallback: sparse git clone of mrdoob/three.js branch r160, folder build)",
"Playwright + Chromium (npm i -g playwright && npx playwright install chromium); launch args --use-angle=swiftshader --enable-unsafe-swiftshader --ignore-gpu-blocklist",
"python3 numpy Pillow, ffmpeg (with rubberband)",
"Serve web/ with a tiny Node http server; render.mjs loads index.html, waits for window.ready, calls window.renderFrame(f), saves canvas.toDataURL('image/jpeg',.95) to frames/f0000.jpg. Support RESUME=1 (skip existing) and a frame list 'a-b' or '1,5,9'."
],
"timing": "If voice_speed!=1: ffmpeg -af rubberband=tempo=<speed> (pitch kept). Claude can't hear audio: align my script to speech using ffmpeg silencedetect (-35dB, 0.12s): split script into phrases at punctuation, DP-match phrases to speech segments by syllable count vs duration, penalise sentence ends inside a segment. Spread words by syllables. Write work/phrases.json; check pauses fall at sentence ends. Frames = round(duration*30). Every reaction lands 0-3 frames before its word; the final payoff lands on the final word.",
"architecture": {
"files": "web/index.html (canvas#c 1080x1920 + module main.js), main.js (renderer, materials, world, cards, sprites, passes), story.js (SHOTS, LIGHTS, lightFor, camAt, dofAt, worldAt, actorsAt, fxAt: all pure functions of frame f), motion.js, paint.js (canvas textures), toon.js (character + creature drawing), audio.py, mix.py, finish.sh, sheet.py (contact sheets).",
"renderer": "WebGLRenderer antialias:false, preserveDrawingBuffer, PCFSoft shadows 2048, sun = DirectionalLight from az/el per light preset, shadow camera centred on each shot's action (ext 8-60m), HemisphereLight, Fog(colour = sky horizon). Camera Perspective, near .08 far 1500.",
"materials": "MeshToonMaterial with a 2-texel gradientMap [90,255] Nearest = hard 2-step toon shading. Textures are CanvasTextures painted in code: flat base + soft blotches + dark seams/strokes, repeat-wrapped, colorSpace sRGB. Boxes use world-scaled UVs (constant texel density).",
"passes": [
"1 colour: render scene to HalfFloat RT (samples 4).",
"2 normal+depth: swap every mesh material to a ShaderMaterial writing vec4(normal*.5+.5, viewDepth) (handle USE_INSTANCING: pos=instanceMatrix*pos). Cards/sprites write rgb 0 + depth with alpha-test (so they block but are never outlined). Hide sky, clouds, blob shadows. Fog and shadows off for this pass.",
"3 ink+grade fullscreen: 16 taps on a ring of radius 2.5px*clamp(7/depth,.62,1.25); edge = smoothstep(.006,.02,(dS-d)/d) on the NEAR side of depth jumps only; crease = smoothstep(.88,.72,dot(n,nS))*.9 when depths are within 6%; skip card samples; sky counts as depth 1e4; fade ink 140-520m. colour = mix(c, #030203, e); saturation 1.08-1.15; gain/lift tint; vignette .2-.34; white flash uniform.",
"4 lens: per-pixel CoC = cinf*(1-focus/d) (near side capped 1.4x); 48-tap golden-angle disc, each tap weighted by its own CoC so sharp foreground never bleeds; skip when cinf<.5. Output linearToOutputTexel."
],
"sky": "inverted sphere following camera: mix(horizon, top, pow(y,.55)) + optional sun disc. Painted cloud billboards far away (650-900m), fog off, facing camera."
},
"characters": {
"card": "Each character is a 1200x2000 CanvasTexture on a 1.35x2.25m plane with origin at the soles (design space 600x1000, soles at y=975, 1 design unit = 2.25mm). MeshBasicMaterial alphaTest .02, DoubleSide; shadow via customDepthMaterial with the same map (alphaTest .5); soft dark radial blob under the feet. Billboard on yaw only: rotY = atan2(cam.x-x, cam.z-z). Redraw a card only when its key (JSON of q()-rounded pose values) changes.",
"proportions": "Bean body: head blob ~236 wide, legs 1.38xHH, torso 1.08xHH (stout 1.12), eyes ~1.47m high. Head = superellipse blob with slight egg + per-seed asymmetry. Torso = egg blob with a tunic skirt below. Legs/arms = thin curved strokes (5.8u/5.2u, u=headWidth/100) in a darker shade of the outfit; round dot hands; small boots.",
"ink": "Outline colour #241726 (plum), width 5u, thicker on the side away from the light (light from upper-left, -120deg). Fills: base colour with a soft shadow gradient toward lower-right. Skin default #ffe2c2, also #f5c9a0 #ecd0b6 #c99067.",
"faces": "Eyes 13u apart either side of centre. Kinds: dot, lid (half-closed), happy (arc), squeeze, shock (big white + small pupil + raised arc brows), slit, dash. Mouths: dash, frown, smirk, smile, grin (open with teeth line), laugh, o, O, wave (nervous), teeth. Brows are short tapered strokes; angle sets mood. Expressions: neutral, stern, grin, laugh, nervous (+sweat drop), shock, smile, pained, squint, smug/side-eye (half lids, pupils to one side). Blinks every 1.3-2.3s for 4 frames.",
"outfits": "Built from parts: tunic colour, belt, buttons, pockets, sash, hat (slouch hat, cap, top hat, bonnet, helmet, crown, hair), beard/moustache, apron, dress, props in hands. Design new outfits for each story in the same flat style.",
"arm_poses": "hang, point (+finger), up, wave, hip, belly, cheek (both = shock), salute (flat hand at brim, drawn over the head), thumb (thumbs-up), shrug, reach, lift, cross, prop-holding (pen, stamp, wrench, spear, sign). Whole upper body tilts about the hip; head tilts separately.",
"creatures": "Animals are side-view canvas sprites (600x800 design, feet at y=780) on shared textures cached by pose key, so flocks of 50+ cost little: shaggy shaded body blob with fringe strokes, thick inked limbs, small head, big googly white eye with pupil that can look/side-eye, simple beak/snout. Legs via 2-bone IK with joint bent backward; run cycle 16 phases (foot x = hip + stride*cos, lift = max(0,sin)); poses: stand, run, peck/graze, smug. Flip the sprite when travel direction dot camera-right < 0."
},
"world": {
"build": "Primitives only: boxes, cylinders, cones, squashed spheres, extrusions; group set-pieces with pivots driven by 0..1 progress from worldAt(f) with eased, staggered parts. Instanced meshes for crops/grass/rocks; clear a patch where the action happens.",
"background": "low half-buried hill spheres, distant mesas or mountains (cone + snow cap), trees (trunk cylinder + 4-6 squashed sphere canopies), far houses, fog to the horizon colour.",
"secondary_motion": "windmills turn, flags/cloth wave (vertex sine), smoke/dust/leaves/Zzz/stars as cached 2D fx sprites, water shader scroll, wheels roll with distance/radius, vehicles bounce.",
"text": "Diegetic text (signs, crates, letters, stamps) painted on canvas with real fonts; place on +z faces or planes so it never reads mirrored. Swap textures to animate (e.g. stamp appears on impact)."
},
"lights": {
"day": "sun az64 el50 #fff3df 2.45, hemi sky #d2e2f6 ground #a8905e 1.1, sky top #2d74d4 horizon #cfe3f5, fog 120-1300, sat 1.12, vig .2",
"golden": "sun az30 el11 #ffb46a 2.9, hemi #a99bcc/#7a5040 .98, sky #6474c0 -> #ffc485 + sun disc, gain #fff0e0, sat 1.15, vig .26, tint cards #ffe2c4",
"dusk": "sun el5 #ff9a72 .9, hemi #5d6cab/#3a3048 .8, sky #18234f -> #d18a7c, gain #e2e8ff, lift #04050b, vig .34, a warm point-light lamp, tint cards #c9cff2",
"use": "day = normal story, golden = decline or time passing, dusk-blue = explanation or ending. Time jump = 6-frame white flash."
},
"motion": {
"helpers": "smooth(t)=t^3(t(6t-15)+10); easeOut=1-(1-t)^3; back(t)=overshoot s=1.7; spring settle; Catmull-Rom spline through via-points; idle(f,seed)={bob .006 sin(.11f), tilt 1.2deg sin(.05f), headTilt 1.5deg sin(.037f)}; blinkAt(f,seed); q(x)=round for card keys.",
"camera": "Keys {f,pos,look,fov,roll,ease,path} inside cut-free segments; glides 18-45 frames; easeOut for whips/reveals; every hold creeps (fov *= 1-.00012*(f-f0)); 3-5deg roll on drama; impact kick = 7-frame alternating look offset + roll that decays. Vehicles: track alongside, match speed, slight judder.",
"continuity": "prefer one continuous move: MCU pull-back into a wide, crane up and over a fence into the establishing shot, lateral truck along a lineup, crane down into an insert, rack focus to the background gag. Hard cut only on place/time jumps.",
"acting": "anticipation -> back overshoot -> spring settle; pop-ins scale 0->1 with back easing + dust puff; stamp = 2-frame dip + puff + kick; laughs = alternating tilt + bob; head bobs on stressed words; nothing static for 4+ frames.",
"walks_runs": "feet planted, bob 3-7%; run phase = speed/stride; fast movers must stay in frame until their beat is done."
},
"shot_grammar": {
"plan_first": "work/PLAN.md: one row per shot (frames, words, setting, light, camera, cast/poses/expressions, fx, sfx). Usually one shot per phrase; merge tiny ones. Illustrate every sentence literally; props carry the jokes.",
"order": "frame 0 = hook MCU of the hero mid-action -> pull-back reveal on the punch of sentence 1 -> wide establishing crane -> lineup/two-shot with pop-ins on each listed item -> reaction close-up (a creature or extra slides in with a side-eye on the question line) -> action wide (chase, scatter, collapse) -> time-jump flash -> insert on the key object -> twist: music stops, low sting, push-in with roll, payoff on the last word.",
"framing": "Bean cards 2.25m tall: MCU = camera ~3.5m away at fov 32-34 looking at 1.35m; wides fov 40-52. Vertical frame half-width = d*tan(hfov/2), hfov = 2*atan(tan(vfov/2)*.5625): at 4m and fov 40 only +/-0.8m, so stage people in depth.",
"lens": "DOF on close-ups/mediums (cInf 7-14, focus on the eyes), wides sharp, racks ~14 frames."
},
"audio": {
"stems": "audio.py writes only music.wav + sfx.wav (48k mono, numpy synth). Music: short loop in the story's mood (march: kick/snare, plucked bass, brass pad, little fanfare; or plucky comedy; or eerie pad); stops on the twist line, then a low drone. SFX in frames/30: whoosh (low-passed noise with sine^2 envelope) on big moves, thunk (pitched sine drop + noise) on pops/stamps, rustle/leaves, feet patter, engine (pulse train low-passed), scrape, ting (2-4 kHz bells), sting (41 Hz + noise hit + brass stab) on the twist.",
"mix": "mix.py: gated RMS of the voice (0.4s blocks above -40dB of max); scale music so its gated RMS = 0.5x voice (-6 dB); SFX = min(0.5x voice RMS, peaks 0.7x voice peak); sum; one linear gain only. No ducking, no compression. Print the measured levels and confirm.",
"finish": "measure integrated loudness (ffmpeg ebur128), apply one volume gain to -14 LUFS + alimiter -1 dBFS; encode: ffmpeg -framerate 30 -i frames/f%04d.jpg -i mix.wav -c:v libx264 -preset slow -crf 17 -pix_fmt yuv420p -c:a aac -b:a 192k -shortest -movflags +faststart. QA: freezedetect (n=.0005, d=.4) and blackdetect must find nothing; make a 2fps tiled QA sheet and look at it."
},
"look_check": "Before the full render, render stills at every shot's middle plus key actions, tile them into a contact sheet, look at it and fix: cropped heads/hats, characters hidden by props or crops, camera inside objects, fast movers already out of frame, mirrored text, missing ink, empty frames. Send me the sheet, then render all frames in the background (about 3-6 s/frame on CPU), lock picture before sound.",
"code_core": {
"ink_shader_glsl": "uniform sampler2D col, nd; uniform vec2 res; uniform float px, sat, vig, flash; uniform vec3 fogCol, lift, gain; varying vec2 vUv;\nfloat edgeAt(vec2 uv, float r){\nvec4 c = texture2D(nd, uv); if (dot(c.rgb,c.rgb) < .01) return 0.; float d = c.a; vec3 n = c.rgb*2.-1.;\nfloat e = 0.; float rr = r * clamp(7./d, .62, 1.25);\nfor (int i=0;i<16;i++){ float a = float(i)*.785398 + (i>7 ? .39 : 0.); float k = i>7 ? .5 : 1.;\nvec2 o = vec2(cos(a), sin(a))*rr*k/res; vec4 s = texture2D(nd, uv+o);\nfloat ds = s.a; bool card = dot(s.rgb,s.rgb) < .01;\nif (card && ds > 0.) continue; // character cards: never outlined by the world ink\nif (card) ds = 1e4; // sky\nvec3 ns = s.rgb*2.-1.;\ne = max(e, smoothstep(.006, .02, (ds - d)/d)); // depth jump, near side only\nif (!card && abs(ds-d)/d < .06) e = max(e, smoothstep(.88, .72, dot(n, ns)) * .9); // crease\n}\nreturn e * (1. - smoothstep(140., 520., d)*.8);\n}\nvoid main(){\nvec3 c = texture2D(col, vUv).rgb;\nfloat e = edgeAt(vUv, px);\nc = mix(c, vec3(.012,.01,.014), e);\nif (flash < -0.5) c = vec3(e);\nfloat l = dot(c, vec3(.299,.587,.114)); c = mix(vec3(l), c, sat);\nc = c*gain + lift;\nvec2 q = vUv-.5; c *= 1. - vig*dot(q*vec2(1.,.75), q*vec2(1.,.75))*2.2;\nc = mix(c, vec3(1.), flash);\ngl_FragColor = vec4(c,1.); }",
"dof_shader_glsl": "uniform sampler2D src, nd; uniform vec2 res; uniform float focus, cinf, near; varying vec2 vUv;\nfloat coc(vec2 uv){ float d = texture2D(nd, uv).a; if (d <= 0.) d = 2000.; float k = 1. - focus/d; return k > 0. ? cinf*k : min(-k*cinf*near, cinf*1.4); }\nvoid main(){\nfloat c0 = coc(vUv);\nif (cinf < .5 || c0 < .6) { gl_FragColor = linearToOutputTexel(vec4(texture2D(src, vUv).rgb, 1.)); return; }\nvec3 acc = vec3(0.); float wsum = 0.;\nfor (int i=0;i<48;i++){ float fi = float(i); float r = sqrt((fi+.5)/48.); float a = fi*2.39996;\nvec2 o = vec2(cos(a), sin(a))*r*c0/res; float cs = coc(vUv+o);\nfloat w = smoothstep(r*c0-1.5, r*c0+.5, cs + .5);\nacc += texture2D(src, vUv+o).rgb*w; wsum += w; }\ngl_FragColor = linearToOutputTexel(vec4(acc/max(wsum,1e-3), 1.)); }",
"motion_js": "export const clamp = (x, a = 0, b = 1) => Math.max(a, Math.min(b, x));\nexport const lerp = (a, b, t) => a + (b - a) * t;\nexport const lerp3 = (a, b, t) => a.map((v, i) => lerp(v, b[i], t));\nexport const ramp = (f, a, b) => clamp((f - a) / (b - a));\nexport const M = {\nsmooth: (t) => { t = clamp(t); return t * t * t * (t * (t * 6 - 15) + 10); }, \neaseOut: (t) => 1 - Math.pow(1 - clamp(t), 3), \neaseIn: (t) => Math.pow(clamp(t), 3),\nback: (t, s = 1.7) => { t = clamp(t) - 1; return t * t * ((s + 1) * t + s) + 1; }, \nanticip: (t, s = 0.12) => { t = clamp(t); return t < 0.25 ? -s * Math.sin(t / 0.25 * Math.PI) : M.back((t - 0.25) / 0.75); }, \nspring: (t, freq = 3, damp = 5) => { t = Math.max(0, t); return 1 - Math.exp(-damp * t) * Math.cos(freq * 2 * Math.PI * t); }, \n};\nexport const spline = (pts, u) => {\nconst n = pts.length - 1, x = clamp(u) * n, i = Math.min(n - 1, Math.floor(x)), t = x - i;\nconst p0 = pts[Math.max(0, i - 1)], p1 = pts[i], p2 = pts[i + 1], p3 = pts[Math.min(n, i + 2)];\nreturn p1.map((_, k) => 0.5 * ((2 * p1[k]) + (-p0[k] + p2[k]) * t + (2 * p0[k] - 5 * p1[k] + 4 * p2[k] - p3[k]) * t * t + (-p0[k] + 3 * p1[k] - 3 * p2[k] + p3[k]) * t * t * t));\n};\nexport const camFromKeys = (K, f, { creep = 0.0012, kicks = [] } = {}) => {\nlet c;\nif (f <= K[0].f) c = { ...K[0] };\nelse if (f >= K[K.length - 1].f) c = { ...K[K.length - 1] };\nelse {\nconst i = K.findIndex((k, j) => f >= k.f && f <= K[j + 1].f), a = K[i], b = K[i + 1];\nconst ease = M[b.ease || 'smooth'], t = ease((f - a.f) / (b.f - a.f));\nif (b.path) { \nconst pts = [a.pos, ...b.path, b.pos]; c = { pos: spline(pts, t), look: lerp3(a.look, b.look, t), fov: lerp(a.fov, b.fov, t), roll: lerp(a.roll || 0, b.roll || 0, t) };\n} else c = { pos: lerp3(a.pos, b.pos, t), look: lerp3(a.look, b.look, t), fov: lerp(a.fov, b.fov, t), roll: lerp(a.roll || 0, b.roll || 0, t) };\n}\nc.fov *= 1 - creep * Math.max(0, f - K[0].f) * 0.15; \nfor (const k of kicks) { const d = f - k.f; if (d >= 0 && d < 7) { const s = (d % 2 ? -1 : 1) * k.a * (1 - d / 7); c.look = [c.look[0], c.look[1] + s * 3, c.look[2] + s * 2]; c.roll = (c.roll || 0) + s * 20; } }\nreturn c;\n};\nexport const idle = (f, seed = 1) => ({\nbob: 0.006 * Math.sin((f + seed * 11) * 0.11),\ntilt: 1.2 * Math.sin((f + seed * 7) * 0.05),\nheadTilt: 1.5 * Math.sin((f + seed * 5) * 0.037 + 1),\n});\nexport const blinkAt = (f, seed) => { const per = 38 + (seed * 17) % 31, ph = (f + seed * 13) % per; return ph < 2 ? 0.5 : ph < 4 ? 1 : 0; };\nexport const walk = (f, f0, speed = 1.1, stride = 0.8) => { const t = Math.max(0, f - f0) / 30; return { dist: t * speed, phase: (t * speed / (2 * stride)) % 1 }; };\nexport const q = (x, n = 2) => Math.round(x * 10 ** n) / 10 ** n;",
"note": "Use the shaders and motion helpers verbatim. creature_template_js is the reference creature (uses Pen helpers: line, poly, ell, dot, stroke, shadedFill, inkRing, clip, curve, ellPts, mul, rad, thickAngle, INK): write a small Pen class with these, then design THIS story's creatures in the same way. Write everything else from the spec.",
"creature_template_js": "const EMU = { body: \"#4d3b2c\", bodyDk: \"#2f241b\", streak: \"#7a6048\", neck: \"#7f90ad\", neckDk: \"#56627c\", head: \"#3a2f28\", beak: \"#cdb68e\", leg: \"#8c8780\", legDk: \"#5e5a55\" };\nconst ik2 = (h, f, L1, L2, back = -1) => { \nconst dx = f[0] - h[0], dy = f[1] - h[1], d = Math.min(L1 + L2 - 1, Math.hypot(dx, dy));\nconst a = Math.atan2(dy, dx), c = Math.acos(Math.max(-1, Math.min(1, (L1 * L1 + d * d - L2 * L2) / (2 * L1 * d))));\nconst s = back < 0 ? 1 : -1; \nreturn [h[0] + Math.cos(a + s * c) * L1, h[1] + Math.sin(a + s * c) * L1];\n};\nexport const emuSide = (p, opts = {}) => {\nconst { phase = 0, run = 0, peck = 0, blink = 0, expr = \"calm\", look = 0.3, seed = 1, tilt = 0, ruffle = 0 } = opts;\nconst g = p.g, two = Math.PI * 2, ow = 6;\nconst bob = run * 16 * Math.abs(Math.sin(two * phase)) + (1 - run) * 3 * Math.sin(seed * 3.1);\nconst lean = run * 0.16 + peck * 0.1 + tilt;\nconst hip = [292, 528 + bob * 0.6];\nconst bc = [290, 432 + bob], brx = 168, bry = 112;\nconst rot = (pt, c, a) => { const x = pt[0] - c[0], y = pt[1] - c[1]; return [c[0] + x * Math.cos(a) - y * Math.sin(a), c[1] + x * Math.sin(a) + y * Math.cos(a)]; };\nconst legs = [1, 0].map((k) => {\nconst ph = phase + k * 0.5, sx = Math.cos(two * ph), sy = Math.max(0, Math.sin(two * ph));\nconst h = [hip[0] + (k ? -14 : 14), hip[1]];\nconst foot = [h[0] + run * 135 * sx + (1 - run) * (k ? -22 : 26), 776 - run * 92 * sy];\nconst knee = ik2(h, foot, 138, 150, -1);\nreturn { h, foot, knee, k, lift: sy * run };\n});\nconst drawLeg = (L, far) => {\nconst col = far ? EMU.legDk : EMU.leg;\np.line([L.h, L.knee, L.foot], col, 15);\nconst fx = L.foot[0], fy = L.foot[1], ta = L.lift * 0.6;\nfor (const [dx, dy] of [[34, 2], [26, -6], [-14, 0]]) p.line([[fx, fy], [fx + dx * Math.cos(ta) - dy * Math.sin(ta), fy + dy * Math.cos(ta) + dx * Math.sin(ta) * 0.6]], col, 7);\np.dot(L.knee[0], L.knee[1], 9, col);\n};\ndrawLeg(legs[0], true);\nconst nb = rot([392, 372 + bob], bc, -lean * 0.4);\nlet hd = [448 + run * 70, 128 + run * 72 + bob * 0.5];\nhd = [hd[0] * (1 - peck) + 548 * peck, hd[1] * (1 - peck) + 712 * peck];\nconst nm = [ (nb[0] + hd[0]) / 2 + 30 - run * 10 + peck * 40, (nb[1] + hd[1]) / 2 + (peck ? -60 * peck : 10)];\nconst neckPts = curve(nb, nm, hd, 14);\np.line(neckPts, EMU.neck, 40);\nfor (let i = 2; i < 12; i++) { const [x, y] = neckPts[i]; p.stroke([[x - 6, y + 4], [x + 2, y - 4]], 3, EMU.neckDk); }\nconst bp = [];\nfor (let i = 0; i <= 64; i++) {\nconst a = Math.PI * 2 * i / 64, c = Math.cos(a), s = Math.sin(a);\nlet rx = brx, ry = bry;\nif (c < -0.3) rx *= 1 + 0.12 * (-c - 0.3); \nlet x = bc[0] + rx * c, y = bc[1] + ry * s + (c < 0 ? 26 * (-c) * (s > -0.2 ? 1 : 0.2) : 0);\nif (s > 0.15) { const j = (i % 2 ? 1 : -0.4) * (16 + 6 * Math.sin(i * 1.7 + seed + ruffle)); y += j; } \nbp.push(rot([x, y], bc, -lean));\n}\np.shadedFill(bp, EMU.body, EMU.bodyDk, rad(-110), brx, 0.4);\np.clip(bp, () => {\nfor (let i = 0; i < 26; i++) {\nconst x = bc[0] - 150 + ((i * 53 + seed * 31) % 300), y = bc[1] - 80 + ((i * 37) % 150);\np.stroke([[x, y], [x - 26, y + 22 + (i % 3) * 6]], 4, i % 2 ? EMU.streak : EMU.bodyDk);\n}\n});\np.inkRing(bp, ow, thickAngle(rad(-110)));\nconst th = rot([hip[0] + 12, hip[1] - 26], bc, -lean);\np.ell(th[0], th[1], 46, 40, EMU.body, ow);\nfor (let i = 0; i < 5; i++) p.stroke([[th[0] - 30 + i * 14, th[1] + 18], [th[0] - 34 + i * 14, th[1] + 44]], 4, EMU.bodyDk);\ndrawLeg(legs[1], false);\nconst hx = hd[0], hy = hd[1], ha = peck * 1.1 + run * 0.25;\nconst H = (dx, dy) => [hx + dx * Math.cos(ha) - dy * Math.sin(ha), hy + dx * Math.sin(ha) + dy * Math.cos(ha)];\nconst beak = [H(22, -10), H(76, 2), H(74, 8), H(20, 14)];\np.poly(beak, EMU.beak, ow * 0.9);\np.stroke([H(28, 4), H(70, 5)], 2.5, INK);\nconst head = ellPts(hx, hy, 46, 38, 0, 360, ha * 57.3, 32);\np.shadedFill(head, EMU.head, mul(EMU.head, [0.7, 0.7, 0.75]), rad(-110), 40, 0.3);\np.stroke([H(-18, -28), H(-26, -44)], 5, EMU.head); p.stroke([H(-4, -31), H(-6, -48)], 5, EMU.head);\np.inkRing(head, ow, thickAngle(rad(-110)));\nconst ec = H(8, -6), er = expr === \"shock\" ? 22 : 18;\np.ell(ec[0] + 4, ec[1] + 6, 22, 18, \"#9fb6d6\", 0);\np.ell(ec[0], ec[1], er, er, \"#ffffff\", 4);\nconst lid = expr === \"side\" ? 0.5 : expr === \"smug\" ? 0.42 : 0;\nconst lk = Math.max(-1, Math.min(1, look));\nif (blink < 0.75) {\np.dot(ec[0] + lk * (er - 9), ec[1] + (expr === \"side\" ? 3 : 1), expr === \"shock\" ? 6 : 8, INK);\np.dot(ec[0] + lk * (er - 9) - 2, ec[1] - 2, 2.4, \"#ffffff\");\n}\nconst L = Math.max(lid, blink);\nif (L > 0.02) { const top = ec[1] - er, yb = top + 2 * er * L; p.poly([[ec[0] - er - 1, top - 2], [ec[0] + er + 1, top - 2], [ec[0] + er + 1, yb], [ec[0] - er - 1, yb]], EMU.head, 0); p.stroke([[ec[0] - er, yb], [ec[0] + er, yb]], 4); }\nif (expr === \"smug\" || expr === \"side\") p.stroke([H(-8, -30), H(26, -24)], 5, INK);\nif (expr === \"shock\") p.arc(ec[0], ec[1] - 30, 14, 5, 200, 340, 4);\n};"
},
"rules": [
"Original story, characters, world and jokes; never copy another creator's video shot for shot.",
"No real named living people as characters, no brand logos or mascots.",
"No captions unless captions=true.",
"Never edit my voice beyond voice_speed."
],
"deliver": "The MP4 plus a few lines on what each shot shows; offer tweaks."
}
trey retweeted
Grab your free skill here :
github.com/treyscale/stickfi…
Which one should i recreate next
trey retweeted
found another one teapawt.net/treyscalez/status/2116…
trey retweeted
HOLY F*CK
found a boxing account fully created with opus 5.5 printing money
the account is alr at 91K followers with 1.3M likes
this is lowk a money printer once u understand that u could create such type of videos
with $0 spent on videos and images
should I turn this into a free claude skill anyone can use?
let me know if you'd want it.
HOLY F*CK
another goated marketing scheme by higgsfield
remember that ig page that started an opus 5.5 video trend
well they have just changed their bio to “made on higgsfield”
the owner probably sold the account for multiple figures
this kind is of marketing needs to be studied
trey retweeted
a taco shop in New Rochelle has 40.5K followers and its biggest video is about a tank
it's a 32 second 3D story, a soldier on a tank covered in QR codes in the desert. 4.4M views
a burrito gets built in the last few seconds, then one card with the logo and 712 North Ave
if you run a local shop, this is what they did:
1. post a story with nothing from your menu in it
2. hold the food until the end so it lands as a payoff
3. close on your address so people nearby know where to go
4. pin the hits (theirs are 4.4M, 2.2M, 1.3M) and leave the rest below
the video with a staff member in a Westchester shirt is at 3,940
i can't see how many of the 4.4M views live near New Rochelle, and that's the number i'd want












