貢獻者百科¶
社群協作久了會累積許多不成文規定:檔名如何命名、PR 描述要寫什麼、Issue 如何分類、新貢獻者第一週會碰到的疑問。貢獻者百科把散落在 README、Issue 留言、Matrix 對話裡的內容整合成一頁,方便新成員一次看完,也讓資深成員有共同對話的依據。
如果你是第一次參與,建議先看 如何參與與認領主題 決定方向,再回來這頁查具體做法。完整的工具入口與帳號申請見 社群自架服務。
第一週的入門路徑¶
依「我想做什麼」分流:
- 想試水溫,先看看內容:先讀 基礎概念 任一篇,再用 自我技能評估表 評估自己對 Tor、Tails、OONI 的熟悉度
- 想開始寫作或翻譯:申請 Matrix 帳號(見 社群自架服務)→ 加入 Public Space → 表達意願 → 認領一個 Issue
- 想參與技術維運:申請 GitHub 對 anoni-net/docs 的協作權限 → 看 參與開發的環境準備 建好開發環境
- 想加入活動籌備:到 Matrix 對應 room 詢問近期活動(COSCUP、工作坊、小聚),協助文宣、現場、報名等任務
每條路徑的第一步都是「進到 Matrix 表達意願」。社群運作偏向 async,留訊息後等一兩天回覆是正常節奏。
寫作風格規範¶
寫作風格是 anoni.net 三個網站共用的規範,全文在社群首頁的寫作風格規範,英文照它的英文版。這一節只寫文件站執行 linter 的方式。
執行 linter¶
CI 的 docs-style-lint 只在 docs/zh-TW、docs/zh-CN、docs/en 的 Markdown 變更時觸發。根目錄的 README.md、CONTRIBUTING.md 這類說明文件改完,需要自行執行一次:
python3 tools/docs_style_lint.py README.md CONTRIBUTING.md
NOTICE 沒有 .md 副檔名,linter 只收 .md 與 .js,那一份要人工看。
有一組規則明文豁免既有內容,目前只有寫作風格規範「標題句構」的 title-colon。CI 傳 --changed-since <base>,讓這組規則只在本次 PR 實際修改的行上報。本機想看整個檔案的全貌就不要帶那個旗標:
python3 tools/docs_style_lint.py --changed-since origin/main docs/en/tools/vpn-guide.md
沒有這個機制的話,改一行圖片引用就會帶出整篇舊標題的 annotation,跟作者的改動無關,而真正該修的那幾條會被淹在裡面。
規則文件本身逐條寫出被禁用的標點與句型,掃自己的規則描述必然全紅。社群首頁的寫作風格規範、這份百科與工作區的投影檔靠 linter 的 RULE_DOCS 依檔名豁免,tools/README.md 的規則表與已知邊界兩段用 <!-- docs-style-lint: disable --> 與 enable 包住。寫規則說明時照同一個做法,引用的例子要保持原樣。
檔案命名與目錄¶
檔名¶
- 全部小寫,使用連字號分隔(
tor-browser-advanced.md、anonymity-vs-privacy.md) - slug 以英文為主,避免中文檔名
- 縮寫保持小寫(
vasp-2026.md而非VASP-2026.md) - 數字直接接連字號(
roadmap-2026.md、updates-202506.md)
目錄結構¶
文件站的目錄結構維持扁平,不再加深層子目錄。新文章放進現有的 7 大分類:
| 分類 | 內容性質 |
|---|---|
basics/ |
概念層,匿名與隱私的核心思考工具 |
tools/ |
工具層,具體的工具介紹與比較 |
scenarios/ |
場景層,特定角色或情境的應用 |
taiwan/ |
在地脈絡,台灣的法規、觀測、研究 |
reports/ |
研究報告中譯,外部研究報告的正體中文翻譯 |
community/ |
貢獻與翻譯規範、開發環境準備、技能自評與視覺指南 |
社群本身的頁面與公告不放在文件站。關於我們、參與方式、自架服務、活動與社群動態在 anoni.net,原始碼是 anoni-net/www,活動公告、專案上線、工作進度這類社群公告發在該 repo 的 updates/。架設 Tor 中繼節點、橋接與 onion 服務的指南,以及讀懂 OONI 觀測資料的方法,寫給已經熟悉 Tor 的技術讀者,2026-10 起也放在 anoni.net。文件站的 blog/ 放外部文章的翻譯、技術分析、觀測報告與文件站自己的更新回顧。
如果你的新文章不確定該放哪一類,先在 Matrix 上問一聲,避免直接 PR 後又要搬。
搬檔、改名、刪頁要補 redirect¶
移動、改名或刪除已上線的頁面時,在同一個 PR 補上 redirect,讓舊網址不會變成 404。舊網址會長期活在搜尋引擎、書籤與外部連結裡,少了 redirect 就流失既有讀者與累積的 SEO 權重。
- redirect 寫在三支 mkdocs 設定的
plugins.redirects.redirect_maps:mkdocs.yml對應 zh-TW(/docs/)、mkdocs_en.yml對應 en、mkdocs_cn.yml對應 zh-cn。 - 格式是「舊路徑: 新路徑」,路徑相對各語系的 docs 目錄,不含
docs/<lang>/前綴。例:'tools/what-is-ooni.md': 'tools/index.md'。 - 找不到一對一的新頁時,導向所屬分類的 index 頁(
community/index.md、tools/index.md等)。 - 既有 redirect 保留不刪,舊網址會一直有人點進來。唯一要回頭改的情況:某條的目標頁自己也被移掉,redirect 變成斷鏈。
拆頁或搬走段落要回頭檢查入口連結¶
redirect 管不到內容搬移。頁面留著、只有其中一段被拆到新頁時,舊網址仍然回 200,沒有任何工具會報錯,但指向舊頁的按鈕與連結承諾的東西已經在別處。
- 拆頁或把段落搬到別頁時,在同一個 PR 內搜尋站內指向來源頁的連結,把文案提到搬走內容的那幾條重新指向新頁。
- strict build 與
docs-style-lint都抓不到這種錯。兩個目標檔都存在,錯的是連結語意而非能不能連,只有讀按鈕文案對照目的地才找得到。 - 已發布的 blog 文也算在內。按鈕是功能性入口,讀者點它是要找那份內容,重新指向不等於改寫文章當時的記述。
實例:2025-05 把工作坊頁拆成兩頁時,event-workshop-2025.md 留下活動資訊,招募與籌備內容搬到 event-workshop-2025-prepare.md。兩篇 2025-04 的貼文有「查看工作坊招募頁面說明」與「瞭解籌備事項」兩個按鈕仍指向活動頁,到 2026-08 才被發現。
圖片與資源¶
截圖與示意圖走不同的路徑。
截圖(操作畫面、網站畫面)放在 docs/<lang>/assets/images/:
- 在 markdown 引用:對於
basics/、tools/等深度 1 的目錄,用../../assets/images/檔名 - 對於
reports/interseclab-network-coup/等深度 2 的目錄,用../../assets/images/檔名(剛好一樣) - 優先使用 webp 或最佳化過的 png,不直接放手機原始大檔
- 有 lightbox(點擊放大)時,HTML 用
<figure>+<a href>包<img>,兩個的相對路徑都要對齊 - 三個語系的
assets/images/各自獨立,補了一個語系記得補另外兩個。漏掉的話建置不會報錯,站上就是一頁破圖,執行python3 tools/check_image_refs.py掃得出來
示意圖(流程圖、架構圖、對照矩陣、時間軸)的原始檔放 docs/diagrams/,發布到 assets.anoni.net,三個語系引用同一個網址。製作、命名與發布流程見文件站的視覺規範的「貢獻技術圖示」一節。
跨檔連結規則¶
內部連結用相對路徑,不要寫成 /docs/zh-TW/... 絕對路徑:
- 同一目錄:
./other-file.md或直接other-file.md - 跨目錄:
../basics/anonymity-vs-privacy.md - 跨深度:
../../blog/posts/keeping-the-doors-open.md
正文的連結用描述性的文字,不直接露出網址,也不拿網址當連結文字。例:詳見[社群工具頁](https://anoni.net/services/){target="_blank"}。
外部連結加 {target="_blank"},在新分頁開啟:[Freedom on the Net](https://freedomhouse.org/explore-the-map){target="_blank"}。社群首頁、新聞導讀、API 這些 anoni.net/docs/ 以外的網址屬於其他網站,同樣加上。已經有其他屬性時寫在同一組大括號裡,例如 { .md-button target="_blank" }。
需要寫對外完整網址時(社群貼文、外部引用),網站預設語系 zh-TW 不帶語系區段:docs/zh-TW/community/i18n.md 對應 https://anoni.net/docs/community/i18n/。zh-CN 用小寫 https://anoni.net/docs/zh-cn/...,en 用 https://anoni.net/docs/en/...。資料夾路徑仍保留語系大小寫。
文章末尾建議放「接下來」、「相關閱讀」之類的小節,連結到 2–4 篇相關文章。概念、工具、場景之間的橫向連結比單向引用更有用。
文章格式¶
front matter¶
每一頁開頭的 front matter 至少有三個欄位:
---
title: 威脅模型
description: 一句完整的句子,說明這一頁在講什麼、對讀者有什麼用
icon: material/shield-account-outline
---
title不加問號,也不加站名。社群分享卡與頁面標題會自動帶上站名description會用在搜尋結果的摘要與社群分享卡。寫成一句完整的句子,交代這一頁對讀者有什麼用,不要只重述標題icon以material/為主,少數情境用fontawesome-solid-、fontawesome-brands-- front matter 之後緊接 H1,寫成
# :material-icon-name: 標題,圖示通常與icon欄位相同 - blog 文章另外要有
date、slug、categories、authors - 社群分享卡要換標題、描述或底圖時,見文件站的視覺規範的「社群分享卡」一節
註腳¶
引用研究與報導時用 Markdown 註腳,註腳放在文章末尾:
中國的防火長城[^1]長期過濾大量國際網站。
[^1]: [原文標題](https://example.org/article){target="_blank"} - 媒體名稱
主要來源避免選付費牆的內容。只找得到付費牆版本時,另外附一個 archive.org 的存檔連結。
圖表¶
文件站支援 Vega-Lite 圖表(mkdocs-charts-plugin),用語言標記為 vegalite 的程式碼區塊撰寫。圖表在讀者的瀏覽器裡載入資料,onion 版的讀者也會連到資料來源,資料要放在站內或支援 onion 的位址。Pulse 的觀測圖表在 2026-10 搬到社群首頁的 Tor 中繼節點觀測,改成建置時產生的靜態圖表。
結構化資料¶
整站的 Organization JSON-LD 寫在 docs/overrides/main.html,文章裡不要再手動加 <script type="application/ld+json">。
PR 流程¶
Branch 命名¶
blog/<short-slug>處理 blog 文章(例:blog/throttle-drill-results)feat/<short-slug>處理新功能、新分類、寫作規範,以及既有文件的大幅改寫(例:feat/title-colon-rule)fix/<short-slug>處理 bug、樣式與小幅修正(例:fix/table-width)
docs/ 不能當前綴。docs 本身是建置觸發分支,git 不允許同一個名稱同時是 ref 與 ref 的目錄,git switch -c docs/vasp-2026-rewrite 會回報 cannot lock ref。
Commit 訊息格式¶
採用 conventional commits:
<type>(<scope>): <subject>
<body>
常用 type:docs、feat、fix、chore、refactor。scope 用語系或子專案名稱(zh-TW、zh-CN、en、tools)。
PR 描述¶
PR 描述至少包含:
- 改動的「為什麼」(連結 Issue 或社群討論)
- 改動的範圍(哪些檔案、哪幾個段落)
- 對讀者的影響(連結是否會壞、URL 是否變更、有沒有相依的檔案要一起改)
Review¶
- 翻譯、文字校對:請求至少一位非作者 review
- 結構性變動(搬檔、改 nav):先在 Matrix 提案討論,再開 PR
- 圖片、資源:自我檢查 alt 文字、檔名、版權標示
Issue 分類¶
Issue 標籤沿用 GitHub 預設的那一組,另外加上 l10n。用 Issue 模板開單時,類型標籤會自動帶上:
| 標籤 | 用途 |
|---|---|
documentation |
新增或修改文章內容 |
enhancement |
改進建議、小工具提案、技術評估 |
bug |
網站或工具的行為錯誤 |
l10n |
翻譯與在地化 |
question |
問題討論 |
good first issue |
範圍明確,不必先熟悉整個 repo 就能接手 |
help wanted |
需要更多人手 |
duplicate、invalid、wontfix |
結案時註明原因 |
語系與分類不另設標籤,寫在 Issue 的標題或內文。第一次參與可以從 good first issue 清單挑一張,在 Issue 下留言認領,避免兩個人做同一件事。
開 Issue 前可以先在 GitHub 搜尋既有 Issue,避免重複。
翻譯流程¶
zh-TW 是 single source of truth,zh-CN 與 en 從 zh-TW 同步。詳細流程見 中文化與文件翻譯:
- 新文章預設先寫 zh-TW
- zh-CN 用工具輔助初翻 + 人工調整詞彙差異(用語、慣用詞)
- en 需要更多人工,因為文化脈絡轉換比語系翻譯費時
- zh-CN 與 en 的翻譯不必同步上線,依社群人力滾動處理
- 把外部文章(Tor Project、OONI、EFF 等部落格)翻成 blog 的順序、格式與各語系的觀點段,見中文化與文件翻譯的「翻譯外部文章到 blog」一節
- 校對時要抓「翻漏」,也就是 zh-TW 具名的國家、公司、機構、法條、數字在譯文被換成上位詞。判準與檢查方式見 校對時要抓的是翻漏
AI 協作¶
這個專案不限制貢獻者用哪一家的 AI 服務協助寫作、翻譯或寫程式。為了讓不同的人、不同的工具產出一致的內容,規則只寫在這份百科,AI 設定檔都指回這裡。
入口檔¶
- repo 根目錄的
AGENTS.md整理 repo 結構、開發指令與容易出錯的地方,多數 AI 工具會自動讀它。tools/與.github/各有一份 CLAUDE.md引入AGENTS.md,另外說明.claude/底下的 subagent 與 skill- 使用的工具不會自動讀這兩份時,開工前把
AGENTS.md與這份百科的「寫作風格規範」一節提供給它
AI 產出的檢查¶
AI 產出與人工撰寫走同一套流程:執行 docs_style_lint.py、照 PR 範本自我檢查、經過 review。「安全與隱私寫作」一節的界線同樣適用。AI 給的數字、引文與來源連結要實際點開核對,送出 PR 的人為內容負責。
角色¶
寫一篇文章時,可以把工作拆給幾個角色,各自只做一件事。使用 Claude Code 的貢獻者可以直接叫用 .claude/agents/ 底下對應的 subagent,其他工具照下面的描述下指令即可。每個角色的讀者前提相同:記者、公民團體、開源科技社群,熟悉 Tor、OONI 與數位人權的專家也會讀。
動筆前的三個角色:
- 選題雷達:掃指定期間(預設近兩週)匿名網路工具、數位身分與 eID、監控與審查立法、審查量測、支付隱私、吹哨與洩密平台、台灣與 APAC 數位人權的新事件,篩掉炒作、純產品發布與無關的題目。每則候選回報一句話的事件、日期、一手來源連結、跟社群的關聯、有沒有台灣或 APAC 的角度、時效,依值得寫的程度排序,最多六則。不寫文章,也不決定切角
- 切角顧問:針對一個題目提出三到四個切角,說明每個切角從哪個面向切入、社群能補什麼觀點、有沒有台灣或 APAC 的在地連結,並排出建議順序。只給選項,不替作者決定,也不動筆
- 資料蒐集:題目選定後,蒐集一手來源(官方公告、原始文件、權威報導)並附連結與發布日期,掃
docs/zh-TW/blog/posts/列出該交叉連結的既有文章與相對路徑,標出之後寫進文章時要附出處的宣稱。站內已有很接近的文章時直接指出。不寫文章,也不決定切角
審稿的四個角色:
- 結構審查:讀完全文,用一句話寫出核心主張與它想說服的對象,再檢查每段是否服務這條主線,哪些順序該調、哪些可刪、哪些缺銜接。回報主線判讀、依嚴重程度排序的結構問題(標出段落位置)與調整建議。不改字句
- 文字潤稿:找出冗詞、語意含糊與邏輯跳接的句子,檢查語氣前後一致,雙語文件核對兩個版本說的是同一件事。每個問題回報原句位置、問題與改寫版本,針對句子,不重寫整段
- 事實查核:列出文章裡每個可查證的宣稱,包括數字、日期、國家案例、技術描述、對專案或組織的描述,逐一判定為準確、需要出處、可能有誤或過度宣稱,可能有誤的實際查證。每個問題回報原句位置與宣稱、判定、證據或來源連結、建議改法(改數字、加出處、改成保守的說法或刪除)。不潤稿,也不評論文采
- 目標讀者:扮演一位不熟主題、願意花五分鐘讀完的讀者,標出哪句讀不懂、哪個論點沒被說服、讀完記得什麼、會想做什麼。只給讀者反應,不給編輯建議
提問前先看哪裡¶
新貢獻者最常問的問題與對應出處:
| 問題 | 看這裡 |
|---|---|
| 如何選擇主題開始? | 如何參與與認領主題 |
| 如何申請 Matrix 帳號? | 社群自架服務 |
| 我的程度適合做什麼? | 自我技能評估表 |
| 如何設定開發環境? | 參與開發的環境準備 |
| 翻譯有什麼規範? | 中文化與文件翻譯 |
| 緊急情況的對外資源? | 緊急求救 |
如果上述都沒答案,到 Matrix 詢問。詢問前盡量提供:你想做什麼、你已經試過什麼、你卡在哪。
行為準則摘要¶
社群以開放、互助、合法為原則。以下是快速摘要,完整版(含角色定義、決策流程、爭議處理)見 治理章程,兩者不一致時以治理章程為準。重點:
- 互相尊重:不同背景、不同熟悉度的成員一視同仁
- 討論議題不攻擊個人:對事不對人
- 合法前提:所有討論與協作以合法用途為前提,不協助洗錢、規避稅務、騷擾、跟蹤、未授權入侵等行為
- 資訊揭露:涉及個人資料、機敏資訊的處理走 上傳機敏資訊流程
- 爭議處理:先在 Matrix 討論,沒有共識可提案到下一次社群同步討論
違反原則的行為會由核心成員依治理章程處理。
這份百科是活文件¶
新貢獻者遇到本頁沒有涵蓋的問題、發現某個流程其實沒寫清楚,歡迎提案修改本頁。改 contributor-handbook 本身就是一個 good first issue 的好題目。