Khảo sát: biến notion-test thành "second brain"
- Ngày: 2026-09-05
- Trạng thái: báo cáo khả thi, CHƯA phải spec. Chờ chủ dự án chọn hướng.
- Cách làm: ba nhánh khảo sát song song (khái niệm + repo hot, cách hiện thực
kỹ thuật, hiện trạng repo), số sao tra trực tiếp GitHub API ngày 05/09/2026.
1. Second brain là gì
"Second brain" là phương pháp làm việc của người dùng, không phải một loại
phần mềm. Phần mềm chỉ cần đủ tính năng để người dùng áp được phương pháp.
| Phương pháp | Ý cốt lõi | Tính năng phần mềm tương ứng |
|---|---|---|
| CODE (Tiago Forte) | Capture → Organize → Distill → Express: ghi mọi thứ, xếp theo tính khả dụng, chắt lọc dần, dùng lại để tạo ra sản phẩm mới | Capture nhanh (clipper, share), tô đậm/tóm tắt tiến dần, template |
| PARA | Xếp ghi chú vào 4 xô: Projects, Areas, Resources, Archives | Thư mục/tag cấp trang, view lọc |
| Zettelkasten | Mỗi ghi chú một ý, bắt buộc liên kết tới ghi chú khác, MOC (mục lục chủ đề) tự nổi lên từ liên kết | Wikilink, backlink, graph view |
Nguồn gốc của mọi tính năng "backlink + graph" hiện nay là Zettelkasten. Lớp AI
(tìm ngữ nghĩa, chat với ghi chú, gợi ý liên kết) chỉ là lớp phủ thêm sau.
2. Các repo đang được quan tâm 2025–2026
| Repo | Sao | Điểm học được |
|---|---|---|
| AppFlowy | 76k | Notion alternative local-first, AI là plugin tuỳ chọn |
| AnythingLLM | 66k | Chat với tài liệu, cắm nhiều LLM + vector DB |
| mem0 | 65k | Lớp bộ nhớ cho agent, không phải app ghi chú |
| Logseq | 45k | Outliner, block reference, daily notes mặc định, graph |
| Quivr | 39k | Từng là "second brain", nay đổi sang RAG doanh nghiệp |
| Khoj | 37k | Trợ lý cá nhân: chat trên ghi chú + web, agent chạy theo lịch |
| Reor | 8,6k | Ghi chú AI 100% local: tự liên kết, hỏi đáp, semantic search (LanceDB) |
| obsidian-copilot | 7,7k | Plugin chat với vault, có chế độ lexical không cần index |
| obsidian-smart-connections | 5,4k | "Related notes" bằng embedding local, zero setup |
| obsidian-second-brain (eugeniughelbur) | 4,3k | 45 lệnh cho Claude Code thao tác vault, agent bảo trì theo lịch |
| obsidian-claude-code-mcp (iansinnott) | 348 | MCP server cho Claude Code đọc/ghi vault đang mở |
Cảnh báo: AgriciDaniel/claude-obsidian (14,6k sao) và tinyhumansai/openhuman
(39k sao) có dấu hiệu bơm sao (fork/sao đúng 10,0%, homepage bán khoá học, 64
người theo dõi). Chỉ tham khảo ý tưởng "LLM Wiki" (Karpathy, 04/2026), không
dùng số sao làm bằng chứng.
Tính năng phổ biến, xếp theo tần suất xuất hiện
- Markdown thuần, local-first
- Wikilink + backlink + graph view
- Semantic search bằng embedding
- Chat với toàn bộ ghi chú (RAG)
- Daily notes / block reference
- Tags
- AI gợi ý liên kết / related notes
- Agent chạy theo lịch tự bảo trì kho
- Template
- Query trên metadata (Dataview)
- Capture từ web
- Mã hoá / P2P
Xu hướng 2026 rõ nhất: agentic second brain. Claude Code hoặc MCP đọc/ghi
kho ghi chú trực tiếp, agent chạy nền để liên kết, tóm tắt, dọn dẹp.
3. notion-test đang đứng ở đâu
| Tính năng second brain | Hiện trạng | Điểm móc |
|---|---|---|
| Wikilink | ĐÃ CÓ một chiều: inline @trang lưu pageId, tên đọc động, xoá trang thì link mờ | src/blocknote/schema.ts:255, Editor.tsx:583 (trigger @) |
| Backlink | Chưa có. Không có index "trang nào trỏ tới trang này" | Wire format pageLink + pageId đã có test khoá (src/pageLinkWireFormat.test.ts) |
| Graph view | Chưa có | Ăn theo backlink index |
| Tags | Chưa có. Chỉ có categoryId (một trang một nhóm) | Page ở src/models/types.ts, mẫu upsertPageMeta từng trường |
| Full-text search | Có, in-memory, mở Y.Doc mọi trang mỗi lần mở Ctrl+K | SearchModal.tsx, searchPages.ts |
| Semantic search / embedding | Chưa có | Server đã có Postgres, Node, proxy LLM |
| AI trong editor | ĐÃ CÓ: /api/ai/stream SSE, ba chế độ sinh/sửa/nén, Anthropic + OpenAI | server/src/aiApi.ts, src/ai/ |
| Agent ngoài đọc/ghi | ĐÃ CÓ REST API agent: tạo, đọc/ghi markdown, tìm tiêu đề, sửa meta | server/src/agentApi.ts, skill notion-agent-api |
| Việc chạy nền | ĐÃ CÓ hàng đợi agent_tasks cho Flywheel poll | server/src/db.ts:245 |
| Daily notes / capture | Chưa có UI, nhưng API agent tạo trang đã đủ làm | |
| Local-first | ĐÃ CÓ: Y.Doc + IndexedDB, sync tuỳ chọn |
Kết luận: notion-test đã có nền agentic tốt hơn phần lớn repo ở mục 2, nhưng
thiếu đúng lớp phương pháp (backlink, tags, graph) mà Zettelkasten/PARA
cần. Đây là phần rẻ nhất và đáng làm trước.
Lỗ hổng phát hiện khi soi code
pageLink không nằm trong LOAI_MAT_MAT (src/agent/matMatMarkdown.ts:25) và
markdownExport.ts không có nhánh xử lý nó. Nhiều khả năng @trang biến mất
** im lặng** khi agent đọc trang qua API, và vòng GET → PUT sẽ xoá link. Chưa đo
bằng test, cần xác minh trước khi làm bất kỳ đợt nào, vì backlink mà agent
không thấy thì "agentic second brain" hỏng từ gốc.
4. Ba hướng triển khai
Hướng A: Nền Zettelkasten (backlink, tags, graph)
- Backlink index tính ở server khi Hocuspocus persist doc: quét
Y.XmlFragment tìm node pageLink, ghi bảng page_links(from_id, to_id).
Client hỏi GET /api/pages/:id/backlinks. Lý do server: nhiều máy thấy cùng
kết quả, trang /p/ công khai cũng dùng được mà không cần workspace doc.
- Panel "Được nhắc tới ở" cuối trang, kèm đoạn văn chứa link.
- Tags: trường
tags: string[]trênPage, ghi từng trường theo mẫu
upsertPageMeta, tab lọc theo tag tái dùng mẫu category.
- Graph view:
react-force-graph(đủ cho vài trăm đến vài nghìn trang),
màu theo token vàng hiện có.
- Sửa lỗ markdown: xuất
@trangthành[[Tên trang|pageId]]hoặc cú pháp
tương đương giữ được pageId, nhập ngược lại được.
- Độ phức tạp: Vừa. Không chạm public bundle trừ panel backlink cho
/p/.
Hướng B: Lớp AI trên ghi chú (embedding, related, chat)
- Embedding ở server bằng API (OpenAI
text-embedding-3-smallhoặc Voyage
đa ngữ), lưu Postgres pgvector. Không chạy model trong trình duyệt: model
tốt tiếng Việt (bge-m3, multilingual-e5) nặng hàng trăm MB, model nhỏ chạy
được trong browser chủ yếu tiếng Anh, chưa đo tiếng Việt.
- Chunk theo block, tái dùng converter markdown đã kiểm chứng, embed theo nhịp
persist của Hocuspocus (debounce), không theo keystroke.
- Ba UI trên cùng một index: tìm ngữ nghĩa trong Ctrl+K, panel "Trang liên
quan" cạnh editor, "Hỏi kho ghi chú" tái dùng /api/ai/stream với bước
retrieve trước prompt.
- Độ phức tạp: Vừa. Rủi ro: chi phí embedding, VPS cần cài extension
pgvector, prompt phải tách chunk khỏi nhãn hệ thống (bài học spec 3).
Hướng C: Agentic second brain (MCP, capture, agent bảo trì)
- MCP server Node mỏng bọc API agent hiện có:
list_pages,search_pages,
read_page, write_page, append_page, get_backlinks. Claude Code trên
PC dùng trực tiếp thay curl.
- Capture nhanh: bookmarklet hoặc PWA
share_targetgọi thẳng API agent tạo
trang trong nhóm "Inbox". Daily note: nút tạo trang theo ngày.
- Agent bảo trì theo lịch qua
agent_tasks+ Flywheel: gợi ý liên kết cho
trang mới, tóm tắt tuần, gắn tag. Kết quả ghi dạng đề xuất để người
duyệt, không tự sửa nội dung.
- Độ phức tạp: Thấp cho MCP và capture, Vừa cho agent bảo trì.
Khuyến nghị thứ tự
A → B → C. A là nền mà B và C đều cần (backlink để graph, để MCP trả
get_backlinks, để agent gợi ý liên kết). B mang lại cảm giác "second brain
thông minh" rõ nhất nhưng cần A để hiển thị đúng. C rẻ và hợp cách anh làm việc
hiện nay (Claude Code + Flywheel), có thể chen MCP mỏng vào ngay sau A.
Mỗi hướng là một spec riêng theo quy ước docs/superpowers/specs/.
5. Ràng buộc và rủi ro riêng của repo
- Public bundle: mọi thứ trên
/p/không được import collab/sync/persistence,
trần 2000 byte gzip cho entry. Panel backlink công khai phải nhận dữ liệu qua
API, không qua workspace doc.
- CRDT: index server tính từ update Y.Doc, không ghi thẳng bảng
documents. Mọi index là dẫn xuất, xây lại được từ doc.
- Markdown mất-mát: bài học PR #74. Mọi cú pháp mới (
[[...]], tag) phải
round-trip qua matMatMarkdown hoặc nằm trong danh sách mất-mát.
- Protected paths: thêm dependency (
react-force-graph,pgvector) đụng
package.json, PR cần label harness-approved.
- Server không có typecheck trong verify, deploy tay qua
install-vps.sh. - Hai cơ chế xác thực: MCP và capture dùng API key, không dùng cookie SSO.
6. Câu hỏi cần chủ dự án trả lời
- Anh dùng notion-test theo kiểu nào nhiều hơn: tự gõ và liên kết tay
(Zettelkasten, ưu tiên A) hay đổ ý tưởng vào rồi để AI/agent sắp xếp (ưu tiên
B + C)?
- Có chấp nhận gửi nội dung ghi chú lên API embedding bên ngoài không? Nếu
không, hướng B phải chạy model trên VPS, cần đo RAM.
- Backlink và graph có cần hiện trên trang công khai
/p/không, hay chỉ
trong app riêng?
- Quy mô: hiện anh có khoảng bao nhiêu trang, dự kiến tới đâu trong một năm?
Ảnh hưởng chọn thư viện graph và cách index search.
- Có muốn làm ngay việc xác minh lỗ
@trangmất qua markdown như một PR sửa
lỗi độc lập trước khi bàn spec không?