The 100 hour gap between a vibecoded prototype and a working product
#Regulation

The 100 hour gap between a vibecoded prototype and a working product

AI & ML Reporter
13 min read

A developer's journey reveals why 'vibecoded in 30 minutes' claims are misleading - the real work happens in the last 10% of polish and production readiness.

Last month, I spent about 100 hours on vibecoding. Now I'm pretty sure that people who say they "vibecoded an app in 30 minutes" are either building simple copies of existing projects, produce some buggy crap, or just farm engagement. And it’s not because I am AI skeptic. Actually, quite the contrary.

Where do I come from? At my previous startup we started using AI to code in late 2023, before it was even called 'vibe coding'. It was controversial because LLMs weren't that good and we were an Open Source project, so it made people reluctant to contribute to our spaghetti codebase. But Tim was early to recognize AI’s potential and while he used gpt4-preview via gpt-cli, I literally pasted my code to ChatGPT app. We used it for simple stuff (like putting new content into the app's layout) and as the AI got better, we started shipping more complex features that way. Later we moved on to Cursor and Claude Code and that early AI embrace gave us an edge.

This made me believe that AI can be a coding superpower. But - as of March 2026 - there are limits to that.

Choosing the idea

And I wanted to test these limits. Aside from vibecoding at Kiwi, I had some experience with "real" coding. Did a 100 day Python course, built JS weather apps, deployed some Cryptozombies smart contracts. and so on. And of course vibecoded plenty of local apps with Claude.

post image

Now was the time to solo the full process of shipping an app to the public, which was supposed to make me a better PM. Since my main goal was to learn, I decided to do it "the right way". This means I didn’t want to rely on Replit or Lovable where the infra part is obfuscated. I wanted to deal with that complexity myself.

To make the process more pleasant I decided to build an SLC of something fun. As Jason Cohen says SLCs are what MVPs were supposed to be

From a few ideas I had on the table, I picked Cryptosaurus. The app would be simple - you pick a dino, the app takes your pfp and creates a dino styled as your pfp. Simple, Lovable, Complete.

post image

I had the high-level vision in my head and I knew how to build things "by the book". But I thought: "Okay, let's embrace the hype and 'just build' like some Twitter influencers say". And this "just building" took way longer than I expected.

Working prototype

I started by describing my idea to ChatGPT (5.2 Thinking Extended). We discussed it for a while, narrowed down the scope and I was ready to start. I sent the scope to Opus 4.5, turned on the Plan Mode, and waited for the outcome.

In the meantime I got my API keys from Gemini, added them to the .env and… bam! In the first hour I had my working prototype. Wow, I'm going to publish it soon, right?

Non-crappy prototype

Not right. I didn’t like the boilerplate design. So I played around with Coolors to find the palette I liked. Picked something, tested it on the UI, changed some colors. Wash, rinse, repeat. After a few rounds I got the colors right.

Then I noticed that Claude overly complicated UI and UX. So I started simplifying it. If I used Figma I would’ve made 10 different variants in 10 minutes and keep a pixel-perfect control over the outcome. But I wanted to "just build", right? So I asked LLM to build a new UI. Didn't like it, so asked Claude to rebuild it. Some important details were not there, so had to reprompt. Then I figured out I could simplify the UI way further so asked to rebuild it completely. Then I had some weird container that broke the front-end. Then something didn’t render well on mobile. Then it added some weird outlines I didn’t want. And so on and so forth.

Every iteration took a few minutes: my prompt, LLM building it, checking if I like it, reprompting. The clock was ticking. If I "just used Figma", I’d have prepared my UI 10X faster. But whatever, let’s "just build".

And it was the tip of the iceberg. Since the main Cryptosaurus "product" were dino pictures, I had to make sure they look good. These pictures looked good with my pfp but would they look good with others? I picked a few edge case pfps to check if the outputs are going to work. And they didn't. Some changed the frame, some rendered a random prompt text in the background, some changed the picture completely.

post image

Started discussing it with Gemini, Codex (it just launched) and Claude (4.6 just got out). Change prompt, upload an image, wait until the new image gets generated. Now the background is out. Now it misses the headgear. Now it shows some weird text and the beard doesn’t look natural. I went through this process at least 200 times. The clock was still ticking - I was way over "building an app in 30 minutes".

To cover all edge cases, my prompt.ts file had 274 lines. And the script that sent the prompt to Gemini also had some features that fixed edge cases and prevented bad outputs. And I still didn’t get out of localhost.

Setting up infra

Once I figured out the prompt, now was the time to put it out there. Bought a cryptosaurus.app domain on Cloudflare, set it up on Vercel, and now was the time to put my back-end on a server.

After a longer chat with an LLM I decided to use AWS since it was pretty cheap and I always wanted to learn it. Once I opened the panel and saw the vast ocean of AWS services, I knew it’s an overkill. But instead of using simpler infra, I decided to follow through and set up my S3 and Lambda.

After a few tries it seemed to be working. But no, some things broke down. Didn’t make my bucket public. And now some .envs weren’t shared with Vercel or AWS. Okay, found what was wrong, let’s go!

Soon I discovered AWS CLI and got excited that my LLM could set up things for me. But after I asked it for help, my app stopped working again. After an investigation I found out my Claude started automatically creating new S3 buckets instead of using the one that I set up myself. Okay, fixed that, but another "unknown unknown" hit me in the head.

After a lot of back-and-forth my infra was fine. Now I had to make it work as a Farcaster Mini App because FC users liked collecting pfps and I already had distribution on that network.

But... I couldn't fully test my app in Developer Mode because the notifications didn’t work there. Okay, have to add manifest and include noindex so the app isn’t public. Okay but then I need another account to test it because people might see I do something on my main account. Okay, let’s set it up.

Now although the mobile UI seems to work in the browser, something breaks in the mini-app UI. Another front-end fixing, this time I was smarter and just inspected code in my browser and sent container screenshots to my LLM.

Okay now let’s mint a dino NFT. Ah, but testnet doesn’t work on these wallets. Redeploy contract to Base Mainnet. Now need to change .envs everywhere. Eh… Okay. Did it. Everything works.

Then I thought… Okay if I’m trying to learn how to do it the "production-grade way". I should also protect my smart contract from being called via CLI. So now I needed to ensure that only my app can create dinos. To achieve that I had to change the smart contract and set up onlyMinter with a separate Ethereum address that would mint NFTs on behalf of the users. Also didn’t want it to be the same as Owner in case the private key leaks, so I had to set up Safe that’s a contract owner and can change onlyMinter in case something happens.

Although the app was simple from the user POV, there's been a lot going on under the hood. Then I was like… Okay but what if 100 people want to use app at once. Will it manage to serve them? My LLMs told me it would not. So I spent 2 days figuring out different edge cases, rate limits, and things that would prepare the app for potential users’ spike. I also moved to Paid versions for some of my apps.

I went through a long checklist and now was the time to launch.

Launch

Two weeks before sharing an app I did a pre-launch so had about 500 people who ‘installed’ the app on Farcaster. I shared the launch post, sent the notifications and people started opening the app...

One cool thing about launching it on Farcaster was that in one post you can embed the image and the in-feed link to the app. So when the user got their dino, I prompted them to share it in the feed to build virality.

post image

...and the app broke down. Together with my carefully manufactured virality.

Although I used Codex 5.3 Extra High and Opus 4.6 to prepare the app and the API for usase spikes, both LLMs forgot about nonces. So when two people wanted to get a dino at the same time, their payment went through but their request didn't reach the API to generate the image and mint an NFT.

I told everyone affected they’d get their money back and started fixing the bug. Late in the night most problems were fixed and I wrote a script that found everyone whose payment got stuck. I sent them money back (+ extra $1 as a ‘thank you for your patience’ note), and let them know via DMs. People were pleasantly surprised with my swift response and most of them decided to get their dinos anyway.

Eventually, despite all challenges, many people minted and shared their dinos in the feed:

Featured image

And we could say that the v1 of the app was finished. Took way longer than 30 minutes, right?

Zooming out

Now let’s zoom out for a second. As I said in the beginning, I created a prototype in an hour. But since I didn’t want to put out a vercel215810.buggyslop.com type of app and didn’t want to take a Replit/Lovable shortcut, setting it up for production took way longer. In this case, about 100X longer.

If I was a masochistic person with 0 coding experience who wanted to follow my "let's just build, but also let's do it the right way" approach, I imagine it’d take them even more.

On of the most time consuming elements was the UX, UI and the end-product (dino outputs). The reason I decided to invest time in these was because we have enough unpolished software out there. We had that even before AI, when people just cloned open source repos and changed a few parameters to build their own apps.

At the end of the day, you can build a weather app like that:

Or you can build Windy:

My app was of course nowhere near the Windy league, but you get the idea. Good thing is that I achieved my main goal - built the app without working tightly with a staff-level engineer (like I did in Kiwi) and learned a lot on the way.

And although the goal was to learn, the app’s performance was decent, too. 1,000+ people downloaded the app, 180+ paid $2 for a dino and the app got to TOP3 in Farcaster Mini App store in its first week.

post image

It is ofc a simple app that didn't make a dent in the universe. But that was part of the "just build an SLC" plan. Later on I want to deliver Stage II, where you can use your dino to play a game and compare scores with your Farcaster friends.

The limits

Over time I learned how to get better at using these tools. I carefully scoped work for my LLMs so I could have 3-4 agents simultaneously working on the same codebase without getting in each other's way. I noticed that Codex overcomplicates things compared to Claude, so I asked it in my agents.md to always looks for simple, elegant solutions with a few LOC. I spent more time on architecture, asking LLMs to create flowcharts and iterating on them before my agent spent 30 minutes shipping the plan.

And later on I ditched this "just build" philosophy a bit and used Figma to polish the design instead of waiting for an LLM, which made the whole process less frustrating. I noted down these and many smaller lessons in my Obsidian so I would remember them and sometimes just pasted these lessons into my prompts.

Although vibecoding in my case didn’t live up to the "build an app in 30 minutes" hype, it was a 10-100X speed improvement. And if I used Replit or Lovable, the acceleration would be even more dramatic. It was a different experience, though. When I used to code by hand, I got into a pleasant creative flow. Now I am just a manager who gives tasks to digital employees and gets frustrated when they don't deliver what I wanted.

But... it's still worth it because now I can focus on building things instead of fixing syntax. And engineering experience still matters. Especially when you want to get the details right.

There was a moment when Brave started showing weird colors, overriding my light theme. I wanted to disable it in the app and tried 3 different LLMs to crack it. After an hour, nothing changed. Asked my friend who’s a senior design engineer for help and he fixed it with one line of code.

There were many similar problems, which - if I had an experienced engineer by my side - I could've solved 10X faster. So highly recommend asking your senior dev friends for help as LLMs still have their limits.

Summary

This whole experience reminded me of the timeless Tom Cargill's quote: "The first 90 percent of the code accounts for the first 90 percent of the development time. The remaining 10 percent of the code accounts for the other 90 percent of the development time."

With AI, it’s easier to get the first 90 percent out there. This means we can spend more time on the remaining 10 percent, which means more time for craftsmanship and figuring out how to make your users happy. The "remaining 10 percent" is a difference between slop and something people enjoy. One of the reasons why it's good to make your app Lovable.

Because vibecoding takes the boring part out of coding and creates more space for craftsmanship, I think we will end up with more cool digital experiences. And the ability to create these cool experience is what brought many of us to tech. So all in all, before agents become better PMs than humans, product building should be fun.

PS: And if you want to check out Cryptosaurus, you can click this link and it should launch the mini app in your Farcaster account. If you mint a dino, you're going to be able to use it the app's Stage 2 which should be out soon(ish).

PS2: Huge thanks to Pugson, Kris Kaczor and Sayangel for sharing protips along the way.


Originally published on kanfa

Comments

Loading comments...