原型设计到可用产品之间相隔100小时。
The 100 hour gap between a vibecoded prototype and a working product

原始链接: https://kanfa.macbudkowski.com/vibecoding-cryptosaurus

## Vibecoding 现实检验:100小时应用构建 在听到关于使用“振动编码”(AI辅助开发)可以在几分钟内构建应用程序的说法后,作者花费100小时构建并发布了一个简单的应用程序Cryptosaurus,以测试其极限。作者之前曾在一家初创公司使用过AI编码工具,他们相信这项技术的潜力,但怀疑炒作被夸大了。 该项目——创建个性化的恐龙头像——最初使用AI原型快速启动。然而,实现一个完善的、可用于生产的应用程序证明要复杂得多。虽然AI加速了初始开发,但完善UI/UX、处理图像生成中的边缘情况,以及使用AWS部署后端都耗费了大量时间。 作者了解到,在没有仔细规划和关注细节的情况下“仅仅构建”会导致比预期更长的过程——大约是炒作的30分钟构建的100倍。最终,Cryptosaurus发布后获得了适度的成功(1000多用户,180多付费用户),但强调了持续对工程专业知识的需求,尤其是在关键细节和错误修复方面。 这次经历证实,AI可以提供10-100倍的速度提升,但并不能消除对工艺的需求。它将开发者的角色从编码者转变为管理者,并强调开发过程的最后10%——润色和用户体验——仍然至关重要。

一个 Hacker News 的讨论围绕着“氛围编码”的概念——快速原型设计和构建软件,有时只需一个小时。虽然令人兴奋,但评论员们争论它的局限性。 一些人认为,真正有用的应用程序,比如一个像样的笔记应用程序,仍然需要大量的开发时间(可能需要 6 个月以上的全职工作)才能超越基本的演示。借助人工智能的帮助,最初的 80% 的功能可以快速实现,但最后的 20%——完善、可用性和健壮性——仍然具有挑战性且耗时。 另一些人认为,氛围编码非常适合个人工具,在这些工具中,美学约束最小。一个关键的收获是,虽然快速原型设计功能强大,但构建*好*产品仍然需要大量的努力,而不仅仅是“氛围”创造。对开发和部署工具的改进,例如更智能地处理现有基础设施,可以进一步简化流程。
相关文章

原文

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.

post image

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.

post image
Didn't want to be this guy anymore.

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.

post image
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
Main idea behind the app.

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.

post image
Some examples of outputs that didn't work as expected

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

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

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.

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

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

post image