© 2026 Thibaud Geisler - SIRET 880 419 122 00036
Python/Remotion pipeline driven by a Claude Code skill that produces every Instagram teaser for a techno night from a single description file. Generative AI only produces the ambient shots. Names, branding, the DJs' real footage and cuts locked to the music are composed in code, for about $5 to $10 of generation per night. In production.
I chair Tekuno, a non-profit that promotes electronic music around Metz, France: it runs club nights and a label that showcases local artists. Every night needs its own series of Instagram teasers: the lineup, an artist focus, a countdown at D-7 and D-1, and the day's timetable. Until now, all of it was edited by hand in After Effects.
Manual editing has to be redone for every night, and generative AI alone falls short: it misspells artist names, cannot stick to a brand identity and distorts faces as soon as a real photo goes through an image-to-video model.
Goal: produce every 9:16 teaser for a night in one pass from a single file, in the poster's branding, for $5 to $10 of AI generation per night.
My role: design, development and operations, solo.
Handing the whole teaser to a video model means accepting misspelled names, rough typography and distorted faces. For a non-profit that publishes on behalf of its artists, that is not acceptable.
Solutions: a strict split of roles. AI only generates abstract ambient shots (liquid chrome, smoke, light) and the poster animation, with no text and no people. Everything else is composed in code: names, set times, venues, logos, the DJs' real footage. A name can therefore never be misspelled, and no real face ever goes through a generative model. When the poster shows an identifiable person, it is never sent to AI: the video animates it with a simple slow zoom, computed in code.
Every video shot costs money each time it is generated, and a job runs two to three minutes at the provider. A network drop, a Ctrl+C or a retouched poster is enough to pay twice for the same shot.
Solutions: each shot carries a fingerprint of what defines it (prompt, model, resolution, duration, source image): a shot already generated is never paid for again. Each job is written to a manifest as soon as it is submitted: after a drop, the next run resumes tracking instead of resubmitting. A free quote comes before every run, a per-night ceiling requires human confirmation, and a 480p draft validates the result before the 720p final. The final reuses the seed of the approved draft, to stay close to what was validated. Result: about $5 to $10 of generation per night.
Preparing a night is a chain of steps: sorting files, filling in the description, writing prompts, preparing media, generating, rendering. A conversational agent fits that well, but it handles personal data (the DJs' footage) and can trigger spending.
Solutions: a Claude Code skill runs the preparation in conversation, but it executes nothing itself: a deterministic CLI, usable without Claude, is the only executor. Reading the DJs' footage is blocked by permission, and every paid generation goes through three steps: a free quote, an explicit approval in the conversation, then a Claude Code permission prompt that the agent cannot approve on my behalf.
OpenRouter offers around thirty video generation models, at widely varying prices. Public leaderboards did not help me choose: they reflect users' overall opinion, across all kinds of videos. I needed something specific: abstract shots, with no text and no people, in the night's colors.
Solutions: a reproducible benchmark between Wan 3.0 and MiniMax Hailuo 3 Max, in three phases (480p screening, check at production resolution, poster animation). The decision rule was set before any result, and scoring was done blind, on clips anonymized by a randomly drawn letter. Wan 3.0 wins, 4.1 versus 3.5 out of 5 for a 6% cost difference. Total benchmark cost: $9.58 for 32 clips, with no failures.
In a teaser, cuts have to land on the music: placed at random, they sound wrong, even when the picture is right. And every night has a different lineup, which has to fit a fixed duration without touching the code.
Technical challenges: detecting a track's tempo and drop without manual calibration, then spreading cards, DJ footage and ambient shots over a musical grid, in whole frames (without exceeding the variant's duration).
Solutions: the composition is written in Remotion (React), driven by a Python CLI. Tempo and drop are detected automatically (the drop is found within 0.01 s on a real track). Every cut lands on the first beat of a half-bar. A single rule shares the time between cards, DJ footage and ambient shots, for all four variants. If everything does not fit the planned duration, it first removes ambient-shot passages, then shortens or removes videos, flagging each cut. As a last resort, it states how much to extend the video. A night is therefore tuned through its description alone, without touching the code.
A poster is read standing still, in a large format. A teaser is watched in a few seconds, on a phone, with a moving background under the text: the poster's typography and layout do not hold up as they are.
Solutions: a continuous AI background under the text, moving from one card to the next without replaying a passage, and the poster frame kept fixed for the whole video (date, set times, venues). The video ends with a fade to black under the logo. Typography is enlarged and made bolder for a phone screen, and every deviation from the poster's design system is decided and documented.
The DJs' videos come in every format. Those shot on an iPhone are HDR: converted to standard video for Instagram, their colors come out dull and greyish. Many are shot horizontally, and the sound level changes from one file to the next.
Solutions: an HDR to standard video conversion that keeps the original contrast and colors, harmonized loudness at the level Instagram recommends, and a framing rule: full screen when a vertical crop keeps the essential part of the picture, otherwise the whole video inside a branded frame. AI shots are graded in the night's color, while the DJs' videos keep their original colors.
Source code available on request (private repository).