←Pierre Sauvignononreplay.ai ↗
Case study · OnReplay

OnReplay Case Study

OnReplay turns a handful of ordinary photos into a themed, AI-animated short film, sold to consumers on a credit model in eight languages. I designed, built and operate the whole system solo: the web app, the marketing site, the admin backoffice and an AWS serverless backend that orchestrates several generative AI providers per render.

The onreplay.ai homepage with a film playing
The OnReplay homepage with an AI-animated film playing, October 2026

At a glance

RoleSole engineer and product owner
PeriodDecember 2025 to present, about 2,500 commits
ProductConsumer web app, paid per render, 8 languages
StackAWS serverless (Lambda, Step Functions, DynamoDB, Batch), Expo / React, Astro, Stripe
AIGemini, Kling, Grok, OpenAI, Veo, Sora, HeyGen
Scale30 themed worlds, 140 Lambda functions, about 3,200 marketing pages

Traction

Since the first film in January 2026, OnReplay has delivered 3,121 films to 2,065 creators.

MetricValue
Creators who received a film2,065
Registered accounts11,083
Films delivered3,121
AI-animated clips in delivered films7,767
Photos transformed by AI9,541
Finished film delivered791 minutes, about 13 hours
Paid renders delivered successfully98%
Films made in a language other than English32%
Films delivered per month grew 2.7× from January to September 20262,919 films over 9 months; October not yet completeJan 2026: 179 films delivered179JanFeb 2026: 168 films delivered168FebMar 2026: 184 films delivered184MarApr 2026: 231 films delivered231AprMay 2026: 359 films delivered359MayJun 2026: 425 films delivered425JunJul 2026: 422 films delivered422JulAug 2026: 469 films delivered469AugSep 2026: 482 films delivered482Sep
OnReplay production database · completed films by month, Jan to Sep 2026

Volume has grown every quarter, from 531 films in Q1 to 1,373 in Q3, on the same pipeline.

The product

A user picks a themed "world" (a wedding, a family Christmas, a superhero comic, a pet tribute), uploads a few photos, and minutes later receives a short film starring their own faces, animated and scored. Each render costs credits, bought as packs or a subscription.

The hard part is not calling a model. It is turning slow, metered, sometimes failing AI services into something a paying customer experiences as reliable, with failures recovered automatically and no human in the loop.

Architecture

One serverless backend serves three frontends and eight AI enginesWeb app · app.onreplay.aiExpo, React Native WebStatic export, S3 + CloudFrontZustand stores, 8 languagesMarketing site · onreplay.aiAstro, Tailwind, 8 languagesAbout 3,200 static pagesS3 + CloudFront, push to deployBackoffice (admin)React, Vite, TanStack QueryRecharts dashboardsAWS SDK and /admin API routesAPI Gateway + Cognito101 routes, Cognito authorizer, throttledPasswordless magic link, Google, Apple sign-in140 Lambda functions · Node 20 on GravitonAuth, albums, credits, Stripe webhooks, free tools, email, scheduled monitorsesbuild bundles; SAM build and deploy from GitHub Actions on push to mainDynamoDB · 17 tablesAlbums, photos, users, sessionsEmail logs, pipeline logsKling in-flight slot semaphoreS3 · 3 bucketsPhotos, 90-day lifecycleClips and films, 60 daysSoundtracks; CloudFront previewStep FunctionsProduction state machine3 phases, Map concurrency 5 / 12Task token to Batch, 60-min pollExternal AI providers, called from Lambda tasksImages: Gemini 3 Pro Image, Grok Imagine, GPT Image 1.5Video: Kling v2.5 / v2.6 / v3, Grok, Veo 3.1, Sora 2, HeyGenPrompts and safety: GPT-4o mini; colorize: Replicate DDColorAWS Batch · ffmpegSpot Graviton pool, 2 to 24 vCPUOn-demand fallback queueCrossfade, soundtrack, watermark
Architecture · 3 frontends, 1 API, 140 Lambdas, 3 stores, Batch

Four repositories on one AWS account, with no servers to manage. Every request is a Lambda, state lives in DynamoDB and S3, and the one long-running job, rendering a film, is a Step Functions workflow that hands video assembly to low-cost Spot compute.

The AI rendering pipeline

From photos to film: three phases, one state machine, no human in the loopUpload and checkoutPhotos go to S3 by presigned URL; incomplete uploads are prunedCredits debited once; album marked processing in DynamoDBPhase 1 · Transform (Map, 5 photos in parallel)Restyle each photo: Gemini, softened prompt, Grok, OpenAI, or skipGPT-4o mini writes the animation prompt; prepared photo savedPhase 2 · Submit (Map, 12 scenes in parallel)Each scene job (photo × scene) goes to Kling or the chosen engineA DynamoDB semaphore defers jobs when in-flight slots are fullPhase 3 · Poll loopWait 45 s, poll all jobs, decide: done, keep waiting, or give upWindow of 80 iterations (about 60 min), stall guard, hard cap 3 hnot doneCollect resultsReady clips recorded per scene; missing or failed clips flaggedSmart re-run reuses ready clips; up to 2 automatic re-runsFailure pathNo refunds, automatic re-runSlow-render email at 12 minFailed email after 2 re-runsAssemble on AWS Batch (ffmpeg, Spot)Lambda hands a task token to Batch; job sized by clip countCrossfade clips, loop soundtrack, logo and QR watermark, outroDeliverBatch completion event resumes the state machine via task tokenReady email in the user's language, de-duplicated by clip signature
Render pipeline · 7 stages, 1 poll loop, 1 failure path

All photo transformations finish before any video job starts, so cheap failures surface before expensive ones. Each clip is keyed by photo and scene, so a re-run only pays for what failed. Limits such as the 60-minute wait window are code constants checked by tests, so they cannot silently drift.

How AI is used

Every film uses at least three generative models, and none is trusted to be available: each step has a fallback and a cost ceiling.

StepModelsFallback
Restyle each photo into the worldGeminiGrok, then OpenAI, with a softened prompt in between
Write the motion prompt for each clipGPT-4oA hand-written default
Animate each image into a clipKling, with Veo, Sora and HeyGen for A/B testsGrok
Stitch, score and watermark the filmffmpeg, no modelOn-demand compute if Spot is unavailable

What running this in production taught me:

One pipeline, 30 products

Each themed world is configuration and prompts, not new code, so a new world ships without touching the orchestration. Ten worlds also let users pick from a catalogue of 105 scenes.

The AI models were never the weak point; configuration was. Automated checks now fail the build whenever a world is incomplete, so every world reaches customers fully wired, down to the scenes each user picks.

Making it reliable

Most of the work after launch went into making third-party AI behave like dependable infrastructure. Each fix below came from a real production incident.

ProblemFix
Large albums lost scenes when the video provider hit its concurrency limitA shared slot counter that queues jobs instead of dropping them
Slow renders were reported as failuresA longer wait window and up to two automatic re-runs that reuse finished clips, never charging twice
The provider ran out of prepaid credit and the error looked like a rate limitExplicit error classification plus a balance monitor that alerts before credit runs out
A fallback path doubled the cost per photoThe fallback was removed by design, and cost is now tracked per film
Cloud Spot capacity dried up and stalled video assemblyAutomatic overflow to on-demand compute, plus a stuck-queue monitor

The pattern: never just retry harder. Make the failure visible, classify it, cap what it can cost, and add a test so it cannot return.

Monetization and growth

Revenue. Users buy credit packs or a subscription through Stripe, in three currencies, with self-serve cancellation. New accounts get one free film. Prices are defined once and checked automatically across all three codebases.

Acquisition. The marketing site generates about 3,200 SEO pages in eight languages from the same 30 worlds, plus a keyword-driven blog. Eight free single-photo tools act as a funnel into the paid app, and every step is tracked in PostHog.

Outcomes

In ten months, working alone, I shipped and now operate a paid consumer AI product that has delivered 3,121 films to 2,065 creators.

My lessons for teams building on generative AI:

  1. Treat every model call as a flaky, metered external dependency, and never let a retry or fallback spend money you did not budget for.
  2. Keep prompts and product configuration in data, and test that the configuration is complete.
  3. Build the admin and debugging views early. They paid for themselves the first time a customer wrote in.

Contact

Hiring a hands-on product or engineering lead in Toulouse? Let's talk.

pierre.sauvignon at gmail dot com

Message on XLinkedInGitHub