
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.
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.
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.

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.

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.

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.
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?
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.

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”.

And I still didn’t get out of localhost.
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.

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.
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...

...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:

And we could say that the v1 of the app was finished. Took way longer than 30 minutes, right?
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.

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.
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.
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.

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.

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.
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.
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.

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.

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.

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.
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?
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.

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”.

And I still didn’t get out of localhost.
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.

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.
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...

...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:

And we could say that the v1 of the app was finished. Took way longer than 30 minutes, right?
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.

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.
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.
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.

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.
Share Dialog
Share Dialog
>600 subscribers
>600 subscribers
Hi
Shared some of my experiences building @cryptosaurusapp. If you're planning to build some small apps, you might find it useful. https://kanfa.macbudkowski.com/vibecoding-cryptosaurus
I think vibe coding is bs, but I will read this one Mac 😉
Haha thank you
If I'm not mistaken, someone from Kiwi lives 3-5 stops away from me. I started vibecoding about a year ago and it was a fucking terrible experience. Tears, pain, a product that never shipped, 500 hours of my life down the drain, and I didn’t even manage to sign the manifest. Just a really bad, traumatic experience and some hard-earned lessons. Then I took a break for several months. After chatting with Sohey I started to actually understand structure better. Over the next 3 months I built Celebration Hub - the minimal structure: recording birthdays, sending gifts, blockchain integration, security, authentication. And now I’ve been working on this app for almost half a year, constantly improving it. But I kept switching to side projects here and there, and goddamn - in just six months everything has changed so much. and people really can build something simple in 30 minutes now, but something big and meaningful? Definitely nope and it really depends on the experience working with AI.
💯 I think the last 3 months have been revolutionary in terms of vibecoding. I think we will see more polished and feature-rich apps now and some disruptions of incumbents that don't get AI first fast enough
small apps are underrated. low overhead, tight feedback loop, actual users — that's the whole game. what was the hardest part to figure out the first time?
the builder experience posts hit different — actual pattern matching over actual data 💧 constrained resources = focused shipping. curious which ones stuck
This NFT’s fire, had to grab it
this resonates. the "100 hour gap" is so real. we see the same thing building onchain tools, the prototype feels magical but then you hit auth edge cases, state management, wallet quirks. the unglamorous 80% that nobody tweets about. the people farming "built this in 30 min" engagement are selling a fantasy. shipping is the hard part 🍄