標籤彙整: open source

我們是不是把「辦研討會」誤當成「經營社群」?

我們是不是常常把「辦了一場成功的研討會、一場盛大的年會」當成「我們有一個健康的社群」?

最近讀到一篇文章,讓我把這個問題又翻出來想了一遍。作者 Jr Conlin 在 Mozilla 待了超過 15 年,離開前寫了一封很長的告別文〈Leaving Mozilla〉。表面上他在談一家瀏覽器公司的內部問題,但讀到後面我發現,他真正在寫的是另一面。一個組織如何把真正撐起它的「社群」,誤當成「顧客」、誤當成「一場可以反覆操辦的大活動」,然後一步步離棄那些持續投入的人。

說明:以下前半段是我自己讀完後的重點整理與編譯,加上一點個人的理解,不是逐字翻譯。內容很豐富,強烈建議直接點原文讀完整版,我這裡只整理摘要與觀點。

Jr Conlin 如何看 Mozilla

離職信留給同事的三句話

他離開時留給同事一封信:

  • 你比你想的還重要:他講的就是「正在讀這封信的那個你」,不是什麼「企業體」或「組織」。他長年在公司裡推動 mentoring(師徒制、指導),本質就是「找到另一個可以對話的人」。無論你的資歷深淺,你都同時能學、也能教。
  • 你是更大整體的一部分:在 Mozilla 領薪水的人,是幸運的少數。真正的 peers(同儕)是外面那一大群「沒有 badge、沒有 @mozilla.com 信箱」、卻一起想打造一個「把使用者利益擺第一」的瀏覽器的人。對這群人,公司有「傾聽」的義務,因為如果不為他們做事,他們會去找別人。
  • 我們其實很小:Firefox 是一個 niche(小眾)瀏覽器,只是運氣好,取得了足夠的資金。他用了一個很傳神的比喻:想像你住在一個只有麥當勞、漢堡王、溫蒂漢堡的地方,而 Mozilla 是那間溫暖的「夫妻經營的小餐館」:客人會彼此打招呼、互相倒咖啡、幫忙收桌子。人們是特地繞過手邊現成的大廠瀏覽器、忍受各種「你的瀏覽器過期了」的警告,才來找 Firefox 的。

最後他把這封信收束成三句 TL;DR:尊重你自己、互相幫助、記得你到底是為誰工作。

離職之後的真心話

離職信寫得客套,那些「困擾他很久」的事,他在文章後續另外寫下來(原文內容很豐富,有時間建議閱讀):

  • 領導層不是功臣:業界常說「Mozilla 是『靠著』它的領導層存活下來的,而不是『因為』領導層」,他說這句話「最近聽起來特別真實」。
  • 使用者「極度不正常」:Firefox 的使用者是「deeply abnormal(極度不正常)」的一群人,你得主動去找、去下載、無視所有要你改用 Chrome 的廣告。而問題在於,領導層不知道該如何面對這種「不正常」。Mozilla 本來就是不正常的,幾乎每一行程式碼都是開源公開的、關鍵漏洞常常 24 小時內修掉。
  • 把開源透明當火星人:從傳統科技業挖來的領導者,多半來自「黑色高領毛衣之神」(暗指賈伯斯那套)信奉的世界,奉行「什麼都別告訴任何人」。對他們來說,「把東西免費送出去、而且透明到不可思議」這件事,簡直像火星人在做的事。
  • DAU 焦慮:日活躍使用者數(DAU)掉了好幾年,新的領導者每次進來都帶著大想法,而那些大想法幾乎都是「我們應該抄大廠在做的東西」。但這註定沒用。如果使用者真的想要那個功能,他們手邊的大廠瀏覽器早就有了,何必特地來用你?
  • 假裝成新創:每個新領導者都覺得「我們要像新創一樣思考!」可是 Mozilla 是一家 30 年的老公司,是新創的反面。結果他們「假裝成新創」假裝了 15 年,換來史上最低的 DAU。他的建議是,回頭看看 30 年歷史裡 DAU 最高的時候在做什麼。而那答案,從來都跟潮流無關:做自己擅長的事、保持那份「不正常」、幫人們做出他們真正想要的東西
  • 追企業合約的諷刺:Mozilla 一度想去賺「企業財」,得通過一堆 ISO 標準與資安認證、證明自己的程式與基礎設施夠安全。諷刺的是,企業客戶用的 curl、Linux 和一大堆開源工具,全是「網路上隨便一些人」寫的。而那些資安認證體系所要求的「金鑰妥善保管、建置環境安全、有可稽核的軌跡」,其實正是 Mozilla 這種「全部開源、公開修漏洞」的做法在示範給大家看的。
  • 倖存者偏差:推出爭議功能(DRM、AI、推播通知……)後,「聽使用者的意見」其實很難,因為會留下來告訴你想法的人是少數,多數人不爽就直接走了。於是你的資訊來源永遠是「留下來的那群人」,得到的滿意度自然虛高。他用了二戰那張著名的轟炸機彈孔圖當比喻。原文只一句帶過,這裡補充一下典故:你以為該補強中彈多的地方,但真正該補的是「沒中彈」的部位,因為中那裡的飛機根本沒飛回來。一個功能如果熱度過了新鮮期就掉下去,那大概就是你猜錯了,Reddit 上抱怨的人可能才是對的。
  • 最痛的一點,離棄社群:過去五年,Mozilla 由上而下地背離了它最大的後盾:社群。領導層認定「Mozilla 是靠自己走到今天的」。但它不是。他們說服自己「社群只是顧客、頂多是粉絲」,這激怒了非常多無償貢獻者。這些人付出了好幾年的時間,因為相信自己屬於一件更大的事,結果換來一句「你們只是顧客」,覺得被背叛了。

「如果讓我當 CEO,我會做什麼?」

他說,這是他面試時最愛問別人的問題,現在反過來問自己,答案有四個:

  1. 無聊一點:Mozilla 什麼都想做,做過購物樞紐、做過手機作業系統,然後一再發現自己不擅長。他們真正擅長的就是做瀏覽器。那就專心把核心功能顧好,讓那台「高速亂噴的義大利麵砲」先冷卻一下。
  2. 少一點登月計畫:Firefox 都存在這麼多年了,會用它的那群「怪人」要的很樸實,把累積已久的舊 bug 和技術債修一修、把東西做得更好用、更不煩人,而不是再來一個一年後就棄坑的花俏新功能。而且重大改動要預設 opt-in。他提醒、你的使用者不是你的粉絲,他們只是「勉強忍受你」,你得每天努力才留得住他們。這話聽起來消極,卻很務實。謙虛才會逼你進步。
  3. 重建你的社群:鼓勵外部貢獻,鼓勵到他們能「參與決定下一步要做什麼」的程度。他要的是真的會去修正 bug、做翻譯、回答海量問題的那些人,而不是用 Amazon 禮券把人圈進來坐一小時的焦點團體。(Firefox 曾經幾乎支援所有語言,靠的就是這群志工。)
  4. 別丟掉好東西:Mozilla 有個很糟的習慣、把成功的東西丟掉。Thunderbird 被晾在一邊、Rust 被丟出去(明明可能是金雞母)、Servo 說不定哪天會反過來打敗你、Bugzilla 才是原版好東西(Jira 不過是從它腐化出來的那場惡夢)。這些其實都可以重新邀請回來、一起把事情做得更好。

他真正的願望,是 Mozilla 能重新和社群連結,靠「有用」而不是靠「製造聲量」來成長,當生態系裡有活力的一分子,而不是吞掉一切的黑洞。

文章最後,他把自己這一年反覆問自己的問題攤開來:「我到底是為誰在做這些?」他得到的答案讓人很難過:「我做這一切,是為了讓某個人在下一份履歷上,多得一顆星星。」

反觀台灣:社群,不是研討會

讀完上面那段,我一直在想一件事。Mozilla 真正的問題,是忘了自己一直靠社群撐著,把那群無償投入的人慢慢當成顧客、當成一場可以反覆操辦的大活動。

那我們呢?台灣的開源圈、技術圈,犯的是一個方向相反、結果卻一樣的錯。Mozilla 是忘了社群還在,我們是把「辦了一場研討會」直接當成「我們有一個社群」。一個是遺忘,一個是替換,最後那群真正持續投入的人,同樣沒有被關注!

什麼才叫「社群」

社群,是「除了辦大型活動之外,平常還持續在一起做事」的那群人。一場一年一度的研討會,本身不是社群。

研討會頂多是社群的「年度高峰」,而且前提是,它背後真的有一個平常就在運作的社群。如果一年就那一場、辦完就散、隔年再重來,那它是個「活動」,不是個「社群」。

這跟 Jr Conlin 講的是同一件事,只是換了詞,對他來說,社群是那些「沒有 badge、沒有薪水,卻一直回來」的人。研討會是一個「事件」,社群是一段「持續的關係」。事件結束後,關係才開始累積。

正面的樣子:把社群做對的例子

台灣其實有把「社群」做對的例子,特徵都一樣,大會落幕後,它們仍在運作

  • g0v 零時政府:嚴格說,g0v 比較像一場運動、一個協作平台,不是單一個社群。真正在一起做事的,是各專案頻道裡平常持續協作、持續推進的那群人。每兩個月一次、由「揪松團」籌辦的「大松」(g0v 的大型黑客松)持續在辦,雙年會 Summit 只是其中一個節點而已,g0v 不是「靠 Summit 才存在」的。
  • 各語言、技術的 meetup 與讀書會(Python、Ruby、前端、資安……):定期小聚、定期分享、定期動手做。這些聚會通常不大,但它們是「持續的」。這才是讓新人能一直走進來、讓關係能一直長出來的入口。
  • COSCUP:嚴格說,COSCUP 是一場研討會、一個交會點,不是社群本身。它辦得好,是因為背後有眾多平常各自持續運作的社群,而不是大會那幾天本身。
  • 我自己在 Devconnect ARG 2025 也看過這種「對的設計」:大會給社群一塊空間(Community Hub),讓社群在活動週裡自己持續長出小議程、自己佈置、自己招呼人,而不是「一桌兩椅、講完就收」。給空間讓社群自己長,跟「把社群當成一個攤位節目」,是兩種完全不同的思路。

反面的樣子:辦完一場大會,就說自己有社群

對照之下,台灣也有不少這樣的型態:

  • 「我們辦了一場 XX 高峰會、XX 論壇、XX 年會,所以我們有社群」,但大會結束後,沒有持續的聚會、沒有持續的協作、也沒有讓新人持續加入的入口。明年再用同一套模板辦一次,中間 11 個月一片安靜。
  • 由上而下、由主辦方、政府、企業掛名的「社群」:名義上是社群,實際上缺了 grassroots(草根)那一層持續性。沒有人在「不辦大活動的日子」也願意一起做事。
  • 把參加者當「人次、KPI、觀眾」,而不是「會回來一起做事的夥伴」:這其實就是 Mozilla 把社群當顧客的台灣版,你關心的是「今年來了幾個人」,可惜不是「這些人會不會再回來」。

為什麼說台灣「面臨一樣的處境」

把 Mozilla 的狀況拿來對照,會發現問題幾乎一模一樣:

  • 一樣的倖存者偏差:我們只看得到「來參加大會的人數」,看不到那些默默離開、不再回來的貢獻者。活動報告裡只會寫「今年破紀錄、來了多少人」,不會有人記下「去年那批熱情參與的人,今年一個都沒回來」。
  • 一樣的「製造聲量」勝過「真的有用」:把資源和注意力都壓在一年一度的曝光與人次上(很像 Mozilla 追 DAU、追潮流),而不是去經營那種「能持續產出、能持續投入的夥伴」的關係。
  • 於是社群空心化:因為所有力氣都花在「大型活動」這個事件上,平常該持續運作的小聚、協作、新人招募反而無人承接。久了,大會還在,但大會背後那個「社群」已經被掏空了。

所以呢?

辦一場研討會、辦一場盛大的年會,當然是好事。但我想提醒自己,研討會是社群的「果」,不是「因」。沒有平常持續的活動撐著,一場大會就只是一次性的展演,熱鬧兩天,然後呢?

Jr Conlin 為 Mozilla 提出的那幾條建議,其實放到台灣的社群也成立。他說要「無聊一點」、別一直追新花樣,換成社群的話,就是別每年都想辦一場更大、更炫的活動,把心力放回每個月的小聚、每次的協作上。他說「別丟掉好東西」,就是別讓那些長期默默運作的老專案、老聚會自生自滅,它們往往才是社群真正的命脈。他說要「重建社群」、讓貢獻者能參與決定下一步,換成我們,就是讓平常一起做事的人有真正的位置,而不只是在大會那幾天被當成觀眾。

借用他那句話:社群,是那些「沒有 badge、沒有薪水,卻一直回來」的人。今年的大會來了多少人,其實沒那麼要緊。比較能說明一個社群還活著的,是大會結束三個月後,你還叫得出名字、還願意約出來一起做事的人,到底剩下幾個。

大會結束之後,還有多少人,願意持續一起做事?

這個問題我沒有標準答案,丟給你,也丟給我自己。如果你也在經營或參與某個社群,歡迎從一件小事開始:在下個月不辦大活動的那些日子,找幾個人一起動手做點什麼 🙂


本文前半為 Jr Conlin〈Leaving Mozilla〉的重點整理與編譯(非逐字翻譯,僅為評論性引用),原文連結:https://blog.unitedheroes.net/5751。後半的台灣社群觀察為個人觀點。

為什麼 Self-host 自架服務?

大約在一年前 2024/10 的時候,開始嘗試自架服務使用,一年後的此刻,整理一下自架的優缺點與心得。

  • Tailscale:建立一個大內網,安全的從外網連入。
  • Radicale:取代行事曆、通訊錄,支援 CalDAV、CardDAV 協定,iOS 可以整合使用。
  • FreshRSS:訂閱與管理 RSS 資訊,可以與應用程式整合。
  • Beszel:伺服器監控、歷史數據、Docker 統計與告警。
  • Open WebUI:自架 LLM、OpenAI、Anthropic 相容聊天介面。
  • Redmine:專案管理、待辦事項。
  • Memos:自架筆記、備忘。
  • WordPress:部落格、CMS。

隱私

選擇自架服務的原因在隱私,尤其平台可以把你的資料再次利用的時候,開始意識到我需要讓平台知道那麼多關於我的資訊嗎?我應該還有選擇的權力吧?而自己的資料擁有權應該屬於誰的,擁有平台的帳號應該不能表示也擁有平台,在沒有預警的情況下帳號隨時都有被停用、註銷的可能。

最後決定應該要有一個自己可以掌控資料的地方,但還有一個擔心的點跨不出去,如何安全的連回自己的主機?

Tailscale

跨出自架服務的第一步主要還是安全的考量,其次才是隱私,畢竟重要的資料是可以透過外部的網路存取到,需要特別注意是否會有任何的網站或是連線漏洞等問題。Tailscale 是一個可以突破內網(網路位址轉譯 NAT,不需要設定外部連線埠轉內部)、建立大內網域(透過 Carrier-Grade NAT, CGNAT 分配 IPs)的方式搭起一個私有網路。目前一個免費帳號可以建立 100 個連線裝置,包含行動裝置也可以安裝與納入。

Tailscale 是透過 Wireguard VPN 的技術與每個裝置建立起連線,除了每個裝置會有一個 IP 外,也可建立網域名稱並配發 SSL/TLS 憑證(Let’s Encrypt),在透過 HTTP 連線時也可以保有 HTTPS 的連線加密保障。網域的部分在後面自架服務時非常方便,憑證由於是 Let’s Encrypt 簽發的,瀏覽器可以正常識別其憑證的信任。

總之,與平時架站時設定 nginx 完全無異,甚至 80、443 連線埠都不用設定對外開放也可以連線(因為透過 NAT 的方式)。Tailscale 可以應用的方式太多了,後續會再提到!

Radicale

行事曆、通訊錄是重要隱私資訊的儲存媒介,Radicale 是支援 CalDAV、CardDAV 協定的伺服器,說伺服器有點不符合,因為他很輕量,作者當初想要挑戰用 Python 來完成一個課程的作業,想要證明用一個 Python 描述檔就可以實作完成,而作者也真的完成,後續也持續增補、修正。

iOS 也可以匯入 CalDAV、CardDAV 的協定連結,所以可以持續在「聯絡人」、「待辦事項」應用程式中使用。只是 Apple 有針對「待辦事項」額外開發的功能,如看板或子任務就無法使用。

回到隱私的考量,行事曆、通訊錄如果能夠自己掌握資料,那真的就不要放置在別人的服務中。想一想,今天如果帳號被接管了,除了郵件外,行事曆與通訊錄也是一個很重要的揭露資訊,能描繪帳號使用者輪廓的重要素材。

FreshRSS

現在還有多少人會使用 RSS 來閱讀網站更新的資訊,從以前閱讀網站資訊的時候都習慣訂閱該網站 RSS 資訊,從最早 Google Reader、Feedly,到此刻也因為隱私考量,自架服務使用 FreshRSS。

FreshRSS 雖然介面看起來停留在上一個世代,但其功能不因此打折扣,重點是很多行動裝置的應用程式都有支援與 FreshRSS API 溝通,所以可以再搭配一個額外的應用程式來閱讀或管理。我自己就購買 Reeder 在 iOS 上閱讀或是訂閱、在瀏覽器上一個分頁固定給 FreshRSS 持續收取最新資訊。

題外話,關於 RSS 的使用,現在也越來越多人思考是不是要回到這樣單純閱讀資訊的方式,我們要的究竟是把使用者努力帶來網站上做什麼?還是讓我們想要說的資訊傳遞出去呢?(通常努力把人帶回到網站是因為想透過網站上的廣告獲利)

Beszel

Beszel 是輕量監控平台,由彙整儀表板(Hub)與裝在被監控主機(Agent)組成。可檢視 CPU、記憶體、磁碟、網路、Conatainer 歷史與警示通知。

不需對外開 port,直接走 Tailscale 內網就可以,自架服務一多,總是要有個地方可以集中看「誰在跑、網路流量、有沒有異常」。文件與說明:https://beszel.dev

Memos

Memos 是自架筆記、備忘服務,隱私優先、無追蹤、支援 Markdown。思考、靈感或隨手紀錄的文字放在自己主機,不依賴其他第三方服務。與前面 Radicale、FreshRSS 屬於 DeGoogle 計畫中的一環。

Memos 雖然在行動裝置上可以直接用網頁開啟使用,但也有應用程式版本可以使用:iOSAndriod

Open WebUI

自架 LLM 聊天介面,可接本地或遠端 API(如 Ollama、OpenAI 相容端點)。對話內容與 prompt 不經過第三方,模型可跑在自己機器或你信任的端點。另一方面,透過 API 的方式連結語言模型所得到的回覆比較不會參雜個人化的設定在其中,或許現在使用 web 或 app 的方式有改善,但當初選擇自建立的時候是遇到很明顯的喜好記憶問題。

現在主要是串接 OpenAI、Antropic 的 API 使用,用在翻譯、寫作建議、問問題或是純粹閒聊的情境上。串接本的 Ollama 反而受限於主機硬體關係沒有使用。(open-webui

Redmine

專案管理、議題追蹤、甘特圖、自架替代 Jira、Linear 等。專案與待辦留在自己環境,適合個人或小團隊。我會在專案層級用 Redmine、個人待辦用 Radicale。(Redmine)。

Redmine 是一個很老牌的開源專案管理服務,我自己手邊如果有跨季度的專案,執行過程中需要依進度切割的話,我會用 Redmine 來協助我規劃與導航。用習慣後發現,單純的介面比較不會影響規劃時的思緒。

WordPress

之前是透過 Blogger 來寫文章,但後來平台看起來都沒有開發新功能,我自己也停了一段時間沒有寫文章,就這樣荒廢很久。直到最近想要恢復寫文章分享、紀錄的習慣。也有考慮一些可以產生靜態網站的,但看到 WordPress 越來越好用,就選擇自己來架一個用看看。

目前沒有裝太多的套件,基本款的 WordPress 已經算很好用了,文字編輯介面也滿好處理一些格式或區塊的問題,內建的版面外觀也滿好用的,調整好一個比較好看的版面後就專心寫文字。

唯一會擔心一點的部分是常常會聽到一些零時的漏洞問題,但因為前面有用 Cloudflare 擋一下,雖然不是萬無一失,但至少可以減少一些風險。

最後

自架服務一年後,除了隱私的考量外,希望可以有一個自己可以掌控資料的地方,一方面也是要測試去 Google 服務或是降低對其他平台的依賴。另外也是因為 Tailscale 的關係,可以建立一個大內網,安全的從外網連入,讓在一台主機上架設多個服務變得更加方便。

2026,我想專心把這兩個專案做好

今年我手邊有兩個專案,會在 2026 年 持續、也更專心地投入執行。如果你對其中任何一個有興趣、也認同背後的理念,都非常歡迎一起加入。

這兩個專案分別是:一個是我目前服務的開放文化基金會(OCF)OSCVPass 2.0,另一個則是我在業餘時間投入經營的匿名網路社群

下面依序簡單介紹這兩個專案的背景與接下來的方向。

OSCVPass 2.0

OSCVPass 是一個為開源貢獻者提供回饋與支持 的專案。在 1.0 版本時,我們透過申請機制,讓近一年有參與開源貢獻的人,可以獲得一個認證身分,並在參與年度研討會時享有票價優惠或其他回饋方式,作為對貢獻的感謝。

到了 2.0 版本,這些既有的回饋方式依然保留(向下相容),但專案的重心會開始轉變。基金會希望從較被動的申請制,走向更主動的支持角色,包含:

  • 協助個人了解如何參與開源專案
  • 協助開源專案被更多人看見、把成果整理得更清楚
  • 協助社群持續參與國際交流與資訊更新

整體會以「個人、專案、社群」三個面向來推動。之所以會有這樣的調整,其實來自過去幾年的觀察:

  1. 很多貢獻者在申請完成後就消失了
  2. 有些專案即使開始成形,也因為沒有接手的人而中斷
  3. 社群更是如此,近十年來消失或停滯的案例並不少見

OSCVPass 2.0 嘗試回應的,就是這些「結構性很難撐久」的問題。我們希望能更早發現可能性,並在適當的時間點介入,協助它發生、也陪它走一段路

這次的專案執行,也會正式引入志工體系。我們正在募集認同開源價值、也對台灣開源生態現況有所關心的夥伴,一起嘗試把這件事做得更長久、更有彈性。

我在這個專案中,主要負責的是:

  • 協助志工夥伴的 onboarding
  • 建立專案相關文件與引導手冊
  • 整理背景脈絡,讓新加入的人可以透過文字快速理解整體狀況
  • 協助基金會內部與「社群相關」業務的流程整合,看看是否能在 OSCVPass 的框架下,讓行政與協作更順一些

這些看起來很基礎的事情,其實正是讓專案能不能持續下去的關鍵起手式。

匿名網路社群 anoni.net

匿名網路社群是在 2025 年逐漸成形的。到了 2026 年,預計會聚焦在三個主題上持續推進:

  • 匿名網路與網路自由的推廣
  • Tor Relay 在校園學術網路中的建立
  • 匿名支付的可能性與限制

在匿名網路的推廣上,除了持續進行 Tor、Tails、OONI 等工具的教學與使用說明,我們也會補上「為什麼重要」之後的下一步:如果你知道隱私與網路自由很重要,那在個人能力可及的範圍內,可以怎麼開始?

這個調整其實來自 2025 年工作坊後的回饋。很多夥伴提到,直接跨入使用 Tor 一整套工具,心理門檻仍然偏高。因此我們計畫先從「個人隱私的基本防護」開始,一步一步引導,讓更多人能找到適合自己的起點。

第二個主題是 Tor Relay 校園節點的建立。前陣子我們在臺師大有一個成功案例,透過良好的溝通方式,獲得教授支持與行政配合,順利在校園學術網路中建立了 Tor Relay 節點。

接下來,我希望能把這個案例整理成可被複製的經驗,分享給其他學校的相關社團或科系,搭配既有的溝通範本與企劃書,降低校方的疑慮與負擔,讓更多校園成為匿名網路的基礎節點。

最後一個主題是匿名支付。這是匿名概念在現實生活中的延伸。支付行為其實牽涉大量隱私,但在高度便利的消費環境中,這個失衡往往不容易被察覺。我們希望能從一般消費到跨境支付,一邊理解實際需求,一邊謹慎討論合規與界線。

2026 年,匿名網路社群會同時推進這三條主線,也會嘗試舉辦幾場工作坊活動。過去在大型研討會中的經驗讓我們發現,匿名與隱私的實作,不一定只能在封閉場域中發生,也可以「藏」在大型公開活動裡,被更多人自然地學會與使用。

最後

老實說,我並不確定這兩個專案最後會走到哪裡,也無法保證它們一定能成為什麼「成功案例」。

開源生態是否真的能被撐得更久?匿名與隱私的討論,是否能在現實限制中留下空間?這些問題其實也還在一邊做、一邊確認。但至少在 2026,我選擇不急著給答案,而是願意花時間,把一些我認為重要的事情慢慢試過一次。也許進度不會很快,也可能途中會需要調整方向,但如果能在過程中多留下幾條可被理解、可被延續的路,那這一年的投入,對我來說就已經很值得了。

如果你在讀到這些內容時,心裡浮現了一些疑問、好奇,或只是隱約覺得這些議題和自己關心的事情有一點重疊,那其實就已經很足夠了。不需要立刻知道自己能做什麼,也不一定要以「參與者」的身分出現,有時候只是交換想法、分享觀察,或聽聽彼此正在煩惱的事情,本身就是很重要的開始。

這些專案目前也仍在持續調整與學習中,如果你願意聊聊、看看、或單純保持聯繫,都很歡迎交流,讓這些討論有機會慢慢延伸,而不急著走向任何結論。

Stalwart 開源郵件伺服器即將發佈 1.0 版本,成為第一個實作 JMAP 協議的郵件伺服器

雖然現在已經很少人自架郵件伺服器了,但是一款開源的郵件伺服器軟體 Stalwart 完成了 JMAP 的實作!這篇文章介紹了 Stalwart Labs 一個重大里程碑:完成 JMAP 用於行事曆、聯絡人、地址簿、檔案儲存及分享的完整實作,使 Stalwart 成為首個支援完整 JMAP 協作協議的郵件伺服器。

完整的文章內容: https://stalw.art/blog/jmap-collaboration

  • 新一代協議:JMAP 包括用於行事曆、聯絡人、檔案儲存及分享的新協議,目標取代傳統的 WebDAV 技術如 CalDAV 和 CardDAV,並引入 JSCalendar 和 JSContact 作為 iCalendar 和 vCard 的繼承者。這些新標準提供一致且優雅的生態系統。
  • 舊技術的限制:傳統的 WebDAV 及其延伸技術因 XML 設計的複雜性,導致實施困難且互通性差。iCalendar 和 vCard 的技術負擔也使這些格式難以維護。
  • JMAP 的現代解決方案:JMAP 協議以 JSON 為基礎,透過 HTTPS 提供高效且清晰的 API,用於郵件、行事曆、聯絡人及檔案分享,簡化協作技術實作,提升可讀性與解析效率。這次發佈不僅帶來新功能,更改變了群件協議的設計和實作方式,對開發者和組織而言意味著更簡單、更少的互通性問題,並加速創新。
  • 客戶端支援與生態系統:目前已有幾個專案(如 Mailtemi、Parula 和 OpenCloud)在開發 JMAP 的客戶端實作,預期 JMAP 會快速被採用。
  • 感謝及未來展望:感謝 NLNet 對 JMAP 開發的支持。Stalwart 開發團隊將致力於性能優化和增強功能,目標在未來幾個月內推出正式的 1.0.0 版本,樹立開放且現代化的郵件通信伺服器新標準。

前幾個月有把 Stalwart 架起來,很難想像在此刻架一台郵件伺服器能有多難,但再往前跨一步出去後發現,很多雲端服務如 AWSDigitalOcean 將 25, 465, 587 連線埠給關閉或不提供 IP 反向解析1(PTR/RDNS),即使架好了也無法與其他郵件伺服器溝通,或許當越來越多人使用 Stalwart 後這個問題有可能會被克服,我很期待可以自己架設郵件伺服器!


  1. 設定 IP 反向解析(PTR/RDNS)有助於驗證發信伺服器的真實身份,提高郵件的可信度並減少被標記為垃圾郵件的風險,確保郵件順利地送達收件者的主要信箱,提升整體郵件的可交付性。 ↩︎

開源自架服務 immich 被 Google 安全瀏覽誤判為「危險」網站

Google 提供一項名為「安全瀏覽(Google Safe Browsing)」的服務,用來檢測網站是否存在惡意軟體、不受歡迎的軟體或從事某種社交工程行為。不過,對於如何判斷網站是否「危險」的細節仍然不太清楚。這導致使用 Google 安全瀏覽服務的瀏覽器(如 Chrome 和 Firefox)會自動警告使用者,除非少數人忽視這樣的警告,否則這些網站幾乎無法被訪問。

而近期一款開源自架的照片、影片管理軟體 immich,因為自家的 Demo 網站被標記為危險,影響到整個網域的使用。immich 解釋如何透過 Google 的申訴管道提出恢復,但恢復之後所產生的頁面也再次被標記危險。結論提到目前像是可自架服務的 NextCloud、n8n、Jellyfin …… 等,都會有這樣發生的可能,對於開源、自架環境是一個潛在的阻礙

有興趣可以閱讀完整內容:https://immich.app/blog/google-flags-immich-as-dangerous


查了一下 Google Safe Browsing 沒有公開名單讓人查閱哪些網站被放入,只有一個查詢的網站可以使用,雖然我自己不是用 Chrome,但其他使用者以目前 Chrome 的市占率,其影響不容小覷。

這樣的審查模式與臺灣之前討論 RPZ 類似,一樣也是不公佈名單,但 Google 比較麻煩的部分是評判標準不明,然後又常常誤判,申訴後也不知道何時可以恢復,如果真的遇到誤判,還真的不知道該如何面對。

之前作過一個內部系統,也是遇到這樣的問題,想說臨時換一個網域應該可以解決,但又馬上被判定「危險」,最後只能請使用者關閉「安全瀏覽」檢查的功能,還好不是面對外部的使用者,可以這樣一一通知暫時解法使用。

mkdocs-material on Github Actions

Material for MkDocs 網站截圖
Material for MkDocs 是一個專為 MkDocs 設計的主題,都用來生成美觀且易於瀏覽的靜態文件網站。它結合了現代設計美學和豐富的功能,使得技術文檔不僅易於閱讀,還能夠輕鬆地進行導航和查找內容。這個主題提供了多種自訂選項,支援多語言以及進階搜尋功能,讓使用者能夠快速建立專業級的文件網站。對於開發人員和技術作家來說,Material for MkDocs 不僅提升了文件的可讀性,還大大簡化了文件的維護和展示工作。

滿喜歡用 Material for MkDocs 來產生文件網站,嚴格來說,這是一個建構在 MkDocs 之上的一個樣式套件,只是又加入了滿多設計樣式,相對於原始 MkDocs 來說在文件閱讀排版上更清晰。

以前常用 Sphinxrst 格式的純文字內容,後來 Markdown 成為主流,延伸出許多靜態網頁套件或是對應 Markdown 轉換其他文件格式的應用。我記得我是在使用 FastAPIPydantic 的技術文件注意到為什麼有一套很美的文件產生樣板,使用後就決定採用在當時做的專案,建構文件資訊給予其他貢獻者參與、閱讀。

以往所建立 Material for MkDocs 的文件專案,大部分都會將建立好的靜態網頁上傳到 AWS S3 存放,直接透過 AWS S3 的網站設定或是透過 nginx 路徑轉址合併到原有的網站中(如:/docs)。反而發現從來沒嘗試過直接用 Github Pages 來建立 Material for MkDocs 文件專案。

在 Github Actions 中有三種方式可以實現 Github Pages 的發佈,可以參考這份 yaml 檔案的描述。這裡用的套件管理是 uv。

MkDocs 有整合 Github Pages 的發佈,可以透過 mkdocs gh-deploy 來佈署,直接一行指令就可以完成。

- name: Build MkDocs
  run: |
      uv run mkdocs gh-deploy -b gh-pages -d ./docs

直接將產生出來的靜態檔案 ./docs 內的檔案上傳到 gh-pages 分支的頂層位置。

第二種方式是每次都從 main 建立一個新的分支 gh-pages 然後產生靜態文件後,強迫上傳覆蓋遠端原有的 gh-pages,這樣的方式是只會看到最新的文件提交紀錄。

- name: Build MkDocs
  run: |
      uv run mkdocs build -d ./docs
      git checkout -b gh-pages main
      git add -f ./docs
      git commit -m 'Deploy MkDocs to GitHub Pages'
      git push -f origin gh-pages

第三種方式是用 worktree 的方式將 gh-pages 建立在 ./docs,然後把靜態文件產生到 ./docs 中完成提交與推送。

- name: Build Mkdocs
  run: |
      git worktree add ./docs gh-pages
      rm -rf ./docs/*
      uv run mkdocs build -v -d ./docs
      cd ./docs
      if [ -n "$(git status --porcelain)" ]; then
        git add .
        git commit -a -m 'Deploy on ${{ github.ref_name }} ${{ github.sha }}'
        git push origin HEAD
      else
        echo "No changes to commit."
      fi

歷史紀錄

如果有使用 mkdocs-git-revision-date-localized-plugin 套件,應該會發現每次產生出來的文件建立日期與修改日期都會是一樣的,那是因為 Github Actions 在使用 actions/checkout 的時候不會擷取過往的 git 歷史提交,需要指定參數來提示擷取完整的 git 紀錄。

- uses: actions/checkout@v5
  with:
      fetch-depth: 0

以上,透過三種方式來建立 Material for MkDocs 靜態文件,看起來多行的指令是可以保留一些彈性操作的可能,例如在最後更換 og 預覽圖,當使用免費版本,都只能呈現預設的樣式。

Material for MkDocs 是一個很好快速建立靜態文件或是針對專案類型的說明網站,建立在 Github Pages 上也不用擔心主機安全性或流量問題,覺得這是一個值得投入瞭解與應用的靜態文件套件!