Building with v0 x vercel
I have known about v0 since its early days as a tool that is very good at building aesthetically pleasing web applications. I remember a couple of years ago, one of my engineers literally used v0 to build the frontend before integrating it with our core application. That alone says a lot about how strong its frontend design capability is.
Anyway, in conjunction with the H0: Hack the Zero Stack with Vercel v0 and AWS Databases, I was lured in by the free credits. I had not really been able to build anything nice with the small amount of free credit before, so this felt like a good chance to test the technology more deeply, especially with the new database integration with AWS.
Long story short, here is the finished product.
Idea
I had this idea in mind for quite some time, especially with my role in starting a new AI platform team in the company I work for. One of the first tasks was to look for maturity assessments so we could understand how far away we were from industry norms.
That got me thinking: is there a way to scale this assessment approach and generate questions that are relevant to each company, instead of relying only on a fixed assessment that someone else created? That is how Maturity SE was born. “SE” which also stands for Software Engineering.
Idea inside v0
With that in mind, I put my prompt into v0 using v0-pro and the initial free $5 credit get every month. Sadly to say, It got used up within just a couple of prompts. Even so, it was pretty decent in my opinion, and v0 even named the product “Maturity IQ” which was also a pretty nice name to me, though I am still not sure what the “IQ” was supposed to mean.
Luckily, this hackathon also gave the participant additional $30 credit, and this kept me going to complete the unfinished product.
It even got the homepage I was using for Maturity SE almost right on the first build. Here is the original site.

Landing page of Maturity IQ
In the rebuild later on, I tried asking to create a new landing page, and this still looks way better, thus, I decided to go with this as our landing page.
Maturity IQ login
Since this was my first build, I chose not to complicate things and went with something easy to configure. That is where Neon database came in and used. Everything looked good, except I could not get the login to work.
Knowing the issue was likely related to CORS, I tried prompting v0 to fix it. It literally failed. Keep in mind, I knew I was not using the smartest model v0 could offer, since credit was limited. I tried to compensate by providing much more detailed context myself.
I am still trying to learn v0 at this point. I could not properly inspect what was happening inside the login page. This is where relying purely on “AI” becomes a double-edged sword. I cloned the code locally and started debugging. There were so many environment variables created that I was not even sure what was required anymore.
My main goal was just to fix it and continue development inside v0.
Rolling it back failed
The more I prompts, it feels like the code structure get worsen. At that point, I decided to ask it to roll back the changes. And… that failed too. I think a big part of this was me not really understanding how v0 handles the relationship between chat history and branches.

Look at the chat conversation topics
So I decided to start everything again from scratch. This time, v0 named it “Maturity SE,” and I decided to stick with that.
Maturity SE rebuild
Using the same prompts, it generated almost the same thing, except this time with no landing page. Still, at least I knew the commits and branches were not messed up yet.
Again, trying to fix things inside v0 still sucked. The CORS confusion between the preview inside v0, the preview in Vercel, and the production runtime in Vercel made it unnecessarily painful. I ended up setting the origin to wildcard “∗” just to move forward and continue building the rest of the application.
const trustedOrigins = isProd
? [
...(productionURL ? [productionURL] : []),
...(previewURL ? [previewURL] : []),
'http://localhost:3000',
]
: ['*']
Application logic
Once I got past the login page, I was actually surprised. The whole application felt 90% done, and done nicely too, across both frontend and backend. After a couple of rounds of vibing with it to fix things and add features, I was quite happy with the application’s progress.
I also tried adding more features within v0, but I have to say, it was not nearly as good as that initial first-time bootstrapping experience.
Since the credit is running low, without the frontier model, I do feel that it will be hard to make decent progress to add more feature. I started to swap out into my local coding environment with the other subscriptions that I have. Can clearly see that all the harder feature later on has a separate PR from me.
Heavy fallback
Anyway, I also started to find my own flow by syncing the project locally and using my Opencode setup with skills like /grill-me, /to-prd, and /to-issues for more feature-heavy tasks.
With that setup, I was able to make much better progress.
Switching to Aurora Postgres
Since I assumed the AWS and Vercel integration was supposed to be a first-class experience, I asked v0 to switch the database. It failed quite badly and could not create Aurora properly, even though my AWS account was already connected.
Somehow, this worked a couple of days later. But even after Aurora was connected, the generated code was still not calling Aurora correctly. I tried multiple prompts, including asking it to write tests first to figure out how to make it work before wiring it into the larger system. All of that still failed.

That was when I went back to local development and started fixing it myself. Eventually, I realized the code snippet it had generated was simply wrong. Here is how I test it before connecting actually.

Here, you can see on the left which was generated by v0 and on the right is the one I fixed. I managed to prove it was working with a simple test.js, and then proceeded to implement it properly into the application.
Database migration
Database migration is not handled nicely as well. I think v0 bootstrap should also ensure that user is able to switch or upgrade or downgrade database out of the box. Since is not handled, I have to redo the migration myself (lucky with LLM, things are much easier with a couple of prompts. In the end, I chose dbmate due to it being easy and less dependency needed for a small startup projects.
Overall experience
Overall, I would give it a 7/10.
- Initial bootstrap –
9/10(solid) - Debugging –
3/10(there are still plenty of room to improve debugging experience) - Token usage –
5/10(even with $30 credit, I still felt very limited and not daring to use v0-max) - Deployment –
9/10(everything come build in and setup nicely with vercel) - AWS integration –
6/10(fall short for me, wasting token just to debug things that should just work out of the box regardless of the model selection)
If I had to summarize it in one sentence: v0 is very good at getting you to something impressive very quickly, but once things break, you still need enough engineering depth to take over and finish the job yourself.