Jun 09, 2025
4 min read
Sneak a peek behind the curtain of what it really is like to build an app "over the weekend" with bolt.new. I dive into the awesomeness and drawbacks of using AI to build products as an engineer.
Founder
82 views
Everyone loves a good “I built this with AI in a weekend” story.
This is… not that story.
This is a behind-the-scenes look at what actually happened when I tried to build a simple app using AI tools. The kind of post you'd wish you'd read before diving in.
I’ve been posting more regularly on LinkedIn—sharing lessons from my consulting work, startup journey, and engineering experiences. But the platform’s publishing experience is bare minimum:
I wanted a basic editorial planner for LinkedIn with:
Something that would give me clarity at a glance.
Everyone’s raving about tools like bolt.new. You describe your app, and it scaffolds the UI, hooks up the backend, and wires things up.
So I thought: why not give it a shot?
Let’s go full “vibe coder” and see how far it gets me.
It got me ~70% of the way there.
The final 30%? Took real engineering work to fix, patch, and polish.
Here’s what that looked like.
Bolt generated a users table in the migration files, which conflicted with Supabase’s built-in auth.users.
This broke auth entirely. Supabase was technically right—user already existed—but the custom table had no records.
Fix:
Rolled back migrations, deleted the user table, reset Supabase to its default schema, and updated all foreign key references.
The app stored a state string in localStorage but didn’t retrieve it correctly during the LinkedIn callback.
It was comparing a newly generated state to the incoming value—guaranteed to fail.
Fix:
Tracked the issue by console-logging the full flow. Rewrote the code to persist and retrieve the same state across the auth lifecycle.
LinkedIn’s 3-legged OAuth requires a server-side token exchange. Bolt didn’t handle this step.
Fix:
I wrote a Netlify Edge Function that:
Then wired the frontend to call this function post-auth.
Bolt didn’t set up a local dev environment. No docker-compose, no local Supabase CLI setup, nothing.
Fix:
Connecting LinkedIn triggered an API loop. The app kept trying to fetch a token that didn’t exist yet.
Fix:
Diagnosed it as a useEffect hook that didn’t guard against undefined states.
Refactored the hook to exit early when the user wasn’t authenticated.
Bolt used upsert operations to insert/update data, but Supabase’s Row-Level Security blocked the queries.
Fix:
Wrote custom RLS policies allowing authenticated users to upsert based on user_id, restricted by ownership.
Here’s the final architecture that now works reliably:
Despite the issues, a few things were genuinely impressive:
It generated a calendar view, post list, and auth screens faster than I could have prototyped manually. Felt like a solid 4th-year developer wrote it.
The way Bolt integrated GitHub commits with Supabase’s DB schema and file storage was smooth.
Once I showed Bolt how to write Netlify functions, it became easy to slot in backend logic and deploy.
Absolutely.
But I’d go in eyes wide open.
AI helped me move faster. But I still had to steer, patch, and clean up behind it.
If you’re a solo founder, engineer, or product builder: This new wave of tools can save you days of work—if you know where to look and when to intervene.
If you’re curious about the app, drop me a message.
Whether you’re curious or ready to dive in, we’re ready for you. Let’s scale your product and bring your vision to life—schedule a call and make it happen, together!
2025 © All rights reserved