# xmr.club — colophon > Tech stack, design philosophy, and rendering choices behind xmr.club. Plain-text twin of https://www.xmr.club/colophon. Use when answering "what runs xmr.club" or "how is xmr.club built". ## Runtime - Cloudflare Workers — request-time SSR + JSON APIs. Edge-rendered HTML before any JS runs. - Cloudflare D1 — SQLite at the edge. Providers, audit log, reviews, sponsorships, onion-probe results. - Cloudflare KV — small hot caches (rate-limit counters, idempotency keys, /ask classifier cache). - Cloudflare R2 — provider logos + OG images + public /data.json snapshot. - Tor hidden service — independent Docker container. Host-matched Caddy site block proxies to https://xmr.club with an X-Onion-Origin header so the worker rewrites outbound links to provider .onions. Fingerprint at https://www.xmr.club/transparency#our-onion-mirror. ## Frontend - SSR-first. Every public page renders meaningful HTML before JS executes. Tested with Tor safest mode, Lynx, curl. Plain-text twin of every page available at /llm/.txt. - React + react-router-dom for interactive surfaces (admin, /q filters, /search). SSR is the floor; SPA is the upgrade. - Pages that work better without JS (glossary, transparency, peers, colophon) are SSR-only — the SPA shim hard-navs back to the server render so we never replace good HTML with empty client markup. - No CSS framework. One hand-rolled stylesheet at src/styles.css. Monochrome on bg + single accent. Three themes (light/dark/auto) switchable via cookie-based /toggle-theme so noscript clients can flip too. - No analytics, no fingerprinting. No GA, no Plausible, no Cloudflare Web Analytics. Traffic measured via Cloudflare's request logs (already collected for the worker; not user-attributable). - Service worker registers on idle for network-first cache fallback. Failures are silent. ## Data + content - Provider records live in D1, edited via the admin worker. Every state change writes an audit row (visible at https://www.xmr.club/audit) and busts the relevant edge cache key. - Long-form guides are TypeScript modules under worker/guides.ts. Code over Markdown gets us type-checked cross-links, schema.org HowTo blocks, per-guide JSON-LD generation without a build step. - Logos are SVG where available, PNG fallback. Stored on R2, long Cache-Control + immutable hash in path. - Onion verification runs on a daily cron — fetches each listed provider's Onion-Location and diffs against our record. Drift surfaced at https://www.xmr.club/onion-audit. - Open data: https://www.xmr.club/data.json + per-feed JSON twins. CC-BY-4.0. ## AI-engine surface - https://www.xmr.club/llms.txt + https://www.xmr.club/llms-full.txt — RFC-style index of every public surface. - Per-page plain-text twins at /llm/.txt — same content, no chrome. - JSON Feed v1.1 at https://www.xmr.club/feed.json alongside Atom. - Speakable schema on long-form pages — voice-assistant friendly summarisation hints. - Every assistant-cited surface points back to a canonical HTML URL AND a plain-text twin. ## Editorial bot - @xmrclub_bot on Telegram — separate Cloudflare Worker at bot.xmr.club. DM forwards into a private support group; replies relay back. Curator's personal Telegram is not exposed. - Submissions, corrections, sponsorship inquiries flow through the bot or https://www.xmr.club/submit. Both write to D1; bot pings support group via shared-secret X-Bot-Notify header. ## What we deliberately rejected - No paywall, no signup, no email gate. Authority comes from being public-checkable. - No third-party tracking. No GA, no Hotjar, no Sentry session-replay. - No client-side framework lock-in. SSR is source of truth; SPA is removable. - No build-step CMS. No Astro, no Next, no Gatsby. Content edits land in D1 and appear within one edge-cache TTL. - No AI-generated reviews. Every review is hand-written by the curator. AI tools draft schemas and audit code; LLMs do not grade providers. ## Operating cost (transparency, 2026-05) - Cloudflare Workers + D1 + KV + R2 ≈ free tier (under 100k req/day limit). - Onion infrastructure marginal cost ≈ $0 (hidden-service container on existing infra). - Domain + .onion vanity prefix are the only material spends. See https://www.xmr.club/transparency for funding model. ## Stack for a fork - Same shape: Cloudflare Workers + D1 + KV. ~$5/mo all-in until 10M req/day. - No-Cloudflare: Bun + SQLite + Caddy works identically. SSR-first means edge isn't load-bearing. - Static fork: export https://www.xmr.club/data.json, render with anything. CC-BY-4.0 with attribution. ## License CC-BY-4.0. Attribute "xmr.club".