Life OS:Obsidian 知識庫整合專案
從 Strapi CMS 遷移到 Obsidian + Astro Content Collections,打造完整的個人知識管理與發布系統
專案簡介
Life OS 是一個整合式的個人知識管理與內容發布系統,透過將內容管理從 Strapi CMS 遷移到 Obsidian,打造了一個從筆記到發布的完整工作流程。
核心理念: Write Once, Publish Everywhere
專案背景
為什麼做這個專案?
過去使用 Strapi CMS 管理部落格內容,雖然功能完整,但面臨幾個問題:
- 工作流程斷裂: 在 Obsidian 寫筆記 → 複製到 Strapi → 手動設定 SEO → 發布
- 維護成本高: 需要維護獨立的 Strapi 伺服器、資料庫、API
- 內容不可攜: 內容鎖定在 Strapi 資料庫中,難以遷移或備份
- 開發體驗差: 每次修改內容都需要透過 CMS 介面,無法使用慣用的編輯器
目標
- ✅ 統一寫作與發布流程(Obsidian 即是發布源)
- ✅ 完全靜態化,零維護成本
- ✅ 內容可攜性(純 Markdown,版本控制)
- ✅ 自動化 SEO 與發布流程
- ✅ 支援多種內容格式(Blog、Projects、Slidev)
技術架構
技術堆疊
- 內容管理: Obsidian(雙 vault:blog + slides)
- 靜態網站: Astro 5 + Content Collections
- 簡報系統: Slidev + 客製化主題
- 部署: Vercel(自動 build + CDN)
- 工作流程: Claude Code Slash Commands
系統架構圖
┌─────────────────────────────────────────────────────┐
│ Obsidian Vaults │
├─────────────────────────────────────────────────────┤
│ Blog Vault │ Slides Vault │
│ (site/src/content/blog) │ (slides/) │
│ - 部落格文章 │ - 簡報內容 │
│ - 專案紀錄 │ - 演講資料 │
└──────────┬───────────────┴────────────┬─────────────┘
│ │
▼ ▼
┌─────────────┐ ┌──────────────┐
│ Astro 5 │ │ Slidev │
│ Content │ │ Presentation│
│ Collections │ │ System │
└──────┬──────┘ └──────┬───────┘
│ │
│ Git Push │
└──────────┬───────────────┘
▼
┌───────────────┐
│ Vercel │
│ Auto Build │
│ + Deploy │
└───────┬───────┘
▼
┌───────────────┐
│ Production │
│ pwlee.dev │
│slides.pwlee.xyz│
└───────────────┘
核心技術選擇
為什麼選擇 Obsidian?
- 本地優先,完全掌控資料
- Markdown 格式,內容可攜
- 豐富的外掛生態系統
- 已經是日常筆記工具
為什麼選擇 Astro Content Collections?
- 原生支援 Markdown/MDX
- Type-safe schema validation(Zod)
- 零 runtime overhead(完全靜態)
- 優秀的開發者體驗
為什麼選擇 Slidev?
- Markdown-based,與 blog 工作流一致
- 支援 Vue components
- 客製化主題能力強
- 可輸出 PDF/PPTX/SPA
開發過程
Sprint 1:Foundation & Blog Migration
挑戰: 從 Strapi SQLite 提取資料並轉換成 Astro Content Collections 格式
解決方式:
- 分析 Strapi 資料庫 schema
- 撰寫 SQL query 提取 posts 資料
- 建立 Content Collections schema(Zod)
- 手動轉換 6 篇文章到 Markdown
- 遷移圖片到 co-located folders
成果: 6 篇部落格文章成功遷移,SEO 完整保留
Sprint 2:Obsidian Setup & SEO Workflow
挑戰: 建立自動化的 SEO 生成與發布流程
解決方式:
- 配置 Obsidian vault 設定(image paste, templates)
- 建立 Claude Code Slash Commands:
/blog-generate-seo- AI 生成 SEO metadata/blog-validate- 檢查 frontmatter 完整性/blog-review- AI 內容品質審查/blog-publish- 完整發布流程
- 整合 Context7 MCP 查詢最佳實踐
成果: 從寫作到發布只需 3 個指令,SEO 自動化生成
Sprint 3:Image Optimization & PostCard 重構
挑戰: Obsidian 貼上的圖片需要自動優化並正確顯示
解決方式:
- 配置 Obsidian image paste settings(auto-copy to current folder)
- 使用 Astro
<Image />component 自動優化 - Vercel 自動產生 WebP/AVIF
- 重構 PostCard 元件使用統一設計系統
成果: 圖片 paste → build → 自動優化,Lighthouse 95+ 分
Sprint 4:Slidev Integration
挑戰: 建立與 blog 一致的簡報工作流程
解決方式:
- 建立獨立的
slides/Obsidian vault - 開發 shared-theme matching brand design
- 實作 AutoScale Vue component 防止 overflow
- 建立
/slides-*指令集(create, validate, review, build, publish) - 整合 Context7 查詢 Slidev 最佳實踐
成果: Markdown → Slidev → 自動部署到 slides.pwlee.xyz
Sprint 5:Projects & Strapi Removal
挑戰: 完全移除 Strapi 依賴,建立 Projects 系統
解決方式:
- 建立 Projects Content Collection schema
- 新增
projects/Obsidian vault - 建立
/projects頁面與 detail page - 刪除整個
cms/目錄 - 移除所有 Strapi 相關程式碼
- 建立
site-settings.ts取代 Strapi Site Settings
成果: 完全靜態化,零依賴外部服務
成果展示
核心功能
-
雙 Obsidian Vault 系統
- Blog vault:
site/src/content/blog/ - Slides vault:
slides/ - 各自獨立的模板與設定
- Blog vault:
-
自動化 SEO 工作流程
- AI 生成 meta title/description/keywords
- 自動產生 canonical URLs
- 完整的 structured data (JSON-LD)
-
完整的 Slash Commands
- 10 個
/blog-*指令 - 6 個
/slides-*指令 - 支援 human-in-the-loop 審查
- 10 個
-
三位一體的內容系統
- Blog: 部落格文章與教學
- Projects: 專案紀錄
- Slidev: 簡報與演講
效能數據
- Build Time: ~3-4 秒(完全靜態)
- Lighthouse Score: 95+ (Performance, SEO, Accessibility)
- Bundle Size: ~50KB (gzipped)
- Deploy Time: ~1 分鐘(Vercel 自動部署)
開發體驗提升
Before (Strapi):
寫作 → 複製到 Strapi → 設定 SEO → 上傳圖片 → 發布
⏱️ ~15-20 分鐘
After (Obsidian + Astro):
寫作 → /blog-generate-seo → /blog-publish
⏱️ ~2-3 分鐘
學習心得
技術收穫
-
Astro Content Collections 深入理解
- Glob loader pattern
- Zod schema validation
- Type-safe content queries
-
MCP (Model Context Protocol) 整合
- Context7 for documentation lookup
- Zeabur for deployment management
- 提升 AI 輔助開發效率
-
Slidev 客製化
- Vue component 開發
- Theme 系統設計
- Auto-resize 解決方案
-
工作流程自動化
- Claude Code Slash Commands
- Human-in-the-loop AI workflow
- Git-based deployment pipeline
專案管理心得
- 逐步遷移策略: 分 5 個 Sprint,每個 Sprint 都有可驗證的成果
- 保持向後相容: Sprint 1-3 完成前,Strapi 仍可使用
- 文檔先行: 每個 Sprint 都更新 CLAUDE.md 與技術文檔
- AI 協作模式: 善用 Claude Code 加速開發,但保持人工審查
如果重來會怎麼做?
- 提早規劃 Projects 系統: Sprint 1 就應該一起設計 Blog + Projects schema
- 更早測試 AutoScale: Slidev overflow 問題花了較多時間 debug
- 建立更完整的測試: 目前主要靠手動測試,應該加入 E2E tests
未來規劃
接下來想要加入的功能或改進方向:
- 完成 Strapi 遷移
- 建立 Projects 系統
- Slidev 整合
- NLWeb 語意層實作(2025.11.22 完成)
- llms.txt 入口檔案
- llms-full.txt 自動生成
- Atom 1.0 RSS feed with full content
- Enhanced Schema.org JSON-LD
- Daily Notes Collection(每日筆記發布)
- Tags 系統改用 Content Collections
- RAG Chatbot(語義搜尋)
- AI Agent Analytics(追蹤 agents 存取)
- Analytics 整合(Umami)
- Newsletter 系統(Email subscription)
- 中英雙語支援
Sprint 6: NLWeb 語意層(2025.11.22)
目標: 實作完整的 NLWeb 語意層,讓 AI agents 能夠發現與存取內容
成果:
-
llms.txt 靜態入口檔案
- 位置:
site/public/llms.txt - 提供網站結構導覽
- 遵循 NLWeb 規範
- 位置:
-
llms-full.txt 自動生成系統
- Build script:
site/scripts/generate-llms-full.ts - 自動索引所有文章與專案
- 整合到
npm run prebuild
- Build script:
-
Atom 1.0 RSS Feed 升級
- 從 RSS 2.0 升級到 Atom 1.0
- 包含完整 HTML 內容(使用
marked解析) - 支援 author, tags, updated time
- 增加到 50 篇文章
-
Schema.org JSON-LD 優化
- WebSite schema: 加入 SearchAction, inLanguage
- Organization schema: 加入 founder, foundingDate
- BlogPosting schema: 加入 inLanguage, wordCount, 完整作者資訊
技術細節:
- 新增依賴:
gray-matter,marked - 實作 markdown to HTML 轉換
- 更新
site/src/lib/site-settings.ts完整 organization 資訊 - Build time 自動化生成 llms-full.txt
參考標準:
- 符合 NLWeb 規範(12+ 企業採用:Shopify, Snowflake, O’Reilly 等)
- W3C Feed Validator 驗證通過
- Google Rich Results Test 驗證通過
相關文章: 實作 NLWeb 語意層
專案統計:
- ⏱️ 開發時間:~3 週(6 個 Sprint)
- 📝 程式碼變更:~4000+ lines added, ~5000+ lines removed
- 🎯 完成度:100% (All Sprints 完成 + NLWeb enhancement)
- 🚀 部署狀態:Production (pwlee.dev, slides.pwlee.xyz)
- 🤖 AI Agents 友善:完整 NLWeb 語意層支援