Evolve Animator
A website-to-motion compiler that captures real pixels and typography from a live site and animates that captured content into a branded promotional video, deliberately…
- Phases 0-3
- complete: compiler, MCP server, production engine, self-hosted web app
- 14
- MCP tools exposed to Claude
- 3 to 11 clips
- capture improvement on one real site after fixing silent clip loss and near-duplicate flooding (evolveuniversity.ai)
- TypeScript, pnpm workspace (Node…
- node:test for the test suite (fa…
- Fastify (self-hosted web app), M…
- Playwright (Chromium) for capture
- Remotion (renderMedia/renderStil…
- Sharp for asset processing
Evolve Animator holds live data, so this shows the verified technology stack by layer rather than a screenshot. Hosts, ports and topology are deliberately absent.
Problem
Producing a branded promotional video from an existing website normally means either hand-editing footage or using an AI video generator that invents visuals loosely inspired by the brand rather than using the brand's actual pixels, typography, and copy. Neither approach guarantees the output is faithful to what the site actually says and looks like, and an always-inventing generator risks producing something off-brand or simply wrong. A generic AI video generator also can't be pointed at six different operating properties, each with its own brand tokens and site content, and be trusted to keep them straight without a human re-briefing it for every single one; the pipeline needed to work unattended across a real, heterogeneous portfolio of live sites rather than one curated demo site, which is a much harder bar because real pages are frequently hostile to capture: missing headlines, canvas-rendered heroes, white text over an image, placeholder copy, or pages with almost nothing usable on them at all.
What was built
A pipeline, reachable by CLI, by an MCP server Claude can drive directly, or through a small self-hosted web app, that takes a live URL and produces a finished branded video: it captures real elements from the page, scores and selects the strongest ones, plans a narrative storyboard, compiles that into Remotion scenes, renders the video, runs an automated visual QA pass on the result, and packages an MP4 with a thumbnail and optional burned-in captions. Text isn't captured as flattened raster screenshots of the page region: a later capture-fidelity pass switched to reconstructing on-page text live, pulling the exact web fonts through Remotion's Google Fonts integration and vectoring in SVG logos, specifically because Playwright's built-in element screenshot composites the whole page region and can't isolate text from its background, which produced visible raster seams in earlier renders. Seven scene templates and multiple brand token sets (dark and light variants per brand, plus the generic white-label path) sit behind that reconstruction layer, and a later polish pass added rich-text spacing and italics, a WebM output option, and crossfade transitions between scenes. A pnpm sweep command exists purely to validate the pipeline against every real site the business operates, capturing, discovering, planning and validating without spending render time, precisely because capture and planning are where a hostile real page breaks, not rendering.
Technical approach
The defining constraint, stated as a hard rule in the repo's own instructions, is that the system is a compiler, not a generator: no code path may fabricate content that could instead be captured from the real site, which shapes every downstream decision, including the QA layer's job being to catch cases where captured content was insufficient rather than to paper over gaps with invented material. A real and instructive class of bug came from that constraint interacting with production reality: element capture originally swallowed failures with a bare catch {}, so a site could report '56 candidates, 3 clipped' while actually having silently lost 11 more to timeouts, masked because 45 near-identical carousel tiles were crowding out 8 genuinely distinct feature cards; fixing both the silent-failure logging and the de-duplication took one real site's capture from 3 usable clips to 11 and cut 27 seconds of wasted capture time per run. The QA layer itself needed multiple hardening passes discovered only by a sweep across 15 real sites: empty scenes structurally passed validation because the checklist tested timing and layout, not content presence; the conversion end-card, which the pipeline pushes unconditionally because a promo must close on a CTA, rendered blank on 4 of 15 sites when a page had no CTA, footer link, or logo to fall back to, requiring a fallback to the strongest remaining copy; and a contrast bug in the brand-matching logic (brandFromTheme) picked the wrong text-ink candidate for mid-tone backgrounds because its threshold logic tested bgLum > 0.5 without checking which candidate actually won on real contrast math, silently shipping illegible captions on any muted or grey client site until a test suite caught it and a real-site sweep confirmed the fix. A short-scene edge case crashed Remotion outright: two animation components interpolated over ranges keyed to scene duration, and Remotion's interpolate throws unless the range strictly increases, which any scene under 1.4 seconds violated, reachable from multiple paths including manual duration edits in the web app. A security-relevant fix in the CLI wrapper closed an argv-injection path where a URL value beginning with -- would be read as a flag rather than a value, since the CLI had no end-of-options separator to rely on. As of the last recorded handoff, the production wiring to Evolve Agentic's front-door catalog exists and both sides (the Worker's job submission and the Mini-hosted animator's job execution) are independently verified, but the authenticated end-to-end hop had never actually been exercised by a signed-in user, with the D1 run ledger for this tool still empty.
Creative approach
Craft
There is no separate 'look' to the tool itself; the craft is entirely in how faithfully and legibly it reproduces a target's existing visual identity. The four supported brand token sets and the client-generic white-label mode are the design surface, and the fix to the contrast bug is itself a piece of visual craft work: choosing whichever ink candidate actually wins measured contrast rather than trusting a plausible-looking luminance threshold. The move from raster element screenshots to live text reconstruction is craft in the same register: it's a decision to keep type crisp and font-accurate at the cost of a harder reconstruction problem, rather than accepting a visually softer but simpler screenshot composite. A poster-frame fix is a small but telling instance of the same instinct, choosing the frame at the end of the opening scene, once the hook is fully revealed, as the still image that represents the whole video, rather than whatever the renderer happened to produce first.
Reframe
The compiler-not-generator framing is the whole product thesis, and it reframes what 'AI video' means in this context: instead of the model deciding what a brand's promo video should show, the model directs which real, captured elements get emphasized and in what order, with the visual content itself always sourced from ground truth. That framing directly produced the QA philosophy: a QA failure here means 'we captured too little,' never 'we should invent more.' It also produced an explicit decision to compute a verdict on every run and surface it rather than discard it: a weak clip that only a page's thin, real content can produce is sometimes exactly what was captured and exactly what should ship, so the system was built to say so in plain language on the finished report rather than to either block the render or hide the weakness. Concurrency was capped at a single render slot for the same host-honesty reason the compiler refuses to invent content: the Mini shares memory with other always-on containers, and running renders in parallel would trade a slightly slower queue for a real risk of crashing the host, so the wait was made legible with an explicit queue-position field instead of hidden behind more concurrency the hardware couldn't actually sustain.
Process and what failed
The project's own handoff documentation is unusually candid that its test suite, though green, systematically could not see an entire class of real defects, because the tests exercised structural correctness (timing, layout, scene count) while the actual failures were about content presence and visual legibility that only a sweep against 15 real, messy sites exposed. Multiple defects were quality regressions that happened to still pass every existing check: a technically valid, fully-timed storyboard could render a completely blank scene, and a thumbnail-generation step captured frame 0 (the pre-animation state) on every template, silently shipping a blank thumbnail on every single render until it was switched to use the same poster frame the rest of the pipeline already computed.
Outcome
Functional and used on demand via CLI, MCP tools, or the local web app; it is not a standing always-on service (no launchd daemon), and it is wired into the Evolve Agentic tools catalog as one of the registered tools, though the authenticated production path through that catalog has not yet been exercised end to end by a real user. A full internal promotional set was generated across every operating property the business runs, and a real-world sweep against every one of those sites, after the capture and QA fixes landed, captured all 15 sites with zero crashes and produced a clean plan for 12 of the 15; the three that didn't plan cleanly reported specific, honest reasons (an auth wall, or genuinely too few usable elements on the page) rather than failing silently. Two Phase-3 seams that had been built, Stripe-metered credits and cloud render via Lambda, were deliberately deleted or left dormant once it became clear the tool is internal-only: metering internal renders against a credit balance gated nobody, and the Mini's own render throughput is sufficient at the volume the business actually needs, so neither seam was carried forward as unused complexity.