이 레포가 무엇을 하는 물건인가.
OpenKnowledge는 마크다운 .md 파일을 그대로 디스크에 저장하면서도 Google Docs처럼 리치 텍스트(WYSIWYG)로 편집할 수 있게 해준다. 여기에 Claude·Codex·Cursor 같은 LLM 에이전트가 MCP(Model Context Protocol) 도구를 통해 문서를 직접 읽고 쓰는 것을 실시간으로 함께 볼 수 있다는 것이 결정적 차이다.
에이전트 공동작업, 팀 Git 동기화, 임베딩 기반 시맨틱 검색, 스킬 시스템까지 — 개인 노트를 넘어 "LLM 위키"와 "에이전트 세컨드 브레인"으로 설계됐다.
# ## ** 등)를 직접 타이핑하는 대신, 워드프로세서처럼 서식이 즉시 렌더링되는 에디터. 내부적으로는 순수 .md 파일을 읽고 쓰기 때문에 파일 이동성을 잃지 않는다.search·read·write·exec 도구로 노트북을 탐색하고 편집할 수 있다. 마치 에이전트 전용 API가 붙은 위키다.Notion·Obsidian 대비 차별점과 트렌딩 이유.
2026년 중반, "AI 에이전트에게 어떻게 지식을 공급하고 협업할 것인가"라는 질문이 뜨겁다. OpenKnowledge는 이 질문에 에디터 레이어와 에이전트 레이어를 동일한 CRDT 문서로 묶는 방식으로 답한다.
| 비교 항목 | Notion | Obsidian | OpenKnowledge |
|---|---|---|---|
| 파일 저장 | 클라우드 DB (벤더 종속) | 로컬 .md (완전 소유) | 로컬 .md + Git 자동 동기화 |
| AI 통합 | Notion AI (제한적 플러그인) | 플러그인 커뮤니티 의존 | MCP 서버 내장 — Claude/Codex 직접 편집 |
| 실시간 협업 | 클라우드 기반 multiplayer | 없음 (단일 사용자) | Yjs CRDT + Hocuspocus (에이전트 포함) |
| 에디터 모드 | 블록 에디터 (고유 형식) | 소스 / 프리뷰 전환 | WYSIWYG + 소스 모드 + TUI(터미널 UI) |
| 검색 | 클라우드 AI 검색 | 플러그인 (Dataview 등) | BM25 전문 검색 + 선택적 벡터 임베딩 |
| 팀 공유 | 워크스페이스 구독료 | Obsidian Sync 구독료 | GitHub 레포 기반 (무료 티어 가능) |
| 플랫폼 | 웹 / 앱 | 데스크톱 앱 | macOS 앱 + CLI 웹앱 (Linux/Windows) |
| 라이선스 | 독점 SaaS | 독점 소프트웨어 | GPL-3.0 (오픈소스) |
v0.19.x 단계이며 pre-1.0 시맨틱 버저닝을 명시적으로 따른다. 즉, semver의 "minor" 변경이 실질적 브레이킹 체인지일 수 있다. AGENTS.md에 "public mirror" 임을 명시 — 실제 내부 레포(inkeep/agents-private)의 공개 미러다. API가 안정되지 않았으니 프로덕션 파이프라인에 직접 연결하기보다 실험·학습 목적으로 접근하는 게 적절하다.
기존 도구에서 AI 에이전트가 파일을 수정하면 인간은 "수정된 결과"를 나중에 보게 된다. OpenKnowledge는 Yjs CRDT와 Hocuspocus 실시간 콜라보 서버를 이용해, 에이전트가 타이핑하는 동안 인간 화면에 에이전트 커서가 실시간으로 나타나는 진짜 공동 작업을 구현했다.
6개 패키지에 걸친 전체 기술 구성 상세.
| 기술 | 역할 | 버전 |
|---|---|---|
| React 19 | UI 컴포넌트 트리 전체. 최신 Concurrent 모드 사용 | ^19.2.5 |
| Vite 8 | 개발 서버 + 번들러. HMR 즉시 반영 | ^8.0.0 |
| Tiptap v3 | 리치텍스트(WYSIWYG) 에디터 프레임워크. ProseMirror 기반 | ^3.22.3 |
| ProseMirror | Tiptap의 내부 문서 모델 엔진. 노드/마크 스키마 정의 | @tiptap/pm |
| CodeMirror 6 | 소스 모드(원시 마크다운) 편집기. 양방향 동기화 | ^6.x |
| Electron 41 | macOS 데스크톱 앱 래퍼. 내장 TUI 지원 | 41.2.1 |
| LinguiJS | i18n 국제화. 복수형·날짜 포맷 처리 | (dev dep) |
| 기술 | 역할 | 핵심 포인트 |
|---|---|---|
| Yjs | CRDT(Conflict-free Replicated Data Type) 라이브러리 | 충돌 없는 동시 편집의 수학적 기반 |
| @tiptap/y-tiptap | Tiptap ↔ Yjs 바인딩. ProseMirror 문서를 Y.Doc에 매핑 | 에이전트·인간 동일 문서 공유 |
| y-codemirror.next | CodeMirror ↔ Yjs 바인딩. 소스 모드도 동기화 | WYSIWYG ↔ 소스 양방향 동기 |
| y-indexeddb | 브라우저 IndexedDB에 Yjs 상태 로컬 영속화 | 오프라인/네트워크 단절 복원 |
| Hocuspocus | Yjs WebSocket 서버. 협업 상태 중계 | 에이전트 세션 관리 포함 |
| 기술 | 역할 | 세부 |
|---|---|---|
| @modelcontextprotocol/sdk | MCP 서버 SDK. Claude·Cursor·Codex에 도구 노출 | 20+ MCP 도구 등록 |
| OpenAI 임베딩 API | 시맨틱 검색용 벡터 생성 (선택) | 기본 모델: text-embedding-3-small |
| @orama/orama | 인메모리 BM25 전문 검색 엔진 | 페이지·폴더·파일 색인 |
| OpenTelemetry | 분산 추적 + 메트릭 수집 | OTLP HTTP 내보내기 |
| 기술 | 역할 | 세부 |
|---|---|---|
| Bun 1.3 | 런타임 + 패키지 매니저 + 테스트 러너 | Node.js보다 빠른 시작·실행 |
| simple-git | Git 조작 라이브러리. 팀 공유·자동 동기화 핵심 | git init/commit/push/pull 자동화 |
| Chokidar 5 | 파일시스템 감시. 외부 에디터 변경 감지 | Claude Code가 파일 수정 시 즉시 반영 |
| Turborepo | 모노레포 태스크 오케스트레이션 | 의존성 그래프 기반 병렬 빌드 |
| Biome | 린터 + 포매터 (ESLint+Prettier 대체) | Rust 기반, 매우 빠름 |
| Mermaid 11 | 다이어그램 렌더링. 문서 내 시각화 | 서버사이드 SVG 렌더링 |
| Zod 4 | 런타임 스키마 검증 | MCP 도구 입출력 타입 보장 |
| 마크다운 파싱 | remark/rehype/mdast 생태계 | MDX 확장 포함, 수식(remark-math) |
에디터 ↔ AI ↔ 위키가 연결되는 방식. ASCII 시스템 구조도.
OpenKnowledge의 가장 독창적인 설계는 에이전트 세션도 Hocuspocus WebSocket 클라이언트로 참여한다는 점이다. AgentSessionManager는 에이전트마다 고유 ID와 아이콘·색상을 부여하고, Yjs의 Awareness(인식) API를 통해 에이전트 커서 위치가 인간 화면에 실시간으로 나타난다.
리치텍스트(ProseMirror/Tiptap 노드 트리) ↔ 마크다운 텍스트의 손실 없는 왕복 변환이 이 프로젝트의 기술적 난제다. packages/core/src/extensions/에는 표·각주·수학식·위키링크·JSX 컴포넌트 등 수십 개의 "fidelity 확장"이 있다. @handlewithcare/remark-prosemirror 패치 버전을 사용하고, remark/mdast 생태계를 적극 활용해 파싱한다.
ok init 명령을 실행하면 Claude Code·Cursor·Codex의 설정 디렉토리에 OpenKnowledge 스킬이 자동 설치된다. 스킬은 SKILL.md를 포함하는 ZIP 아카이브(.ok/skills/)로 관리되며, MCP 서버의 skills 도구로 설치·업데이트·삭제된다. 에이전트가 이 스킬을 호출하면 OpenKnowledge MCP 서버에 연결해 위키를 탐색한다.
기본은 @orama/orama의 BM25 전문 검색이다. 사용자가 search.semantic.enabled: true와 OpenAI API 키를 설정하면 임베딩 벡터가 BM25 점수와 RRF(Reciprocal Rank Fusion)로 융합되어 키워드 없이도 의미적으로 관련된 문서를 찾는다. 문서는 8,000자 단위로 청킹(400자 오버랩)되어 최대 80개 청크로 색인된다.
모노레포 6개 패키지의 역할과 핵심 파일.
app = 식당 홀 (손님이 보는 공간, Tiptap WYSIWYG 에디터)
core = 주방 레시피 (마크다운 파싱·직렬화 공통 로직, 앱과 서버 모두 사용)
server = 주방 + 서빙 계통 (Hocuspocus 협업 서버, MCP 도구, Git, 임베딩)
cli = 출입문 (ok init으로 프로젝트 초기화, ok start로 서버 실행)
desktop = 건물 외관 (Electron이 웹 앱을 네이티브 앱처럼 포장)
이 레포를 통해 무엇을 배울 수 있는가.
Tiptap은 ProseMirror 위에 편의 레이어를 얹은 에디터 프레임워크다. OpenKnowledge는 30개 이상의 커스텀 확장(Extension)을 구현하여 [[위키링크]], /슬래시 명령어, 수식 인라인, 테이블 컨트롤, 각주, MDX 컴포넌트 등을 지원한다. "어떻게 에디터에 도메인 특화 기능을 추가하는가"의 실전 교과서다.
packages/core/src/extensions/wiki-link.ts: 정규식으로 [[target#anchor|alias]]를 파싱해 ProseMirror 노드로 변환하는 코드. Node/Mark/Extension 세 가지 타입과 inputRules·pasteRules의 차이를 이해할 수 있다.
packages/app/src/editor/extensions/shared.ts: 수십 개의 확장을 한 배열에 모으고, core 확장을 app 레이어에서 오버라이드하는 패턴.
Yjs는 CRDT(Conflict-free Replicated Data Type) 라이브러리다. 여러 클라이언트(인간 + 에이전트)가 동시에 같은 문서를 수정해도 자동으로 합산하여 일관된 결과를 만든다. Git merge처럼 충돌이 생겨 수동 해소할 필요가 없다.
TiptapEditor.tsx의 buildAwarenessUser()와 renderCursor() 함수. 사용자(또는 에이전트)마다 이름·색상을 Awareness 상태에 담아 다른 클라이언트 화면에 커서로 렌더링하는 패턴.
OpenKnowledge의 서버(packages/server/src/mcp/)는 20개 이상의 MCP 도구를 노출한다. search, write, edit, exec, skills, history, workflow 등 에이전트가 노트북 전체를 조작할 수 있는 API 세트다. Zod로 입출력 스키마를 정의하고, 세밀한 에러 메시지로 에이전트를 안내하는 방법을 볼 수 있다.
remark/mdast(마크다운 AST) ↔ ProseMirror 노드 트리의 변환은 놀랍도록 복잡하다. 특히 MDX(JSX 컴포넌트), 수학식, 위키링크처럼 표준 마크다운을 벗어난 확장을 "손실 없이" 왕복시키는 코드(packages/core/src/markdown/)는 파서 엔지니어링의 실전 연습장이다.
6개 패키지가 서로를 workspace:*로 참조하며, Turborepo가 의존 그래프를 분석해 변경된 패키지만 재빌드한다. 패키지 간 타입 공유, 공통 설정(biome.jsonc), 개발 DX를 어떻게 유지하는지 배울 수 있다.
packages/desktop/은 electron-vite로 구성된다. main/preload/renderer 세 프로세스 구조와 contextBridge 보안 패턴, auto-updater 연동, 네이티브 패키지(node-pty, @napi-rs/keyring) 통합 방법을 실제 코드로 배울 수 있다.
직접 실행하기 위한 환경 조건과 명령어.
| 항목 | 최소 버전 | 비고 |
|---|---|---|
| Node.js | 24+ | CLI(ok 명령어) 실행에 필요. LTS 24 권장 |
| Bun | 1.3.13+ | 개발/빌드용 런타임. npm install로 설치 가능 |
| Git | 2.x+ | 팀 동기화·히스토리 기능에 필수 |
| macOS | 데스크톱 앱 | DMG 설치. arm64(M1/M2) 최적화 빌드 제공 |
| Linux/Windows | CLI 웹앱 | Node.js 24 설치 후 npm i -g @inkeep/open-knowledge |
| OpenAI API 키 | 선택 | 시맨틱 검색 활성화 시 필요. 없으면 BM25만 사용 |
# 1. CLI 전역 설치
npm install -g @inkeep/open-knowledge
# 2. 노트 폴더로 이동 (없으면 새 폴더 생성)
mkdir my-wiki && cd my-wiki
# 3. 프로젝트 초기화 (Claude Code, Cursor, Codex MCP 설정 자동 생성)
ok init
# 4. 에디터 서버 시작 + 브라우저 자동 오픈
ok start --open
# Bun 설치
curl -fsSL https://bun.sh/install | bash
# 레포 클론 및 의존성 설치
git clone https://github.com/inkeep/open-knowledge.git
cd open-knowledge
bun install
# 앱 개발 서버 실행 (packages/app)
bun run --filter @inkeep/open-knowledge-app dev
# 전체 빌드 + 타입체크 + 테스트
bun run check
# 프로젝트 루트의 .ok/config.local.yaml 생성
search:
semantic:
enabled: true
apiKey: sk-... # OpenAI API 키
# model: text-embedding-3-small (기본값)
# dimensions: 1536 (기본값)
난이도별 3~5개 과제. 코드를 읽는 것을 넘어 직접 만들어본다.
npm install -g @inkeep/open-knowledge로 설치 후 ok init으로 개인 위키 폴더를 초기화한다. ok start --open으로 에디터를 열고, 마크다운 파일을 WYSIWYG으로 편집해본다. [[페이지이름]] 위키링크를 입력해 페이지 간 연결을 만들고, 슬래시(/) 명령어로 표·코드블록·Mermaid 다이어그램을 삽입해본다.
ok init이 생성한 .mcp.json(또는 .claude/claude_desktop_config.json)에 OpenKnowledge MCP 서버가 등록되어 있다. Claude Code 터미널에서 "spec.md 파일에 '시스템 아키텍처' 섹션을 추가해줘"라고 요청한다. OpenKnowledge 브라우저 탭에서 에이전트 커서가 실시간으로 움직이며 텍스트가 삽입되는 것을 확인한다.
packages/app/src/editor/extensions/의 tag.ts와 tag-view.ts를 참고해 #태그 형식의 인라인 태그를 커스텀 색상으로 렌더링하는 확장을 만든다. Node.create()로 노드 타입을 정의하고, inputRules로 #단어 입력 시 자동 변환을 구현한다. shared.ts에 추가해 에디터에 활성화한다.
packages/server/src/mcp/tools/에 today-summary.ts를 만든다. history 도구 코드(history.ts)를 참고해 오늘 날짜 이후 수정된 마크다운 파일 목록을 반환하는 Zod 스키마를 정의하고, registerAllTools()(index.ts)에 등록한다. Claude에서 "오늘 내가 뭘 수정했어?"라고 물었을 때 이 도구가 호출되는지 확인한다.
packages/server/src/embeddings/embedder.ts의 OpenAiEmbedder는 OpenAI 호환 API를 사용한다. Ollama나 Llama.cpp가 OpenAI 호환 임베딩 엔드포인트를 제공하므로, search.semantic.baseUrl을 로컬 서버(http://localhost:11434/v1)로 설정하고 model을 nomic-embed-text로 변경한다. 설정 후 시맨틱 검색이 완전 오프라인으로 동작하는지 확인한다.
이 레포를 완전히 이해하기 위한 주차별 학습 경로.
| 주차 | 주제 | 핵심 자료 / 실습 |
|---|---|---|
| 1주 | ProseMirror 기초 | prosemirror.net 가이드 → 간단한 에디터 직접 구현 → Tiptap "Getting Started"로 이어서 |
| 2주 | Tiptap 확장 개발 | Tiptap v3 공식 문서 → Node/Mark/Extension 직접 만들어보기 → OpenKnowledge wiki-link.ts 분석 |
| 3주 | Yjs + CRDT 이론 | "CRDTs: The Hard Parts" (영상) → yjs.dev 문서 → y-websocket 간단 서버 직접 띄워보기 |
| 4주 | Hocuspocus 협업 서버 | tiptap.dev/hocuspocus → Awareness API → OpenKnowledge agent-sessions.ts 코드 추적 |
| 5주 | remark/rehype/mdast 생태계 | unifiedjs.com 가이드 → remark 플러그인 직접 작성 → mdast ↔ ProseMirror 변환 이해 |
| 6주 | MCP(Model Context Protocol) | modelcontextprotocol.io 공식 스펙 → @modelcontextprotocol/sdk로 간단한 MCP 서버 구현 |
| 7주 | 벡터 임베딩 + 시맨틱 검색 | 임베딩 개념(OpenAI cookbook) → @orama/orama 문서 → RRF 융합 알고리즘 이해 |
| 8주 | Electron + electron-vite | electron.build 문서 → electron-vite 스타터 → main/preload/renderer 보안 모델 이해 |
| 9주 | Turborepo 모노레포 | turbo.build 문서 → 캐싱·파이프라인 설계 → OpenKnowledge turbo.json 분석 |
| 10주 | OpenTelemetry 관측 | opentelemetry.io → OTLP 추적 수집 → OpenKnowledge telemetry.ts 코드 탐색 |
이 레포를 읽으면서 만나는 핵심 개념 정리.
| 키워드 | 한 줄 설명 |
|---|---|
| CRDT | Conflict-free Replicated Data Type. 분산 환경에서 순서 없이 병합해도 항상 같은 결과를 만드는 데이터 구조. Yjs의 핵심 이론 |
| Hocuspocus | Yjs용 WebSocket 협업 서버. 여러 클라이언트의 Y.Doc 상태를 중계·동기화 |
| ProseMirror | 코드로 정의하는 리치텍스트 에디터 엔진. 노드·마크 스키마, 트랜잭션 기반 상태 관리 |
| Tiptap | ProseMirror 래퍼. Extension API로 기능을 플러그인처럼 추가. React/Vue 바인딩 제공 |
| MCP | Model Context Protocol. LLM 에이전트에게 외부 도구를 표준 방식으로 노출하는 프로토콜 |
| mdast | Markdown Abstract Syntax Tree. remark가 마크다운을 파싱해 만드는 트리 형식 |
| BM25 | Best Match 25. 키워드 빈도·문서 길이를 고려한 고전 정보검색 알고리즘. @orama/orama에서 사용 |
| RRF | Reciprocal Rank Fusion. 여러 랭킹 목록(BM25 + 벡터)을 하나로 합치는 기법 |
| Y.Doc | Yjs의 공유 문서 객체. Y.Text·Y.Map·Y.Array 등 CRDT 타입을 담는 컨테이너 |
| Awareness | Yjs의 임시 상태 공유 메커니즘. 커서 위치·사용자 이름처럼 영속화 불필요한 상태에 사용 |
| Wiki Link | [[페이지]] 형식 링크. Obsidian이 대중화. OpenKnowledge는 이를 ProseMirror 노드로 구현 |
| electron-vite | Electron용 Vite 빌드 도구. main/preload/renderer 세 진입점을 동시에 빌드 |
| Turborepo | 모노레포 태스크 러너. 의존성 그래프 기반 병렬 실행 + 원격 캐시 지원 |
| Biome | Rust로 만든 JavaScript/TypeScript 린터+포매터. ESLint+Prettier보다 10-100배 빠름 |
| Orama | 풀 타입 안전 인메모리 검색 엔진. BM25 전문 검색 + 벡터 검색 지원 |
| ok init | OpenKnowledge CLI 명령어. 노트 폴더에 .ok/ 설정, MCP 등록, 스킬 설치를 한 번에 |
더 깊이 파고들기 위한 공식 자료와 관련 기술 문서.