Automated data broker removal tool — close your accounts, erase your data. Beta — Core features are stable and tested. Some advanced features (web-form CAPTCHA solving, DPA auto-filing) require manual setup or are event-flagged only.
What's inside
FAQ
symaira-eraseme is a Claude Code plugin with 1 hand-picked skill for security work, indexed on Flowy. Install it with the command on its page. It includes contribute-broker. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.
$ npx -y skills add danieljustus/symaira-eraseme --agent claude-code
Automated data broker removal tool — close your accounts, erase your data.
Beta — Core features are stable and tested. Some advanced features (web-form CAPTCHA solving, DPA auto-filing) require manual setup or are event-flagged only.

Symaira EraseMe helps you exercise your GDPR/CCPA right to erasure against data brokers. It provides:
symeraseme review <file> — step through detected PII in a terminal UI and choose to keep, redact, or skip each match before saving the cleaned file.symeraseme serve — exposes a redact_file tool to MCP clients such as Claude Code or Cursor, letting AI agents redact files inside the workspace root.End users (from PyPI):
pip install symeraseme
Optional extras:
pip install symeraseme[web] # Playwright-based browser automation
pip install symeraseme[triage] # LLM triage via Anthropic Claude
macOS users (via Homebrew):
brew tap danieljustus/tap
brew install symeraseme
This installs the Symaira EraseMe command-line tool. The macOS graphical app is distributed separately as a DMG from the GitHub release.
Developers (from source):
# Clone the repository
git clone https://github.com/danieljustus/Symaira-EraseMe.git
cd symaira-eraseme
# Install dependencies with uv
uv sync
uv pip install -e ".[dev,web,triage]"
# Configure your environment
cp .env.example .env
# Edit .env and add your ANTHROPIC_API_KEY
See .env.example for all supported environment variables.
Symaira EraseMe supports Symaira Vault
for centralized secret management. Instead of storing credentials in environment
variables or the system keyring, you can reference them via vault:// URIs:
# Store a secret in Symaira Vault
symvault set anthropic/prod-key "sk-ant-..."
# Reference it in your .env or profile config
export ANTHROPIC_API_KEY="vault://anthropic/prod-key"
export CAPSOLVER_API_KEY="vault://captcha/capsolver"
export IMAP_PASSWORD="vault://email/imap-password"
When Symaira EraseMe encounters a vault:// URI, it transparently resolves it
by calling symvault get <path> --print. The fallback chain is:
symvault get <path> --print (requires symvault on PATH)keyring package (for IMAP credentials)If symvault is not installed, the system falls back to the plain-text value
in the environment variable. No crash, no error — just a debug log.
Security: Secret values are never written to logs, tracebacks, or structured logging events.
# Verify installation
symeraseme --version
# Initialize your profile with personal details
symeraseme init-profile
# List all registered brokers, optionally filtered by jurisdiction or law
symeraseme brokers list --law GDPR
# Show details for a specific broker
symeraseme brokers show --name spokeo
$ symeraseme init-profile
✓ Profile saved to ~/.config/symeraseme/profile.json
$ symeraseme brokers list --law GDPR
┏━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Name ┃ Website ┃ Jurisdiction ┃
┡━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ Spokeo │ https://www.spokeo.com │ CCPA │
│ Intelius │ https://www.intelius.com │ CCPA │
│ Acxiom (EU) │ https://www.acxiom.com │ GDPR │
│ Schufa │ https://www.schufa.de │ GDPR │
└──────────────┴─────────────────────────────┴───────────────┘
$ symeraseme plan create --campaign initial --jurisdiction GDPR --max 5
✓ Plan created: 5 brokers selected
Campaign: initial
$ symeraseme plan status
Campaign: initial
┏━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━┓
┃ Broker ┃ Status ┃ Deadline ┃
┡━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━┩
│ Acxiom (EU) │ planned │ — │
│ Schufa │ planned │ — │
│ Experian EU │ planned │ — │
│ Equifax EU │ planned │ — │
│ Creditreform│ planned │ — │
└─────────────┴─────────────┴──────────────────────┘
# Create a removal plan for GDPR brokers (limit to 10)
symeraseme plan create --campaign initial --jurisdiction GDPR --max 10
# Review the plan before sending
symeraseme plan show --campaign initial
# Execute the plan in batches (respects rate limits, requires consent)
symeraseme plan execute --campaign initial --batch-size 5 --delay 30 --yes
# Check overall campaign progress
symeraseme plan status
# View deadline calendar and upcoming tick actions
symeraseme calendar --weeks 4
[triage] extra)# Poll your IMAP inbox for broker replies
symeraseme poll-inbox --username your@email.com
# Classify a broker reply via LLM
symeraseme classify-reply <request_id>
# Generate a jurisdiction-aware rebuttal for a rejection
symeraseme generate-rebuttal <request_id>
[web] extra)# Run a broker's web-form opt-out via Playwright
symeraseme run-web-form <broker_id>
# List manual fallback tasks for forms that couldn't be automated
symeraseme manual-tasks list
# Mark a manual task as completed
symeraseme manual-tasks complete <task_id>
# Run the tick engine (checks deadlines, reminders, escalations)
symeraseme plan tick --dry-run
symeraseme plan tick
# Generate scheduler configs (cron / launchd / systemd)
symeraseme generate-scheduler --output-dir ./schedules
# Install schedules
symeraseme schedule install
# Generate a dashboard report
symeraseme generate-dashboard
# Export campaign data for GDPR record-keeping
symeraseme export --format json --output campaign.json
# Validate registry YAML files against the schema
symeraseme validate
# Show event history for a request
symeraseme events show <request_id>
# List all removal requests
symeraseme requests list --status pending
# Grant consent for destructive operations
symeraseme grant execute --ttl 3600
# Review a file interactively and choose which PII to redact
symeraseme review <file>
# Start the local MCP JSON-RPC server (default: 127.0.0.1:8000)
symeraseme serve
# Bind to a different host/port
symeraseme serve --host 127.0.0.1 --port 8080
# Allow non-loopback binds on trusted networks
symeraseme serve --host 0.0.0.0 --port 8000 --allow-remote
The MCP server exposes one tool:
| Tool | Description | Input schema |
|---|---|---|
redact_file | Reads a file, runs PII redaction on it, and returns the redacted content. | { "path": "string" } (path is required) |
Example MCP client config:
{
"mcpServers": {
"symeraseme": {
"command": "sh",
"args": [
"-c",
"TOKEN=$(cat ~/.symeraseme/mcp_token 2>/dev/null || echo ''); exec symeraseme serve --host 127.0.0.1 --port 8000"
],
"env": {
"MCP_AUTH_TOKEN": "$TOKEN"
}
}
}
}
Alternatively, configure the MCP client to pass the token as an Authorization: Bearer <token> header on every request. The token is generated fresh on each server start and written to <data_dir>/mcp_token.
Security: the MCP server uses per-run Bearer-token authentication. The token is written to
<data_dir>/mcp_tokenon startup and must be included as anAuthorization: Bearer <token>header on every request. The default127.0.0.1bind is reachable only from the local machine. Use--allow-remoteonly on trusted networks.
Run symeraseme --help for a full list of commands and options.
Symaira EraseMe uses an event-sourced architecture built on SQLite:
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ CLI / │────▶│ Event │────▶│ Request │
│ Skills │ │ Store │ │ State │
└─────────────┘ │ (SQLite) │ │ (Projection)│
└──────────────┘ └─────────────┘
│
┌──────┴──────┐
▼ ▼
┌──────────┐ ┌──────────┐
│ Tick │ │ Reports │
│ Engine │ │ / Export │
└──────────┘ └──────────┘
The broker registry is kept fresh by two scheduled GitHub Actions:
registry-scanner (Sundays, 00:00 UTC) — fetches the latest data-broker
registries published by US states (e.g. California, Vermont, Oregon, Texas),
normalizes the records into YAML entries, and opens a pull request for any
additions or changes.registry-link-check (Mondays, 06:00 UTC) — issues a HEAD request to
every broker's website field and reports unreachable URLs so dead entries
can be retired or corrected.You can also run the sync manually:
uv run python scripts/registry_sync.py
uv sync --all-extras
uv pip install -e ".[dev,web,triage]"
pre-commit install
The pre-commit hooks include:
CI additionally runs TruffleHog for comprehensive secrets scanning on every pull request.
uv run pytest --verbose --tb=short
uv run ruff check src/symeraseme/
uv run ruff format --check src/symeraseme/
uv run mypy src/symeraseme/
All three checks run in CI on every push and pull request to the main branch.
src/symeraseme/
cli/ — Typer CLI application
core/ — Event store, projections, tick engine, templating, scheduler
registry/ — Broker loader, schema validation
services/ — CLI command handlers
adapters/ — Web (Playwright), Triage (Claude), Email (SMTP/IMAP)
registry/
brokers/ — YAML broker definitions (eu/, uk/, us/)
laws/ — Jinja2 legal templates (GDPR, CCPA, rebuttals)
schemas/ — JSON Schema for broker validation
skills/ — LLM agent skill files (Claude Code, Cursor, Windsurf, Hermes, Copilot, Codex)
examples/ — Integration examples for all supported AI agents
AGENTS.md — Setup guide for all AI agent integrations
Symaira EraseMe uses standard exit codes for scripting:
0 — Command completed successfully1 — General error (validation failure, database error, etc.)2 — Configuration error (missing/invalid identity profile, bad settings)3 — Network error (connection failures, e.g. IMAP/SMTP/HTTP)Error: No identity profile found. Run 'symeraseme init-profile' first.
Create your identity profile before using any other commands:
symeraseme init-profile
If you see database errors, initialize the schema:
symeraseme db-init
For inbox triage commands (poll-inbox, classify-reply), ensure IMAP credentials are configured:
export IMAP_PASSWORD="your-app-password"
Use an app password if 2FA is enabled on your email account.
Web-form automation requires a CAPTCHA solver. Set the Capsolver API key:
export CAPSOLVER_API_KEY="CAP-..."
If you see a LINKEDIT alignment error on macOS 27 (Tahoe), reinstall pydantic_core from source:
pip install --force-reinstall --no-binary pydantic_core pydantic-core
For triage commands, ensure your LLM provider API key is set:
export ANTHROPIC_API_KEY="sk-ant-..."
Or use OpenAI:
export OPENAI_API_KEY="sk-..."
Commands like plan execute require explicit consent. Use the --yes flag for non-interactive mode:
symeraseme plan execute --campaign initial --yes
Or issue a consent token:
symeraseme grant execute --ttl 3600
version: 2; earlier files used version: 1. A legacy no-AAD fallback exists for version: 0 files only — any tampered ciphertext on version 1+ fails closed with InvalidTag.SYMERASEME_ENCRYPT_DB=1 is set, the SQLite database is encrypted at rest using AES-256-GCM with a key derived from your identity master key. Databases created before v0.2.0 used a fixed PBKDF2 salt (V1 format); newer databases use a per-file random salt (V2 format). On open, any V1 database is automatically re-encrypted to V2 transparently — no manual migration is required. On open, the database is decrypted to a temporary file with restrictive permissions (0o600). The temp file is placed in a secure temporary directory. On Linux /dev/shm (tmpfs, memory-backed) is used when available. On macOS and Windows the OS temp directory is used, which may be disk-backed. On normal exit, SIGTERM, or context close, the temp file is re-encrypted and removed. A startup scavenger removes any stale temp files older than 5 minutes from previous aborted runs. A SIGKILL (e.g., kill -9, OOM killer, or system crash) may leave the decrypted temp file behind temporarily; the 5-minute scavenger window limits exposure. If this is a concern for your threat model, consider running Symaira EraseMe on a single-user system, using full-disk encryption, or setting TMPDIR to a RAM disk (e.g., /dev/shm on Linux).--consent or the SYMERASEME_CONSENT environment variable are visible in process listings (ps aux), shell history, and crash dumps. On shared systems or CI runners, prefer --consent-file or SYMERASEME_CONSENT_FILE to read the token from a file with 0o600 permissions. The file is read once and the token is consumed (consume_token) after verification. Pipe-based input is supported: echo $TOKEN | symeraseme plan execute --consent-file /dev/stdin.Apache-2.0
.agents/
skills/
symaira-eraseme
.claude/
skills/
symaira-eraseme
.env.example
.github/
audit/
2026-05-20T08-05-00Z.md
2026-05-21T09-08-32Z.md
2026-05-26T09-00-00Z.md
branch-protection/
main.json
CODE_OF_CONDUCT.md
CODEOWNERS
coverage/
2026-06-29T18:40:18Z.md
2026-07-01T12:20:58Z.md
dependabot.yml
ISSUE_TEMPLATE/
broker.yml
bug.yml
config.yml
feature.yml
prerelease/
2026-06-29T17:32:57Z.md
2026-06-30T07:50:03Z.md
2026-07-01T12:15:00Z.md
PULL_REQUEST_TEMPLATE/
PULL_REQUEST_TEMPLATE.md
broker_update.md
review/
2026-05-19T17-42-30Z.md
2026-05-19T21-39-04Z.md
2026-05-22T10-09-55Z.md
2026-05-22T13-15-00Z.md
2026-05-27T12-32-04Z.md
2026-05-27T14-04-31Z.md
2026-05-28T10-21-00Z.md
2026-05-28T20-28-30Z.md
2026-05-28T22-41-00Z.md
2026-06-02T09-45-13Z.md
2026-06-02T12-52-10Z.md
2026-06-02T14-06-00Z.md
2026-06-03T22-00-00Z.md
2026-06-04T00-00-00Z.md
2026-06-04T08-30-00Z.md
2026-06-10T14-17-32Z.md
2026-06-10T17-19-04Z.md
2026-06-11T07-43-14Z.md
2026-06-15T18-54-50Z.md
2026-06-16T10-00-47Z.md
2026-06-16T12-00-00Z.md
2026-06-16T16-06-41Z.md
2026-06-16T19-30-00Z.md
SECURITY.md
workflows/
ci.yml
publish-homebrew.yml
publish-redirect.yml
publish.yml
registry-link-check.yml
registry-scanner.yml
release-app.yml
.gitignore
.omo/
run-continuation/
ses_12e1cc210ffeuPzcccNThid4f9.json
ses_12f1fb43effeRzJOCra5jDlVNf.json
.pre-commit-config.yaml
AGENTS.md
app/
SymairaEraseMe/
build.sh
Package.resolved
Package.swift
README.md
Sources/
SymairaEraseMe/
Models/
Broker.swift
Calendar.swift
Dashboard.swift
Event.swift
ManualTask.swift
MCPResponse.swift
Profile.swift
Request.swift
ViewState.swift
Services/
MCPClient.swift
ServerManager.swift
Theme/
BrandColors.swift
Glassmorphism.swift
ViewModels/
BrokersViewModel.swift
CalendarViewModel.swift
CampaignsViewModel.swift
DashboardViewModel.swift
ManualTasksViewModel.swift
RequestsViewModel.swift
SettingsViewModel.swift
Views/
BrokersView.swift
CalendarView.swift
CampaignsView.swift
DashboardView.swift
ManualTasksView.swift
RequestsView.swift
SettingsView.swift
SymairaEraseMeApp.swift
assets/
apple-touch-icon.png
branding/
app-icon-glyph.svg
app-icon.png
app-icon.svg
AppIcon.icns
Assets.xcassets/
AppIcon.appiconset/
Contents.json
mac-128.png
mac-128@2x.png
mac-16.png
mac-16@2x.png
mac-256.png
mac-256@2x.png
mac-32.png
mac-32@2x.png
mac-512.png
mac-512@2x.png
Contents.json
product-logo.png
symaira-dmg-background.png
terminal-demo.svg
CHANGELOG.md
CONTRIBUTING.md
docs/
app-test/
2026-07-27T15-05-00Z--symaira-eraseme/
2026-07-27T15-05-00Z--symaira-eraseme.md
01-settings-start-server-hang-sample.txt
02-campaigns-rpc-error.png
03-manual-tasks-crash.ips
assets/
social-preview.png
examples/
aider/
CONVENTIONS.md
README.md
claude-code/
.claude/
skills/
openeraseme
README.md
cline/
.clinerules/
00-symaira-eraseme.md
README.md
codex/
README.md
continue/
.continue/
rules/
symaira-eraseme.md
README.md
cursor/
.cursor/
skills/
symaira-eraseme
README.md
hermes/
README.md
openclaw/
README.md
plain-cron/
README.md
windsurf/
.windsurf/
skills/
symaira-eraseme
README.md
LICENSE
pyproject.toml
README.md
redirect/
openeraseme/
pyproject.toml
README.md
src/
openeraseme/
__init__.py
cli.py
registry/
brokers/
eu/
_example.yaml
across-eu.yaml
actioniq-eu.yaml
acxiom-eu.yaml
adform-eu.yaml
adikteev-eu.yaml
admetrics-eu.yaml
adobe-audience-manager-eu.yaml
adroll-eu.yaml
adspirit-eu.yaml
adsquare-eu.yaml
adventori-eu.yaml
amazon-ads-eu.yaml
arvato-financial-solutions--bertelsmann-eu.yaml
az-direct-eu.yaml
azerion--improve-digital-eu.yaml
azerion--sublime-eu.yaml
bidtheatre-ab-eu.yaml
bisnode-eu.yaml
blis-global-eu.yaml
blueconic-eu.yaml
bonded-eu.yaml
boniversum-eu.yaml
buergel-wirtschaftsinformationen-gmbh--co-kg-eu.yaml
captify-technologies-eu.yaml
cognism-eu.yaml
com-solutions-eu.yaml
commanders-act-eu.yaml
contentsquare-eu.yaml
creditreform-eu.yaml
crif-eu.yaml
criteo-eu.yaml
das-telefonbuch-eu.yaml
data-bubble-eu.yaml
data-hq-eu.yaml
datajoy-eu.yaml
datarade-eu.yaml
dealfront-eu.yaml
dentsu-uk-eu.yaml
deutsche-post-adress-gmbh--co-kg-eu.yaml
digiseg-eu.yaml
doubleverify-eu.yaml
emerse-sverige-ab-eu.yaml
emetriq-eu.yaml
epsilon-data-management-eu.yaml
equifax-eu.yaml
etarget-se-eu.yaml
experian-eu.yaml
eyeota-eu.yaml
fifty-technology-eu.yaml
fiftyfive-eu.yaml
gelbe-seiten-eu.yaml
genius-sports-uk-eu.yaml
google-ads-eu.yaml
infoscore-consumer-data-eu.yaml
intrum-ab-eu.yaml
jellyfish-eu.yaml
kaspr-eu.yaml
leadiq-eu.yaml
lexisnexis-risk-solutions-eu.yaml
lifesight-eu.yaml
liveramp-eu.yaml
loopme-eu.yaml
lotame-eu.yaml
lowell-group-eu.yaml
lytics-eu.yaml
madison-logic-eu.yaml
magnite-eu.yaml
meta-ads-eu.yaml
microsoft-ads-eu.yaml
miq-digital-eu.yaml
mparticle-eu.yaml
neustar-eu.yaml
nielsen-marketing-cloud--nielsen-eu.yaml
ogury-eu.yaml
onaudiencecom-eu.yaml
oracle-data-cloud-eu.yaml
outbrain-eu.yaml
phantombuster-eu.yaml
pianoio-eu.yaml
quantcast-eu.yaml
qwarry-eu.yaml
rocketreach-eu.yaml
roqad-eu.yaml
rtb-house-eu.yaml
rudderstack-eu.yaml
salesforce-audience-studio-eu.yaml
schober-eu.yaml
schufa-de.yaml
scope3-eu.yaml
seawave-media-eu.yaml
selectabase-eu.yaml
selligent-eu.yaml
semasio-eu.yaml
sense--slintel-eu.yaml
showheroes-se-eu.yaml
sirdata-eu.yaml
smartclip-europe-eu.yaml
spokeo-eu.yaml
stayfriends-eu.yaml
taboola-eu.yaml
tagada-media-eu.yaml
tapad-eu.yaml
tealium-eu.yaml
the-trade-desk-eu.yaml
tiktok-ads-eu.yaml
transunion-eu.yaml
treasure-data-eu.yaml
triplelift-eu.yaml
twilio-segment-eu.yaml
uplead-eu.yaml
vainu-eu.yaml
venatus-media-eu.yaml
verisk-eu.yaml
virtual-minds-eu.yaml
webmecanik-eu.yaml
weborama-eu.yaml
xandr-eu.yaml
yahoo-eu.yaml
yasni-eu.yaml
zeotap-eu.yaml
uk/
_example.yaml
118118-uk.yaml
acxiom-uk.yaml
bt-uk.yaml
clearscore-uk.yaml
comparethemarket-uk.yaml
confusedcom-uk.yaml
credit-karma-uk.yaml
equifax-uk.yaml
experian-consumer-services-uk.yaml
experian-uk.yaml
gb-group-uk.yaml
gocompare-uk.yaml
moneysupermarket-uk.yaml
ondevice-research-uk.yaml
realitymine-uk.yaml
royal-mail-data-uk.yaml
totallymoney-uk.yaml
transunion-uk.yaml
yell--yellcom-uk.yaml
us/
0ptimus-analytics-us.yaml
180-by-two-us.yaml
33-mile-radius-us.yaml
360-media-direct-us.yaml
4c-insights-us.yaml
700-credit-us.yaml
absolutepeoplesearch-us.yaml
academixdirect-us.yaml
accenture-llp-us.yaml
accucom-us.yaml
accudata-integrated-marketing-us.yaml
accuity-us.yaml
ach-address-clearing-house-us.yaml
active-intel-investigations-us.yaml
acxiom-us.yaml
adaptio-us.yaml
adcolony-us.yaml
address-scoop-us.yaml
address-search-us.yaml
addressescom-us.yaml
addresssearch-us.yaml
adrea-rubin-marketing-inc-us.yaml
adrea-rubin-media-inc-dba-calibrant-digital-us.yaml
adstra-us.yaml
advancedbackgroundchecks-us.yaml
advantage-credit-us.yaml
advantage-sales--marketing-us.yaml
advantage-sales-marketing-us.yaml
advertise4sales-us.yaml
aeroleads-us.yaml
affinity-answers-us.yaml
affinity-solutions-us.yaml
affordablebackgroundchecks-us.yaml
agr-marketing-solutions-us.yaml
alabama-arrests-us.yaml
alabama-court-records-us.yaml
alarmsearch-us.yaml
alaska-arrests-us.yaml
alaska-court-records-us.yaml
alc-us.yaml
all-global-resources-us.yaml
all-the-way-up-us.yaml
all-web-leads-us.yaml
allant-group-us.yaml
allareacodes-us.yaml
allbiz-us.yaml
alliant-cooperative-data-solutions-us.yaml
alliant-us.yaml
allpeople-us.yaml
allwebleads-us.yaml
alphasense-us.yaml
altisource-holdings-us.yaml
amazon-advertising-us.yaml
american-city-business-journals-us.yaml
americaphonebook-us.yaml
amerilist-us.yaml
amobee-us.yaml
amplemarket-us.yaml
amplitude-us.yaml
... 1330 more© 2026 Flowy · Free and open source
Built for Claude Code · Not affiliated with Anthropic