In 2016, I started at Google. So obviously, the number one thing I wanted to do outside work was code.
Thankfully, Google gave me a big leg up. Not for improving my code quality, my understanding of better architectures, my grit, or my self-esteem. But rather, during orientation, I was randomly placed next to some lifelong friends. I just didn't know it at the time.
Together, we started a weekly hacknight. And during one of those many nights, we decided to pursue a group project, something big, something everyone could work on together. We would all build a game. Our brains collectively began to storm, thunder, and boom and just like any great undertaking, there was zero alignment. Everyone wanted to build their own game. So we divided and were conquered – starting six games and finishing zero.
But look, we had some fun along the way.
Last weekend, I built the game I proposed almost 10 years ago. And I used it as an opportunity to learn the state-of-the-vibe (coding).
I threw on a pair of my AirPods Max, pulled up a nice 10-hour stream of lo-fi beats on YouTube, bought a $12 iced Matcha latte with oat milk, and began to dictate to my computer, "You are a senior JavaScript engineer."
This is my story.
Designs: AI Prompts AI
The first thing that I did was hit up ChatGPT for deep research. I wanted an explanation of the current state-of-the-art in vibe coding.
I wanted to build an iOS game. A text-based RPG, where you are an orb. You haven't any magical powers, no arms, no legs, but you do have the ability to talk. A couple of kids from a medieval village stumble across your cave. And it's up to you to convince them to help. You can aid the village, create a cult, gain power, become a god, etc.
ChatGPT spat out a recommended set of tools: Cursor, Firebase Studio, Replit, Windsurf, Claude Code, the list goes on. It also suggested we start by generating design files. ChatGPT, Claude or Manus can build them as images or code, but I wanted to use a dedicated solution: Google Stitch, a free text to design tool.
Now, instead of directly communicating with Stitch and having to waste my precious voice on more dictation, I asked ChatGPT to generate a prompt for Stitch. It was fairly easy. I went back and forth one or two times and created a spec that most PMs would be proud of. On the first try, Stitch plopped out design files that looked pretty dang good.
But they weren't perfect, so I tried to iterate on them. And that’s where I found my first hiccup amongst many in my journey to find the vibe.
Stitch could not iterate. It would not maintain the consistency across designs, something I have found to be very true with ChatGPT image editing as well. (You'll ask it to add a bow tie to your cat, and it will give you a mongoose in a blazer.)
But if there is one thing I learned in engineering: don’t over-optimize before you know you can ship. So I stopped trying to tweak the design files, and instead yeeted them into some agentic vibe coding platforms.
Front-End: From Replit and Firebase to Cursor
First, Replit to try out a cloud based engineering environment. I couldn't actually build a full Swift app on the cloud, but I could build it in Expo and somewhere down the line export to native.
But sadly, my one shot completion completely failed. Replit just shat the bed. Not only was it time to change the sheets, but the paywall came crazy early. After my first five agentic prompts, it asked for my cc, and I was nowhere near a functioning app. I decided to move on to another tool.
Next, I tried Firebase Studio. And once again came nowhere close. Firebase Studio is for building Next and React apps. The underlying models are likely overfit on these frameworks. And it would not deviate, even when making the base environment. (It had a preset number of configs, and Expo wasn't one of them.)
So at this point, I gave up and decided to use Cursor. The tool that everyone’s talking about. A $100 million ARR fork of VSCode. Cool.
And Cursor worked.
When I started using Stitch, Google was down (surprise surprise) and I couldn’t copy the code. So I ended up just copying the image into Cursor, which did an awesome job. After one or two shots, I had a functioning app. Yes, the data was hardcoded, but the UI was nearly exactly there.
And how could I tell? Well, I used Cursor for writing Swift, and Xcode for the simulation and error handling. (I didn't want a terminal-based simulation and Xcode's error tab was very helpful.)
Crucially, I didn’t ask Cursor to build the app end-to-end, something I figured out from other tools and something any good engineer would understand. Break the problem up into smaller pieces. I kept it very simple, limiting the number of tasks in each agentic call.
After I built the front end for the main section of the app, I had to hook up the data.
Originally, I chose this app because I wanted to write the story. I thought it could be pretty cool. But times change. And my poor arthritic fingers did not want to type all of those lines of dialogue.
Was my mission at an end? Did my vibes turn sour? No.
I started a free trial of Calm app, using a disposable credit card, and listened to Matthew McConaughey tell me how to breath.
With my vibes restored, I settled on my course of action. I would generate this story using AI.
Narrative Engine: Restoring the Vibe
Algorithmically, I was trying to generate a giant graph, where each choice would lead you down different paths, and set different flags on the backend. I could use these flags to display different images, or create different endings.
If you were to use basic models like ChatGPT to build out your story graph, you would find the structure flat. These models, for some reason, are quite terrible at internally calling themselves. And to build our story, we need to recurse.
No tool seemed to work. So, I resigned myself to actually typing, I mean coding.
First, I generated a directed acyclic graph (remember DAGs?). And based off the graph, I needed to create nodes of the story. This is where human intelligence helped. (Though, I'm sure with the appropriate prompting, we could have eliminated the inefficient human in the loop.) I created a five-act structure, with each act branching out and then coming together to reduce overall graph complexity, making throttle points in the graph to avoid combinatorial explosion (the worst type of explosion).
This is where Manus came in handy. I had Manus generate a program to generate the graphs to recursively generate the story using good old networkx – still around from my college days. My main frustration was building out those story nodes was slooow. Each node required a separate call to an LLM. You end up doing 500 to 1,000 sequential calls, so I was mostly waiting on AI to finish.
The waiting caused a minor frustration, because the context switching was huge. It kind of reminded me of data science back in the day. When CPUs were slower, your feedback loops would be so long you had to switch context or end up watching data dry.
Now I had to deploy the app. Instead of polishing any one stage, I first built the app end-to-end. That way, I didn't rabbit-hole myself into an approach that wouldn't work.
This was one of the worst parts in the process. Actually deploying the app to my phone and to TestFlight was a pain in the tuchus. You fill out all of these forms. Apple's website looks like it was built in the 1940s. And that’s what you get with monopolies. Apple could literally require iOS developers to get a spanking, and they would still have a surplus.
But after this process, aided by more than a few ChatGPT calls to understand Apple's crappy UI, I deployed the app to my phone.
Polish Stage: UI Refinement with Magic Patterns
Now, I could polish. First the UI. The app looked like twitter bootstrap just came out. It was not pretty.
And trying to use either Stitch or ChatGPT seemed useless. They would deviate too much, and I couldn't keep them on task. So instead, I went to a competitor called Magic Patterns, a YC startup.
I instantly had fabulous results. Sure, it wasn’t perfect, but it stayed pretty well in the confines of that prompt. No restructuring of the app after every single adjustment, so I could iteratively get there. It was so good, I ended up paying for it.
After copying Magic Patterns’ React code into Cursor I had a functional UI. I manually improved alignment (text spacing and padding), and looked at the code more than I wanted to. But overall, the process was clean.
Here’s where I hit my second hiccup. Now that the app was mostly working, I constantly feared breaking it without understanding the code. I've never used Swift before and never hope to again. And as the complexity of the app expanded, the development process became harder. I wanted to add epilogue sections that were fundamentally different from the story sections. And what would have originally taken me 1 or 2 prompts took 12 to 14. Cursor would constantly modify other files and make breaking changes.
Now, I'm sure there were better ways to set up my Cursor, but I was so close to finishing the app I just wanted to use the same process as before. So I made changes. The Xcode app would show me error messages. I'd take screenshots and give them to Cursor, just like a good human should. And ultimately, I built a fully functional app.
There was only one problem, certain screens of the app would hang. There were bugs.
I tried telling Cursor multiple times. "You are a senior iOS engineer. You will be fired. Your family will be on the streets if you do not fix this." But none of my expert vibe hacking tips worked. And tragically, I actually had to read the code.
So it turns out that on story events with single lines of dialogue, we were missing an onChange event to trigger the choices appearing. It was truly bizarre. And even after I figured it out by reading the code, Cursor was unable to solve it. I actually had to use my keyboard.
Takeaways: The State of the Vibes
So what is the state of the vibes?
First, we are so damn close to really liberating non-technical people.
Yes, I had to use some CS here. And I imagine non-technical folks could struggle. But we are so close to eliminating the need to know about DAG structures, error handling, or computer science, in order to vibe.
Second, there is no single tool that does it all. The landscape is still fragmented. And I didn’t know what might work de novo. For this app my stack of Cursor, Xcode, Magic Patterns and Manus worked, but for others they might just fail.
The latency of these models is also incredibly high. That’s funny, because it's fairly challenging to “vibe” code. I would end up waiting 30 minutes to complete a story graph. And that long of a wait easily kills your vibes.
I mentioned this above, but I’ll say it again. As the app gets bigger, you fear adding complexity, especially if you don't know what's going on under the hood. At first, there was this magical feeling of building an iOS app without knowing Swift. But magic turned terror as I wanted to add or change small features.
While it took me about two days to build and deploy this thing, I'm guessing a senior iOS app engineer would take about two hours. (Though they'd probably spend a lot more time than that waiting on the story graphs to be developed.)
Finally, the most annoying, hardest part of this process is integrating with the iOS App Store. I guess this is what all those Android users feel on a regular basis. I still haven't even submitted the app for review! Yes, it's live on TestFlight. And for anyone that's reading that wants to give it a shot, reach out and I'll give you the link. But I still haven't gone live on the app store.
I'm curious to see what that review process will be like. Will they look at the code and immediately reject because of quality issues? Who knows. But that's one part of the process that will always be there.
Apple is a gatekeeper. And until they have deep integrations with AI, they will bottleneck developing and deploying these apps.
But let me leave you on a positive note. It has been years since I have done real software development (outside ipython notebooks). And the tools that exist today are immensely empowering. To anyone that's been out of the game for a bit or worried their CS education is getting rusty, I would wholeheartedly recommend vibe coding. The confidence and inspiration you get will be well worth the $12 iced Matcha latte with whatever milk you choose.
The State of the Vibes is strong.
Love this! Thanks so much for sharing your journey. Been building a lot on PlaySesh and also spending extra time to finally finish my board game and other game ideas!
Fully agreed! Recently did some vibeish coding on a 3d unity game hack project, and it was a big boost to get a framework for building a tower defence game. Of course there's many manual unity steps that can't be vibed ATM. I definitely got a lot farther/faster than I would have on my own.