A minimalist tab manager for Chrome.
Stash all your open tabs into named groups with one click,
then restore them whenever you're ready.
Features • Installation • Usage • Development • License
- 🗂 Save tabs in one click — Click the extension icon (or press ⌥S) to archive every tab in the current window into a named group. Originals are closed to clear your workspace.
- ↩️ Restore anytime — Reopen a whole group in a new window, or restore single tabs into the current one.
- 📌 Pin & organize — Pin important groups to a dedicated section at the top. Pinned groups stay in your collection after restoring.
- 🔀 Merge groups — Shift+drag one group onto another to combine them. Duplicate URLs are removed automatically.
- 🔍 Search — Filter groups and tabs by title or URL.
- 🔄 Cloud sync — Sign in with Google to sync your collection across devices.
- 🔒 Offline-first & private — Everything works without an account. Data lives in local storage and only syncs to your own Firebase path when you sign in. No third-party tracking.
- ⌨️ Keyboard friendly — Navigate, rename, restore, and reorder without touching the mouse.
- 📤 Import / Export — Back up your collection to JSON, or import and merge from a file.
- 🌚 Dark mode — Dark theme by default.
Staaaash isn't on the Chrome Web Store yet, so you build it yourself and load it as an unpacked extension:
- Follow the Development steps below to install dependencies and run
pnpm run build - Open
chrome://extensions/in Chrome - Enable Developer mode (toggle in the top-right corner)
- Click Load unpacked and select the
distdirectory
- Stash tabs: Click the extension icon or press ⌥S — all tabs in the current window are saved as a new group and the dashboard opens.
- Open the dashboard without stashing: Press ⌥⇧S, or right-click the extension icon and choose Open Collections.
- Restore: Click a group's Restore button to open all its tabs in a new window, or use the external-link icon on a tab to open just that one.
| Mac | Win/Linux | Action |
|---|---|---|
| ⌥ S | Alt S | Archive all tabs and open the dashboard |
| ⌥ ⇧ S | Alt Shift S | Open the dashboard (no archiving) |
| Shortcut | Action |
|---|---|
| ↑ ↓ | Navigate through groups and tabs |
| ← | Collapse group / jump to parent group |
| → | Expand group |
| ⌘ F | Focus search |
| ↵ | Rename selected group |
| ⌘ ↵ | Restore selected item |
| ⌫ | Delete selected item |
| P | Pin/unpin selected group |
| ⇧ ↑ / ⇧ ↓ | Move selected item up/down |
| Esc | Clear search / cancel editing |
(On Windows/Linux, use Ctrl instead of ⌘.)
| Gesture | Action |
|---|---|
| Drag group | Reorder within its section |
| ⇧ + drag group | Merge into the target group (duplicate URLs removed) |
| Drag tab | Move a tab within or across groups |
- Node.js v18+
- pnpm
git clone https://github.com/mtskf/Staaaash.git
cd Staaaash
pnpm installStaaaash uses Firebase for sync and Google Auth for identity. (You can skip this and use the extension offline-only, but sign-in won't work.)
-
Create a Firebase project
- Go to the Firebase Console
- Create a new project and enable Authentication and Realtime Database
-
Register a web app
- In Project Settings > General, click the
</>icon to add a web app - Copy the configuration keys (apiKey, authDomain, etc.)
- In Project Settings > General, click the
-
Configure environment variables
- Copy
.env.exampleto.env:cp .env.example .env
- Fill in your Firebase config values
- Copy
-
Set up Google OAuth
- To make
chrome.identitywork, you need a specific OAuth Client ID - Go to Google Cloud Console > APIs & Services > Credentials
- Create an OAuth 2.0 Client ID (Type: Web application, NOT Chrome Extension)
- Under Authorized Redirect URIs, add
https://<YOUR-EXTENSION-ID>.chromiumapp.org/- You can find your extension ID at
chrome://extensionsafter loading the unpacked extension once
- You can find your extension ID at
- Add this Client ID to
.envasVITE_GOOGLE_CLIENT_ID - In Firebase Console > Authentication > Sign-in method, ensure the Google provider is enabled and whitelisted with this Client ID
- To make
pnpm run dev # Dev server with HMR
pnpm run build # Production build (outputs to dist/)
pnpm run check # Type check + tests + lint (same as CI)
pnpm test # Run tests in watch modeAfter building, load the dist directory in Chrome as described in Installation.
# 1. Bump version in package.json and manifest.json
# 2. Build
pnpm run build
# 3. Package
cd dist && zip -r ../release/staaaash-vX.X.X.zip .| Category | Technologies |
|---|---|
| Core | TypeScript, React 19, Chrome Extension Manifest V3 |
| Backend | Firebase Realtime Database, Google OAuth via chrome.identity |
| UI | Tailwind CSS v3, shadcn/ui (Radix), lucide-react, sonner |
| Drag & Drop | @dnd-kit/core, @dnd-kit/sortable |
| Tooling | pnpm, Vite, ESLint, Vitest |
MIT © mtskf
