Skip to content

Rebuild Cookie Quick Manager as Cookie Loom - #1

Merged
q1 merged 4 commits into
fpifrom
feat/cookie-loom
Oct 8, 2026
Merged

q1 merged 4 commits into
fpifrom
feat/cookie-loom

Conversation

@q1

@q1 q1 commented Oct 8, 2026 •

Copy link
Copy Markdown
Owner

What changes for users?

Rebuild Cookie Quick Manager as Cookie Loom, an independently maintained cookie manager for modern Firefox and Chromium. The new TypeScript/React/WXT workspace pairs a compact current-site popup with a full cookie workbench. Original GPL attribution and 65 historical files are preserved under legacy/; the browser packages contain the new implementation.

  • Create, inspect, edit, protect, delete, and restore cookies while retaining browser-store, path, host-only, container, first-party-isolation, and partition identity.
  • Preview native JSON, legacy JSON, and Netscape imports; export data explicitly; copy cookies between compatible stores with isolation safeguards.
  • Use a quieter, denser interface with responsive navigation, masked values, keyboard search, direct value copying, dirty-draft confirmation, and stale-edit protection.
  • Coordinate writes across extension pages, verify saved cookie identities independently, and expose explicit compatibility handling for legacy Netscape exports. A direct code review reproduced and fixed browser, concurrency, import, and async UI issues; see the review record.
  • Request website access explicitly. No analytics, account, backend, remote runtime assets, or automatic data upload.

Cookie Loom workbench

Verification

  • 144 unit tests passed, including callback-only messaging and concurrent mutation/protection regressions.
  • 57 Playwright checks passed across Chromium 149 and Firefox 151, including responsive layouts from 320 to 1440 pixels and native Chromium extension operations.
  • 13 native Firefox 151 checks passed, including containers, first-party isolation, partition identity, background lifecycle, host/domain cookie coexistence, and extension-page messaging to the production background.
  • Type checking, formatting, production dependency audit, both production builds, build verification, and ZIP integrity checks passed.
  • Firefox lint: no errors or unexpected warnings; two reviewed React vendor warnings are documented.
  • Extracted the source archive into an empty directory, installed from the lockfile, and reproduced all 22 files in each browser build byte for byte.

The T3 browser sandbox was unavailable in this environment; Playwright supplied browser verification. Native permission dialogs, signed store installation/update paths, and minimum-version browser checks remain manual release gates. See verification and visual verification.

Review notes

Required permissions are limited to cookies, storage, activeTab, and Firefox contextual identities. HTTP/HTTPS host access and scripting are optional. Cookie values and operations remain local; undo is session-scoped, and protection applies only to Cookie Loom cleanup.

The repository now includes pinned CI actions, reproducible unsigned browser/source artifacts, a build-content verifier, contributor and security guidance, issue forms, ownership, dependency maintenance, release instructions, and an explicit compatibility policy. Runtime dependency auditing is clean. A documented development-only node-forge advisory remains in the web-ext Android toolchain, outside the shipped bundles; no patched registry release is available. See dependency review.

This is a draft for review, not a signed store release.

@coderabbitai

coderabbitai Bot commented Oct 8, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Note

Currently processing new changes in this PR. This may take a few minutes, please wait...

⚙️ Run configuration
  • Configuration used: Repository YAML (base), Organization UI (inherited)
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 742b9185-68fe-4c6a-924e-3dd683b86895
📥 Commits

Reviewing files that changed from the base of the PR and between ef7d9e4 and 0ff9b40.

⛔ Files ignored due to path filters (78)
  • apps/extension/public/icon.svg is excluded by !**/*.svg
  • apps/extension/public/icons/128.png is excluded by !**/*.png
  • apps/extension/public/icons/16.png is excluded by !**/*.png
  • apps/extension/public/icons/32.png is excluded by !**/*.png
  • apps/extension/public/icons/48.png is excluded by !**/*.png
  • apps/extension/public/icons/96.png is excluded by !**/*.png
  • docs/design/narrow.png is excluded by !**/*.png
  • docs/design/popup.png is excluded by !**/*.png
  • docs/design/workbench-concept.png is excluded by !**/*.png
  • docs/design/workbench-dark.png is excluded by !**/*.png
  • docs/design/workbench-refinement-concept.png is excluded by !**/*.png
  • docs/design/workbench.png is excluded by !**/*.png
  • legacy/AMO/description/description_DE.txt is excluded by !legacy/**
  • legacy/AMO/description/description_FR.txt is excluded by !legacy/**
  • legacy/AMO/description/description_US.txt is excluded by !legacy/**
  • legacy/AMO/screenshots/android_capture1.png is excluded by !**/*.png, !legacy/**
  • legacy/AMO/screenshots/android_capture2.png is excluded by !**/*.png, !legacy/**
  • legacy/AMO/screenshots/capture0.png is excluded by !**/*.png, !legacy/**
  • legacy/AMO/screenshots/capture1.png is excluded by !**/*.png, !legacy/**
  • legacy/AMO/screenshots/capture10.png is excluded by !**/*.png, !legacy/**
  • legacy/AMO/screenshots/capture2.png is excluded by !**/*.png, !legacy/**
  • legacy/AMO/screenshots/capture3.png is excluded by !**/*.png, !legacy/**
  • legacy/AMO/screenshots/capture4.png is excluded by !**/*.png, !legacy/**
  • legacy/AMO/screenshots/capture5.png is excluded by !**/*.png, !legacy/**
  • legacy/AMO/screenshots/capture6.png is excluded by !**/*.png, !legacy/**
  • legacy/AMO/screenshots/capture7.png is excluded by !**/*.png, !legacy/**
  • legacy/AMO/screenshots/capture8.png is excluded by !**/*.png, !legacy/**
  • legacy/AMO/screenshots/capture9.png is excluded by !**/*.png, !legacy/**
  • legacy/AMO/screenshots/github.png is excluded by !**/*.png, !legacy/**
  • legacy/Makefile is excluded by !legacy/**
  • legacy/README.md is excluded by !legacy/**
  • legacy/src/_locales/de/messages.json is excluded by !legacy/**
  • legacy/src/_locales/en/messages.json is excluded by !legacy/**
  • legacy/src/_locales/fr/messages.json is excluded by !legacy/**
  • legacy/src/api.js is excluded by !legacy/**
  • legacy/src/background-script.js is excluded by !legacy/**
  • legacy/src/cookies.html is excluded by !legacy/**
  • legacy/src/cookies.js is excluded by !legacy/**
  • legacy/src/export.js is excluded by !legacy/**
  • legacy/src/hacker_style.css is excluded by !legacy/**
  • legacy/src/icons/briefcase.svg is excluded by !**/*.svg, !legacy/**
  • legacy/src/icons/cart.svg is excluded by !**/*.svg, !legacy/**
  • legacy/src/icons/chill.svg is excluded by !**/*.svg, !legacy/**
  • legacy/src/icons/circle.svg is excluded by !**/*.svg, !legacy/**
  • legacy/src/icons/dollar.svg is excluded by !**/*.svg, !legacy/**
  • legacy/src/icons/donate.svg is excluded by !**/*.svg, !legacy/**
  • legacy/src/icons/fence.svg is excluded by !**/*.svg, !legacy/**
  • legacy/src/icons/fingerprint.svg is excluded by !**/*.svg, !legacy/**
  • legacy/src/icons/food.svg is excluded by !**/*.svg, !legacy/**
  • legacy/src/icons/forbidden48.png is excluded by !**/*.png, !legacy/**
  • legacy/src/icons/fruit.svg is excluded by !**/*.svg, !legacy/**
  • legacy/src/icons/gift.svg is excluded by !**/*.svg, !legacy/**
  • legacy/src/icons/icon48.png is excluded by !**/*.png, !legacy/**
  • legacy/src/icons/icon96.png is excluded by !**/*.png, !legacy/**
  • legacy/src/icons/pet.svg is excluded by !**/*.svg, !legacy/**
  • legacy/src/icons/private-browsing.svg is excluded by !**/*.svg, !legacy/**
  • legacy/src/icons/tree.svg is excluded by !**/*.svg, !legacy/**
  • legacy/src/icons/vacation.svg is excluded by !**/*.svg, !legacy/**
  • legacy/src/internationalization.js is excluded by !legacy/**
  • legacy/src/manifest.json is excluded by !legacy/**
  • legacy/src/menu.html is excluded by !legacy/**
  • legacy/src/menu.js is excluded by !legacy/**
  • legacy/src/options.html is excluded by !legacy/**
  • legacy/src/options.js is excluded by !legacy/**
  • legacy/src/static/css/bootstrap-datetimepicker.min.css is excluded by !**/*.min.css, !legacy/**
  • legacy/src/static/css/bootstrap-theme.min.css is excluded by !**/*.min.css, !legacy/**
  • legacy/src/static/css/bootstrap.min.css is excluded by !**/*.min.css, !legacy/**
  • legacy/src/static/css/jquery-ui.min.css is excluded by !**/*.min.css, !legacy/**
  • legacy/src/static/fonts/glyphicons-halflings-regular.woff2 is excluded by !**/*.woff2, !legacy/**
  • legacy/src/static/js/bootstrap-3.3.7.min.js is excluded by !**/*.min.js, !legacy/**
  • legacy/src/static/js/bootstrap-datetimepicker-4.17.47.min.js is excluded by !**/*.min.js, !legacy/**
  • legacy/src/static/js/bootstrap-treeview-1.2.0.min.js is excluded by !**/*.min.js, !legacy/**
  • legacy/src/static/js/bootstrap-treeview.min.css is excluded by !**/*.min.css, !legacy/**
  • legacy/src/static/js/jquery-3.4.1.min.js is excluded by !**/*.min.js, !legacy/**
  • legacy/src/static/js/jquery.contextMenu-3.0.0-beta.1.min.js is excluded by !**/*.min.js, !legacy/**
  • legacy/src/static/js/jquery.contextMenu.min.css is excluded by !**/*.min.css, !legacy/**
  • legacy/src/static/js/moment-2.19.3.min.js is excluded by !**/*.min.js, !legacy/**
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (97)
  • .coderabbit.yaml
  • .editorconfig
  • .github/CODEOWNERS
  • .github/ISSUE_TEMPLATE/bug_report.yml
  • .github/ISSUE_TEMPLATE/config.yml
  • .github/ISSUE_TEMPLATE/feature_request.yml
  • .github/dependabot.yml
  • .github/pull_request_template.md
  • .github/workflows/ci.yml
  • .gitignore
  • .nvmrc
  • .prettierignore
  • .prettierrc.json
  • CHANGELOG.md
  • CODE_OF_CONDUCT.md
  • CONTRIBUTING.md
  • NOTICE
  • PRIVACY.md
  • README.md
  • SECURITY.md
  • THIRD_PARTY_NOTICES.md
  • apps/extension/entrypoints/background.ts
  • apps/extension/entrypoints/options.html
  • apps/extension/entrypoints/popup/index.html
  • apps/extension/entrypoints/workbench.html
  • apps/extension/index.html
  • apps/extension/package.json
  • apps/extension/public/LICENSE
  • apps/extension/public/NOTICE
  • apps/extension/public/PRIVACY.md
  • apps/extension/public/THIRD_PARTY_NOTICES.md
  • apps/extension/src/demo.tsx
  • apps/extension/src/lib/browser-gateway.ts
  • apps/extension/src/lib/demo-gateway.ts
  • apps/extension/src/lib/gateway.test.ts
  • apps/extension/src/lib/gateway.ts
  • apps/extension/src/lib/mutation-coordinator.test.ts
  • apps/extension/src/lib/mutation-coordinator.ts
  • apps/extension/src/lib/types.ts
  • apps/extension/src/lib/value-codecs.test.ts
  • apps/extension/src/lib/value-codecs.ts
  • apps/extension/src/options.tsx
  • apps/extension/src/popup.tsx
  • apps/extension/src/ui/CookieTable.tsx
  • apps/extension/src/ui/CopyDialog.tsx
  • apps/extension/src/ui/Editor.tsx
  • apps/extension/src/ui/Popup.tsx
  • apps/extension/src/ui/Settings.tsx
  • apps/extension/src/ui/Sidebar.tsx
  • apps/extension/src/ui/TransferDialog.tsx
  • apps/extension/src/ui/ValueTools.tsx
  • apps/extension/src/ui/Workbench.tsx
  • apps/extension/src/ui/context.tsx
  • apps/extension/src/ui/shared.tsx
  • apps/extension/src/ui/styles.css
  • apps/extension/src/ui/tokens.css
  • apps/extension/src/workbench.tsx
  • apps/extension/tsconfig.json
  • apps/extension/vite.demo.config.ts
  • apps/extension/wxt.config.ts
  • docs/architecture.md
  • docs/dependency-review.md
  • docs/design/README.md
  • docs/design/verification.md
  • docs/development.md
  • docs/maintaining.md
  • docs/migration.md
  • docs/releasing.md
  • docs/review-2026-10-08.md
  • docs/usage.md
  • docs/verification.md
  • licenses/wxt-MIT.txt
  • package.json
  • packages/core/README.md
  • packages/core/package.json
  • packages/core/src/cookie.ts
  • packages/core/src/core.test.ts
  • packages/core/src/index.ts
  • packages/core/src/search.ts
  • packages/core/src/transfer.ts
  • packages/core/src/types.ts
  • packages/core/tsconfig.json
  • playwright.config.ts
  • scripts/lint-firefox.mjs
  • scripts/prepare-assets.mjs
  • scripts/verify-builds.mjs
  • tests/e2e/demo.spec.ts
  • tests/e2e/extension.spec.ts
  • tests/e2e/fixtures.ts
  • tests/e2e/responsive.spec.ts
  • tests/e2e/review.spec.ts
  • tests/e2e/transfer-review.spec.ts
  • tests/firefox/README.md
  • tests/firefox/client.ts
  • tests/firefox/fixture.ts
  • tests/firefox/run.mjs
  • vitest.config.ts
✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
✨ Simplify code
  • Commit to this branch
  • Create a new PR
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Warning

Billing warning: we have not been able to collect payment for this subscription for more than 72 hours. Please update the payment method or pay any pending invoices in Billing to avoid service interruption.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@q1
q1 marked this pull request as ready for review October 8, 2026 23:45
@q1
q1 merged commit 6c72b53 into fpi Oct 8, 2026
5 of 6 checks passed
@q1
q1 deleted the feat/cookie-loom branch October 8, 2026 23:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant