Chrome Tab Groups API: Group Tabs and Manage Their State
Chrome divides tab grouping across two APIs. chrome.tabs.group changes which tabs belong together; chrome.tabGroups reads and changes the group's title, color and collapsed state. Treat group IDs as temporary browser objects, not permanent project IDs.

Separate membership from group appearance
Call chrome.tabs.group({ tabIds }) to create a group from selected tabs, or pass groupId to add tabs to an existing group. The call returns the group ID. Then chrome.tabGroups.update(groupId, { title, color }) can name and color that group. The tabGroups namespace itself does not add tabs to a group.
To remove selected tabs from their groups, call chrome.tabs.ungroup(tabIds). If a group becomes empty, Chrome removes it. Build the UI around this lifecycle rather than assuming every saved project always has a live browser group.
Request only the permission the feature needs
Chrome documents tabGroups as a named permission for reading or changing group properties. A feature that only creates groups through chrome.tabs.group has different needs from one that queries titles, colors or collapse state. If the UI also reads tab URLs and titles, evaluate tabs or host access separately.
Explain to the user which part of the feature touches browser groups and which part reads page metadata. A single vague 'manage all tabs' message hides those distinctions.
Do not persist group IDs as project identity
Chrome says group IDs are unique within a browser session. After a restart, a saved project should be reconnected by its own record ID and source URLs, not by an old groupId. Query live groups on demand and treat a missing group as a normal state.
Groups can also move between windows or disappear when closed. Listen for group events when the interface needs to update, but reconcile with current tabs and groups before a consequential action.

Account for window boundaries
Each TabGroup has a windowId. When grouping selected tabs, verify they are in a compatible window and choose the destination deliberately. If you must reorganize tabs across windows, move them first and check the result before grouping.
A group that moves between windows may be reported as removed from one window and created in another rather than a simple move event. Code that assumes a stable group ID and one event type can lose track of it.
Idea: task groups with durable notes
Create a named Chrome group for the pages needed now, and pair it with a durable project note containing purpose, findings and next action. The group is a convenient live arrangement; the note is the record that survives changes in the tab strip.
When the user returns, preview which saved links are already open, then offer to build a fresh group. This avoids treating a closed group as lost research.
Test the group lifecycle
Create a group, rename it, collapse it, move tabs out, close the last tab and restart Chrome. Confirm the UI shows the current state and does not reuse a stale group ID.
Include a case where the user manually renames or moves a group while the extension is open. Respect the user's browser changes instead of silently reverting them to an old saved value.
Tabzero: Browser Tab Manager & Notes
Save tab links, keep notes beside your sources, and return to what matters. Tabzero is in development preview; AI Notes remains planned.
Related guides
Chrome Scripting API: Read a Page Only When Needed
Use chrome.scripting.executeScript with activeTab or host access, understand injection limits, and build a reviewable page-capture flow.
Chrome Tab Messaging: Service Workers and Content Scripts
Use runtime.sendMessage and tabs.sendMessage for tab features, validate responses, and avoid assuming a content script is present.
Chrome Storage API for Tab Sessions: local, sync, and session
Choose the right chrome.storage area for tab notes, settings, and temporary state while respecting quotas and recovery limits.