Chrome Windows API: Organize Tabs Across Multiple Windows
A tab has a windowId because tab organization spans more than one tab strip. chrome.windows lets an extension discover, create and focus browser windows, but the phrase 'current window' depends on where the extension code runs.

Identify the window the user means
chrome.windows.getCurrent() refers to the window containing the code that made the call. Chrome warns this is not necessarily the topmost or focused window. In a service worker, the current window falls back to the last active window, and there may be no current browser window in some circumstances.
Use chrome.windows.getLastFocused() when the feature means the window the user most recently interacted with. If no suitable normal window exists, show a clear empty state rather than silently creating one or operating on a popup.
List windows and their tabs carefully
chrome.windows.getAll({ populate: true }) includes Tab objects in each returned Window. If the feature reads tab URL, title, pendingUrl or favicon, Chrome requires tabs or matching host access for those sensitive fields. The ability to list windows alone is not the same as permission to inspect every page.
Filter by window type before showing a project inventory. A normal browsing window, popup and developer tools window serve different purposes. Store a project ID separately from windowId because browser window IDs are live-session identifiers, not durable records.
Create or focus a workspace deliberately
chrome.windows.create({ url, focused: true }) can open a new window. chrome.windows.update(windowId, { focused: true }) can bring an existing one forward. Use a user-triggered action and make the destination visible in the UI, especially if several windows have similar names or tabs.
Creating a window with a list of URLs may feel convenient, but it can flood the desktop. Preview the link count and let the person choose whether to reuse an existing window, create a new one or open only selected sources.

Expect focus changes and disappearance
windows.onFocusChanged can report WINDOW_ID_NONE when Chrome has lost focus. A window can also close while a tab move is running. Handle those cases by refreshing the window list and reporting which tabs moved successfully.
The windows API includes onCreated and onRemoved events. Use them to refresh a picker, then reconcile with getAll() before an action. An event stream alone is not a durable source of truth after a service-worker restart.
Idea: one-window-per-project restore
Offer a project restore preview with source titles and domains, then let the user open selected links in a new normal window. Add a note tab or project label if the product supports it, and keep a record of failed URLs so retrying does not duplicate successful opens.
This feature should be optional. Some people prefer tab groups within one window; others prefer windows separated by task. A good tab manager supports both arrangements without changing them unexpectedly.
Test with multiple window types
Open two normal windows and an extension popup, switch focus, close the chosen destination and retry a move. Verify the code never confuses the extension popup with the browser window that holds the user's work.
Also test the extension's behavior when it is not allowed in incognito. A separate permission boundary should not be papered over by an apparently empty tab list.
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.