跳至内容
cutty.dev
All posts

cutty.dev 的技術堆疊——深思熟慮的選擇

cutty.dev 的底層是什麼,以及為什麼這樣設計。不談宣傳:哲學在於使用乏味但穩定的技術棧、在歐盟進行託管,並將隱私內建於架構之中,使得單人即可維護。

大多數「我的技術棧」文章都是一份自豪的新興技術清單。但這篇不同——它談的是 cutty.dev 背後所秉持的哲學:選擇沉穩而非追新,歐洲風格而非美國風格,以隱私為核心設計,並且簡單到一個人就能維護。

框架:Astro(伺服器端渲染)

cutty.dev 是一個採用伺服器端渲染的 Astro 應用程式。每個請求都會經過伺服器,動態組裝頁面並返回完整的 HTML。

為什麼: 我想要伺服器端渲染,但避免繁重的基礎設施;框架內建對多種語言的良好支援;以及零額外開銷的速度。Astro 提供了所有這些優點,且程式碼保持清晰可讀——對於個人專案而言,這比任何時髦的附加功能都更有價值。

資料庫:SQLite

單一資料庫,單一檔案。搭配對 TypeScript 友善的查詢層,讓資料結構的變更能立即在程式碼中顯示錯誤,而非等到生產環境才暴露問題。

為什麼: cutty.dev 主要是一個「讀取密集型」應用——每次點擊連結都代表一次讀取操作,同時也會增加計數器。SQLite 在這方面表現極佳,即使面對每天巨大的流量也能輕鬆應對。備份僅僅是複製單一檔案而已——無需冗長的複製儀式,也不需要複雜的腳本。這裡的簡潔並非以犧牲品質為代價;而是一個深思熟慮的決定:更少的移動部件意味著更少可能出錯的環節。

主機託管:歐盟境內的伺服器

專屬歐盟伺服器、自訂 TLS 憑證、具備自動 HTTPS 功能的反向代理,以及容器化應用程式。

為什麼: 這是 cutty.dev 處理數據的基礎。對數據位置擁有完全控制權(對歐盟客戶及 GDPR 合規至關重要)、不依賴單一供應商、不會像大型雲端平台那樣自動將數據複製到美國,以及可預測的成本而非基於流量的計費。使用便捷的西方平台或許能加快起步速度——但代價是用戶數據的物理存放地點將由他人決定。

翻譯:本地 AI 模型

cutty.dev 以 25 種語言運作,其翻譯由運行在我們自有基礎設施上的本地開源 AI 模型完成。

為什麼: 介面中的任何文字都不會外洩——我們不會將其發送給任何外部 AI 供應商。這帶來了單次翻譯的零成本以及對品質的完全控制:我們可以隨時刷新翻譯內容。機器翻譯始終需要人工審核,且每種語言都經過了這樣的審查;但自主處理意味著隱私不是定價表中的一個選項,而是架構的本質屬性。

CSS:實用優先(Tailwind)

一個樣式系統,無需 CSS-in-JS,無需單獨的樣式檔案。所有內容直接寫在模板中。

為什麼: 迭代速度。我不會把時間浪費在為類別命名上,而未使用的樣式也不會出現在最終頁面中。系統本身強制實施了統一的設計。對於一個人來說,每一分鐘花在次要事項上的時間都至關重要。

部署:容器

以容器(Docker)運行的應用程式,採用可重複且具移植性的方式進行部署。

為什麼: 本地與生產環境保持一致,避免「在我這裡沒問題」的藉口,並且能在半小時內將整個系統遷移至其他伺服器(如有需要)。可移植性即是一種獨立性。

這教會了我什麼

  • 平庸的技術堆疊勝出。 Astro、SQLite、Tailwind 和容器——一切都已成熟、文檔完善且穩定。不會在最意想不到的時刻崩潰。
  • 歐盟的主機服務已具備生產環境條件。 「必須使用大型美國雲端服務才算正經」只是個謠言。
  • 本地 AI 已成現實。 不需要將數據交給外部 API 就能獲得良好的翻譯效果。
  • 一個人也能打造出看起來像團隊作品的產品。 時間是比金錢更昂貴的資源,因此這裡的每個選擇都旨在保護時間。

即時觀看。技術相關問題請來信 hello@cutty.dev,我會在當天回覆。