{"slug": "show-hn-chrome-tab-group-cleaner-for-claude-code-created-tab-groups", "title": "Show HN: Chrome tab group cleaner for Claude Code created tab groups", "summary": "Franz Enzenhofer released chrome-tab-group-cleaner, an open-source tool that bulk-deletes saved tab groups in Chrome, addressing the 71 saved groups left behind by Claude Code in his browser. The tool, available as a Claude Code skill or CLI, requires Node 20+ and one runtime dependency, and it backs up the entire store before each delete. It can also handle orphaned tab entities and sync tombstones, though the developer notes that tombstone acceptance by Chrome builds is not verified against a real account.", "body_md": "**Chrome has no bulk delete for saved tab groups. This is one.**\n\n*71 saved groups, 70 of them left behind by Claude in Chrome. Chrome removes them\none right-click at a time.*\n\n*After delete --claude --orphans --restart. The one group that is not Claude's\nsurvives.*\n\nAs a Claude Code skill - the repo *is* the skill:\n\n```\ngit clone https://github.com/franzenzenhofer/chrome-tab-group-cleaner.git \\\n  ~/.claude/skills/chrome-tab-group-cleaner\ncd ~/.claude/skills/chrome-tab-group-cleaner && npm install && npm run build\n```\n\nThen ask for it: *\"get rid of all these Claude tab groups\"*.\n\nRather have your agent read it first? Paste this into Claude Code instead:\n\n```\nInstall https://github.com/franzenzenhofer/chrome-tab-group-cleaner as a global\nClaude Code skill. First clone it somewhere temporary and read SKILL.md, README.md\nand every file in src/, then tell me what it does, what it writes to, and anything\nyou find questionable - it deletes records from Chrome's profile database and can\nquit my browser. If it looks wrong, stop and say so instead of installing.\n\nIf it checks out: clone it to ~/.claude/skills/chrome-tab-group-cleaner, run\nnpm install && npm run gates, and show me `node dist/cli.js list --all-profiles`.\nNever delete without a --dry-run first, never quit my browser without telling me.\n```\n\nAs a plain CLI: clone anywhere, `npm install && npm run build`\n\n, then\n`node dist/cli.js --help`\n\n. Node 20+, one runtime dependency.\n\n```\nchrome-tab-group-cleaner list --all-profiles -v        # what is there\nchrome-tab-group-cleaner delete --claude --dry-run     # what would go\nchrome-tab-group-cleaner delete --claude --orphans --restart\nchrome-tab-group-cleaner restore --backup ~/.chrome-tab-group-cleaner/backups/Default-...\n```\n\nPick groups with `--all`\n\n, `--claude`\n\n, `--match <text>`\n\nor `--regex <pattern>`\n\n.\nThen `--browser chrome|chromium|brave|edge`\n\n, `--profile <dir>`\n\n, `--all-profiles`\n\n,\n`--orphans`\n\n, `--dry-run`\n\n, `--restart`\n\n, `--sync-tombstone`\n\n.\n\nThe browser must be quit for a delete: the store is locked, and a live browser\nrewrites it from memory on exit. `--restart`\n\nquits it and reopens your tabs.\nEvery delete backs the whole store up first; `restore`\n\nputs it back.\n\n```\n<user data>/<Profile>/Sync Data/LevelDB     one key per entity: saved_tab_group-dt-<uuid>\n\n{ 1: schema version, 2: SavedTabGroupSpecifics }\n\nSavedTabGroupSpecifics { 1: guid, 2: created µs, 3: updated µs, 4: group, 5: tab }\n  group { 2: title, 3: color, 4: position }\n  tab   { 1: group guid, 2: position, 3: url, 4: title }\n```\n\nA group is a group entity **plus** its tab entities - delete only the group and\nthe tabs linger as orphans, which is how Chrome leaves them too (`--orphans`\n\nsweeps those). `src/proto.ts`\n\nreads this wire format directly, no protobuf\ndependency.\n\nA profile that syncs tab groups re-downloads a local delete, so `delete`\n\nrefuses\nit. `--sync-tombstone`\n\ncommits the deletion instead: the data record goes, its\n`sync_pb::EntityMetadata`\n\nstays with `is_deleted = 1`\n\nand `sequence_number = acked_sequence_number + 1`\n\n, which the sync processor reads as a pending commit\nand sends to the account.\n\n```\n1 client_tag_hash   2 server_id       3 is_deleted            4 sequence_number\n5 acked_sequence_number               6 server_version\n7 creation_time ms  8 modification_time ms                    9 specifics_hash\n```\n\nThose bytes are covered by tests, and the field numbers were read out of a live store. Whether a given Chrome build accepts a tombstone it did not write itself is not verified against a real account - worst case, the groups come back.\n\n`npm run gates`\n\n- typecheck, lint, test, build. Tests build real LevelDB stores\nand read them back, no mocks.\n\nMIT", "url": "https://wpnews.pro/news/show-hn-chrome-tab-group-cleaner-for-claude-code-created-tab-groups", "canonical_source": "https://github.com/franzenzenhofer/chrome-tab-group-cleaner", "published_at": "2026-09-03 23:15:29+00:00", "updated_at": "2026-09-03 23:53:14.065827+00:00", "lang": "en", "topics": ["developer-tools", "ai-tools"], "entities": ["Franz Enzenhofer", "chrome-tab-group-cleaner", "Claude Code", "Chrome"], "alternates": {"html": "https://wpnews.pro/news/show-hn-chrome-tab-group-cleaner-for-claude-code-created-tab-groups", "markdown": "https://wpnews.pro/news/show-hn-chrome-tab-group-cleaner-for-claude-code-created-tab-groups.md", "text": "https://wpnews.pro/news/show-hn-chrome-tab-group-cleaner-for-claude-code-created-tab-groups.txt", "jsonld": "https://wpnews.pro/news/show-hn-chrome-tab-group-cleaner-for-claude-code-created-tab-groups.jsonld"}}