We’re in a world where you can dream up an app and have AI create it for you, just by having a conversation with a chatbot. That’s vibe coding.
Just about anyone can do it, and there’s no real learning curve. The final app you create is only as good as the prompts you give it, so while all of your projects might not turn out perfect, it’s easy enough for anyone to pick up.
I’ve played around with vibe coding quite a bit, creating random projects here and there. I’ve mostly tried vibe coding out for proof of concept or chatbot testing, but I’ve rarely used it to make something crucial or functional enough to use daily.
This particular project came to be by accident. I’d been in the market for an e-reader, looking to disconnect from my overly connected iPad. Regardless of the motivation (but mostly in defiance of Amazon), it prompted me to try to vibe code a fix — but with a twist.
I wanted to see if I could vibe code a functional e-reading application with all the features I wanted. Even knowing that if I was able to get this thing up and running and knowing I likely wouldn’t use this daily, I still wanted to add some flair.
The question became what AI chatbot to use. I tested three — Gemini, Claude and ChatGPT — to create what I wanted and then checked to see which produced better results.
As it turns out, the model didn’t matter as much as the prompt.
The prompt
Comparing chatbots is hard, especially when trying to mimic the same conversation or vibe in a coding project. Believe me, I’ve tried. I wanted to make sure all the tools I tested used the same prompt, but first, I wanted to refine it to get the best results, so I came up with a strategy to help me do that.
First, I built the entire project from the ground up with Gemini. Once I liked where the project was (a successful, functional proof of concept), I asked it to create a prompt so I could add it to any other chatbot. Gemini generated the prompt, I saved it as a file, and I uploaded it to Claude. I went through this process again, allowing Claude to catch and fix things I hadn’t thought about when building the project and Gemini. Once that process was complete, I asked it to create another prompt so I could add it to ChatGPT.
The idea was to have all three chatbots contribute to the actual creation of the project and, in turn, to the final prompt. Once the prompt was created, I uploaded it to all three chatbots in a separate chat to see how consistently they performed.
The project: The Tome Reader
I wanted to create an immersive e-reader web application that would read your books aloud (with real-time text highlighting), whether you pasted text or uploaded a PDF or EPUB file.
This project was born out of my frustration with Amazon’s Kindle devices. Anyone who likes to read and listen to their books can do so with real-time highlighting in the app for iOS or Android, but after all this time — nearly 20 years — you can’t do this on a Kindle.
In fact, it wasn’t long ago that users gained the ability to achieve real-time text highlighting with the assistive reader playing, which is so close to the app’s functionality. As of right now, you can only read or listen to an audiobook on Kindle, not both, which is laughable, and so was the idea of Amazon owning all my books. I got to thinking that I could just vibe code a solution.
I call it the Tome Reader.
In addition to reading the text aloud, the web app would create background music depending on the content of the text in a subset of categories (neutral, gothic horror, sci-fi, nature, fantasy, underwater, western, mystery), and generate additional sound and visual effects when certain trigger words were spoken in real-time. The entire project was created in a single HTML file so it could run within a web browser without additional dependencies.
Building with the chatbots: The first round
Gemini
Claude’s project gave me the most success in some areas and more trouble in others, but is my personal favorite of the three test projects.
Claude made fantastic refinements to the underlying function of the trigger words in this project. Claude expanded the vocabulary and enhanced visualization when a trigger word was spoken aloud. That said, Claude made a call that I didn’t ask for, though the logic indeed made sense.
Initially, I thought the project wasn’t working because when I tested its functionality, only the first trigger word would produce the desired effect in a string of nearly 10. It took some time for Claude to finally reveal that it had decided to allow the sound and visual effects to trigger only once per sentence, so as not to “spam” the user. This made a lot of sense, but the project was more of a proof of concept than a functional reader, and Gemini and ChatGPT generated sound effects for every keyword, which was the expected functionality.
All that said, there was no specific instruction in the prompt about how many times the sound and visual effects played. While it wasn’t necessarily what I wanted, I did appreciate the consideration of the overall user experience in making this call. Then, after all those refinements were coded in, Claude updated the prompt, and I took it to ChatGPT.