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);
}
}
}
});
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 });
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
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
Top comments (0)