Skip to main content

Overview

Tab Stash lets you save groups of open tabs and restore them later, perfect for managing multiple projects or contexts. It preserves tab groups, pinned tabs, and window arrangements.
Tab Stash requires the optional tabs and tabGroups permissions. The extension will prompt you to grant these permissions when you first use this feature.

How It Works

Tab Stash captures and stores:
  • Tab URLs: Every tab’s URL in your window(s)
  • Tab Titles: Page titles for easy identification
  • Favicons: Site icons for visual recognition
  • Tab Groups: Group assignments, colors, and labels
  • Pinned Status: Which tabs were pinned
  • Window Organization: Which tabs belonged to which window
From tab-stash.store.ts:122-139, each stashed session stores:
interface TabStash {
  id: string;
  userId: string;
  windowId: string;
  urls: string[];           // Legacy: array of URLs
  tabsData: TabData[];      // Full tab metadata
  createdAt: number;
  updatedAt: number;
  deletedAt: null;
}

interface TabData {
  title: string;
  url: string;
  favicon?: string;
  windowId: number;
  pinned: boolean;
  groupId?: number;
  groupData?: {
    color: string;
    title: string;
  };
}

Granting Permissions

When you first open Tab Stash, you may see a permission banner:
1

Click 'Grant Permission'

The permission banner appears at the top of the Tab Stash panel.
2

Browser Permission Prompt

Your browser will show a popup asking for permission to:
  • Access your tabs
  • Access your tab groups
3

Click 'Allow'

Grant the permissions to enable Tab Stash functionality.
4

Start Using Tab Stash

The permission banner disappears and stash buttons become enabled.
From tab-stash.sheet.tsx:119-120:
<PermissionBanner />
From tab-stash.store.ts:221-233:
requestPermissions: async () => {
  const granted = await chrome.permissions.request({
    permissions: ["tabs", "tabGroups"],
  });
  set({ hasPermissions: granted });
  return granted;
}
You can revoke these permissions at any time from your browser’s extension settings. Existing stashes will remain saved.

Stashing Tabs

Tab Stash offers two stashing modes:

Stash Current Window

Saves all tabs in the current browser window.
1

Open Tab Stash

Click the Tab Stash icon in the dock.
2

Click 'Stash Current'

Click the Stash Current button at the top of the panel.
3

Session Saved

All tabs in your current window are saved with a timestamp. The tabs remain open.
From tab-stash.sheet.tsx:135-139:
<Button
  variant="outline"
  onClick={() => stashTabs("current")}
  disabled={!hasPermissions || isStashing}
>
  {t("tab-stash.stash-current")}
</Button>

Stash All Windows

Saves tabs from all open browser windows as a single session.
1

Open Multiple Windows

Ensure you have at least 2 browser windows open. The button is disabled with only 1 window.
2

Click 'Stash All'

Click the Stash All button in the Tab Stash panel.
3

All Windows Saved

Tabs from all windows are saved, preserving which tabs belonged to which window.
From tab-stash.sheet.tsx:123-131:
<Button
  variant="outline"
  onClick={() => stashTabs("all")}
  disabled={!hasPermissions || isStashing || windowCount <= 1}
  title={windowCount <= 1 ? t("tab-stash.need-multiple-windows") : undefined}
>
  {t("tab-stash.stash-all")}
</Button>
The “Stash All” button is disabled if you only have one window open. You need at least 2 windows to use this feature.

Viewing Saved Sessions

From tab-stash.sheet.tsx:160-161:
<SessionList sessions={sessions} onSelectSession={setSelectedSession} />
Your saved sessions appear as a list showing:
  • Session Name: Timestamp of when the session was created (e.g., “12/5/2024, 3:45 PM”)
  • Tab Count: Number of tabs in the session
  • Window Count: Number of windows the tabs came from
  • Preview: Favicon grid showing the first few sites

Session Details

Click on any session to view detailed information:
1

Click Session

Click on a saved session in the list.
2

View Details

The session detail view shows:
  • Full list of all tabs with titles and URLs
  • Tab groups with their colors and labels
  • Pinned tabs marked with a pin icon
  • Window organization if from multiple windows
3

Back to List

Click the back button to return to the session list.
From tab-stash.sheet.tsx:108-115:
if (selectedSession) {
  return (
    <SessionView
      session={selectedSession}
      onBack={() => setSelectedSession(null)}
    />
  );
}

Restoring Sessions

Restore a saved session to reopen all the tabs exactly as they were.
1

Select Session

From the session list or detail view, find the session you want to restore.
2

Click 'Restore'

Click the Restore button for that session.
3

Tabs Open

  • First window’s tabs open in your current window
  • Additional windows (if any) open in new browser windows
  • Tab groups are recreated with their original colors and labels
  • Pinned tabs are restored in their pinned state
From tab-stash.store.ts:180-215, the restore process:
restoreSession: async (sessionId: string) => {
  const session = get().sessions.find((s) => s.id === sessionId);
  
  // Get current window
  const currentWindow = await chrome.windows.getCurrent();
  
  // Group tabs by their original window
  const tabsByWindow = groupTabsByWindow(session.tabs);
  const windowGroups = Object.entries(tabsByWindow).sort();
  
  // Restore first window to current window
  const [, firstWindowTabs] = windowGroups[0];
  await restoreTabsToExistingWindow(currentWindow.id!, firstWindowTabs);
  
  // Restore additional windows as new windows
  for (let i = 1; i < windowGroups.length; i++) {
    const [, tabs] = windowGroups[i];
    await restoreTabsToWindowWithGroups(tabs);
  }
}

Restore with Tab Groups

From tab-stash.utils.ts, tab groups are restored by:
  1. Creating tabs in the correct window
  2. Grouping related tabs together
  3. Applying the original group color and title
  4. Setting pinned status
Tab groups are a Chrome/Edge feature. In Firefox, tabs will restore without groups since Firefox has limited tab group support.

Managing Sessions

Rename Session

From tab-stash.store.ts:172-178:
renameSession: (sessionId: string, newName: string) => {
  set((state) => ({
    sessions: state.sessions.map((session) =>
      session.id === sessionId ? { ...session, name: newName } : session
    ),
  }));
}
1

Open Session Details

Click on a session to view its details.
2

Click Edit/Rename

Look for the rename or edit icon.
3

Enter New Name

Type a descriptive name for the session (e.g., “Research Project” or “Client Meeting Prep”).
4

Save

Press Enter or click save. The session name updates immediately.

Delete Session

From tab-stash.store.ts:160-170:
removeSession: async (sessionId: string) => {
  const deletedAt = Date.now();
  await db.tabStashes.update(sessionId, { deletedAt, updatedAt: deletedAt });
  set(s => ({ sessions: s.sessions.filter(session => session.id !== sessionId) }));
}
1

Find Session

Locate the session you want to delete in the session list.
2

Click Delete

Click the delete or trash icon for that session.
3

Confirm

Confirm the deletion. The session is removed from the list.
Deleted sessions are soft-deleted in the database but removed from the UI. Currently there’s no “undo” or “restore deleted sessions” feature.

Storage & Limits

Storage Location

From tab-stash.store.ts:236-254, sessions are stored in:
  • Chrome Storage: For quick access and state persistence
  • IndexedDB (Dexie): For full session data with tab metadata
  • Store name: meelio:local:tab-stash

Session Limits

From tab-stash.store.ts:110:
const MAX_TAB_STASHES = 100;
You can save up to 100 sessions. This limit prevents storage issues and ensures good performance. If you try to create a new stash when at the limit:
  • The addSession function returns undefined
  • An error message appears
  • You need to delete old sessions to make room

Data Migration

From tab-stash.store.ts:82-104, the store handles legacy data:
// Converts old format (urls array) to new format (tabsData)
tabs: ts.tabsData && ts.tabsData.length > 0
  ? ts.tabsData.map(tab => ({ /* full metadata */ }))
  : ts.urls.map(url => ({ /* minimal data */ }))
Old sessions with only URL arrays are automatically upgraded to include full tab metadata.

Window Detection

From tab-stash.sheet.tsx:86-106, the extension tracks window count:
const updateWindowCount = async () => {
  if (!chrome?.windows) return;
  const windows = await chrome.windows.getAll();
  setWindowCount(windows.length);
};

// Listeners for window changes
chrome.windows.onCreated.addListener(handleWindowChange);
chrome.windows.onRemoved.addListener(handleWindowChange);
This enables/disables the “Stash All” button based on whether you have multiple windows open.

Use Cases

Project Context Switching

Save tabs for different projects and switch between them instantly. Keep work, personal, and research tabs organized.

Daily Routines

Create morning, afternoon, and evening tab sets. Restore your routine tabs with one click.

Research Sessions

Save groups of research tabs for different topics. Return to your research exactly where you left off.

Clean Slate

Stash all tabs before starting a focused work session. Restore them later when you’re ready to multitask again.

Browser Compatibility

Full Support
  • Tab groups fully supported
  • Tab group colors and labels preserved
  • Multi-window stashing works perfectly
  • Pinned tabs restored correctly

Extension-Only Feature

From tab-stash.sheet.tsx:171-191:
const isExtension = typeof chrome !== "undefined" && !!chrome.storage;
Tab Stash requires browser extension APIs for:
  • Accessing tab information
  • Creating and managing tab groups
  • Opening tabs in new windows
The web version shows:
"Tab stashing functionality is only available in the browser extension."
Tab Stash only works in the browser extension. It cannot function in the web app version.

Privacy & Data

  • Tab data is stored locally in IndexedDB
  • No tab content or page data is captured (only URLs and metadata)
  • Tab history is not sent to Meelio servers
  • Optional: Sync sessions across devices when signed in

Troubleshooting

  • Check if you’ve already granted permissions in the past
  • Look in browser settings > Extensions > Meelio > Permissions
  • Try clicking the “Grant Permission” button in the Tab Stash panel
  • Refresh the extension or restart your browser
  • Verify the session data contains the tabs (check session detail view)
  • Check if you’re hitting browser popup blocker limits
  • Some URLs may be restricted by browser security (chrome://, about://, etc.)
  • Try restoring in smaller batches by deleting some tabs from the session first
  • This is expected in Firefox (tab groups not supported)
  • In Chrome/Edge, check if you’ve granted the tabGroups permission
  • Try re-granting permissions: revoke and grant again
  • You’ve hit the 100 session limit
  • Delete old or unused sessions to make room
  • Export important sessions if you need to keep them for reference
  • Check if you’re signed in to the same user account
  • Verify browser storage permissions haven’t been revoked
  • Check browser console for IndexedDB errors
  • Sessions are user-specific; switching users will show different sessions

Bookmarks

Manage permanent links vs. temporary tab sessions

Site Blocker

Block distracting sites while working on a focused session

Task Management

Associate task lists with specific tab stash sessions

Settings

Configure Tab Stash behavior and preferences

Build docs developers (and LLMs) love