# Tbook(暫定名)· 自製雲端筆記 Web App 設計文件 > 版本 v0.1(草案)· 2026-10-18 · 狀態:待審閱 > 定位:免費、自控、Notion 風格的雲端筆記系統(個人使用優先) --- ## 1. 背景 Notion 好用,但兩個痛點: 1. **要訂閱付費** 2. **功能唔啱心水**(語音輸入、自訂 AI、MD/HTML 雙格式等想自己加) 目標:做一個自己全權控制、零訂閱費嘅 Notion-like web app,並加入自己想加嘅功能(語音板、AI、雙格式)。 ## 2. 目標 / 非目標 **目標(MVP 範圍內)** - Web app 形式,需登入使用 - Notion 風格 UI(左側邊欄 + 區塊化頁面) - 筆記上雲端,任何裝置開瀏覽器即可存取 - Markdown 為主格式,**同時探索 HTML 支援**(雙格式) - 語音輸入面板(語音 → 文字,插入筆記) - AI 功能:文字輔助、圖片生成、語音轉文字 **非目標(暫時唔做)** - 行動原生 App(先做 PWA,可安裝) - 多人即時協作(CRDT 留到後期) - 團隊權限管理(個人 workspace 為先) ## 3. 需求清單 | # | 需求 | 說明 | 優先級 | |---|------|------|--------| | R1 | 登入 | 帳號系統,註冊/登入 | P0 | | R2 | 雲端 | 筆記上雲,瀏覽器存取,自動儲存 | P0 | | R3 | Web app | 純 web 形式(PWA 加分) | P0 | | R4 | Notion 風格 UI | 側邊欄 + 區塊編輯 + slash menu | P0 | | R5 | Markdown | 主要文件格式,可匯入/匯出 .md | P0 | | R6 | HTML | 亦支援 HTML(手打方便),探索雙格式同時支援嘅方式 | P1 | | R7 | 語音板 | 語音輸入面板,喺部電腦嘅瀏覽器內測試可用 | P1 | | R8 | AI | 文字輔助、圖片生成、語音轉文字 | P2 | | R9 | 內容遷移 | 將現有自己做嘅嘢(筆記/作品)搬入新 app | P2 | ## 4. 整體架構 ![整體架構](diagrams/architecture.svg) ## 5. 技術棧(建議) | 層 | 建議 | 備選 | 理由 | |---|------|------|------| | 前端 | Next.js + React + TypeScript | Vite + React | API routes 一鍋端、SSR、部署簡單 | | 編輯器 | Tiptap(ProseMirror 核心) | BlockNote、CodeMirror 6 | 區塊式 WYSIWYG 最似 Notion;原生支援 MD/HTML 匯入匯出 | | 資料庫 | PostgreSQL | SQLite(MVP 可先简化) | 結構化資料 + 全文搜尋 | | 認證 | Email + 密碼(Argon2id)+ JWT(httpOnly cookie) | Better Auth / Supabase Auth | 零依賴、自控 | | 檔案 | MinIO(S3 協議) | 本地磁碟 + 靜態伺服 | S3 協議日後遷移容易 | | STT | faster-whisper(自託管) | OpenAI Whisper API、Web Speech API | 粵語準確度好、可離線、無按字計費 | | AI | Provider 抽象層(OpenAI / Anthropic / Ollama / 本地 SD) | — | 用家可自帶 key,成本自控 | | 部署 | Docker Compose(next + postgres + minio) | VPS / 家用伺服器 | 一鍵部署、搬遷容易 | > 成本角度:全部自託管 = 只係電費/伺服器錢,AI API 先係唯一變數(可用本地模型壓低)。 ## 6. 關鍵功能設計 ### 6.1 登入 - Email + 密碼註冊/登入;密碼 Argon2id hash - JWT 雙 token:access(15 分鐘)+ refresh(30 日),httpOnly cookie 存放 - 忘記密碼:email reset link - v2:GitHub / Google OAuth ### 6.2 雲端儲存與同步 - 前端 debounce 1–2 秒自動儲存 → `PUT /notes/:id` - 歷史版本:每次儲存留 snapshot(MVP 先留最近 50 版) - MVP:單裝置「雲端儲存」模式 - v2:Yjs CRDT + WebSocket 多裝置即時同步(Tiptap 有原生 collab 擴充,成本低) ### 6.3 編輯器:Markdown + HTML 雙格式(重點探索) **Plan A · JSON 文件為單一事實來源(進階,最終形態)** - 用 Tiptap 區塊編輯器,內部存 JSON 文件 - MD / HTML 只係同一文件嘅兩種**檢視**:匯入(.md / .html)+匯出(.md / .html) - ✅ WYSIWYG 體驗最好;兩格式自然雙向;AI 理解結構容易 - ❌ 學習曲線較陡 **Plan B · 每篇筆記標記單一格式(簡單,MVP 建議)** - `notes.format = 'markdown' | 'html'` - MD 筆記:Tiptap WYSIWYG 編輯 - HTML 筆記:CodeMirror 6 手打 + iframe sandbox 即時預覽 - ✅ 實作快;「同時支援 MD 同 HTML」即刻成立(每篇各選一種) - ❌ 兩種編輯體驗唔統一;單一筆記唔可以混合 **Plan C · Markdown 為單一來源** - 存 raw MD,編輯器係 code editor + 預覽 - 容許 MD 內嵌 HTML block(要 sanitize) - ✅ 最簡單、最 portable - ❌ WYSIWYG 弱、HTML 混排有安全風險 **建議路線:M1/M2 用 Plan B 快速落地 → M4 之後遷移 Plan A。** Tiptap 本身有 MD/HTML serializer,Plan B 嘅 MD 筆記內容可以直接過檔,遷移成本可控。 ![MD / HTML 雙格式方案](diagrams/dual-format.svg) **HTML 安全措施:** - 預覽用 `