Rails
- not allowedReadsReads nothing but the shot list it is given.
- not allowedWritesWrites nothing outside itself. The PDF is yours.
- aloneMoneySells prepaid credits and spends them, one frame at a time.
- alonePublicOpen to anyone with a shot list.
- aloneUnattendedGenerates, meters and settles with nobody watching.
- a person, on exceptionsDecidesA person writes the list. Nobody checks the frames.
Problem
Pre-production needs frames fast, and most of them get thrown away. Paying an illustrator for the bin makes no sense, and prompting a model shot by shot is slow.
A public tool that spends real money on every request also needs a ledger that cannot be argued with.
System
Decisions
- Prepaid credits through Stripe, 100 credits for A$10, instead of a subscription.
- Every generation takes an atomic hold on credits at one chokepoint and settles after. The ledger caught one IP address consuming 98% of spend; the chokepoint ended it.
- Per-IP quotas, a global spend cap, BotID and App Check in front of every call to a model.
- Models on Replicate: Flux Schnell, Pro and Kontext, Imagen 4 Fast, Nano Banana 2. Gemini vision was removed. Firebase hosting retired for Vercel in September 2026.
Stack
Next.js, Clerk, Postgres (Neon), Stripe, Replicate, Flux, Imagen 4, BotID