Hi Friends,
Today, I want to share a mind-blowing experience that happened to me during the weekend. It’s also why you receive this newsletter on Monday instead of Sunday. 🙂
I don’t know if it’s the baby, the lack of sleep, or my wife’s crazy schedule, but she has started coming up with some great app ideas for parents—one where you could track all your kid’s sicknesses and the treatments that worked for that particular sickness. I, who had already tried to launch a couple of apps without a baby, knew we couldn’t build anything right now.
This was until our company started receiving emails from Vercel to try v0, and others on the team tried to ship some simple pages, such as a 404 or users page with it. I thought, this might be it, this is how I can build my wife’s ideas. So I decided I’ll give it a shot.
v0
My initial prompt looked like this:
I want to create an app for parents that works like this:
- symptoms for your children can be added to a card
- on the back of the card you can write solutions that have worked for your kid as a treatment
- you can search cards by symptoms and solutions
- the app is mobile first
Here’s what I got for Version 1:
Good
You can push this really far without paying a dollar.
I don’t know the limits because I’ve got tired explaining the same thing in 7 different ways. Probably works better for web apps, and I’ve seen results it generated from my colleagues, and it’s OK. 🤷♂️
Bad
I recorded this behavior because I’ve spent around 7 versions just trying to explain to v0 what flipping a card means. 🙃 Before you question my prompting skills, I was very explicit about what was broken.
Overall, I wasn’t particularly happy with the results. I’ve built and used some of those mobile-first web apps, and they could never match a native experience.
Then I asked on X if there’s a way to build mobile apps in the same fashion–it turns out there is.
bolt.new
You simply cannot compare this to v0, and it makes sense now why Vercel is pushing its product so heavily.
What you see here is a mobile app built with Expo, which is an open-source platform for making universal native apps for Android, iOS, and the web with JavaScript and React. There’s a way to preview it on my phone, which I still haven’t figured out how to use, but this is a super small thing considering what you have above.
The app is already connected to Supabase, and I’m signing in to an account that’s in the database. The card and children’s data also go into PostgreSQL. 🤯
80% of the app took around 30 minutes to build. The rest took an hour–below I’m explaining why.
Good
You get great results fast. It was so convincing that I actually paid for the monthly subscription, and I’m looking forward to experimenting more with it.
If you value your time, this is probably the way to go.
The Supabase connection is really good. It’s not seamless, but it’ll get better. I’ve used it many times before, so I know my way around, but even if you’re new, Bolt tells you what to do—or you can just ask it.
Bolt realizes if there are problems in the console and tries to auto-fix them. It succeeded 9/10.
Bad
The Expo preview screen was out of sync with the code and crashed, and I had to revert my changes to get the preview working.
After I added the Supabase integration, some code remained that tried to handle data stored locally before—like Bolt didn’t realize I had moved to Supabase.
Conclusion
Now that I have tried these tools, I can tell you that the rumors that they write junior-mid-level code are actually true. 🤷♂️
Here are some examples from the code Bolt generated and why it’s a perfect junior-mid level code.
Junior Code - Impossible States
Below is a classic pattern where you load some data into React and have 3 different states for data, error, and loading. However, with these being independent, you can actually have some impossible situations, for example:
loading true, data true - not possible, you either have the data or it’s loading
error true, data true - if you have data, you had no errors
and so on.
So the above can be written as a useReducer with actions that would eliminate the impossible combinations.
Mid-level Code - good useEffects
Understanding how useEffects works is still challenging, so when you see someone (or something 🤖) separate concerns into different useEffects, you know they know their stuff:
If you also want to know your stuff, I recommend you check out one of my latest articles from my tech blog to avoid rookie mistakes when using useEffect:
Take Action Now
Prototyping has changed forever.
Now you can spend $20 bucks and have something an expert can take to production.
If you’re a Junior or Mid-level engineer, the barrier of entry has changed.
Try to accumulate as much experience as possible, not from writing To-do level apps but giving a shot to stuff like Bolt, connecting it to Supabase, and going in the full-stack direction.
Alternatively, you can just get really good at front-end or move to other areas like AI Engineering or Data Science. Here’s a good Reddit thread on it. Is Sticking to Frontend Enough? React Dev Thinking About Next.js, Backend, or Data Science.
That’s it for today.
Shoot me your question in the comments or simply reply to this email.
Have a productive week, everyone! 👋
📰 Weekly shoutout
How Did SoundCloud Scale Its Architecture Using BFF, Microservices & DDD? by
Your Code is Fast, But Your Database is Slow—Now What? by
📣 Share
There’s no easier way to help this newsletter grow than by sharing it with the world. If you liked it, found something helpful, or you know someone who knows someone to whom this could be helpful, share it:
🏆 Subscribe
Actually, there’s one easier thing you can do to grow and help grow: subscribe to this newsletter. I’ll keep putting in the work and distilling what I learn/learned as a software engineer/consultant. Simply sign up here:
Cool!
Have you tried the composer on Cursor?
I think it has the best of all worlds :)
Maybe a bit more setup initially, but worked really nice for me
Better to embrace AI-driven development and agentic IDEs.
I always struggled to start a side project. I thought the time commitment was too high, and I didn't have the time... But I've tried cursor, and it feels much more rewarding and manageable 🙌