Blame Today

today.blamePublished by blame.todayOfficial publisherv3.0.0Updated Nov 2, 2026

Blame things on blame.today, the anonymous 'who do you blame today' board. Nostr, no account.

VerifiedStreamable HTTPWeb executableDeveloper ToolsCommunication & Collaboration

Overview

AI-generated overview

Returns a self-serve recipe for posting anonymous blame targets and votes to the blame.today Nostr board, which the assistant then runs itself.

What you can do
  • Fetch the blame.today recipe: a short client-side snippet that signs and publishes a Nostr event, plus the relays to use.
  • Get the score and COUNT recipe for reading the leaderboard, and the board's house rule.
  • Nothing is executed server-side: the assistant runs the snippet itself, and the server does not blame or read on its behalf.
When to use it
Useful when someone wants an assistant to post an anonymous blame target or vote to the blame.today board, or to learn how its counts and relays work, without installing a full client.
Requirements
A remote streamable HTTP endpoint at blame.today; no account, API key, environment variable or header is declared. The assistant needs to be able to run the returned client-side snippet and reach Nostr relays over the network.
Before you install
The recipe produces a snippet that signs and publishes public Nostr events, so anything posted is visible on the open board and cannot be taken back. The board is an open firehose with only a content filter as a gate, and its counts are relay estimates rather than a verified vote census.

Installation

In SourceWeft

  1. Open Blame Today in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/today.blame%2Fmcp/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "blame-today": {
      "type": "http",
      "url": "https://blame.today/mcp"
    }
  }
}

README

blame-web

The 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.

Split 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.

check it out - blame.today

what it is

  • 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.
  • the leaderboard is built from relay COUNTs (all-time + a 24h "hot" window), not by fetching events.
  • the News tab mines today's headlines client-side (compromise) into clickable suggestions.
  • content filter (profanity / PII / gibberish) is the only gate — it's an open firehose.

dev

Votes are signed once per click and retried with the same event id. A new target must be acknowledged before its opening vote is sent. After five failed attempts the board offers a retry with that same signed event. Queued and failed deliveries live only in the current tab; keep it open until pending votes finish.

Counts are relay estimates: the second-highest fresh report from distinct configured relays, separately for each target and window. Fewer than two reports means unavailable, shown as an ellipsis rather than zero. A live event or acknowledgement requests a new snapshot; it never adds to the snapshot, so overlapping delivery cannot count twice. A relay can correct its estimate downward. Samples older than 90 seconds are removed on a new reply or the next 45-second resync, including during silence. This is not an exact union across relays. NIP-45 filters the application tag and event kind but cannot filter reaction content. Incoming board events are separately checked for shape, application tag, canonical id and signature.

COUNT responses are unsigned relay claims. One dishonest relay cannot raise the estimate above every honest reported count; it can still influence the result within that range. Two dishonest relays can corroborate a false count. Partial coverage and unlimited signed voting remain part of this open board, so these estimates are not a verified vote census. One relay can accept a vote while its count awaits another response. Mine preserves the submitted topic. Old cached totals are discarded on reload; saved topics and ownership remain.

Each tab retains at most 1,000 remote targets plus its owned targets. New targets replace the oldest unowned remote target, so a full cached board still receives live topics. Incoming frames are limited to 128 KiB, with at most 1,024 frames / 1 MiB waiting for verification per relay. A relay that overflows that queue is disconnected and retried. Unanswered COUNT requests are capped at 12,000 across the pool and superseded requests are removed. These are client resource limits; they do not change which events relays accept.

npm installnpm run dev      # vite dev servernpm test         # vitest unit testsnpm run test:e2e # playwrightnpm run build    # -> dist/

deploy

Push 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/.

Migrated 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.

infra (the Cloudflare config around the worker)

The 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/ (OpenTofu). wrangler owns the worker code + the apex custom domain; OpenTofu owns everything else, each resource with exactly one owner. See infra/README.md.

Source: README.md at commit 7a104a9

Tools

1

get_blame_recipe

Get the self-serve blame recipe

Get the self-serve recipe for blame.today, the anonymous 'who do you blame today' board. Returns a short client-side snippet (sign + publish a Nostr event) plus the relays, the score/COUNT recipe, and the house rule. You run it yourself — this server does not blame or read on your behalf.

Takes no parameters.

Version history

1
  1. v3.0.0LatestSep 16, 2026

Score

90% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts

    Declare a license in the repository or the registry entry.