Enuff is enuff.

Find every sender that won't shut up. Make them stop.

Local-first · No credentials · Curated by you

1

Pick how to run it

Two ways in. Both run the same scan → review → act flow with the same safety rules — only the entry point differs. Assumes you already have Claude Code installed.

Best for: trying it before installing, dev containers, ephemeral sandboxes. No git or GitHub account required.

  1. Go to github.com/codecoincognition/enuff-is-enuff-unsubscribe
  2. Click the green Code button → Download ZIP
  3. Unzip it (double-click on Mac; right-click → Extract on Windows). You'll get a folder named enuff-is-enuff-unsubscribe-main.
  4. Move it somewhere easy to find — your Desktop works.
  5. Open Terminal (Mac: Cmd + Space, type Terminal; Windows: Win + X, click Windows PowerShell), then:
cd ~/Desktop/enuff-is-enuff-unsubscribe-main
claude

The repo's CLAUDE.md auto-loads and Claude greets you. From here you don't run any commands yourself — you just talk to Claude in plain English. The next steps tell you what to say.

Already have git? One-liner alternative
git clone https://github.com/codecoincognition/enuff-is-enuff-unsubscribe.git
cd enuff-is-enuff-unsubscribe
claude

Best for: always-on access from any project.

Install from the public repo (one-step, shareable) — in any Claude Code session, run:

/plugin marketplace add codecoincognition/enuff-is-enuff-unsubscribe
/plugin install enuff-is-enuff-unsubscribe@enuff-is-enuff-local
/reload-plugins

Or install from a local clone (good for testing changes you've made):

git clone https://github.com/codecoincognition/enuff-is-enuff-unsubscribe.git
# in any Claude Code session:
/plugin marketplace add ./enuff-is-enuff-unsubscribe
/plugin install enuff-is-enuff-unsubscribe@enuff-is-enuff-local
/reload-plugins

Or load directly without a marketplace (fastest dev loop — no install, no caching):

claude --plugin-dir ./enuff-is-enuff-unsubscribe

Once loaded, slash commands work from anywhere:

/enuff-is-enuff-unsubscribe:scan ~/Downloads/INBOX.mbox/mbox
/enuff-is-enuff-unsubscribe:review
/enuff-is-enuff-unsubscribe:act

After editing any plugin file, run /reload-plugins again to pick up the changes.

Optional but strongly recommended: enable Chrome control

The act phase actually drives Chrome to flip the right toggles or click the right confirm buttons, then verifies the unsubscribe really took by reading the page state. Without browser control, the plugin runs in degraded mode — it can open unsubscribe URLs in your browser, but you click the toggles yourself and nothing is verified.

To enable real automation, install Claude for Chrome (Anthropic's official Chrome extension + MCP):

  1. Get the extension at claude.com/product/claude-for-chrome and follow the install steps.
  2. In any Claude Code session, run /mcp to confirm claude-in-chrome appears in the active MCP servers list.
  3. Try /chrome in Claude Code — it should attach to your running Chrome and open a tab.

Once installed, the act phase navigates each approved unsubscribe URL, identifies the provider (Substack settings page, Mailchimp confirmation, Beehiiv one-click, etc.), clicks the right control, and reads aria-checked (or equivalent DOM state) to verify the unsubscribe really happened. Every action is screenshotted to the action log.

Compatible alternatives

Any browser-control MCP that exposes navigate / click / read-DOM / screenshot will work — gstack /browse, custom Chrome DevTools Protocol MCPs, etc. The plugin uses generic browser-control patterns, not Anthropic-specific APIs.

No browser-control MCP? Still works. The plugin falls back to open <url> for each approved item and tells you exactly what to click in plain English. Slower, no verification, but safe and universal.
2

Export Your Mail

The scanner reads only an exported mailbox file (.mbox) or a folder of .eml files. Your live account is never touched.

Gmail (recommended)
  1. Go to Google Takeout
  2. Click Deselect all, then check Mail
  3. Choose all mail or specific labels
  4. Create the export and wait for the email link
  5. Download and unzip — the .mbox file is inside
Apple Mail (Mac)
  1. Open Mail
  2. Select one or more mailboxes in the sidebar
  3. Choose Mailbox > Export Mailbox
  4. Pick a folder and click Choose
Apple Mail .mbox is a folder. Point the scanner at the inner mbox file inside, e.g. ~/Downloads/INBOX.mbox/mbox.
Thunderbird

Use Thunderbird's profile mail folders or the ImportExportTools NG add-on. Each folder is a single .mbox-style file.

Proton Mail
  1. Use the official Proton Mail Export Tool
  2. Run a backup export to your device
  3. Point the scanner at the exported folder of .eml files
Fastmail
  1. Go to Settings > Migration
  2. Open the Export tab
  3. Create a new mail export for the folder/date range you want
  4. Download the zip and point the scanner at the contents
Outlook / Outlook.com

Outlook exports .pst files, which this prototype does not parse directly yet. For now, import the mail into Apple Mail or Thunderbird, then export .mbox.

Yahoo, AOL, iCloud, and other IMAP mail
  1. Add the account to Apple Mail or Thunderbird via IMAP
  2. Wait for the folders you care about to sync locally
  3. Export from that mail client as .mbox
Move the export into your enuff-is-enuff-unsubscribe-main folder. Drag the .mbox file (or .eml folder) from your Downloads into the project folder you set up in step 1. Then you can refer to it by just its filename — no long paths to remember.
3

Scan

Hand Claude the path to your export.

Tell Claude what to scan. If you moved the mailbox into the project folder (recommended in step 2), the filename alone is enough:

You typeScan INBOX.mbox/mbox

Or, if it's still in Downloads, give the full path:

You typeScan ~/Downloads/INBOX.mbox/mbox

That's the whole step. Claude does the rest.

Run the slash command with the full path to your export:

/enuff-is-enuff-unsubscribe:scan ~/Downloads/INBOX.mbox/mbox

The scanner reads only message headers — no bodies, no attachments — and writes summary state to a local enuff-is-enuff-report/ folder. Nothing is acted on, and the HTML report is not generated yet.

4

Review — in chat, brand by brand

Approval lives in the chat with Claude, not in the HTML. Claude reads the scan state, presents the brands grouped by stream, and asks which to flag — one company at a time.

You can pick at the stream level: flag Substack:newsletter while keeping Substack:marketing_promos. Locked streams (account/security, receipts, financial) are blocked from the prompt entirely.

Selection grammar

Confirm in the browser

Claude writes your selections to approved-actions.json and re-renders the HTML report so you can see your approved items highlighted in green.

open enuff-is-enuff-report/report.html
The HTML is read-only. There are no checkboxes inside — it's a confirmation surface, not a control panel. Use it to verify what you approved, then come back to Claude to act.
5

Act — one yes, the whole sweep

Tell Claude you're ready. First, Claude shows you the queue — a one-line summary of every approved item — and asks the single global gate:

Have you reviewed the report? Are you okay with everything?

One "yes" authorizes the whole queue. You curated it brand-by-brand in step 4; Claude won't ask again per URL — that would just be friction. After your yes, Claude works through the queue and announces each completion as it goes:

For every approved item, Claude:

  1. Navigates to the URL via Chrome control.
  2. Reads the actual page — never assumes from the URL shape. A disable_email?token=… URL looks like a one-click endpoint but is actually a Substack settings deep-link. URL pattern matching produces false confidence.
  3. Describes the action it's about to take, in one line (e.g., "This is the Substack settings page; the 'Marketing emails' toggle is currently on; I'll flip it off").
  4. Executes via real Chrome click events.
  5. Verifies via DOM state (aria-checked, page text, URL change) — never via response-body text scraping, which produces false positives.
  6. Screenshots the post-click state for the action log.
  7. If the page is ambiguous (login wall, unexpected popup, multiple plausible buttons), Claude does not click — marks the item as needs your verification in the summary.

Mailto unsubscribes are drafted and opened in your mail client pre-filled — you press send. Everything lands in action-log.md.

When the queue is drained, Claude posts an end-of-act summary with counts (completed / needs-verify / mailto-pending / failed), a per-item table with ✓ / ⚠ / ✗ icons, and a pointer to anything still needing your attention.

The global "yes" authorizes opening unsubscribe URLs and drafting mailto messages — nothing else. Claude never enters credentials, deletes or archives messages, creates filters, or sends mail on your behalf.

Troubleshooting

"node: command not found"
  • Node ships with Claude Code, so the install in step 1 should have given you both. Close and reopen Terminal/PowerShell.
  • Try running the Claude Code installer again.
Apple Mail .mbox folder doesn't scan

Apple Mail .mbox is a directory. Point the scanner at the inner file: ~/Downloads/INBOX.mbox/mbox, not the directory itself.

Scanner finds zero unsubscribe candidates

The heuristic flags streams with List-Unsubscribe headers and either high unread rate or volume. If the export is small (under ~50 messages), nothing may auto-qualify. Claude will still walk you through every brand in the review step so you can flag manually.

Approved item didn't appear in the report
  • The HTML report is regenerated on every review pass. If you edited approved-actions.json by hand, just tell Claude "re-render the report" — Claude knows the command.
  • Approved rows show a green badge, a green row highlight, and a top summary panel listing every approval.
Unsubscribe URL opens a confirm-button page

Some providers don't support one-click GET. Claude will detect the page and ask you to click the confirm button manually in your browser, then ask you to report back. The action log marks these as started in browser — user to confirm.

Privacy