AdReel went live last night.
A creator-style ad video generator. You paste a product URL, pick a style, and ninety seconds later you have a short-form video that looks like a person filmed it. Auth, queue, storage, generation, billing rails - all of it. Ten days from blank repo to public URL.
I am writing this the morning after, partly because it is fresh, partly because the gap between “what people think MVP means” and “what the work actually looks like” keeps biting founders I talk to. Most of them are not blocked by code. They are blocked by a refusal to cut.
So here is the cut list.
What stayed
The single path. Paste URL → pick style → get video. That is the wedge. Everything else is a layer on top.
- Auth - Better-Auth, email link only. No OAuth, no password reset flow, no team workspaces. You can sign in. That is enough.
- Storage - MinIO, self-hosted, single bucket. No CDN, no signed URLs with expiry, no multi-region. The generated videos are small and there will be tens of users, not tens of thousands.
- Queue - BullMQ on the same VPS as the app. No separate worker fleet, no Kubernetes, no autoscaling. One process pulls jobs and runs them.
- Generation - Kie.ai. I do not own the model, do not host the model, do not fine-tune the model. Pay per call, ship.
- Billing - placeholder. Stripe link in nav goes to a coming-soon page. Users on the beta list get credits manually.
What got cut
This is the part founders find painful.
- No dashboard. You see your last video on the homepage after generation. If you want history, refresh. v2 problem.
- No team accounts. One user, one email, one set of videos. Agencies asking about multi-seat get a “later, here is the workaround” reply.
- No editing. The video that comes back is the video. No trimming, no captions overlay, no thumbnail picker. Cinema-grade is irrelevant when the question is “does anyone want this at all.”
- No API. People keep asking. The answer is no until I have evidence the consumer flow works.
- No analytics inside the product. PostHog is wired up for me. The user sees nothing.
Every one of these is a real feature that real users will eventually want. None of them belong in week one. The job of week one is to prove that someone, anyone, will paste a URL and watch the result.
The mistake I almost made
The first version I scoped had Clerk for auth, Cloudinary for media, and a hand-rolled Gemini integration with a fallback path. Two days in, I tore it out.
Clerk is great. Cloudinary is great. Gemini is great. None of them are bad. They were just three vendors charging three bills, three dashboards to log into, three sets of API limits to chase, and three reasons the whole thing would not run on the VPS I already had. The OSS swap - Better-Auth, MinIO, Kie.ai - cost me a Saturday. It bought me total ownership and a recurring bill of zero.
This is the trade founders get wrong all the time. The “fast” SaaS stack is fast on day one and slow forever after. The OSS-and-VPS stack is slow on day one and fast forever after. If you are shipping an MVP you intend to evolve, the second curve is the one you want.
What two weeks actually feels like
The first weekend I had nothing on screen. By Wednesday the auth and queue were running but you could not generate anything. Thursday and Friday were generation. The weekend was deployment and the broken pipe between MinIO and the worker. Monday I added the landing page. Tuesday the beta list went out. Wednesday I went live.
The middle four days are the part nobody shows you. There is no demo, no Loom, no progress to post. The work looks like it is going nowhere because integration is plumbing and plumbing does not photograph well. This is where most builders break, decide their idea is wrong, and start over. The idea is fine. They just hit the plumbing.
Cut more. Plumb less. Ship.
If you have something you want in users’ hands by the end of next week, book a call. One half-hour. We figure out what the wedge is, what we cut, and what week one ships.