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.3.1 |
| 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.
Alt+Shift+S saves a snapshot without opening the popup.st in the address bar, press space, then type a query to search every tab across every saved session without opening the popup.| Main view | Session detail | Settings |
|---|---|---|
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, your tabs are captured as the last window closes and saved as a session named "Browser close". On next launch, open the SnapTabs popup and restore it.
A hard crash that kills the service worker before the save completes can lose the most recent snapshot. For critical tab sets, take a manual snapshot (Alt+Shift+S).
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 build
Then load the build:
chrome://extensions.output/chrome-mv3 directorynpm 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
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.