I've lost more hours to Chrome extension development than I'd like to admit. Not because extensions are hard, exactly — it's that Manifest V3 changes a bunch of assumptions that feel completely reasonable until they quietly break your extension in production, usually a week after you shipped it and stopped thinking about it.

Here are the five that got me the worst, and how I'd fix them if I were starting over.

1. Your service worker is not a background page

Coming from Manifest V2, it's tempting to treat your service worker like the old persistent background page — just a script that runs and keeps its state in memory. It isn't. Chrome kills idle service workers aggressively (sometimes in under a minute), and when a new event comes in, it spins up a fresh instance. Any global variable you were relying on is gone.

// ❌ This "works" in dev and then silently breaks in production