diff --git a/CLAUDE.md b/CLAUDE.md index f602dc1..c8340c8 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -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//`, 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// /brokers// 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). diff --git a/cmd/eraser/cmd_guides.go b/cmd/eraser/cmd_guides.go index 1e5ec7d..44be90d 100644 --- a/cmd/eraser/cmd_guides.go +++ b/cmd/eraser/cmd_guides.go @@ -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 != "": @@ -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) } @@ -182,7 +185,6 @@ 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 @@ -190,6 +192,7 @@ func runGuides(outDir, format string) error { 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 diff --git a/cmd/eraser/cmd_guides_test.go b/cmd/eraser/cmd_guides_test.go index 0db42df..7543ce7 100644 --- a/cmd/eraser/cmd_guides_test.go +++ b/cmd/eraser/cmd_guides_test.go @@ -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 diff --git a/site/content/_index.md b/site/content/_index.md index a9d9263..9c2d610 100644 --- a/site/content/_index.md +++ b/site/content/_index.md @@ -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." --- diff --git a/site/content/authorities.md b/site/content/authorities.md index 03f1c0d..815d216 100644 --- a/site/content/authorities.md +++ b/site/content/authorities.md @@ -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 --- diff --git a/site/content/brokers/_index.md b/site/content/brokers/_index.md index f1277fa..a1bf325 100644 --- a/site/content/brokers/_index.md +++ b/site/content/brokers/_index.md @@ -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." --- diff --git a/site/content/guides/_index.md b/site/content/guides/_index.md index afc6e4e..b9ac4c0 100644 --- a/site/content/guides/_index.md +++ b/site/content/guides/_index.md @@ -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 diff --git a/site/content/guides/opting-out-of-advertising-data-brokers.md b/site/content/guides/opting-out-of-advertising-data-brokers.md index 1a181a0..3ed153b 100644 --- a/site/content/guides/opting-out-of-advertising-data-brokers.md +++ b/site/content/guides/opting-out-of-advertising-data-brokers.md @@ -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 diff --git a/site/content/guides/sending-a-gdpr-article-17-request.md b/site/content/guides/sending-a-gdpr-article-17-request.md index be10dcf..8f6a6a1 100644 --- a/site/content/guides/sending-a-gdpr-article-17-request.md +++ b/site/content/guides/sending-a-gdpr-article-17-request.md @@ -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 diff --git a/site/content/guides/when-a-broker-ignores-you.md b/site/content/guides/when-a-broker-ignores-you.md index 44ababe..b89b4f3 100644 --- a/site/content/guides/when-a-broker-ignores-you.md +++ b/site/content/guides/when-a-broker-ignores-you.md @@ -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 diff --git a/site/content/privacy.md b/site/content/privacy.md index 3b12921..3eef175 100644 --- a/site/content/privacy.md +++ b/site/content/privacy.md @@ -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. diff --git a/site/layouts/404.html b/site/layouts/404.html new file mode 100644 index 0000000..b1f9668 --- /dev/null +++ b/site/layouts/404.html @@ -0,0 +1,7 @@ +{{ define "main" }} + +{{ end }} diff --git a/site/layouts/partials/head-seo.html b/site/layouts/partials/head-seo.html index e0c1916..a699449 100644 --- a/site/layouts/partials/head-seo.html +++ b/site/layouts/partials/head-seo.html @@ -9,7 +9,13 @@ - +{{- $img := "og.png" | absURL }} + + + + + + {{- $ld := dict -}} diff --git a/site/static/og.png b/site/static/og.png new file mode 100644 index 0000000..0bec451 Binary files /dev/null and b/site/static/og.png differ