Repository navigation
Conversation
Architecture - All tab operations now run in the module service worker; the popup only sends messages. Previously the popup ran the logic itself and was killed as soon as an action created or focused a window. - Pure URL logic (normalization, entity rules, duplicate detection, sort order) lives in src/lib/url.js with a node --test suite. - scripts/e2e.mjs drives a real headless Brave/Chromium over the DevTools protocol and exercises every action (make e2e). Fixes - "Bring All Windows To Front" never worked: the action entry lacked a callback and the handler reassigned a const. - Collate raced its own blank-tab cleanup and could close a window before its tabs were moved in. Windows are now created with their first tab, sequentially. - Sort and collate mixed pinned tabs into the sort order; pinned tabs are now never moved and tab groups stay contiguous and sorted by name. - Dedupe kept an arbitrary copy; it now keeps pinned, then active, then the most recently viewed tab. - Removed Bootstrap (160 KB) and the missing jQuery reference. Features - Duplicate rules: URLs that differ but mean the same page (PR subpages, Jira issue forms, LinkedIn profile tabs, Google Docs edit/view, Notion slugs, YouTube short links and 12 more) collapse to one key. Rules are user-editable JSON with a live tester. - Auto-deduplicate new tabs (opt-in): opening an already-open link closes the new tab and focuses the existing one. - Close Tabs Like This One: pick same domain, same site section, or same kind of page, with a preview and a keep-current toggle. - Group Tabs by Domain using native tab groups; Ungroup; Close Stale; Free Memory (discard); Park Window to Bookmarks and Restore Last Parked. - Preview list before any close from the popup, and Undo for the last close in the session. - Settings page: preferences and rules in chrome.storage.sync with local fallback, JSON export/import, and an optional remote rules URL refreshed on a schedule. Inline help in the popup and a help section in settings. - Keyboard shortcuts for every action, duplicate count badge, context menu grouped into sections, proper icon sizes, light and dark themes. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Moving a tab to another window drops it from its group. Consolidate and Split now move whole groups with tabGroups.move, merge into an existing group with the same name in the destination, and rebuild the group when only part of it moves or the browser cannot move groups across windows. Also adds `make dev`, which launches a throwaway browser profile with the extension loaded and two windows of sample tabs, and extends the e2e suite with group-merge and split assertions. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Dev and e2e browser profiles now live under ~/.holodeck, the designated throwaway sandbox. The dev profile is named in the browser so every window shows where you are. AGENTS.md documents the architecture rules, tests and the holodeck for contributors and AI agents; CLAUDE.md imports it. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The e2e job installs Chrome for Testing with @puppeteer/browsers into the holodeck and runs the suite headless. The script now identifies the extension by manifest name, since browsers ship built-in extensions with service workers of their own, and adds container-friendly flags under CI. Verified locally on Chrome for Testing 154 and Brave. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
zip ships with macOS and the CI runners, 7z does not. The package job uploads organize_tabs-<version>.zip as a workflow artifact after the unit and e2e jobs pass. The e2e script accepts EXT= to test an unzipped package, which is how this build was verified. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
A ground-up rewrite of the extension while keeping it vanilla JS with no build step and no dependencies. Fixes the long-standing bugs, adds entity-aware deduplication, respects pinned tabs and tab groups everywhere, and adds a real settings page with sync, export/import and remote rules.
Bugs fixed
callback:and the handler reassigned aconst.windows.createcalls each ran a global blank-tab sweep that could close a sibling window before its tabs arrived. Windows are now created sequentially.<srript>typo, and the missing jQuery reference.Features
chrome.storage.syncwith local fallback, JSON export/import, optional remote rules URL refreshed on a schedule.Testing it locally
make devseeds tabs that hit every rule (PR subpages, LinkedIn profile pages, YouTube short link, Stack Overflow/q/, wikipedia with utm/fragment/http) plus blank tabs, so you can click through Deduplicate, Close Tabs Like This One, Group by Domain, Sort, Consolidate and Split and watch what happens. The profile persists between runs;make dev-cleanremoves it.BROWSER=/path/to/chromium make devpicks another browser. Google Chrome's branded build no longer honours--load-extension, so for your real Chrome profile usechrome://extensions→ Load unpacked.Things worth checking by hand in your real profile:
Layout
Screenshots
🤖 Generated with Claude Code