用 vibe coding 做出自己的知識管理工具 TypeMD
用 Anytype 和 Capacities 一段時間了,兩個都不錯,但各有不足,乾脆自己 Vibe coding 出來。
這篇文章由 Claude Opus 4.6 模型產生,人工微調內容完成。
Anytype 和 Capacities 各差在哪
除了 Local-first 和 SaaS 服務這個基本差異以外,其他還有:
Anytype 的屬性是全域共享的,不同 Type 掛上相同屬性就能一起查找,多對多關聯和雙向連結也都支援。但沒有嵌入物件的功能——你沒辦法在一個 Object 裡面直接嵌入另一個 Object 的內容。
Capacities 反過來,嵌入物件做得很好,關聯也支援。而且因為屬性是為每個 Type 獨立定義的,有些 Type 能綁定專用功能——像 Daily Notes 和 Tags 都有 View,這在 Anytype 就沒有。不過也因為屬性是 per-type 的,跨 Type 的泛用查找就不太方便。比方說會議和課程都有日期,在 Anytype 因為屬性是全域的,可以直接用同一個日期屬性查到這兩種 Type;Capacities 則需要靠 tags 或手動確保屬性一致來繞過這個限制。
兩個工具各有另一邊沒有的東西,又剛好都是我需要的功能。
我想要什麼樣的知識管理工具?
用過非常多知識管理工具,最後比較接受的還是 Object-based 的管理方法。
這類工具最核心的想法是:知識不是檔案,是 Object。
一般的筆記工具讓你用資料夾和檔案組織一切。這很直覺,但其實是讓你「像電腦一樣思考」——先決定放哪個資料夾,再決定叫什麼名字。問題是,知識本身不長這樣。一本書有作者,作者有其他書,書有分類,分類裡有其他書……這是一張網,不是一棵樹。
Anytype 和 Capacities 的吸引力就在這裡:它們讓你用 Object 來思考。一本書就是一個 Book Object,一個人就是一個 Person Object,兩者之間有 Relation 連接。
既然 Object-based 的方向確定了,接下來就是想清楚「我要怎麼操作它」。
自從上手 Claude 之後,我平常工作幾乎都在終端機裡對話,所以 GUI 不是第一優先,CLI 能操作才是重點。使用 SaaS 服務雖然可以享受懶人包的過程,但像 Anytype 一樣的 local-first 還比較踏實,資料在自己手上。而既然都放本機了,用 Markdown 存最自然——純文字、git 友善,搬家也容易。至於 Type 和 Schema,我希望每種 Object 都有明確的結構定義,不是隨便塞 key-value 就好。雙向關聯當然也要,改了一邊另一邊自動同步,不然手動維護遲早會亂掉。
Vibe 出 TypeMD
沒有從零設計,就是把上面這些想法整理清楚,然後開始 vibe。
快速迭代幾輪之後,TypeMD 的 MVP 就出來了。資料結構很簡單:
vault/
├── .typemd/
│ └── types/ # type schema(YAML)
└── objects/
├── book/
└── person/Object 用 Markdown + YAML frontmatter 儲存,每個目錄是一個 type namespace。完整的 Object ID 是 type/filename,例如 book/golang-in-action。
Type schema 長這樣:
# .typemd/types/book.yaml
name: book
properties:
- name: title
type: string
- name: status
type: enum
values: [to-read, reading, done]
- name: rating
type: number
- name: author
type: relation
target: person
bidirectional: true
inverse: booksbidirectional: true 加上 inverse 就是雙向關聯——link 了 book 的 author,person 的 books 自動更新。這個在 Anytype 有做到,在 TypeMD 也有。
實際長什麼樣
一個 Object 就是一個 Markdown 檔,frontmatter 放屬性,body 放內容:
---
author: person/alan-donovan
rating: 5
status: done
title: The Go Programming Language
---
A comprehensive guide to Go covering fundamentals, concurrency patterns, and best practices.CLI 指令 tmd 是主要的操作介面,直接跑 tmd 會進入 TUI,用的是 Bubble Tea,兩欄介面:
┌─ Objects ─────────┐ ┌─ Detail ──────────────────┐
│ ▼ book (2) │ │ book/golang-in-action │
│ golang-in-action│ │ │
│ clean-code │ │ Properties │
│ ▶ person (1) │ │ title: Go in Action │
│ ▶ note (3) │ │ status: reading │
│ │ │ author: → person/alan │
│ │ │ │
│ │ │ Body │
│ │ │ # Content here... │
└───────────────────┘ └───────────────────────────┘左邊是 Object 列表按 Type 分群,右邊是選中 Object 的細節,/ 可以全文搜尋,檔案有變動會自動 refresh。
另外還有 MCP Server——tmd mcp 啟動之後,AI assistant 可以透過 Model Context Protocol 直接查詢你的 vault。AI 時代的知識管理工具有 MCP 支援感覺很自然。
現在在哪
目前是一個可以用的 CLI 工具,核心功能都有了。Repo 在 https://github.com/typemd/typemd ,功能還會持續增加,因為我對這個工具是抱有想法的,所以短期會新增的功能是我自己需要的。
最後,感謝 @XiuHanYang 給我的靈感,讓我想到可以自己刻出方便查找 Markdown 的工具。