Skip to content

Repository files navigation

Shells the otter keeping watch

Raft

CI codecov

Keep your tabs safe. A Chrome extension for tab suspension and session management.

raftapp.io · My Promise

Named after the way otters hold hands while sleeping to stay together — a group of otters is called a raft. Our mascot Shells keeps watch over your tabs, making sure they stay safe and connected.

Features

Tab Suspension

  • Auto-suspend inactive tabs using Chrome's native tab discarding
  • Protection rules: pinned tabs, audio, whitelisted sites always safe
  • Custom suspended page with one-click restore
  • Manual suspend via popup, context menu, or keyboard shortcut
  • Close duplicate tabs across all windows with intelligent keep-best logic

Session Management

  • Capture every window, tab, and tab group
  • Tab group preservation: names, colors, collapsed state
  • Selective restore: expand a session and pick individual tabs or windows
  • Restore sessions as suspended to save memory
  • Auto-save on configurable schedule
  • Search across sessions by title or URL
  • Organize sessions into folders

Backup & Recovery

  • Multi-layer backup: auto-save, recovery snapshots (rotating last 5), browser sync
  • Backup health monitor in popup and options with actionable suggestions
  • Export sessions as JSON or text
  • Import from OneTab, Session Buddy, Tab Session Manager, Toby

Cloud Sync

  • End-to-end encryption (AES-256-GCM with PBKDF2)
  • Google Drive integration via private app-data folder
  • Free and optional

Trust Report

Encryption

All cloud-synced data is encrypted on your device before it leaves. Raft uses AES-256-GCM with a unique 96-bit IV per encryption operation. Encryption keys are derived from your password using PBKDF2 with 100,000 iterations (SHA-256). Your recovery key is shown once during setup and is never stored. OAuth uses PKCE (S256) to protect the authorization flow, and tokens are encrypted at rest with your password.

See Privacy Policy for full details.

Privacy

Raft collects zero analytics, telemetry, or usage data. Eight automated tests verify that no fetch() or XMLHttpRequest calls exist in the save, restore, import, or export code paths — your session data never touches a network unless you explicitly enable cloud sync.

The extension's Content Security Policy restricts all network access to googleapis.com (for cloud sync). No other outbound connections are possible.

See Privacy Policy.

Automated Safety Tests

Raft's data safety claims are backed by automated tests covering crash recovery, network isolation, import/export integrity, scale limits, and tab fidelity. Run pnpm test:trust-report to generate the full report yourself.

See the generated safety report for details.

Permissions

Raft requests only five permissions, each with a specific purpose:

Permission Why
tabs Read tab URLs/titles to save sessions and identify inactive tabs
storage Persist sessions and settings to chrome.storage.local
alarms Run periodic checks for auto-suspend and auto-save
contextMenus Add "Suspend tab" to the right-click menu
identity Google OAuth for cloud sync

Not requested: history, bookmarks, webRequest, <all_urls>, notifications. See Permissions Explained for full details.

Open Source

Raft's source code is available for inspection. Every claim in this trust report can be verified by reading the code or running the tests.

Keyboard Shortcuts

Shortcut Action
Alt+Shift+S Suspend current tab
Alt+Shift+O Suspend other tabs in window
Alt+Shift+D Close duplicate tabs

Known Issues

Duplicate tab groups in Chrome's menu after restore

After restoring a session, Chrome's three-dot menu → Tab groups (and the bookmarks-bar chips) may list a group more than once — e.g. Work, Personal, Work, Personal — even though the restored window itself shows each group correctly.

This is a Chrome-side limitation, not data loss in Raft. Chrome's saved tab groups are persistent and expose no stable identity to extensions, so on restore Raft can only create fresh native groups; Chrome keeps the previously-saved entries alongside the new ones. Extensions cannot detect, reuse, or delete saved groups. The duplication is also an open Chromium bug (crbug 365519965), independently reproduced as recently as Chrome 148. The duplicate entries are harmless and can be removed manually from the same Tab groups menu.

Tech Stack

  • Build: Vite + CRXJS
  • UI: Preact + TailwindCSS v4
  • State: Zustand
  • Testing: Vitest
  • Language: TypeScript

Installation

pnpm install
pnpm build

Then load the dist/ folder as an unpacked extension in Chrome.

Development

pnpm dev          # Start dev server with HMR
pnpm build        # Build for production
pnpm test         # Run tests
pnpm test:coverage # Run tests with coverage
pnpm typecheck    # Type check
pnpm lint         # Lint

OAuth Setup

Google OAuth credentials are injected at build time from a .env file.

cp .env.example .env
# Edit .env with your Google Cloud OAuth client ID and secret

Create credentials at the Google Cloud Console — choose "OAuth 2.0 Client ID" for a Web application, enable the Drive API, and configure the consent screen. See .env.example for the required variables.

The OAuth flow is additionally protected by PKCE (S256).

License

MIT

About

Open-source tab manager built to keep your tabs private and safe.

Resources

Security policy

Stars

Watchers

Forks

Releases

Packages

Used by

Contributors

Languages