Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,5 @@ See [docs/commands.md](docs/commands.md) for the full CLI reference.

- **Acting on broker email replies** - the frequent one: classify the reply, make the matching `data/brokers.yaml` edit. [docs/broker-replies.md](docs/broker-replies.md).
- **Keeping `data/brokers.yaml` honest** - liveness audit, dedup, growing the list from registries, and keeping the public "700+" broker claim (README, site, setup page) true to the real count: [docs/auditing.md](docs/auditing.md).
- **Removing or merging a broker with a guide page** (`/brokers/<id>/`, curated categories only - see `curatedCategories` in `cmd/eraser/cmd_guides.go`): the next deploy drops the page and the URL 404s via `site/layouts/404.html`. If it was merged into or renamed to another entry, add `/brokers/<old-id>/ /brokers/<new-id>/ 301` to `site/static/_redirects` (Cloudflare Pages) so links and search results land on the surviving page. Without a `404.html`, Pages serves the homepage with a 200 for unknown paths.
- **Re-sending** - brokers re-list you continuously. `./eraser send` is safe to re-run: it resumes where it left off (25-day per-broker cooldown, `daily_send_limit` cap); `eraser schedule install` / `eraser auto` run it unattended ([docs/commands.md](docs/commands.md)). EU cadence and hand-sending are in [EU-NOTES.md](EU-NOTES.md).
7 changes: 5 additions & 2 deletions cmd/eraser/cmd_guides.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ func timelineText(region string) string {

// guideDescription is the meta description / JSON-LD description for a
// broker page - previously the site-wide default, verbatim, on every page.
func guideDescription(b broker.Broker, lastChecked string) string {
func guideDescription(b broker.Broker, lastChecked string, hasLetter bool) string {
var method string
switch {
case b.OptOutURL != "":
Expand All @@ -128,6 +128,9 @@ func guideDescription(b broker.Broker, lastChecked string) string {
}

desc := fmt.Sprintf("How to opt out of %s: %s. %s.", b.Name, method, window)
if hasLetter {
desc += " Includes a ready-to-send request letter."
}
if lastChecked != "" {
desc = fmt.Sprintf("%s Checked %s.", desc, lastChecked)
}
Expand Down Expand Up @@ -182,14 +185,14 @@ func runGuides(outDir, format string) error {
page.LastChecked = m[1]
}
page.Timeline = timelineText(b.Region)
page.Description = guideDescription(b, page.LastChecked)
page.Noindex = noindexedBrokers[b.ID]
if gdpr, err := engine.Render("gdpr", pp, b); err == nil {
page.GDPRBody = gdpr.Body
}
if ccpa, err := engine.Render("ccpa", pp, b); err == nil {
page.CCPABody = ccpa.Body
}
page.Description = guideDescription(b, page.LastChecked, page.GDPRBody != "" || page.CCPABody != "")

var (
content []byte
Expand Down
1 change: 1 addition & 0 deletions cmd/eraser/cmd_guides_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ func TestRunGuidesMarkdown(t *testing.T) {
for _, want := range []string{
`title: "How to opt out of Acme People Finder"`,
`last_checked: "2026-08-01"`,
"Includes a ready-to-send request letter.", // description mentions the rendered letters
"https://acme.example/opt-out",
"Article 17", // GDPR body rendered
"1798.105", // CCPA body rendered
Expand Down
2 changes: 1 addition & 1 deletion site/content/_index.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
---
title: "Eraser"
description: "Send data removal requests to 700+ data brokers. Open source, local-first, free."
description: "Send GDPR and CCPA data removal requests to 700+ data brokers from your own machine. Open source, local-first and free — no account and no telemetry."
---
2 changes: 1 addition & 1 deletion site/content/authorities.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
title: "Privacy authorities"
description: "Where to complain, worldwide, if a data broker ignores or refuses a deletion request."
description: "Where to complain, worldwide, if a data broker ignores or refuses a deletion request: EU/EEA data protection authorities, the UK ICO, US regulators and more."
layout: authorities
---

Expand Down
2 changes: 1 addition & 1 deletion site/content/brokers/_index.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
---
title: "Broker directory"
description: "Every data broker Eraser can send a removal request to."
description: "Every data broker Eraser can send a removal request to, with step-by-step opt-out guides for people-search, background-check and credit brokers."
---
2 changes: 1 addition & 1 deletion site/content/guides/_index.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
title: "Guides"
description: "How to get data brokers to delete you — by law, by hand or with Eraser."
description: "How to get data brokers to delete you — by law, by hand or with Eraser: GDPR Article 17 requests, adtech opt-outs, and what to do when a broker ignores you."
---

Short, practical guides to exercising your erasure rights. The per-broker pages
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
title: "Opting out of advertising data brokers"
description: "The long tail of adtech and data-append brokers, and why one email covers most of them."
description: "The long tail of adtech and data-append brokers that buy and sell your device IDs and contact details, and why one well-written email covers most of them."
---

Most of the companies in the [broker directory](/brokers/) aren't people-search
Expand Down
2 changes: 1 addition & 1 deletion site/content/guides/sending-a-gdpr-article-17-request.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
title: "Sending a GDPR Article 17 request"
description: "What to write, who to send it to, how brokers must respond, and the exemptions they can lawfully invoke."
description: "Sending a GDPR Article 17 erasure request: what to write, who to send it to, how brokers must respond, and the exemptions they can lawfully invoke."
---

If you live in the EU or EEA, **Article 17 of the GDPR** gives you the right to
Expand Down
2 changes: 1 addition & 1 deletion site/content/guides/when-a-broker-ignores-you.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
title: "When a broker ignores you"
description: "Deadlines, the evidence to keep, and how to complain to a supervisory authority — with what to expect."
description: "When a data broker ignores your request: deadlines, the evidence to keep, and how to complain to a supervisory authority — with what to expect."
---

Most brokers comply once a request lands — the request itself, and the liability
Expand Down
2 changes: 1 addition & 1 deletion site/content/privacy.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
title: "Privacy"
description: "What this website collects, and what the tool on your machine doesn't."
description: "What this website collects (cookieless, aggregate visit counts), and what the Eraser tool on your machine doesn't — nothing about your use reaches us."
---

Two different things live under this name, and they have very different answers.
Expand Down
7 changes: 7 additions & 0 deletions site/layouts/404.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{{ define "main" }}
<article class="prose">
<h1>Page not found</h1>
<p>Nothing lives at this address. If you followed a link to a broker guide, that broker may have been merged or removed from the list.</p>
<p><a href="{{ "/brokers/" | relURL }}">Browse the broker directory</a> or <a href="{{ "/" | relURL }}">go to the homepage</a>.</p>
</article>
{{ end }}
8 changes: 7 additions & 1 deletion site/layouts/partials/head-seo.html
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,13 @@
<meta property="og:title" content="{{ $title }}">
<meta property="og:description" content="{{ $desc }}">
<meta property="og:url" content="{{ .Permalink }}">
<meta name="twitter:card" content="summary">
{{- $img := "og.png" | absURL }}
<meta property="og:image" content="{{ $img }}">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:image:alt" content="Eraser: send data removal requests to 700+ data brokers">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="{{ $img }}">
<meta name="twitter:title" content="{{ $title }}">
<meta name="twitter:description" content="{{ $desc }}">
{{- $ld := dict -}}
Expand Down
Binary file added site/static/og.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading