Save every tab in your Chrome window with one click, then bring them all back days or weeks later. SnapTabs keeps tab groups intact, handles incognito tabs, and stores everything on your own machine. No accounts, no sync, no tracking.
SnapTabs is a Chrome extension that captures the state of your tabs and saves them as named sessions. You can have a "Monday standup" session with 12 tabs, a "React project" with 40 tabs, and a "Tax research" you haven't touched in six months. One click restores any of them.
The point is not to keep 200 tabs open. The point is to close them without losing them.
| Latest version | 1.7.0 |
| Browser | Chrome 93+ |
| Manifest | V3 |
| Storage | Local only. No cloud sync |
| Permissions | 4 (tabs, tabGroups, storage, contextMenus) |
| Network requests | None |
| Price | Free |
| License | MIT |
| Size quota | 10 MB (configurable max-sessions 1 to 500) |
The Chrome Web Store badge above updates automatically after each published release. Until a new version passes CWS review, the badge may lag behind this repo's source version.
- Snapshot tabs from the current window or every window with one click.
- Tab group preservation keeps the group name, color, and collapsed state.
- Incognito support when the extension is permitted in incognito mode.
- Search across session names, tab titles, and URLs.
- Keyboard shortcut
Alt+Shift+Ssaves a snapshot without opening the popup. - Right-click menu on the toolbar icon for a quick "Save all tabs".
- Clean toolbar icon. The persistent session-count number on the toolbar badge is gone — the count now shows inside the popup header, where you're actually looking. The badge is reserved for the red recording dot.
- Session sorting. Order the list by newest, oldest, name, or most tabs. Pinned sessions always stay on top.
- Duplicate snapshot warning. If the tabs you are about to snapshot match your most recent session, SnapTabs asks before saving another copy. Skips trivial differences like trailing slashes and URL fragments. Turn off in Settings if you want every click to save unconditionally.
- Excluded domains. Add domains you never want captured (banking, email, internal tools) in Settings > Snapshot > Excluded domains. Tabs from those domains are skipped in snapshots, recordings, and auto-saves. Subdomains match the parent rule.
- Auto-snapshot on browser close. Quit Chrome with Cmd+Q or close the last window and your tabs are waiting for you on the next launch. Multi-window quits are captured as a single combined session.
- Session pinning. Pin the sessions you use often so they stay at the top and survive auto-pruning when you hit the storage limit.
- Omnibox search. Type
stin the address bar, press space, then type a query to search every tab across every saved session without opening the popup. - Import and export. Download all sessions to JSON or load them from a previous export. Useful for moving between machines or keeping an off-device backup.
- Live recording that captures new tabs as you open them, with URL deduplication.
- Configurable max-sessions limit with auto-pruning of the oldest auto-saves first.
- Restore into the current window or a fresh one, with optional auto-delete after restore.
- Storage usage bar in settings so you can see where you are against the 10 MB quota.
No. Everything is stored in chrome.storage.local on your device. There is no cloud sync, no backend service, no analytics. The extension does not make outbound network requests.
Turn on Settings > Auto-Save > Save on browser close (off by default). While it's on, every window's tabs land in a combined session named "Browser close" when the last window closes — including the multi-window Cmd+Q case.
If the browser kills the extension's service worker mid-shutdown before the save lands (Brave is more aggressive about this than Chrome), SnapTabs falls back to a continuously-updated snapshot it keeps in local storage. On the next browser start, that snapshot is promoted to a session named "Browser close (recovered)". Either way your tabs come back.
For critical tab sets, also take a manual snapshot (Alt+Shift+S) — it goes through a different code path and is the most belt-and-braces option.
Yes. Pinned tabs come back pinned. Tab groups come back with their original name, color, and collapsed state. The only thing SnapTabs cannot restore is the exact window layout, because Chrome does not expose window geometry to extensions.
Not automatically. Sessions stay on the device where they were created. Use Settings > Data > Export to download a JSON file, then Import it on another machine.
Chrome's built-in history is time-limited, hard to search, and does not let you name or organize anything. SnapTabs gives you named, searchable, persistent sessions that survive Chrome restarts and updates.
Because adding a backend means handling your browsing data on somebody's server. SnapTabs is deliberately local-only. If you need cross-device sessions, export to JSON and share the file through a channel you already trust.
The current build targets Chrome MV3. It works in Chromium-based browsers that support MV3 (Brave, Arc, recent Edge). Firefox support would need a separate build because Manifest V3 differs on Firefox.
Install SnapTabs from the Chrome Web Store.
git clone https://github.com/threatner/SnapTabs.git
cd snaptabs
npm install
npm run buildThen load the build:
- Open
chrome://extensions - Enable Developer mode (top right)
- Click "Load unpacked"
- Pick the
.output/chrome-mv3directory
npm run dev # dev server with hot reload
npm run build # production build
npm run zip # package a .zip for distribution
npm test # unit tests (Vitest)
npm run test:watch # unit tests in watch mode
npm run test:coverage # coverage report
npm run test:e2e # E2E tests (Playwright, requires build first)
npm run test:e2e:debug # E2E tests in debug mode
npm run test:e2e:brave # E2E tests against Brave (set BRAVE_PATH if non-default)
npm run screenshots # Regenerate Chrome Web Store listing screenshots (1280x800)- Svelte 5 for the UI
- WXT for the MV3 build system
- Tailwind CSS 4 for styles
- TypeScript for type safety
- Vitest for unit tests
- Playwright for E2E
Popup (Svelte UI) ──sendMessage──► Background (Service Worker)
│
Chrome APIs
(tabs, windows,
storage, tabGroups)
All tab-creating operations go through the background service worker via chrome.runtime.sendMessage. The popup sends a request and closes as soon as Chrome focuses the new tab; the real work finishes in the background.
Storage is split between chrome.storage.local (persistent sessions and settings) and chrome.storage.session (ephemeral state including live recordings, window map, proactive tab cache, and the pending-close buffer).
src/
├── assets/ # SVG icon source
├── components/ # Svelte UI components
├── entrypoints/
│ ├── background.ts # Service worker: message handler, events, omnibox
│ └── popup/ # Extension popup (Svelte app)
├── lib/
│ ├── types.ts # Interfaces, constants, helpers
│ ├── storage.ts # Chrome storage CRUD (sessions, settings, caches)
│ └── tabs.ts # Tab capture and restore logic
└── public/
└── icon/ # Extension icons (16, 32, 48, 128 PNG)
tests/ # Unit tests (Vitest)
├── setup.ts # Chrome API mocks
├── types.test.ts
├── storage.test.ts
└── tabs.test.ts
e2e/ # E2E tests (Playwright)
├── playwright.config.ts
├── fixtures/ # Browser + extension launch fixture
├── helpers/ # Storage seeding utilities
└── tests/ # Test specs
| Permission | Reason |
|---|---|
tabs |
Read open tabs, create tabs when restoring |
tabGroups |
Preserve and recreate tab group names, colors, state |
storage |
Store sessions and settings on your device |
contextMenus |
"Save all tabs" right-click item on the extension icon |
No network, no history, no cookies, no identity. Full detail in PRIVACY.md.
See CONTRIBUTING.md.



