ChromeFlash

ChromeFlash

# webdev# productivity# browser
ChromeFlashAlain Picard

I built a Chrome extension to track where Chrome's RAM actually goes. Chrome uses a lot of memory. We...

I built a Chrome extension to track where Chrome's RAM actually goes.
Chrome uses a lot of memory. We all know this. But when I actually tried to figure out which tabs were eating my RAM, I realized Chrome doesn't make it easy.

Task Manager gives you raw process IDs. chrome://memory-internals is a wall of text. Neither tells you "your 12 active tabs are using ~960 MB and your 2 YouTube tabs are using ~300 MB."

So I built ChromeFlash — a Manifest V3 extension that estimates Chrome's memory by category and gives you tools to reclaim it.

What it looks like

The popup shows a breakdown of Chrome's estimated RAM:

  • Browser Core — ~250 MB for Chrome's internal processes
  • Active Tabs — ~80 MB each
  • Pinned Tabs — ~50 MB each (lighter footprint)
  • Media Tabs — ~150 MB each (audio/video)
  • Suspended Tabs — ~1 MB each
  • Extensions — estimated overhead

A stacked color bar visualizes the proportions at a glance.

The honest caveat

Chrome's extension APIs in Manifest V3 don't expose per-tab memory. The chrome.processes API exists but is limited to dev channel. So these are estimates based on real-world averages — not exact measurements.

If you know a better approach, I'd genuinely love to hear it.

Tab suspension

The biggest win. Calling chrome.tabs.discard() on an inactive tab drops it from ~80 MB to ~1 MB. The tab stays in your tab bar, and when you click it, Chrome reloads it.

ChromeFlash lets you:

  • Suspend inactive tabs manually or on a timer (1–120 min)
  • Protect pinned tabs and tabs playing audio
  • Detect and close duplicate tabs

The auto-suspend runs via chrome.alarms since MV3 service workers can't use setInterval.

// The core of tab suspension
chrome.alarms.create('tab-audit', { periodInMinutes: 5 });

chrome.alarms.onAlarm.addListener(async (alarm) => {
  if (alarm.name === 'tab-audit') {
    const tabs = await chrome.tabs.query({});
    for (const tab of tabs) {
      if (shouldDiscard(tab)) {
        await chrome.tabs.discard(tab.id);
      }
    }
  }
});
Enter fullscreen mode Exit fullscreen mode

Optimization profiles

Four presets that configure tab suspension + Chrome settings in one click:

Profile Suspend Services Off Est. RAM Saved
Gaming 1 min 5 (DNS, spell, translate, autofill, search) ~500–2000 MB
Productivity 15 min 0 ~200–600 MB
Battery Saver 5 min 4 (DNS, spell, translate, search) ~400–1500 MB
Privacy 30 min 7 (+ Topics, FLEDGE, Do Not Track ON) ~150–400 MB

Each profile shows the exact numbers and what changes — no vague "optimizes your browser" marketing.

Hidden settings via chrome.privacy

Chrome exposes several settings through the chrome.privacy API that most users never touch:

// Toggle DNS prefetching
chrome.privacy.network.networkPredictionEnabled.set({ value: false });

// Disable cloud spell check
chrome.privacy.services.spellingServiceEnabled.set({ value: false });

// Disable Topics API (ad tracking)
chrome.privacy.websites.topicsEnabled.set({ value: false });

// Disable FLEDGE / Protected Audiences
chrome.privacy.websites.fledgeEnabled.set({ value: false });
Enter fullscreen mode Exit fullscreen mode

The extension exposes 8 of these as toggle switches. Disabling background services like spell check and translation reduces both network calls and CPU usage — not dramatically, but it adds up.

Chrome Flags guide

Chrome flags (chrome://flags) can meaningfully improve performance, but extensions can't modify them programmatically — Chrome blocks this for security reasons.

So ChromeFlash includes a curated database of 21 performance-relevant flags:

  • Rendering — GPU Rasterization, Zero-Copy, Skia Graphite
  • Network — QUIC Protocol, WebSocket over HTTP/2
  • Memory — Automatic Tab Discarding, High Efficiency Mode
  • JavaScript — V8 Sparkplug, V8 Maglev compilers
  • Loading — Back/Forward Cache, Parallel Downloads

Each flag shows a risk level, impact rating, and a button that opens it directly in chrome://flags/#flag-name.

Architecture

ChromeFlash/
  manifest.json
  src/
    background/service-worker.js    # Alarms, tab audit, memory pressure
    modules/
      tab-manager.js                # Suspend, discard, duplicates
      memory-optimizer.js           # Chrome RAM breakdown
      network-optimizer.js          # DNS prefetch toggle
      privacy-optimizer.js          # 8 privacy setting toggles
      performance-monitor.js        # CPU/memory stats, score
      profiles.js                   # 4 profiles with detailed stats
      flags-database.js             # 21 curated flags
      settings.js / storage.js      # Persistence
    popup/                          # Main UI
    pages/                          # Dashboard + Flags Guide
Enter fullscreen mode Exit fullscreen mode

No build step. No framework. No bundler. ES modules loaded natively by Chrome. The entire extension is under 50 KB.

What I learned

MV3 service workers are stateless. Every alarm fires into a fresh context. You can't store state in module-level variables — it has to go in chrome.storage. This tripped me up early.

chrome.tabs.discard() is underrated. It's the single highest-impact thing an extension can do for memory. 85–92% reduction per tab with zero user friction — the tab just reloads when you click it.

chrome.privacy is powerful but underdiscovered. Most developers don't know you can programmatically toggle DNS prefetching, Topics API, or FLEDGE from an extension. The API surface is small but useful.

Flags can't be automated. I spent time looking for workarounds before accepting that chrome://flags is intentionally walled off. The guide approach works well enough.

Try it

ChromeFlash is free, open source, and collects zero data. No analytics, no remote servers, no tracking. Everything stays in chrome.storage.local