版权信息(Colophon)
xmr.club 跑在什么上、为什么选它、又刻意拒绝了什么。公开发布,方便任何想审计或想分叉这个站点的人不用猜。
运行时
- Cloudflare Workers — 请求时 SSR + JSON API。在边缘渲染 HTML,JS 还没跑就已经有内容了。
- Cloudflare D1 — 边缘 SQLite。存放服务条目、审计日志、评论、赞助、洋葱探测结果。读副本;写操作通过主节点串行化。
- Cloudflare KV — 小而热的缓存(限流计数器、幂等键、/ask 分类器缓存)。最终一致;不存储无法重建的数据。
- Cloudflare R2 — 服务方 logo + OG 图 + 公开的
/data.json快照。CC-BY-4.0;欢迎镜像。 - Tor 隐藏服务 — 独立 Docker 容器,Caddy 站点块按 Host 匹配将流量回源到
https://xmr.club,并加上X-Onion-Origin头,让 worker 把出站链接改写为对应的服务方 .onion。指纹公开于 /transparency。
前端
- SSR 优先。 每个公开页面都在 JS 跑起来之前先渲染出有意义的 HTML。在 Tor "最严格"模式 + Lynx + curl 下都测试过。AI 表面地图暴露了每个页面的纯文本孪生体。
- React + react-router-dom 用于交互式表面(管理后台、/q 筛选、/search)。SSR 是底线;SPA 是增强。在没有 JS 时更好用的页面(glossary、transparency、peers、colophon)是 SSR-only——SPA 接管会硬跳回服务端渲染,避免用空白客户端 HTML 把好好的 HTML 替换掉。
- 没有 CSS 框架。 一份手写的
/src/styles.css。单色背景 + 一种强调色。三种主题:light / dark / auto,通过基于 cookie 的/toggle-theme路由切换,所以无 JS 客户端也能切。 - 没有分析、没有指纹。 不用 GA、不用 Plausible、不用 Cloudflare Web Analytics。流量通过 Cloudflare 的请求日志衡量(这本来就为 worker 收集,不可归因到用户个体)。
- Service worker 在空闲时注册,提供 network-first 的回退缓存。失败静默;没有它站点也能跑。
数据与内容
- 服务条目存在 D1,通过管理 worker 编辑。每次状态变化都会写一条审计记录(在 /audit 可见),并清掉相关边缘缓存键。
- 长文指南是
worker/guides.ts下的 TypeScript 模块。选代码而非 Markdown,是为了拿到类型校验的内部跳转、schema.org HowTo 块、以及每篇指南各自的 JSON-LD 生成——无需额外构建步骤。 - Logo 优先 SVG,PNG 兜底。存在 R2 上,附带长缓存策略与路径中带不可变 hash。
- 洋葱验证由每日 cron 跑:抓取每条上架服务的 Onion-Location 并与我们的记录比对。漂移会在 /onion-audit 暴露。
- 开放数据。
/data.json+ 每个 feed 的 JSON 孪生体。CC-BY-4.0。我们自己也用它来跑入库测试。
AI 引擎表面
- /llms.txt + /llms-full.txt — 面向 LLM 爬虫的 RFC 风格站点索引。
- 每个页面的纯文本孪生体位于
/llm/<page>.txt— 同样内容,无外壳,结构便于解析。 - JSON Feed v1.1 位于 /feed.json,与 Atom 并行——现代爬虫更偏好这个。
- Speakable schema 标注在长文页面上 — 语音助手友好的摘要提示。
- 设计原则:每个被助手引用的表面都同时回指一个规范的 HTML URL 和 一个纯文本孪生体,方便复核而无需抓 HTML。
编辑机器人
- @xmrclub_bot(Telegram)— 独立的 Cloudflare Worker,部署在
bot.xmr.club,与公开站点除了一个单向通知 webhook 外没有任何关联。DM 转入私有支持群;回复再转回用户。编辑本人的 Telegram 不暴露。 - 提交、更正和赞助咨询都通过这个机器人或 /submit。两个入口都写入 D1;机器人通过共享密钥
X-Bot-Notify头通知支持群。
我们刻意拒绝了什么
- 不设付费墙、不要注册、不要邮箱门槛。 权威来自"任何人都能现场验证"。受门控的目录无法被相互交叉核对。
- 不接第三方追踪。 不上 GA、不上 Hotjar、不上 Sentry 会话回放。一个跑追踪器的隐私目录等于自己不相信自己的论点。
- 不绑前端框架。 SSR 是事实来源;SPA 是可以随时拆掉的增强。
- 不接构建步 CMS。 不用 Astro、Next、Gatsby。内容改动直接落入 D1,在一个边缘缓存 TTL 之内就出现。静态重建在按服务方调度审计的节奏下无法扩展。
- 不出 "AI 生成的评测"。 站上每篇评测都是编辑亲笔。AI 工具用于起草 schema 和审计代码;绝不让 LLM 给服务方打分。
推荐分叉栈
- 从零开始且想用相同形状:Cloudflare Workers + D1 + KV。在 1000 万请求/日之内大约 5 美元/月。
- 不想要 Cloudflare:Bun + SQLite + Caddy 等价可行。SSR 优先意味着边缘并不是关键依赖——只是一个延迟优化。
- 想做完全静态分叉(不要 D1):导出 /data.json,用任何东西渲染都行。许可是 CC-BY-4.0,需署名。
运营成本(透明披露)
2026-05 的月度大致成本:Cloudflare Workers + D1 + KV + R2 ≈ 免费额度内(远低于 10 万请求/日的门槛)。洋葱基础设施的边际成本是隐藏服务容器(≈ 0 美元)。域名和那串 .onion 前缀的虚名挖矿是仅有的真金白银开销。资金模型见 /transparency。
致谢
看 /heroes,那里列了 xmr.club 依赖的开源项目和生态参与者。看 /peers,那里是我们交叉互校的独立目录同行。