Releases: furybee/chrome-tab-modifier
1.1.5
Changelog - Version 1.1.5
🐛 Bug Fixes
Critical: Chrome crash when using split view with grouped tabs
- Problem: Chrome crashes entirely when using "Add tab to new split view" on tabs that match a Tabee group rule
- Root cause:
chrome.tabs.group()API doesn't support tabs in split view (Chrome 140+) - Fix: Multi-layer split view detection and protection
- Track tabs entering/exiting split view via
changeInfo.splitViewId - Guard all grouping/ungrouping operations with split view checks
- Re-fetch tab state before each retry attempt
- Detect split view related errors and abort retries
- Track tabs entering/exiting split view via
- Impact: No more Chrome crashes when using split view feature
- Files changed:
src/background.tssrc/background/TabGroupsService.ts
Performance: Faster duplicate tab closing (unique feature)
- Problem: With "unique" enabled, duplicates were only closed 9+ seconds after page load
- Old behavior: Content script sent message → background closed duplicate (after page fully loaded)
- New behavior: Background script closes duplicates immediately during
tabs.onUpdatedevent - Impact: Duplicates now closed during page load (before it finishes), matching old tab-modifier speed
- Files changed:
src/background.tssrc/background/TabRulesService.tssrc/content/RuleApplicationService.ts
UI: Fixed icon picker not showing selected image
- Problem: When selecting an image icon, only the category emoji was displayed in the button
- Fix: Now displays the actual selected image thumbnail in the picker button
- Files changed:
src/components/options/center/sections/TabRules/EmojiIconPicker.vue
✨ New Features
Search bar for rules
- Feature: Instant search/filter for rules in the Rules page
- How it works:
- Search bar in the navbar (visible on Rules page)
- Filters rules by name, URL fragment, or title
- Real-time filtering as you type
- Keyboard shortcuts:
Ctrl+K(Windows/Linux) orCmd+K(Mac) to focus searchEscapeto clear search
- UI: Uses DaisyUI kbd badges to show platform-appropriate shortcut
- Files changed:
src/Options.vuesrc/components/options/center/sections/TabRulesPane.vuesrc/stores/rules.store.ts
Debug mode setting
- Feature: Control content script logging via settings
- How it works: Toggle in Settings to enable/disable debug logs in page console
- Files changed:
src/content/debugLog.tssrc/components/options/center/sections/SettingsPane.vue
📝 Documentation
CSS selector variables in title patterns
- Feature: Document existing
{.css-selector}feature in Help page - Use case: Extract text from page DOM and use in tab titles
- Example:
{.ytd-channel-name a} - {title}for YouTube channel names - Files changed:
src/components/options/center/sections/HelpPane.vue
🧪 Tests
Updated test suite
- Fixed tests for split view protection (added
chrome.tabs.getmock) - All 218 tests passing
- Files changed:
src/background/__tests__/TabGroupsService.test.tssrc/background/__tests__/TabRulesService.test.tssrc/background/__tests__/TabRulesService.unique.test.ts
🔧 Maintenance
Migration from yarn to npm
- Change: Project now uses npm instead of yarn
- Updates:
- CI workflow uses
npm ciandnpm runcommands resolutionsreplaced withoverridesin package.json- README.md updated with npm commands
- yarn.lock removed, package-lock.json added
- CI workflow uses
- Files changed:
.github/workflows/ci.ymlpackage.jsonREADME.mddocs/SECURITY.md
Package updates
- Updated dependencies to latest versions
- Applied ESLint formatting across codebase
🎯 User Impact
For users experiencing:
- ✅ Chrome crash with split view → FIXED
- ✅ Slow duplicate tab closing → FIXED (now instant during page load)
- ✅ Icon picker not showing image → FIXED
- ✅ Hard to find rules in long lists → NEW search bar with keyboard shortcut
📊 Metrics
- Test coverage: 218/218 tests passing
- Duplicate closing speed: Instant (during page load)
- Split view compatibility: Full protection against crashes
🔄 Migration Notes
No migration needed. All changes are backward compatible.
1.1.4
🐛 Critical Bug Fixes
Fixed SPA freeze issue (GitHub, Gmail, etc.)
- Problem: Extension caused Chrome to freeze when navigating on Single Page Applications
- Symptoms:
- Network requests hanging ("pending")
- Memory usage growing to GBs
- Page completely frozen
- Browser unresponsive
- Root cause:
UrlChangeDetectorwas observing entire document with aggressive throttlingMutationObserverfiring thousands of times during DOM changes
- Fix:
- Changed from throttling to debouncing (500ms wait after last mutation)
- Reduced observation scope to only
<title>element instead of entire document - Prevents callbacks during heavy DOM manipulation
- Impact: ~99% reduction in observer callbacks → massive performance improvement
- Files changed:
src/content/UrlChangeDetector.tssrc/content/RuleApplicationService.ts
Fixed "unique tab" closing wrong tabs
- Problem: Unique feature was closing unrelated tabs (e.g., Gmail when refreshing GitHub)
- Root cause:
- When
url_fragmentdoesn't contain$1placeholder,_processUrlFragment()returns same value for all URLs - This made all tabs appear as duplicates
- When
- Example scenario:
- Rule:
url_fragment: "github.com/issues",url_matcher: "github\.com/.+/issues/(\d+)" - GitHub tab: processed to
"github.com/issues" - Gmail tab: also processed to
"github.com/issues"(no match, returns fragment as-is) - Both equal → Gmail closed! ❌
- Rule:
- Fix:
- Added validation: tabs must match
url_matcherpattern before comparison - Without
url_matcher: compare exact URLs only - Prevents closing tabs that don't match the rule's pattern
- Added validation: tabs must match
- Impact: Unique feature now works correctly, no more random tab closures
- Files changed:
src/background/TabRulesService.ts - Tests added:
src/background/__tests__/TabRulesService.unique.test.ts(85 new test cases)
✨ New Features
Rule copy/paste functionality
- Feature: Copy rules to clipboard and paste them to duplicate
- How to use:
- Click copy icon next to a rule → copies to clipboard
- Click "Paste rule" button → creates new rule from clipboard
- Use case: Quickly duplicate rules with slight modifications
- Feature flag: Can be disabled via
FEATURE_FLAGS.ENABLE_RULE_COPY_PASTE - Files changed:
src/Options.vuesrc/stores/rules.store.tssrc/components/options/center/sections/TabRules/TableRules.vue
- Files added:
src/components/icons/ClipboardIcon.vue
Paste rule: Auto-refresh
- Problem: After pasting a rule, the list didn't refresh to show the new rule
- Fix: Store automatically refreshes after paste operation
- Files changed:
src/Options.vue
🔧 Technical Improvements
Feature flags system
- Added:
src/common/feature-flags.tsfor toggling experimental features - Current flags:
ENABLE_RULE_COPY_PASTE: Enable/disable copy/paste functionality
URL change detection optimization
- Before: Throttled MutationObserver checking every 100ms during mutations
- After: Debounced observer waiting 500ms after mutations settle
- Result: Only checks URL after DOM changes complete, not during
Observer lifecycle management
- Properly disconnect observers before creating new ones
- Prevents memory leaks from accumulated observers
- Better performance on long-running tabs
🧪 Tests
Comprehensive unique tab test suite
- 85+ new test cases covering all unique tab scenarios
- Tests for GitHub-style URLs with issue numbers
- Tests for simple CONTAINS detection without url_matcher
- Edge cases: nested duplicates, different issue numbers, etc.
- Files added:
src/background/__tests__/TabRulesService.unique.test.ts
🎯 User Impact
For users experiencing Chrome freezing:
- ✅ FIXED: GitHub navigation no longer freezes
- ✅ FIXED: Gmail and other SPAs work smoothly
- ✅ FIXED: Network requests complete normally
- ✅ FIXED: Memory usage stays stable (no more GB growth)
For users experiencing unique tab issues:
- ✅ FIXED: Unique feature no longer closes random tabs
- ✅ FIXED: Gmail won't close when refreshing GitHub
- ✅ FIXED: Only true duplicates are closed
For users wanting to duplicate rules:
- ✅ NEW: Copy/paste rules for quick duplication
📊 Performance Metrics
- Observer callbacks: ~99% reduction on SPAs (thousands → ~10 per navigation)
- Memory usage: Stable (prevents GB-scale growth)
- CPU usage: Dramatically reduced during SPA navigation
- Debounce delay: 500ms after DOM changes settle
- Test coverage: 218 tests passing
🔄 Migration Notes
No migration needed. All changes are backward compatible.
For users with unique tab rules:
If you were experiencing tabs closing incorrectly, this should now work as expected.
For REGEX users:
Patterns with nested quantifiers (e.g., (?:[\w-]+\.)*) are blocked for security.
Use simplified patterns instead: google\.com/.*/u/5/
⚠️ Known Issues
None reported. All critical bugs from 1.1.3 have been resolved.
1.1.3
✨ New Features
Tab Grouping: Fixed race condition
- Problem: Tab groups would appear and disappear rapidly during page load
- Fix: Improved timing logic to prevent race conditions between group creation and tab loading
- Impact: Tab grouping now works reliably and consistently
- Files changed:
src/background.ts
Tab Hive: Reject list with context menu
- Feature: Added ability to exclude URLs or domains from Tab Hive auto-close
- How to use: Right-click on a tab → "Don't auto-close this domain/URL"
- Storage: Rejected patterns saved in settings
- Files added: Context menu integration in
src/background/ContextMenuService.ts
Tab Hive: Settings UI
- Feature: New dedicated settings panel for Tab Hive configuration
- What's included:
- Manage reject list (view/edit/delete excluded URLs/domains)
- Configure auto-close timeout
- Enable/disable Tab Hive
- Files changed:
src/background.ts, Tab Hive settings components
Tab Hive: Improved reliability in service worker
- Problem: Auto-close feature was unreliable with service worker lifecycle
- Fix: Switched from
setIntervaltochrome.alarmsAPI for persistent timers - Impact: Tab Hive auto-close now works consistently, even after service worker suspends
- Files changed:
src/background/TabHiveService.ts
Emoji support for tab icons
- Feature: Added emoji picker for tab icons
- What's included:
- 740+ emojis across 8 categories (Smileys, Animals, Objects, etc.)
- Search functionality
- Categorized tabs
- Files added:
src/common/emoji-data/categories/*.ts
SidePanel: Reload active tab after saving rule
- Feature: When saving a rule in the sidepanel, the active tab automatically reloads
- Impact: Rule changes apply immediately without manual refresh
- Files changed:
src/SidePanel.vue
Icon field: Clear button
- Feature: Added clear button (×) to easily remove icon from a rule
- Impact: Better UX for icon management
- Files changed: Rule form components
🎨 UI Improvements
Tab Hive: Improved styling
- Added primary color to bordered tabs in Tab Hive list
- Better visual hierarchy and consistency
- Files changed: Tab Hive components
Mobile: Fixed sidebar z-index
- Problem: Sidebar was appearing below other elements on mobile
- Fix: Adjusted z-index for proper layering
- Files changed: Sidebar styling
🐛 Bug Fixes
Tab grouping race condition
- Groups no longer flicker or disappear during page load
- Consistent behavior across all detection types (CONTAINS, REGEX, etc.)
📊 What's New
- New icons: 11 star-themed bullet icons (all colors)
- New test suite: Detection vs Uniqueness test cases (
detection-vs-uniqueness.test.ts) - Context menu: Enhanced with Tab Hive reject options
🎯 User Impact
For users experiencing:
- ✅ Tab groups disappearing → FIXED (race condition resolved)
- ✅ Tab Hive not working reliably → FIXED (service worker alarms)
- ✅ No way to exclude tabs from auto-close → ADDED (reject list)
- ✅ Want to use emojis as icons → ADDED (emoji picker)
- ✅ Rules don't apply immediately in sidepanel → FIXED (auto-reload)
🔄 Migration Notes
No migration needed. All changes are backward compatible.
New features (emoji picker, Tab Hive reject list) are opt-in.
1.1.2
What's Fixed
🚨 Critical: Storage Limit Issues
Fixed critical storage limit problems that could cause data loss or extension malfunction:
- Migrated from Chrome sync storage (100KB limit) to local storage (10MB limit)
- Implemented compression using LZ-String to reduce storage footprint
- Removed chunking system (no longer needed with local storage)
- Added automatic migration from old sync storage format
- Storage size reduced by ~60-70% thanks to compression
🚨 Critical: Unique Tab Rule Closing Random tabs
Enhanced the "unique tab" functionality:
- Fixed rule application logic for unique tabs
- Better handling of duplicate detection
- Improved URL change detection with new
UrlChangeDetectorservice - Added 319 new tests specifically for unique tab scenarios
📋 Storage Migration
Complete storage system overhaul:
- Converted
storage.test.jsto TypeScript (storage.test.ts) - Added 391 comprehensive storage tests
- Tests for migration, compression, and edge cases
- Backward compatibility maintained for existing users
🎯 Settings Improvements
Enhanced Settings pane:
- Better organization and layout
- Improved storage limit warnings
- Added migration status indicators
🤖 CI/CD Improvements
Enhanced GitHub Actions workflow:
- Auto-build on pull requests
- Better test coverage reporting
- Multiple workflow fixes and improvements
📊 By The Numbers
- ✅ New tests
- ✅ Storage capacity: 100KB → 10MB (100x increase)
- ✅ Storage usage: -60-70% (thanks to compression)
- ✅ 17 files modified
- ✅ 2,303 lines added, 1,171 lines removed
🧪 Testing
New comprehensive test suites:
TabRulesService.unique.test.tsTabRulesService.unique.bug.test.tsstorage.test.tsUrlChangeDetector.test.tsStorageService.test.ts
📝 Documentation
- Added
docs/unique-pattern-proposal.mdwith detailed proposal for unique tab patterns
🐛 Bug Fixes
- Fixed storage limit errors that prevented saving rules
- Fixed unique tab rule not working correctly
- Fixed rule application timing issues
- Improved URL change detection reliability
- Better error handling for storage operations
⚠️ Breaking Changes
None! All existing data is automatically migrated to the new storage format.
🙏 Thanks
Thank you to everyone who reported storage issues! Your feedback helped us identify and fix critical problems.
📦 Installation
Update via Chrome Web Store.
Full Changelog: v1.1.1...release/1.1.2
1.1.1
What's Fixed
🚨 Critical: Unique Tab Closing All Tabs
Fixed a critical bug where enabling the "unique" option would close all open tabs instead of just duplicates. This was caused by inverted logic in the duplicate detection code.
🎯 Disabled Rules Now Actually Disabled
Fixed disabled rules still matching URLs and blocking enabled rules from working. For example, a disabled rule with .* pattern would prevent all other rules from functioning.
📁 No More Duplicate Tab Groups
Fixed excessive duplicate group creation. Previously, you could end up with 10+ groups named "GitHub" or "YouTube". The extension now properly reuses existing groups.
🔧 TypeScript Build Errors
Fixed compilation errors that prevented clean builds.
📊 By The Numbers
- ✅ 4 critical bugs fixed
- ✅ 181 tests passing (+17 new tests)
- ✅ 9 new tests for tab groups
- ✅ 5 new tests for unique tabs
- ✅ 3 new tests for disabled rules
🙏 Thanks
Thank you to everyone who reported these issues! Your feedback helps make Tabee better.
📦 Installation
Update via Chrome Web Store.
Full Changelog: 1.1.0...1.1.1
1.1.0
🧩 Changes List - Tabee v1.1.0
🎨 Branding & Identity
- 🐝 New name: Chrome Tab Modifier → Tabee
- 🎨 New icon & branding: Bee-inspired design with minimal yellow-black aesthetic
- 🏁 Published under new developer account
✨ New Features
🍯 Tab Hive (Auto-Close Inactive Tabs)
- Automatically closes tabs inactive for a specified duration
- Closed tabs saved in side panel for easy restoration
- Grouped by domain for better organization
- SHA-256 hash-based duplicate detection (no duplicate entries)
- Search functionality to filter tabs by URL or title
- Real-time activity tracking with visual feedback
🌐 Side Panel
- Two tabs: "Add Rule" and "🍯 Tab Hive"
- Quick access to create rules from current tab
- Restore closed tabs with one click
- Clear all closed tabs option
🖼️ Image Paste Support for Icons
- Paste images directly from clipboard into the "Icon" field
- Automatic base64 Data URI conversion
- Support for PNG, JPEG, GIF, WebP formats
- Visual preview of pasted images
🔍 Spot Search - Quick Tab & Bookmark Finder
- Instant search across all open tabs and bookmarks with Alt+Shift+E (or Cmd+Shift+E on Mac)
- Real-time filtering as you type - search by title, URL, or tab group name
- Keyboard navigation - use arrow keys (↑↓) to navigate, Enter to select, Escape to close
- Visual indicators - displays favicons, tab group badges with colors, and bookmark icons
- Smart activation - clicking a tab brings it to focus, clicking a bookmark opens it in a new tab
- Dark theme UI - elegant overlay with smooth animations
- Performance optimized - filters chrome:// internal pages automatically
♻️ Sync Mode
- Automatically save and restore tab renaming rules across multiple devices
- Chrome Storage Sync integration
🍀 Lightweight Mode
- Disable listeners on specific domains or patterns
- Reduce memory usage on specified sites
- Regex or domain-based pattern matching
🎯 Context Menu Enhancements
- ✏️ Rename Tab - Quick rename with emoji
- 🪟 Merge All Windows - Combine all browser windows
- 🍯 Send to Tab Hive - Manually send tab to hive
🔧 Technical Improvements
🏗️ Architecture Refactoring (SOLID Principles)
Background Services:
- TabRulesService.ts - Rule application logic
- TabGroupsService.ts - Tab grouping management
- TabHiveService.ts - Auto-close & tab hive management
- WindowService.ts - Window merging operations
- ContextMenuService.ts - Context menu handling
- Result: background.ts reduced from 820 → 265 lines (68% reduction)
Content Services:
- RegexService.ts - Safe regex validation (ReDoS protection)
- TitleService.ts - Title processing & DOM extraction
- IconService.ts - Favicon management
- StorageService.ts - Storage & rule matching
- RuleApplicationService.ts - Rule orchestration
- Result: content.js reduced from 390 → 56 lines (85% reduction)
🧪 Test Coverage
- More tests!
- 100% pass rate
- Comprehensive coverage for all services
- Background services: 35 tests
- Content services: 57 tests
- Integration tests maintained
📝 Help Section Updates
- Emojis added to all section titles (💡✨⌨️📋📝)
- Removed non-functional "Open Side Panel" keyboard shortcut
- Updated documentation for new features
🔐 Security
- ReDoS (Regular Expression Denial of Service) protection
- Safe regex validation for all user-provided patterns
- SHA-256 hashing for URL comparison
🌍 Logging & Debugging
- Comprehensive logging with emoji indicators (🍯 for Tab Hive operations)
- Detailed console output for troubleshooting
- Error tracking throughout the extension
📦 Build & Tooling
- Full TypeScript migration for background and content scripts
- Vite build optimization
- Modern ES modules architecture
- Improved type safety throughout
🐛 Bug Fixes
- Fixed Wikipedia sample rule regex to support both dash types (— and -)
- Fixed dynamic initialization of auto-close when toggled in settings
- Improved error handling in tab grouping with retry logic
- Fixed capture group support in URL fragments for unique tabs
Migration from Chrome Tab Modifier: All existing rules, groups, and settings are preserved. The extension maintains full backward compatibility while adding new features.
Full Changelog: 1.0.17...1.1.0
1.0.17
What's Changed
- Revert "feat: add support mode (#432)" by @sebastienfontaine in #444
Full Changelog: 1.0.14...1.0.17
1.0.13
What's Changed
- feat: add a transparent icon
- fix: add enable / disable label for rule activation
- fix: tooltip when too long
- chore: upgrade packages
- chore(readme): github glob example
- chore: upgrade crxjs vite plugin (csp)
Full Changelog: 1.0.12...1.0.13
1.0.12
What's Changed
- fix(csp): use workaround because chrome 130 will introduce a bug
- chore(deps): upgrade packages
Full Changelog: 1.0.11...1.0.12
1.0.11
What's Changed
- fix: icon issue for some websites by @sebastienfontaine in #356
- fix: old config import by @sebastienfontaine in #357
Full Changelog: 1.0.10...1.0.11