目錄

用 vibe coding 做出自己的知識管理工具 TypeMD

用 Anytype 和 Capacities 一段時間了,兩個都不錯,但各有不足,乾脆自己 Vibe coding 出來。

這篇文章由 Claude Opus 4.6 模型產生,人工微調內容完成。

除了 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 的 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: books

bidirectional: 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 的工具。