{
  "markdown": "# blame-web\n\nThe **blame.today** web client — the \"raw firehose.\" A client-side Svelte + Vite app that talks straight to nostr relays: the vote path has no backend, no auth, no rate limit (events go direct to relays). A thin Cloudflare Worker fronts the static site to force https, redirect `www` -> apex, and serve the MCP pointer at `/mcp`. This is the open, canonical realization of blame; the iOS app lives in the sibling **blame-ios** repo.\n\nSplit out of `blame-today/blame-mobile` (the old iOS app + worker repo) so each surface is honestly its own thing — they share a brand and the `pureblameapp` nostr tag, but no code, build, or deploy.\n\n[check it out - blame.today](https://blame.today)\n\n## what it is\n\n- a blame target is a nostr `kind 1` event tagged `pureblameapp`; a vote is a `kind 7` reaction tagged `e:<targetId>` + `pureblameapp`. throwaway key per event.\n- the leaderboard is built from relay `COUNT`s (all-time + a 24h \"hot\" window), not by fetching events.\n- the News tab mines today's headlines client-side (`compromise`) into clickable suggestions.\n- content filter (profanity / PII / gibberish) is the only gate — it's an open firehose.\n\n## dev\n\n```\nnpm install\nnpm run dev      # vite dev server\nnpm test         # vitest unit tests\nnpm run test:e2e # playwright\nnpm run build    # -> dist/\n```\n\n## deploy\n\nPush to `main` → `.github/workflows/deploy-web.yml` builds `dist/` and runs `wrangler deploy`, publishing to the Cloudflare Worker (`blame-today`, Workers + Static Assets) that serves blame.today. The worker (`worker/index.js`) serves `dist/` as static assets, force-upgrades http → https, redirects `www` → apex, and serves the MCP inline at `/mcp` (`worker/mcp.js`). Needs `CLOUDFLARE_API_TOKEN` (Workers:Edit) + `CLOUDFLARE_ACCOUNT_ID` repo secrets. The `/about` prose lives in `public/about/` and Vite copies it into `dist/about/`.\n\nMigrated off GitHub Pages 2026-06-16 — the zone is on Cloudflare now and blame.today is a custom domain on the worker. A push touching only `scripts/**` or `infra/**` skips the rebuild.\n\n## infra (the Cloudflare config around the worker)\n\nThe CF \"clicky layer\" — DNS records, zone settings (HSTS, Always Use HTTPS), the `www` → apex redirect rule, and email routing (`*@blame.today` → gmail) — is declarative IaC in [`infra/`](infra/) (OpenTofu). **wrangler owns the worker code + the apex custom domain; OpenTofu owns everything else**, each resource with exactly one owner. See [`infra/README.md`](infra/README.md).\n",
  "bytes": 2488,
  "sha": "ab96f03a7913fd450b8061dfe6a663ea55f4a6c905e59d25779f7e1cda536738",
  "repo_slug": "blame-today/blame-web",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_today_blame_mcp_99985afa/readme"
}