Prosecutors said he hired spell casters to make his wife obey him, or make her sick. 5 years later, he told her family, "I'm not a monster."
In the video below, Maya Millete's family shouts at her husband, Larry Millete, during his sentencing in a San Diego courtroom.
"Where's Maya?" one person yells. Another demands to know why he killed her.
Earlier, Millete told the court his "only regret" was that he couldn't protect his wife. He called himself "a decent and good husband."
Her oldest sister made one request: "Tell us where my sister is and help us bring her home."
According to Times of San Diego, a vial found in the home tested positive for coniine, a poison found in hemlock. Millete had repeatedly searched online for poison hemlock.
Maya Millete, 39, was last seen entering her Chula Vista, California, home at about 4:45 p.m. on Jan. 7, 2021. No footage shows her leaving. She was a mother of 3. Her body has never been found.
Prosecutors said he killed her because she wanted a divorce. The defense said there was no body, no crime scene and no murder weapon.
In July 2026, a jury convicted him of first-degree murder. On Nov. 2, 2026, he was sentenced to 25 years to life, plus 2 consecutive years on an assault weapon count. He maintains his innocence.
1 vial of coniine. 0 bodies found. 27 years to life.
Is 27 years to life enough for a man who won't say where she is, or should his silence cost him parole?
Kirisando retweeted
F*ck. Fable 5.2 did a full web design job and actually pulled it off.
A swarm of 10 agents got one mission: design and ship a full product landing page.
Nobody touched the keyboard.
The layout was locked, the glass 3D hero sculpted, every headline and line of copy written, the signup wired to email, the whole launch checklist run green, and the page pushed live.
Brand, mobile, links, production, all verified and published in one run.
Quit treating Fable like a pricey autocomplete. Hand it the wheel.
So, would you let agents design and launch your landing page?
Kirisando retweeted
Take an 18-year-old’s drugs away and this is what you get: he snapped and turned his fists on his own mother
→ then, when officers stormed in to pull him off her, he st*bbed three of them.
He sat there smug the whole time, smirking like it was all one big joke at everyone else’s expense. Then came the number — bail set at about $3.25 million . The grin dropped dead off his face.
Kirisando retweeted
At 17, Cassandra Bjorge drew a blade across her sleeping grandparents’ throats. With them dead, she caulked the bedroom shut and turned the house into a party spot for the next seven days.
Sat in the interrogation room, her face stayed blank. She calmly informed the cops that the two of them were only the first names on a longer list.
She and her boyfriend, Johnny Rider, bided their time until Randall and Wendy Bjorge, 63 apiece, had turned in for the night. Rider came down on Randall with a tire iron. Cassandra wrestled her grandmother into the same room, wrapped her in tape, and laid into her. Blades did the rest — both bodies pierced, both throats opened.
With the killing done, they stuffed the bedroom shut and ran caulk along the doors so the reek couldn’t escape. Seven straight days they had food delivered, passed joints around, and kept friends coming over while two corpses rotted behind the wall. The grandparents’ car became their ride, like the owners had just stepped out.
The standoff ended with both of them turning on themselves when police closed in. Neither managed it. Both lived, and both went into custody.
Across every interview, not one trace of guilt crossed Cassandra’s face — prosecutors called her stone-cold. In her telling, the grandparents were merely the warm-up act. Rider’s relatives were penciled in next, then her own mother and the stepfather. The only thing that stopped the rest was the clock — they “ran out of time.”
None of this came from nowhere. A year earlier, at 16, she’d already been charged with attacking that same grandmother. Officers knew the address — they’d rolled up to it more than once.
Guilty pleas from both. Life, plus another 21 years stacked on top. No parole hearing on the table until 60 years have passed. Judge Debra Turner ranked it among the worst she had ever presided over. As the prosecutor put it, “It was planned. It was executed correctly, according to their plan.”
The hands that raised her are the ones she ended, and then she danced over the graves. Sixty years until a parole board might even listen — does that square the books?
Kirisando retweeted
Matt Wolfe built a full game from zero and showed every step in 28 minutes - ONLY 28 MINUTES!
Play the finished game: the-librarian-game.vercel.ap…
He says he's new to coding. The game is a reverse Vampire Survivors: you're a librarian, kids throw books off the shelves, you put them back before the chaos meter hits 100%.
Set aside 28 minutes. That's enough to watch it and start your own.
What you need (all free except Claude Code):
→ ChatGPT free plan to turn your idea into a design doc
→ VS Code, free, with Claude Code (comes with Claude Pro, $20/mo)
→ Leonardo for the sprites, 150 free tokens a day
→ Suno for the music, 50 free credits a day (about 10 songs)
→ free GitHub and Vercel accounts to put it online
In the reply: the full code of this game and every prompt he used, in order. Everything is ready. Watch the video, then go make something of your own ↓
Kirisando retweeted
THE HOST COULDN'T KEEP A STRAIGHT FACE AND THE WHOLE TALK SHOW IS AI
→ A platinum blonde guest in a black dress leans into a story on a late night set
→ Her face changes with every sentence: raised brows, eye rolls, hands moving
→ The host looks down at his cue cards, then covers his mouth to hide a laugh
→ He leans toward her at the end while she points at herself
6559 likes and 3.6M views on the source
None of this happened in a studio. The skin, the lip movement, the laugh behind the hand and the wide shot of the set with the moon backdrop all hold together for the full 15 seconds, and that is the hardest thing for AI video to fake: two people reacting to each other in real time. This is the kind of scene you can try with Seedance 2.5 in @Picsart
Would you have noticed it was AI without being told
Kirisando retweeted
You can build a full Roblox game with Claude now. Full tutorial is here.
And Roblox pays for games people play: earned Robux turn into real dollars through DevEx. Roblox says creators earned over $1 billion that way in the 12 months.
Lobby, a map, 4 towers, 10 waves, a boss, a unit shop, coins that save between sessions. This video shows the whole build in 5 minutes: Roblox Studio, its built-in MCP server, Claude Opus 5.5 and 2 prompts.
I broke everything you need into 6 replies below, one for each stage:
→ the setup for Windows and Mac
→ the game prompt
→ the map prompt
→ lobby, shop and saves
→ the safety check before you publish
→ open source code of a real AI-built tower defense
0:50 install Studio · 1:54 MCP server · 2:27 config · 3:10 connect · 3:21 prompts · 3:52 the finished game
video step by step↓
Kirisando retweeted
October 26, 2022. A detective slides a fact across the table to Richard Allen: the bullet they pulled from the spot where two girls were k*lled matches his gun. Then everyone clears out — except his wife. Nobody touches the camera.
He reaches for her. Low, almost gentle: “It’s all right, babe.”
Rewind five years. Libby German and Abby Williams, inseparable, two teenagers who went for a walk. February 2017, Delphi, Indiana — their bodies turn up off a trail, under the shadow of a dead railway bridge. The last thing one of them ever did was lift her phone at the man standing on it. The audio survived. Three words: “Down the hill.”
Back in the room, Allen loops the same sentence like a prayer: “I didn’t mrder anybody. I didn’t help somebody mrder anybody.”
His wife tries one question. Was he ever up on that bridge? “I told them I was on the bridge.” Something shifts in her face. “I don’t remember you telling me that.”
And then the one that won’t move: how does a bullet from his weapon end up out there? He hands her two exits — wrong gun, or wrong place. She shuts both doors in four words: “It did, though, honey.” And one more: “They’ve got ballistics on it.”
On her way out, a detective catches her at the door. “Do the right thing, Kathy. Tell him to do the right thing.” A few minutes is all it takes. Allen: “I’m done talking. Arrest me.” The detective doesn’t blink: “Happy to.”
A jury convicted him of k*lling both girls. The number they handed down: 130 years.
So which man was in that room — one wrecked by a coincidence he couldn’t explain, or one who understood, better than anyone, what that bullet proved?
Kirisando retweeted
F*cking Fable 5.2 built this 4.2M-view shooter. I explained how in the video.
The video is 80 seconds and explains everything. Just drop it into Claude with the prompt and the game's code from the reply, and Claude will write a game like this for you.
What one game took:
→ 1 prompt, 3 sentences
→ 8 hours, no human feedback
→ ~$550 at API prices
→ 445M tokens in, 2.7M out
→ 0 images, 0 3D models, 0 audio files, all of it written as code
The game's code and the prompt are in the reply ↓
I wanted to test Fable 5.2's quality with one-shot prompts without human feedback.
Everything in this game is from scratch: models, sounds, textures. ~$550 at API pricing, ~2.7M output and 445M input tokens, heavily cached. Took 8 hours!
Play it here: claude.ai/artifact/BGY1SztrA…
Kirisando retweeted
In 2002 a 15-year-old girl was taken at gunpoint from a friend’s front yard by a serial kller who had already klled three young girls. She stayed so calm for 18 hours that he let his guard down, and the details she memorized under threat tore his whole secret open.
Kara Robinson was watering plants on a June morning in West Columbia, South Carolina, when Richard Evonitz pulled up, showed a gun, and forced her into a storage tub in his car. He drove her to his apartment, bound her, and assaulted her through the night.
“I knew what his intentions were for me,” she said later.
She had decided early that she was going to live. So she talked to him, watched him, and filed away everything she could: the layout of the apartment, the pet fish on the shelf, the magazines, his name, the road signs she caught through the window. She kept her voice steady and waited for one mistake.
Near dawn he fell asleep. Kara worked a hand free, slipped the restraint off her leg, and walked out the front door into the street. She ran to the first house with a light on and called 911. Her description was so exact that deputies found the apartment within hours, and she picked Evonitz out of a photo lineup. He shot himself before they could arrest him. Inside his place investigators found evidence that tied him to the k*llings of three girls in Virginia whose cases had gone cold: Sofia Silva, and sisters Kati and Kristin Lisk.
In the video below Kara tells it herself. At 0:03 she describes the escape: “I didn’t look back. Not for a second. I just ran.” At 1:21 she lists what she memorized to lead police back to him, down to his doctor and dentist from the magnets on his fridge.
“Picking me was the greatest mistake he ever made.”
She went to work in a sheriff’s DNA lab, then became an officer who handled assault and child cases, and today she tells her story on camera so other people might get out too.
Why does one 15-year-old walk away from a k*ller who let no one else live?
Kirisando retweeted
A developer from China just put a money printer on GitHub. For free.
I tested it with the first thing that came to mind: a fairytale winter in the Alps with a quiet mountain lake. Claude wrote the script, the tool found real footage and cut the video. Exactly what I asked for. Spend an evening with the settings and you can make content that actually goes viral, and that’s where the real money is.
Here the stack costs $0, you only pay for the model you connect.
what it does:
→ topic or keyword in, finished video out
→ Claude writes the script (or GPT, Gemini, DeepSeek, a local model)
→ voiceover built in, or switch it off for music-only clips
→ subtitles timed to the voice automatically
→ stock footage from Pixabay and Pexels matched to every line
→ background music mixed under the voice
→ 9:16, 16:9 or 1:1 in one click
→ batch mode: a list of topics in, a folder of videos out
→ posts straight to TikTok, Instagram and YouTube Shorts
It’s called MoneyPrinterTurbo. 142K stars, 22.8K forks. You grab the repo, plug in your Claude, and it starts turning out short videos on its own.
Setup is pip, Docker, a one-click Windows package or Google Colab.
I left the official GitHub link in the first reply ↓
🌍 where will you be born this time?
ep. 2: tuvalu 🇹🇻
you dream of flying. your playground is the airport runway.
→ your country's highest point: 4.6 m
→ the sea comes up from under the ground
→ 280 visas a year. more than half the country signs up
fully animated in code with claude opus 5.5
you pick the next country 👇
🌍 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 👇
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.
Kirisando retweeted
“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. ↓
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 ↓
Kirisando retweeted
Ladies and Dames - Fable 5.2., I did it in a minute and didn't even feel it.
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."
}













