Skip to content

Repository files navigation

Tabtastic!

Window Time Machine for Chrome.

Save and restore your Chrome project windows — tab groups, colors, names, and all.

CI


What it does

  • One window per project, captured. Saves the window's tab groups (with emoji prefix and color), tabs in each group, ungrouped tabs, and the project name.
  • Time Machine auto-save. A 4-slot rolling backup (last hour, last day, last week, last month) per project, so you can always roll back to a recent good state if Chrome loses your groups.
  • Named snapshots. Save explicit "clean baselines" you can return to whenever the window has accumulated cruft.
  • One-click restore. Open a fresh window with all groups, colors, and tab order rebuilt exactly as saved.
  • Local-only by default. Everything stored in chrome.storage.local. Optional JSON export/import for backups across machines.

Install (loadable extension)

Option A — from the prebuilt zip (recommended)

  1. Download the latest tabtastic-X.Y.Z.zip — either:
    • From the GitHub Releases page (one is auto-published on each tagged release), or
    • From the releases/ folder in this repo (releases/tabtastic-0.5.0.zip ships with the source for convenience), or
    • From the Actions → CI → Artifacts of any successful run.
  2. Unzip it somewhere stable (e.g. ~/Applications/tabtastic-0.1.0/). Chrome loads from a folder, not the zip itself.
  3. Open chrome://extensions in Chrome.
  4. Toggle Developer mode on (top-right corner).
  5. Click Load unpacked and select the unzipped folder.
  6. The Tabtastic! icon appears in the toolbar — pin it for quick access.

To update without losing your projects: download the new zip and unzip into the same folder as before (overwriting the old contents), then click the refresh ↻ icon on the extension card in chrome://extensions. As long as the load-folder path is unchanged, the extension ID stays stable and chrome.storage.local keeps every project and snapshot intact.

Belt-and-braces: before any update, open the options page → Export all → save the JSON. If anything goes sideways, Import restores everything.

Loading from a different folder gives the extension a new ID — a fresh install with empty storage. Avoid this for in-place upgrades.

Option B — build from source

git clone <this repo>
cd Chrome
npm install
npm run build

Then in chrome://extensions, Load unpacked and select the dist/ folder.


Usage

  1. Save your first project. Open the window you use for, say, "Acme Redesign". Click the Tabtastic! toolbar icon. Type a project name (defaults to the current window title) and hit Save this window as a project.
  2. Auto-save runs in the background. Any time you add/remove a tab, change a group, or switch focus away from the window, Tabtastic! takes a fresh snapshot ~30 seconds later. The popup shows you the rolling auto-saves: hour / day / week / month.
  3. Save a "clean baseline". When the window is in a tidy, minimal state, click + Save Named Snapshot and give it a label like "clean baseline". Named snapshots are kept until you delete them.
  4. Restore when Chrome loses your groups. Click the icon, find the snapshot you want, hit Restore. A fresh window opens with the exact saved state.
  5. Manage everything. The gear icon in the popup opens the all-projects manager (rename, delete, export, import).

Development

npm install
npm run dev        # vite dev (writes to dist/, HMR for popup/options)
npm run build      # production build → dist/
npm test           # vitest (unit tests)
npm run typecheck  # tsc --noEmit

Project layout

  • src/manifest.ts — Manifest V3, generated by @crxjs/vite-plugin.
  • src/background/ — service worker shell + per-feature handlers/ and listeners/.
  • src/lib/ — pure modules (types, storage, capture, restore, retention, debouncer, bindings, autosave, import-conflict).
  • src/popup/, src/options/ — UI surfaces.
  • tests/ — Vitest unit tests; tests/setup/chrome-stub.ts provides a Proxy stub for globalThis.chrome so module loads don't throw in the test runner.

CI / releases

.github/workflows/ci.yml runs typecheck + tests + build on every push and PR, and uploads tabtastic-<version>.zip as a downloadable artifact. Pushing a tag like v0.2.0 additionally publishes a GitHub Release with the zip attached.

To cut a release locally:

npm run build
mkdir -p releases
cd dist && zip -r "../releases/tabtastic-$(node -p 'require(\"../package.json\").version').zip" . && cd ..

Backlog & design


Known limitations

  • Window names are managed by Chrome itself; Tabtastic! cannot programmatically rename a window's OS title bar. The plugin reads the title for display and as a hint when you save.
  • chrome:// and some file:// URLs can't be recreated by extensions — those tabs are recorded in a per-restore failure report so you can recreate them manually.
  • Bindings reset on browser restart. When Chrome restarts, the in-session window↔project binding is cleared. Re-bind by clicking the icon in the project window — if you type the same project name, the popup offers to rebind to the existing project (preserving its snapshots).

About

Window Time Machine for Chrome — save & restore project windows (tab groups, colors, names, tabs) with 4-slot Time Machine auto-save + named snapshots

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages