April 20, 2026
3 mins

7 Hard-Won Lessons and 3 Delightful Surprises from Migrating Off Bubble

Whiteboard sketch showing seven numbered lessons and three lightbulb moments from a Bubble migration
Image
Image

3 Delightful Surprises

1. The impossible becomes trivial

Things that are painful workarounds in Bubble — a certain import, a certain utility, a particular data transformation — are absolutely trivial for Claude Code. Things that were impossible become easy. This keeps catching me off guard.

2. Cost control becomes a joy

My favourite prompt: “Go to AWS, look at my bill, and optimise costs.” Diving into what’s actually costing you money and fixing it in minutes is genuinely enjoyable. You end up with $30–40/month instead of $100–120, and you understand exactly where every dollar goes.

3. You get better observability than Bubble

Logging, monitoring, job status, async queue visibility — it’s all more transparent than what you had in Bubble. You end up with a more observable system, not less.

You end up with a more observable system, not less. That was genuinely unexpected.

7 Hard-Won Lessons

1. PRDs are your source of truth — not the code

Your Product Requirements Description describes every aspect: functional, non-functional, design, architecture, coding practices, brand. The code is just a system implementation of the PRDs. Use BuildPrint (George Collier’s tool) to create them — I even have a skill that lets Claude Code query BuildPrint directly, asking its own questions and completing its own functional specs. Amazing tool.

One day I’ll say “I don’t want Docker anymore, I want Rust on a completely different stack.” My goal is that with all the information in the PRDs, the next smart LLM implements exactly that — feature parity, just a different implementation.

Don’t let your PRDs drift. Every new feature gets written back in.

2. Migrate real production data early

Don’t invent test data. Migrate anonymised production data from day one. You won’t have the same schema — and you shouldn’t try. Bubble has loads of workarounds for privacy roles and joins that you simply don’t need anymore.

Run real migrated data so you’re building the app and the data migration simultaneously. When you find a gap in the app, it might be a gap in the migration. Fix it, rinse and repeat. This is really important.

3. Make 90% of decisions before you write a line of code

The thing you have to manage most is your cognitive load. If you’re deciding on infrastructure and architecture halfway through a build, you’ve failed badly. Get all of that resolved upfront. You’ll have enough cognitive load managing all the simultaneous activity without making big decisions mid-flight.

4. Have strong opinions about simple infrastructure

The LLM looks after the complexity of how to do things on AWS. But you need to have an opinion about keeping it simple. Otherwise you’ll end up with 10 Docker containers, 50 sidecars, and 20 external services. You didn’t have load balancers for every service in Bubble. Isolate at the container level, use routing rules, and ask yourself: how much do you actually want to pay for network isolation?

5. Use Run-As impersonation for testing

Carried over from Bubble and just as valuable: impersonate tenants and users. Test as Customer One, Customer Two — look at real data through their eyes, step through phases of development, and verify what they actually see and experience.

6. Cross-check your LLM’s recommendations

LLM best-practice recommendations can be out of date — the model’s training data has a cutoff. If you ask “what’s the best way to do X?”, don’t take it at face value. Cross-check with another model. That said, Claude 4.6 is solid and gets the job done.

7. Manage your energy, not just your time

Know your productive hours. For me, after about 3pm my productivity massively declines. Any decisions I make after 7pm are garbage. That’s just me — but know your own patterns. And let the LLM handle the project management busywork: backlog prioritisation, task tracking, sequencing decisions. Don’t sit there actively managing everything yourself.

Don’t sit there actively managing everything yourself. Let the LLM handle the busywork.

Want the full story? Read Migrating Off Bubble: Fears, Surprises, and Hard-Won Lessons — the complete discussion including all nine fears that never materialised and why I actually migrated.