開發者與技術說明

技術架構、資料模型、自建後端與貢獻指南。

專案總覽

墨家書櫃由三個部分組成:一個注入到讀墨網頁的 Chrome 擴充功能(Extension)、一個可在手機瀏覽家庭書櫃的 PWA, 以及一個可自建的 Cloudflare Workers 後端。三者共用同一組 API 與加密協定。

所有核心資料在上傳前都會在使用者瀏覽器端以 AES-256-GCM 加密,伺服器採零知識設計,只儲存密文。

技術架構

層級技術說明
前端 Chrome Extension(React 19 + TypeScript + Vite) Content Script 注入 Dialog 至讀墨頁面;Manifest V3
行動端 PWA(React + TypeScript) 與 Extension 共用同一後端;無法爬取讀墨書單
後端 Cloudflare Workers + Hono Serverless API,免費額度即可運行,可自建部署
儲存 Cloudflare KV 個人設定(per user)+ 家庭群組(per family)
加密 Web Crypto API(AES-256-GCM) 端對端加密,伺服器零知識
測試 Vitest + React Testing Library + Playwright + Miniflare 單元/元件/E2E/整合測試

資料模型

採兩層設計,將個人偏好與家庭群組解耦:

1. 個人分享設定(user:{user_id}

2. 家庭群組(family:{family_id}

設計重點 — 個人設定歸屬使用者,家庭書櫃只是「聚合查詢」的結果。使用者加入或離開家庭時,個人設定完全不動, 只是被聚合的對象改變。

同步碼格式

同步碼同時傳遞三件事:家庭 ID、加密金鑰,以及(可選的)API 端點。

moo-{family_id_short}-{encryption_key_encoded}            # 使用預設 API
moo-{family_id_short}-{encryption_key_encoded}@{host}     # 使用自訂 API 端點

當使用自建後端時,@{host} 後綴會自動帶入 API 端點設定,家人收到同步碼後無需手動設定, 確保同一家庭所有成員使用相同的後端。

自建後端(BYO Backend)

不想把資料存在預設伺服器?你可以部署自己的 Cloudflare Worker,完全掌控資料。Cloudflare 的免費額度即可運行。

  1. Fork 本專案,進入 worker/ 目錄
  2. 安裝 Wrangler CLI:npm install -g wrangler
  3. 登入並部署至你的 Cloudflare 帳號:
    cd worker
    wrangler login
    wrangler deploy
  4. 在擴充功能或 PWA 的設定頁中,填入你的 Worker URL
  5. 建立家庭後,同步碼會自動帶入 @{host},把它傳給家人即可
注意 — 同一家庭內所有成員必須使用相同的 API 端點。改用不同端點的成員會被視為不同家庭。

詳細部署步驟請參閱 worker/DEPLOY.md

Extension 與 PWA 功能對照

手機上無法安裝 Chrome Extension,因此 PWA 僅提供瀏覽與設定功能;爬取讀墨書單只能在桌面端 Extension 完成

功能ExtensionPWA
瀏覽家庭分享書櫃
建立/加入家庭
個人書櫃分享設定✓(針對已同步的書)
從讀墨網頁爬取書單
自訂 API 端點
離開家庭
手機版無法自動匯入讀墨書單。首次使用需先在桌面端 Extension 完成至少一次同步,之後即可在 PWA 調整分享設定與瀏覽。

API 端點

所有 API 使用 RESTful JSON,統一包在 { data, error } envelope 內,前綴為 /api/

驗證

MethodPath說明
POST/api/auth/lookup以預先雜湊的 userId 查詢家庭歸屬
POST/api/auth/refresh刷新驗證 token

個人設定

MethodPath說明
GET/api/user/:id/books取得個人書單與分享設定
PUT/api/user/:id/books更新分享設定

家庭群組

MethodPath說明
POST/api/family建立新家庭
POST/api/family/:id/join以同步碼加入家庭
DELETE/api/family/:id/member/:uid離開家庭
GET/api/family/:id/members列出家庭成員
GET/api/family/:id/bookshelf聚合家庭分享書櫃

安全與隱私設計

參與開發

歡迎提交 Issue 或 Pull Request。專案採 TypeScript 嚴格模式,核心流程(crypto、API)要求測試覆蓋率 ≥ 80%。

開發環境

pnpm install
pnpm dev           # 啟動 Extension 開發伺服器
cd worker && pnpm dev    # 啟動 Worker 本地開發(Miniflare)
pnpm test          # 執行單元與元件測試
pnpm test:e2e      # 執行 E2E 測試(Playwright)

詳細貢獻指南請參閱 CONTRIBUTING.md, 專案文件位於 docs/