← Blog / Dev

Building a Chrome Extension in 2025: What Changed with MV3

· 6 min read · Dac Hung Nguyen

If you built a Chrome Extension before 2023, you need to know about Manifest V3 (MV3). Google’s overhaul of the extension platform brought significant architectural changes — some for the better, some that required creative workarounds.

What Changed in MV3

Service Workers Replace Background Pages

The biggest change: background pages are gone. MV3 uses service workers instead — lightweight, event-driven scripts that spin up on demand and terminate when idle.

This means:

  • No persistent background state (service workers can be killed at any time)
  • No XMLHttpRequest in background context — use fetch() instead
  • You must persist state to chrome.storage rather than in-memory variables

The Side Panel API

MV3 introduced the Side Panel API — a dedicated UI surface that opens alongside the current tab without blocking content. For Live Meeting Notes, this was the perfect UI paradigm: always accessible, non-intrusive.

// Register the side panel
chrome.sidePanel.setOptions({
  path: 'sidepanel.html',
  enabled: true
});

// Open on action click
chrome.action.onClicked.addListener((tab) => {
  chrome.sidePanel.open({ windowId: tab.windowId });
});

Audio Capture in MV3

For meeting transcription, I needed to capture tab audio. MV3 still allows chrome.tabCapture.capture() but requires an offscreen document for audio processing:

// Create offscreen document for audio processing
await chrome.offscreen.createDocument({
  url: 'offscreen.html',
  reasons: ['USER_MEDIA'],
  justification: 'Capture tab audio for transcription'
});

The Chunked Audio Pipeline

Live Meeting Notes uses a chunked audio pipeline to keep costs down and latency low:

  1. Capture tab audio stream via tabCapture
  2. Buffer audio chunks (configurable, default 10s)
  3. Send chunks to Gemini API for transcription
  4. Stream results back to the Side Panel UI

The key insight: don’t send the entire meeting recording at once. Process in chunks to give users real-time feedback and avoid hitting API payload limits.

Lessons Learned

  1. Test service worker lifecycle aggressively — your extension will be killed and restarted constantly
  2. Use chrome.storage.session for temporary state — it persists within a browser session but clears on restart
  3. The Side Panel is underrated — great UX for productivity tools
  4. Gemini API is surprisingly capable for audio transcription at reasonable cost

Want to see Live Meeting Notes in action? Check it out on the Chrome Web Store.

Want to discuss this topic?

I offer consulting for energy market strategy and software development.

Work With Me →