Kirisando (@kirisando) header
Kirisando (@kirisando) profile picture

The only thing better than AI is more AI

Joined July 2026
Photo by Kirisando (@kirisando)Photo by Kirisando (@kirisando)Photo by Kirisando (@kirisando)Photo by Kirisando (@kirisando)Photo by Kirisando (@kirisando)Photo by Kirisando (@kirisando)Photo by Kirisando (@kirisando)Photo by Kirisando (@kirisando)Photo by Kirisando (@kirisando)Photo by Kirisando (@kirisando)
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." }
12
23
3
162
9,356
Kirisando retweeted
🌍 where will you be born this time? ep. 1: monaco 🇲🇨 you're one of only 84 babies born here this year → odds: 1 in 1.6 million → no income tax since 1869 → f1 races under your window → but you're banned from your own casino. for life fully animated in code with claude opus 5.5 you pick the next country 👇
1
1
2
64
Kirisando retweeted
Fable 5.2, your request, a few edits, and you can be anyone you want on video. A guy recorded one clip of himself, handed it to Fable 5.2 with a Pinterest photo of how he wanted to look, and described the task. Fable 5.2 pulled in the free tools that could do the job, ran them, and came back with a first cut. He sent a few fixes. About 30 minutes, $0 in paid tools, and he was the character he asked for, synced to his own clip. He never opened a single one of those tools himself.
Introducing Claude Fable 5.2 and Claude Mythos 5.2, designed to tackle the most daunting technical challenges. They’re capable collaborators on ambitious projects in many fields, and show improvements in areas like coding, reasoning, and vision.
16
8
65
4,453
Fable 5.2, your request, a few edits, and you can be anyone you want on video. A guy recorded one clip of himself, handed it to Fable 5.2 with a Pinterest photo of how he wanted to look, and described the task. Fable 5.2 pulled in the free tools that could do the job, ran them, and came back with a first cut. He sent a few fixes. About 30 minutes, $0 in paid tools, and he was the character he asked for, synced to his own clip. He never opened a single one of those tools himself.
Introducing Claude Fable 5.2 and Claude Mythos 5.2, designed to tackle the most daunting technical challenges. They’re capable collaborators on ambitious projects in many fields, and show improvements in areas like coding, reasoning, and vision.
16
8
65
4,453
“I think that YOU K*LLED your family.” February 2, 2008. A 15-year-old Boy Scout walks out of his family's house in Cockeysville, Maryland, and tells a friend's dad something is wrong with his father. John Browning, 45, is on the couch, sot. Upstairs, his wife Tamara, 44, and their sons Gregory, 13, and Benjamin, 11, are dad in their beds. All four were s*ot in their sleep. Nothing was stolen. The Xbox and the Wii are still sitting out. The only one still alive is the oldest son, Nicholas. He had been at a sleepover. That same morning, before the bodies were found, he went to the mall with friends and left voicemails for his parents saying he loved them and would see them soon. They were already d*ad when he said it. In the video below, the police interrogation. He never cries. Told his whole family is d*ad, he asks for a soda and something to eat. The detectives split the sleepover boys into separate rooms. One of them cracked: Nick had left in the night to "get his parents' car." His story came apart fast. He said he slept in that car for hours in 30-degree cold, but the keys were in his jacket the whole time. The night before, he had called his 13-year-old brother and asked him to leave the basement door unlocked. A detective finally said it: "I think that you k*lled your family." Nick went quiet. "I didn't k*ll them." He was lying. ↓
8
1
13
408
Kirisando retweeted
𝗙𝗮𝗯𝗹𝗲 𝟱.𝟮 𝗶𝘀 𝗮 𝗳*𝗰𝗸𝗶𝗻𝗴 𝗱𝗶𝗿𝗲𝗰𝘁𝗼𝗿. Give it an idea and it turns it into a real, playable thing, running the whole production itself. This time: a liminal-space game in a browser tab. Flooded pool halls, a working elevator, CRT monitors that type out messages, a pink flamingo in the deep end. Inside Claude Code it works as an agent, not autocomplete. It went and found the free tools on its own, pulled in 𝗧𝗵𝗿𝗲𝗲.𝗷𝘀, wired it up, ran it, fixed its own errors. Almost all of it from a few prompts. 𝗢𝗻𝗹𝘆 𝗼𝗻𝗲 𝘁𝗵𝗶𝗻𝗴 𝗼𝗻 𝘁𝗵𝗲 𝗯𝗶𝗹𝗹: 𝗖𝗹𝗮𝘂𝗱𝗲. No engine, no asset store, no licenses. On a Max plan that is $𝟬 on top of the subscription, about $80 to $100 at API token price ($8 per 1M in, $40 out). 11 minutes, walkable, upscaled to 2560x1440 at 60fps. Full walkthrough below ↓
Introducing Claude Fable 5.2 and Claude Mythos 5.2, designed to tackle the most daunting technical challenges. They’re capable collaborators on ambitious projects in many fields, and show improvements in areas like coding, reasoning, and vision.
17
1
2
23
722
𝗙𝗮𝗯𝗹𝗲 𝟱.𝟮 𝗶𝘀 𝗮 𝗳*𝗰𝗸𝗶𝗻𝗴 𝗱𝗶𝗿𝗲𝗰𝘁𝗼𝗿. Give it an idea and it turns it into a real, playable thing, running the whole production itself. This time: a liminal-space game in a browser tab. Flooded pool halls, a working elevator, CRT monitors that type out messages, a pink flamingo in the deep end. Inside Claude Code it works as an agent, not autocomplete. It went and found the free tools on its own, pulled in 𝗧𝗵𝗿𝗲𝗲.𝗷𝘀, wired it up, ran it, fixed its own errors. Almost all of it from a few prompts. 𝗢𝗻𝗹𝘆 𝗼𝗻𝗲 𝘁𝗵𝗶𝗻𝗴 𝗼𝗻 𝘁𝗵𝗲 𝗯𝗶𝗹𝗹: 𝗖𝗹𝗮𝘂𝗱𝗲. No engine, no asset store, no licenses. On a Max plan that is $𝟬 on top of the subscription, about $80 to $100 at API token price ($8 per 1M in, $40 out). 11 minutes, walkable, upscaled to 2560x1440 at 60fps. Full walkthrough below ↓
Introducing Claude Fable 5.2 and Claude Mythos 5.2, designed to tackle the most daunting technical challenges. They’re capable collaborators on ambitious projects in many fields, and show improvements in areas like coding, reasoning, and vision.
17
1
2
23
722
> SESSION: POOLROOMS_BUILD // operator: you, director: Fable 5.2 > ROLE: senior Three.js dev. ship a first-person liminal "poolrooms" sim. > TARGET: one self-contained index.html, Three.js via CDN, pure WebGL. > CONSTRAINTS: no engine. no paid assets. open libs only. runs in a browser, no build step. > BUILD THE WORLD // - a maze of interconnected indoor pool halls. white + teal glazed tiles on walls and floors, grout lines, slight wetness/specular. - several distinct rooms: a long lap pool, a square deep pool, an L-shaped pool, a small shallow basin. connect them with tiled corridors and arched doorways. - arched windows leaking warm volumetric light. fluorescent ceiling panels. a wall clock. wooden benches. blue plastic pool chairs. chrome pool ladders and handrails. - WATER is the hero: reflection + refraction, animated caustics projected on the floor and walls, gentle ripples, slight surface distortion. shader-based, procedural. - a working ELEVATOR: metal cabin, button panel P / 1 / 2 / 3, doors that open and close, cabin that actually travels between floors and reveals a different hall each time. - CRT MONITORS on thin stands: power-on flicker, green phosphor text that types out line by line ("FETCHING DATA_", "LOADING...", short cryptic lines). scanlines + glow. - hand-painted level MARKERS on tiles: a black "X" with floor numbers (X6, X2) as decals on walls and pool floors. - one giant inflatable PINK FLAMINGO floating in a deep pool. a lifebuoy. small props, no clutter. > ATMOSPHERE // - dim, eerie, empty. soft fog, subtle bloom, high contrast between bright windows and dark corners. quiet dread, no enemies. > CONTROLS // - first-person: WASD move, mouse look, pointer lock, center crosshair, head-bob, wall + water-edge collision, no clipping through floors. slightly heavy, slow walk. > PIPELINE // (do this yourself, ask nothing) 1. walkable tiled room + the water shader. 2. corridors + arched doorways to link rooms. 3. the elevator with moving floors. 4. CRT monitors with typed green text. 5. markers, flamingo, lights, fog, bloom. 6. run it, read the console, fix your own errors, repeat until clean. > OUTPUT: the finished index.html, then a one-line note on how to open it. GO.
96
Kirisando retweeted
Ladies and Dames - Fable 5.2., I did it in a minute and didn't even feel it.
Introducing Claude Fable 5.2 and Claude Mythos 5.2, designed to tackle the most daunting technical challenges. They’re capable collaborators on ambitious projects in many fields, and show improvements in areas like coding, reasoning, and vision.
14
3
1
19
750
Ladies and Dames - Fable 5.2., I did it in a minute and didn't even feel it.
Introducing Claude Fable 5.2 and Claude Mythos 5.2, designed to tackle the most daunting technical challenges. They’re capable collaborators on ambitious projects in many fields, and show improvements in areas like coding, reasoning, and vision.
14
3
1
19
750
Elon F*CKING Musk is about to save every watt of electricity on Earth. On a podcast he said AI is running out of power down here, so the data centers should just go to space. In my cartoon @elonmusk went even further and sent them to Mars 😂 Want one of these about anything you like? Open the post I quoted. It’s a screen recording of how I make cartoons like this in Claude, plus the full prompt behind them. Copy it, paste it into your Claude, pick your topic. No animation skills needed. You either create or you keep scrolling.
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.
18
3
1
28
1,043
Kirisando 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." }
12
23
3
162
9,356
{ "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 on the GPU in a headless Chromium browser (macOS, Windows or Linux), voiced locally with the free Kokoro TTS voice bm_george, encoded with ffmpeg. 1080x1920, 30fps, exactly as long as the voiceover. Work start to finish without stopping or asking. Use a task list for progress.", "my_inputs": { "story": "[your idea, true event, legend or full script]", "script": "[optional exact script; if empty, write it]", "length_seconds": 30, "captions": true, "notes": "[optional: era, setting, characters, jokes]" }, "stages": [ "A. Script (skip if I gave one): ~2.3 words/s for this voice (30s ~ 70 words, 45s ~ 100): 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, short sentences, never describe what's on screen. If presented as true, web-check facts and keep only what holds up; label legend/disputed parts in the script itself. Save work/script.txt and show it in chat.", "B. Voiceover (free, local): Kokoro TTS in tts/: standalone Python 3.12 (github.com/astral-sh/python-…, install_only build for this OS/CPU), venv, pip install kokoro-onnx soundfile; kokoro-v1.0.onnx + voices-v1.0.bin from github.com/thewh1teagle/koko… releases (model-files-v1.0). Voice bm_george, speed 0.95, model loaded once. Split the script into short lines at sentence ends AND commas; voice each line to work/vo/sNN.wav. Never time-stretch (atempo/rate add echo): slow it with pauses. Trim line edges (-50 dB), join with gaps ~0.2s after commas, ~0.4s after sentences, ~0.55s before the pivot and the final line. Write voice.wav (48k mono) + work/phrases.json {text,start,end,words:[{w,start,end}]} (words spread by syllables). Tie every cut and reaction to these times, shot boundaries to phrase TEXT.", "C. Build everything below without stopping. Show the stills contact sheet in chat before the full render, fix what it shows, then render." ], "setup": [ "Works on macOS, Windows and Linux: detect the OS first and use its shell (PowerShell on Windows), paths (.venv/Scripts on Windows, .venv/bin elsewhere) and python command. Create web/lib work/vo stills frames out.", "Python venv .venv with numpy Pillow imageio-ffmpeg; ffmpeg = imageio_ffmpeg.get_ffmpeg_exe(). Nothing system-wide: no Node, no Playwright, no Homebrew. Kokoro gets its own Python 3.12 in tts/ (stage B).", "three.js: download cdn.jsdelivr.net/npm/three@0… to web/lib/.", "render_py (Python only): ThreadingHTTPServer serving web/ on 127.0.0.1; POST /frame?i=N saves the body to frames/f%04d.jpg; POST /done marks a worker finished. Find an installed Chrome/Chromium/Edge (macOS /Applications/Google Chrome.app/Contents/MacOS/Go… Chrome; Windows Program Files or LocalAppData \\Google\\Chrome\\Application\\chrome.exe or Edge msedge.exe; Linux google-chrome / chromium on PATH). Launch it --headless=new --use-angle=<metal on macOS, d3d11 on Windows, vulkan or gl on Linux> --enable-gpu --ignore-gpu-blocklist --hide-scrollbars --mute-audio --window-size=1080,1920 --user-data-dir=<temp per worker> 'http://127.0.0.1:PORT/index.html?from=A&to=B&step=S'. The page awaits window.ready, then for each frame: renderFrame(f) -> canvas.toBlob(jpeg .93) -> fetch POST, one at a time. Run 3 workers in parallel on contiguous ranges. RESUME=1 skips existing frames; frame list 'a-b' or '1,5,9'. Stop a worker if no frame arrives for 60s and print the last frame (JS error there). Print s/frame.", "Speed check first: 10 frames, print s/frame (GPU ~0.1-0.5 s/frame with 3 workers). If WebGL fails (black frames, no context), fall back to --use-angle=swiftshader --enable-unsafe-swiftshader and say so." ], "timing": "Frames = round(voice duration*30) + 15 tail frames. Every reaction lands 0-3 frames before its word; the final payoff lands on the final word. Pauses fall only at sentence ends (guaranteed by stage B).", "architecture": { "files": "Names ending _py are Python files (.py). 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_py, sheet_py (contact sheets). Every frame renders alone (no carried state).", "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: ink_shader_glsl below. colour = mix(c, #030203, e); saturation 1.08-1.15; gain/lift tint; vignette .2-.34; white flash uniform.", "4 lens: dof_shader_glsl below; skip when cinf<.5. Output linearToOutputTexel." ], "sky": "inverted sphere following the camera: mix(horizon, top, pow(y,.55)) + optional sun disc; painted cloud billboards far away, fog off." }, "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: round head blob ~236 wide (superellipse, slight egg, per-seed asymmetry), torso = egg blob (wider at the bottom), legs/arms = thick curved limbs with ink outline (limb width ~12u), round hands with a little cuff, small boots with buckles. Eyes ~1.47m high. Legs 1.38xHH, torso 1.08xHH.", "ink": "Outline #241726 (plum), width 5u, thicker on the side away from the light (upper-left). Fills: base colour + soft shadow gradient to lower-right. Skins #ffe2c2 #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. Expressions table: neutral, stern, grin, smile, laugh, nervous(+sweat), shock, pained(+sweat), squint, smug/side (pupils to one side), sad, deadpan, o.", "outfits": "Rich but flat, every part inked: coat with coat-tails below the torso, gold trim lines down the front, TWO rows of buttons, a contrasting vest panel, jabot/cravat, cuffs, rosy blush on cheeks, wig with side curls + ponytail, tricorn with trim and a highlight line; masks for crowds (bauta = full white mask with eye holes and pupils inside; colombina = half mask with pearl dots and feathers); dresses = wide skirt with a front panel and folds, bodice with laces, hair bun + flower. Give each character a DESIGNS entry {coat, sleeve, trim, buttons, vest, wig, hat, hatCol, mask, dress, panel, blush, leg, boot} and draw everyone with one drawPerson(pen, design, pose).", "arm_poses": "hang, point, up, wave, hip, belly, cheek (both = shock), salute, thumb, shrug, reach, lift, cross, give, hold + props (coin, necklace, pen, stamp, oar, sign). 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": "half-buried hill spheres, distant mountains (cone + snow cap), trees (trunk + 4-6 squashed spheres), far houses, fog to the horizon colour.", "colour": "Warm, saturated, colourful palette (red earth, golden fields, blue sky, pink distant hills, or the story's own bright palette). Never monochrome.", "secondary_motion": "windmills turn, flags wave, smoke/dust/stars as cached 2D sprites, water texture scrolls, wheels roll, vehicles bounce.", "text": "Diegetic text (signs, crates, letters, stamps) painted on canvas with real fonts, on +z faces so it never reads mirrored; swap textures to animate (stamp on impact)." }, "lights": { "day": "sun az64 el50 #fff3df 2.45; hemi #d2e2f6/#a8905e 1.1; sky #2d74d4>#cfe3f5; fog 120-1300; sat 1.12 vig .2", "golden": "sun az30 el11 #ffb46a 2.9; hemi #a99bcc/#7a5040 .98; sky #6474c0>#ffc485 + disc; gain #fff0e0; sat 1.15 vig .26; cards #ffe2c4", "dusk": "sun el5 #ff9a72 .9; hemi #5d6cab/#3a3048 .8; sky #18234f>#d18a7c; gain #e2e8ff lift #04050b; vig .34; warm lamp; cards #c9cff2", "use": "day = story, golden = decline/time passing, dusk = explanation/ending. Time jump = 6-frame white flash." }, "motion": { "helpers": "motion_js verbatim.", "camera": "Keys {f,pos,look,fov,roll,ease,path} inside cut-free segments; glides 18-45 frames; easeOut for reveals; holds creep; 3-5deg roll on drama; impact kick (7-frame alternating offset + roll). Vehicles: track alongside with slight judder.", "continuity": "Prefer one continuous move (MCU pull-back into a wide, crane over into the establishing shot, truck along a lineup, crane down into an insert). 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 already mid-action (never a still or black first frame) -> pull-back reveal on the punch of sentence 1 -> wide establishing crane -> lineup/two-shot with pop-ins on each listed item -> reaction gag: a small animal (pigeon, cat, dog) slides onto the table/foreground on a question line, side-eyes the hero, pecks/fidgets, then is shocked on the payoff -> 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: MCU = camera ~3.5m away, fov 32-34, look at 1.35m; wides fov 40-52. Vertical frame is narrow (at 4m, fov 40 only +/-0.8m): stage people in depth.", "lens": "DOF on close-ups/mediums (cInf 7-14, focus on the eyes), wides sharp, racks ~14 frames.", "captions": "Default ON: 2-3 words at a time from phrases.json (break at punctuation), bold white with a thick dark outline, key words in yellow, lower third (~75% height), pop-in scale, auto-shrink to fit 90% width, never over faces.", "extra": "Numbers that grow (doubling, compounding) = a physical staircase/tower of tiers: tier height x2 each step, tier radius x1.35, tiers going away from camera, each tier pops up on its word with a puff, the number painted on its face; camera starts on the hero standing on a low tier and cranes back until the top tier is tiny. Keep jokes tied to the story; no random gags at the end (the final image is the story's object, e.g. an empty purse)." }, "audio": { "stems": "audio_py: music.wav + sfx.wav (48k mono, numpy). Music = calm quiet bed, never catchy: ~96 bpm, soft sine plucks, quiet pad, soft kick, sparse melody, low-pass 3.2 kHz; stops on the twist line, then a low drone. SFX on frames: whoosh on big moves, thunk on pops/stamps, clinks/tings, card flips, sting (41 Hz + noise + brass stab) on the twist.", "mix": "mix_py: gated RMS of the voice (0.4s blocks above -40 dB); music = 0.22x voice RMS (~-13 dB), SFX = min(0.5x voice RMS, peaks 0.7x voice peak); sum, one linear gain. No ducking or compression. Print levels.", "finish": "finish_py: ebur128 loudness, one gain to -14 LUFS + alimiter -1 dBFS; encode frames/f%04d.jpg + mix.wav with libx264 crf 17 yuv420p, aac 192k, faststart, plus a 720p copy under 30 MB. QA: freezedetect and blackdetect find nothing; tile a 2fps QA sheet and look at it. Claude can't hear: print levels." }, "look_check": "Before the full render: stills at every shot's middle + key actions, tiled into stills/sheet.jpg. Look and fix: cropped heads/hats, characters off-frame or hidden by props, camera inside objects, mirrored text, missing ink, black frames. Show me the sheet, then render all frames with 3 workers. 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;\nif (card) ds = 1e4;\nvec3 ns = s.rgb*2.-1.;\ne = max(e, smoothstep(.006, .02, (ds - d)/d));\nif (!card && abs(ds-d)/d < .06) e = max(e, smoothstep(.88, .72, dot(n, ns)) * .9);\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 shaders + motion helpers verbatim. creature_template_js = reference creature (Pen helpers: line, poly, ell, dot, arc, stroke, shadedFill, inkRing, clip, curve, ellPts, mul, rad, thickAngle, INK): write a small Pen class, then design THIS story's creatures the same way. 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 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.", "Never claim facts the web check didn't confirm.", "Captions on unless captions=false." ], "deliver": "out/final.mp4 (1080x1920) + out/final_720p.mp4 (<30 MB for phones) + a few lines on what each shot shows; offer tweaks." }
1
2
11
3,038
THIS SHOULD BE F*CKING ILLEGAL A BOT ON POLYMARKET SPENT ONE MONTH ON 15-MINUTE CRYPTO BETS AND GREW $313 INTO $438,000 No human fires off 700 predictions in 3 days. It worked Bitcoin, Ethereum, Solana, and XRP “up or down” rounds day and night, won a reported 98% of them, and pushed the account past $550,000 in lifetime profit. Viral posts claimed Claude was behind it And this one has receipts. The 0x8dxd profile is public on Polymarket, and Finbold covered it twice in January 2026: $313 at the start in December, $438,000 by Jan 6, about $512,000 for the month by Jan 9, and $558,327 in all-time profit on the profile page How to use it tonight: Copy all 12 repos with links from the reply Paste them into your Grok Bot and ask it to build a paper-trading desk for Polymarket 15-min rounds Tell it: only one service sends orders, and that’s where your max spend and max loss live If an order hangs, check its status before sending it again Run a full session on paper first, then read the daily summary: closed profit, open positions, fees, rejected orders All 12 repos with links are in the reply ↓
15
16
400
All 12 repos with links ↓ 01 / Polymarket SDK the official Python kit for Polymarket: read markets, check your account, and send orders from one client github.com/Polymarket/py-sdk 02 / Polymarket CLI browse markets, place orders, and track positions from the terminal, with JSON output an agent can read github.com/Polymarket/polyma… 03 / Cryptofeed pipes live trades, quotes, and order books from crypto exchanges into your bot, no tab-refreshing github.com/bmoscon/cryptofee… 04 / CCXT one API that talks to 100+ exchanges and prediction markets for balances, prices, and orders github.com/ccxt/ccxt 05 / Freqtrade a full Python bot out of the box: backtests, paper mode, open-trade tracking, and a browser dashboard github.com/freqtrade/freqtra… 06 / Hummingbot builds and deploys high-frequency bots that quote and trade on centralized and decentralized exchanges github.com/hummingbot/hummin… 07 / VectorBT throws thousands of entry and exit ideas at past data and shows which ones survive the drawdowns github.com/polakowo/vectorbt 08 / Qlib Microsoft’s AI quant lab for hunting signals with machine learning before real money touches them github.com/microsoft/qlib 09 / QuantStats grades your returns: drawdowns, hit rate, volatility, and how you did against a benchmark github.com/ranaroussi/quants… 10 / DuckDB a fast local database that keeps every price tick and fill, so you can replay any night later github.com/duckdb/duckdb 11 / APScheduler wakes up your Python jobs on time: fresh data, balance checks, the daily summary github.com/agronholm/apsched… 12 / Lightweight Charts a clean price chart with your trades pinned on it, open in a tab while the bot does the work github.com/tradingview/light…
1
174
Wait, WTF... 17 cartoon shorts just pulled 1.79M views 🤯 Look at what this one channel pulled off: → This jail short sits at 880.5K views. → The arrest one crossed 389.4K views. → The driving lesson one hit 143.5K views. And this account is just getting started, on one platform only. You can post the same videos on TikTok, YouTube Shorts, Instagram Reels, X, Facebook Reels, Snapchat Spotlight and Threads and make money from them everywhere, because every new account is one more stream of traffic to your store or your app. A guy in a prison cell is reading the paper when the guard opens the door and tells him he's free to go. Then the twist lands: he refuses to leave, because here he gets free food, no job and a personal guard. The guard turns red and kicks him out, and people replay it just to catch that face again and send it to a friend. You'd swear a real animation team drew this, but you can get this same style out of Claude. Get just 1% of the viewers from one 880K short to click your bio link and that's 8,800 people walking into your store or your app. I left the full step-by-step guide in the reply. Just fill in your story in the empty [brackets], paste it all into Claude Code and you'll get a ready animation (one you can improve and change to fit your style) ↓
10
1
1
15
611
How to make these cartoon shorts with Claude Code 🧵 What you need: → Claude Code (Pro plan is enough to start) → Node.js → ElevenLabs API key + 2 voice IDs from the Voice Library → Remotion is free for solo creators Step 1 → Create an empty folder and open Claude Code in it Step 2 → Paste this prompt, fill in the [brackets] Build me a 9:16 cartoon short in Remotion. SETUP - Create a new Remotion project in this folder: 1080x1920, 30 fps. - Install the official Remotion skills: npx skills add remotion-dev/skills - Voices: ElevenLabs API. Key: [YOUR_KEY]. Character A voice ID: [ID_1]. Character B voice ID: [ID_2]. STYLE (every frame) - Flat 2D cartoon, thick black outlines, bright colors, one room as the background. - 2 characters: round yellow head, stick body and limbs, a cap with the character's name printed on it, an outfit that fits the role. - Faces react on every line: eyes, eyebrows, mouth. The mouth moves only while that character talks. Angry = the face turns red. - Both characters are in every shot. One line of dialogue = one shot. - The camera never stands still: slow push-in, quick zoom and a small shake on the punchline. - Captions: 2-3 words at a time, bold white with a black outline, the key word in green, lower third, never over faces. - Nothing cut off by the frame edge, no text on top of the characters. STORY - Topic: [YOUR TOPIC, or "pick one boring everyday rule and flip it"] - 6-8 short lines, under 30 seconds, the twist in the last line. PROCESS 1. Show me the script and a shot list first. Wait for my OK. 2. Voice every line as a separate file, measure each duration, sync every shot and every mouth to the audio. 3. Build the scenes, add captions and light background music. 4. Render a low-quality draft and give me the file path. 5. After my fixes, render the final MP4 at 1080x1920. 6. Save the STYLE and PROCESS sections as a skill in .claude/skills/cartoon-short/SKILL.md. Step 3 → Read the script, reply "OK" or ask for changes Step 4 → Watch the draft, fix in plain words: → "Make the guard angrier on line 5" → "More camera movement" → "Captions bigger" Step 5 → Get the final MP4 and upload the clean file everywhere: TikTok, Shorts, Reels, X, Facebook Every next video → One line: /cartoon-short Topic: [your idea] Same characters, same style, new twist. One short takes under an hour, most of it is Claude working.
1
2
200
This f*cking changes who wins. Andrej Karpathy: “The biggest regret of every engineer in my field right now is every AI conversation they never saved, and in 10 years the ones who started saving in 2024 will be running circles around the rest of us” The OpenAI co-founder put out one idea and 16M people saw it: quit treating AI like a code generator. Turn it into an external memory that holds on to every article, PDF, transcript and conversation you’ve ever handed it The mechanics are simple. Claude Code gets one folder. Anything you put inside, Claude reads, matches against what’s already stored, and writes into a wiki that never stops expanding. What you learn stays learned instead of evaporating by the end of the week The recipe: → Get Obsidian and make a home for your notes: brew install obsidian, mkdir ~/vault, cd ~/vault → Start Claude in that directory and give it “init a knowledge vault with CLAUDE.md as the rules, /raw for sources, /wiki for your pages” → Put anything into /raw (a YouTube transcript, notes from a call, a 400-page PDF, a screenshot of a post), then type “ingest” → Claude drafts a wiki page, connects it to 5 pages you already have without being asked, and records any new habit of your thinking in CLAUDE.md → Stop starting from zero in an empty Claude window. Questions go to the vault, and answers arrive backed by your own sources, each with a date and a link 5 minutes of setup. From tonight, everything you learn starts adding up The part people will skip: a decade from now, the engineers who began in 2024 will be able to pull up any book, podcast or meeting they ever touched, with evidence. You’ll be guessing. Karpathy has already placed his bet, and you’re still standing on the sidelines Every step is laid out in the article below Save it now so this week doesn’t go the way of the last one
8
1
10
278
Your iPhone backup can still have deleted photo preview. Your iPhone backup is not encrypted by default. The scary version going around X says any app on your phone can read this. It can't. iOS locks every app in its own sandbox, and Photos access only reaches the live library. Claude Code + Opus 5.5 will count every one of them on your own Mac. No jailbreak, no ssh, no app on the phone. One prompt. what it pulls out of a single backup: → every app ranked by how much of your data it holds → every photo still sitting in Recently Deleted, with dates → previews of photos that are gone from your library, counted by year → all of it as tables, without opening a single picture how it works: Finder backup → Claude Code decrypts a copy → SQL on Manifest.db and Photos.sqlite → report.md the real hole is the backup folder itself. Anyone who copies ~/Library/Application Support/MobileSync/Backup off an unlocked Mac gets your camera roll, your messages and those previews. One checkbox decides whether they can read it the 3-minute fix tonight: → Finder → your iPhone → tick "Encrypt local backup" → Settings → Privacy & Security → Photos: move every app to Limited Access or None → Safety Check in the same menu → empty Recently Deleted the full prompt is in the first reply ↓
15
2
24
1,522
the prompt (paste into Claude Code, run it in an empty folder): "Act as an iOS privacy auditor. My encrypted iPhone backup is in ~/Library/Application Support/MobileSync/Backup. Don't modify it: work on a copy. 1. Install iphone_backup_decrypt in a venv and ask me for the backup password in the terminal. Never write the password to a file. 2. From Manifest.db, list the top 20 apps by number of files and total size. 3. Extract Photos.sqlite and report: total assets, assets with ZTRASHEDSTATE = 1, and the oldest and newest date among them. 4. List files under PhotoData/Thumbnails. Count how many do not match any asset still in the library, grouped by year. Output a report.md with tables only. Do not open, describe or upload any image. Delete the decrypted copy when you're done."
1
4
149