The deploy that ate an evening.
Every step worked. The result was a 404.
I wanted my portfolio on my own domain, on Vercel, so I could keep working through GitHub and Claude Code. I had the domain. I had the site. I had maybe an hour blocked out for it.
Reader, it was not an hour.
Everything worked, one step at a time
Connect Lovable to GitHub. Import the repo into Vercel. Framework detected as Vite. Deploy. Green.
Add the domain in Vercel. It hands over an A record and a CNAME. Off to Metanet, where my DNS lives.
The A record for the root domain refuses the @ symbol. Metanet's own hint explains why: leave the field empty for the domain itself. Fine. Empty field, IP, save.
Then Vercel mentions that the IP it gave me minutes earlier is outdated and recommends a different one. Update it. Then the www CNAME collides with an existing CNAME, which exists because I created it, personally, one hour previously. Delete, recreate, new value.
Eventually: valid configuration. Green checkmarks everywhere. Verified.
404.
Where the problem was hiding
Not DNS. DNS was correct. The deployment itself was serving nothing at all.
Build logs clean. No errors. Everything compiled beautifully.
The project runs on TanStack Start, and Lovable's config wrapper hard-wires Cloudflare's Vite plugin into every build. What comes out is a Cloudflare Worker bundle with a wrangler config and a server entry point. Not a static site. Not a Node serverless function. The assets land in dist/client instead of dist.
So I pointed Vercel's output directory at dist/client. Redeploy. Still 404, because the folder was never the problem. Vercel had no idea how to run the thing that build produced. It was being handed a Cloudflare Worker and politely declining.
The options, once I stopped poking DNS
Convert fully to a plain Vite SPA. Around twenty files, every route rewritten, the server-side error wrapper removed, per-route meta rebuilt with something else, Lovable preview broken until it's all done.
Write a custom build that bypasses the wrapper. Medium effort, and fragile every single time the wrapper updates.
Or host it where it already works.
What I picked
Lovable's own hosting, domain pointed at it. New A record, TXT record for verification, www CNAME rewritten for the third time that evening, at which point I could have done it blindfolded.
Green within the hour.
I wanted Vercel for the workflow. I still have the workflow. Claude Code pushes to GitHub, Lovable picks up the commit, the site updates. What I actually gave up was a hosting provider, which is not the same as giving up how I work, even though for about twenty minutes it felt like losing.
What I'd tell past me
Before picking a host, find out what your build actually produces. Not which framework you're using. What comes out the other end, and what that thing needs in order to run.
I spent most of that evening debugging DNS, which was never broken, because DNS is the part that gives you lovely clear error messages and the build is the part that quietly hands you a 404 and says nothing at all.
