I made an app. Not on my own. No, I got Gemini to help me. And I thought I'd tell you how that went. It was mostly good but at points it was one of the most frustrating things I’ve ever tried to do.
For the last seven years work has taken me away from digital development and, honestly, I've missed it. Over the years I’ve been involved in building many things but it’s not something I’ve ever had to do on my own. I have a very basic knowledge of Python and sufficient HTML knowledge to edit a site. That’s been fine for knocking basic websites together but isn’t enough for anything more complex.
So, I thought I’d see what I could build with the help of Google’s Gemini. I found out, once I’d started, that this was called vibe coding, that’s probably a fairly good name for something that started as one thing and ended up as something very different.
Every good project starts with a good problem. In my case I needed a database to keep songs in. Our ukulele group (Moselele) has accumulated nearly 750 songs and we need a way to access them quickly. Until recently our website has had a database that searched a spreadsheet and provided a link to a PDF of any individual song. That’s been fine but the plugin that managed this has tied us to WordPress as a CMS. If we ever wanted to move from WordPress then we were going to need something that existed independently.
This is not a new problem, we’ve been looking for years for database solutions, and I have a vague recollection of trying to code something before with ChatGPT. Previously I’d not been able to find something that was both cheap enough and functional enough.
I suppose one of the first questions I should answer is “why didn’t I just get someone to write something for me?” A ukulele song database is not something that has a lot of value. It’s useful for a few of us in the group but not so useful that it was ever going to be worth paying someone competent to do it.
Equally it might be worth clarifying where I stand on AI. I’m largely ambivalent about it. Like all new technologies the opportunity is not in how it does the things we can already do, it’s how it helps us do the things we can’t think of yet. I don’t think it’s going to change the world in the way that the people who sell us AI want us to believe it will. But I’m interested enough to play with it.
The first challenge was to get over 700 PDFs into some usable data that could be searched and organised. This turned out to be really simple. Gemini wrote me a Python script that had extracted all of the data into a JSON in about thirty minutes. This is the thing that I’d always thought was the “insurmountable problem”. It wasn’t insurmountable.
From there I had a searchable database up and running, using Streamlit, in about two hours. That showed me, quickly, that this was possible.
It also highlighted one of the other questions quite a few people have asked me, “Don’t you know someone you could just ask to do this?”. Well, yes, I do. Even within Moselele we have people who do this for a living and who offered to help. But one lesson I’ve learned over years of building things, with other people, is that working with volunteers and friend’s burns social capital. There is a limit to how many times you can say “now make it do this” or “that’s wrong”. Gemini proved to be exceptionally patient and tolerated a lot of early scope creep.
Having a proof of concept running in hours made me realise I needed something more robust. Fortunately, I’ve got a Virtual Private Server running on Dreamhost which meant I could host a more functional app at no cost.
That then led to another five weeks of turning my proof of concept into something that now works in ways that I’d never really conceived of when I started. Rather than explain every step of those five weeks maybe it’s more useful to tell you what I learned about working with an LLM to do this.
Possibly the most important thing is that it never appeared that interested in architectural choices. As far as Gemini was concerned this app was best constructed as one big Python script and one page of HTML (with Java script embedded in it). This proved to be really vulnerable.
A thing I quickly learned is that Gemini doesn’t have much permanence of memory. It really likes to “simplify” code, meaning it deletes things, and then denies all knowledge of it. One of the first things I had to do was break everything into components (distinct Python scripts, separate Java and CSS). This was the only way to stop problems cascading through the code as Gemini tried to edit one function and broke everything else.
Equally getting Gemini to comment code in a way that was useful was a real challenge that I don’t think I ever really cracked.
These are the basics that good human professionals do as a matter of course.
Gemini can very easily get itself into what I’ve come to describe as a deathloop. If something doesn’t work, it will create two solutions and just switch between them even though neither of them work. It then refuses to believe that these have been tried before. I ended up losing days to this behaviour.
I’ve found the only way to break this is to just leave it for a day or two and see if it has a better idea after some sleep or try to prompt it with creative questions to approach the problem from a new direction.
I quickly learned to keep copious backups of files because there were many points where I had to present code, where functions had previously worked, just to prove it was possible.
Within this you can begin to see why I describe this as a very frustrating way to work. There are only so many hours you can spend typing “that doesn’t work”.
It also has a contradictory instinct to remove code that works whilst throwing exponentially more code where things are not working. Through weeks of working on this I now know what each bit of code does and can challenge it when it is making things deliberately complex.
But, on the positive side many functions in the app were suggested by Gemini. I didn’t think it would be possible to animate songs which scrolled as you play along with them. Gemini thought it was possible and generated the code in seconds.
The end product is something that I am very proud of. It’s actually turned into a pretty complex product and made me understand the potential there is for building in this way.
I’m not convinced this is a productive way to take something from inception to production. I think it is a very good way to build a proof of concept that can be handed over to someone that knows what they are doing.
It’s been fun and frustrating. It’s been fun getting back to digital stuff. It’s been frustrating spending so much time arguing with a website. More than that it’s taught me a lot.
If you’ve got an idea, and a spare month, give it a go.
You can see my app at https://www.moselele.com