TRENDSHIFT 딥다이브 · 2026-06-27

inkeep/open-knowledge 딥다이브
— AI-네이티브 로컬퍼스트 마크다운 에디터 + LLM 위키 엔진

단순한 노트 앱이 아니다. Claude·Codex·Cursor가 직접 문서를 편집하는 동안 인간도 같은 화면에서 WYSIWYG으로 함께 글을 쓸 수 있는 에디터다. 마크다운 파일을 Git으로 자동 동기화하고, MCP 서버를 내장해 어떤 LLM 에이전트든 검색·읽기·수정 도구를 바로 쓸 수 있다. (저장소: inkeep/open-knowledge · 스택: Tiptap v3 + Yjs CRDT + Hocuspocus + Electron/Vite · GPL-3.0 라이선스 · TrendShift Daily #7) ※ 이 프로젝트는 2026년 6월 기준 v0.19.2 베타 단계입니다. API 및 스키마가 언제든 변경될 수 있습니다.
목차
  1. 프로젝트 한줄 요약
  2. 왜 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석
  5. 디렉토리 구조 해부
  6. 학습 포인트 (기술별)
  7. 시스템 요구사항 · 설치
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한줄 요약

이 레포가 무엇을 하는 물건인가.

핵심 메시지

"Notion의 WYSIWYG 편의성 + Obsidian의 로컬 마크다운 철학 + AI 에이전트가 직접 타이핑하는 협업 레이어"를 하나로 묶은 에디터

OpenKnowledge는 마크다운 .md 파일을 그대로 디스크에 저장하면서도 Google Docs처럼 리치 텍스트(WYSIWYG)로 편집할 수 있게 해준다. 여기에 Claude·Codex·Cursor 같은 LLM 에이전트가 MCP(Model Context Protocol) 도구를 통해 문서를 직접 읽고 쓰는 것을 실시간으로 함께 볼 수 있다는 것이 결정적 차이다.

에이전트 공동작업, 팀 Git 동기화, 임베딩 기반 시맨틱 검색, 스킬 시스템까지 — 개인 노트를 넘어 "LLM 위키""에이전트 세컨드 브레인"으로 설계됐다.

용어
AI-native (AI 네이티브)
단순히 "AI 기능을 붙인" 게 아니라, LLM 에이전트가 1등 시민으로 설계된 소프트웨어. OpenKnowledge는 에이전트가 문서를 수정할 때 인간과 동일한 CRDT 공유 문서를 통해 충돌 없이 동시 편집하고, 에이전트의 커서까지 화면에 표시된다.
용어
WYSIWYG 마크다운 에디터
"What You See Is What You Get" — 마크다운 기호(# ## ** 등)를 직접 타이핑하는 대신, 워드프로세서처럼 서식이 즉시 렌더링되는 에디터. 내부적으로는 순수 .md 파일을 읽고 쓰기 때문에 파일 이동성을 잃지 않는다.
용어
LLM Wiki (LLM 위키)
인간이 읽는 문서이자 AI가 검색·참조하는 지식 베이스. OpenKnowledge는 MCP 서버를 내장해 Claude 같은 LLM이 search·read·write·exec 도구로 노트북을 탐색하고 편집할 수 있다. 마치 에이전트 전용 API가 붙은 위키다.

2왜 주목받는가

Notion·Obsidian 대비 차별점과 트렌딩 이유.

2026년 중반, "AI 에이전트에게 어떻게 지식을 공급하고 협업할 것인가"라는 질문이 뜨겁다. OpenKnowledge는 이 질문에 에디터 레이어와 에이전트 레이어를 동일한 CRDT 문서로 묶는 방식으로 답한다.

비교 항목NotionObsidianOpenKnowledge
파일 저장클라우드 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 실시간 콜라보 서버를 이용해, 에이전트가 타이핑하는 동안 인간 화면에 에이전트 커서가 실시간으로 나타나는 진짜 공동 작업을 구현했다.

3기술 스택 전체 지도

6개 패키지에 걸친 전체 기술 구성 상세.

프론트엔드 · 에디터 UI

기술역할버전
React 19UI 컴포넌트 트리 전체. 최신 Concurrent 모드 사용^19.2.5
Vite 8개발 서버 + 번들러. HMR 즉시 반영^8.0.0
Tiptap v3리치텍스트(WYSIWYG) 에디터 프레임워크. ProseMirror 기반^3.22.3
ProseMirrorTiptap의 내부 문서 모델 엔진. 노드/마크 스키마 정의@tiptap/pm
CodeMirror 6소스 모드(원시 마크다운) 편집기. 양방향 동기화^6.x
Electron 41macOS 데스크톱 앱 래퍼. 내장 TUI 지원41.2.1
LinguiJSi18n 국제화. 복수형·날짜 포맷 처리(dev dep)

에디터 엔진 · 실시간 협업

기술역할핵심 포인트
YjsCRDT(Conflict-free Replicated Data Type) 라이브러리충돌 없는 동시 편집의 수학적 기반
@tiptap/y-tiptapTiptap ↔ Yjs 바인딩. ProseMirror 문서를 Y.Doc에 매핑에이전트·인간 동일 문서 공유
y-codemirror.nextCodeMirror ↔ Yjs 바인딩. 소스 모드도 동기화WYSIWYG ↔ 소스 양방향 동기
y-indexeddb브라우저 IndexedDB에 Yjs 상태 로컬 영속화오프라인/네트워크 단절 복원
HocuspocusYjs WebSocket 서버. 협업 상태 중계에이전트 세션 관리 포함

AI 통합 · MCP 서버

기술역할세부
@modelcontextprotocol/sdkMCP 서버 SDK. Claude·Cursor·Codex에 도구 노출20+ MCP 도구 등록
OpenAI 임베딩 API시맨틱 검색용 벡터 생성 (선택)기본 모델: text-embedding-3-small
@orama/orama인메모리 BM25 전문 검색 엔진페이지·폴더·파일 색인
OpenTelemetry분산 추적 + 메트릭 수집OTLP HTTP 내보내기

백엔드 · 저장소 · 인프라

기술역할세부
Bun 1.3런타임 + 패키지 매니저 + 테스트 러너Node.js보다 빠른 시작·실행
simple-gitGit 조작 라이브러리. 팀 공유·자동 동기화 핵심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)

4아키텍처 심화 분석

에디터 ↔ AI ↔ 위키가 연결되는 방식. ASCII 시스템 구조도.

┌─────────────────────────────────────────────────────────────────┐ │ OpenKnowledge 전체 구조 │ └─────────────────────────────────────────────────────────────────┘ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ 인간 사용자 │ │ Claude/Codex │ │ Cursor IDE │ │ (브라우저/앱) │ │ (LLM 에이전트)│ │ (에디터) │ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │ │ MCP 도구 호출 │ MCP 도구 호출 │ WebSocket │ (search/write/exec) │ ▼ ▼ ▼ ┌──────────────────────────────────────────────────────────┐ │ OK Server (Bun) │ │ │ │ ┌─────────────────┐ ┌──────────────────────────────┐ │ │ │ Hocuspocus │ │ MCP HTTP Handler │ │ │ │ (WebSocket) │ │ ┌───────────┬─────────────┐ │ │ │ │ │ │ │ search │ write/edit │ │ │ │ │ Y.Doc (CRDT) │ │ │ exec │ skills │ │ │ │ │ 공유 문서 상태 │ │ │ history │ workflow │ │ │ │ │ │ │ └───────────┴─────────────┘ │ │ │ └────────┬────────┘ └──────────────────────────────┘ │ │ │ │ │ ┌────────▼────────────────────────────────────────────┐ │ │ │ Core 도메인 로직 │ │ │ │ 마크다운 파싱·직렬화 | 임베딩 | Git 연동 | 검색 │ │ │ └────────────────────────┬───────────────────────────┘ │ └───────────────────────────┼──────────────────────────────┘ │ ┌─────────▼──────────┐ │ 로컬 파일시스템 │ │ (마크다운 .md) │ │ + Git 레포 │ └────────────────────┘ │ git push/pull ┌─────────▼──────────┐ │ GitHub 레포 │ │ (팀 공유 동기화) │ └────────────────────┘

핵심 설계 패턴 1 — CRDT 기반 에이전트-인간 동시 편집

OpenKnowledge의 가장 독창적인 설계는 에이전트 세션도 Hocuspocus WebSocket 클라이언트로 참여한다는 점이다. AgentSessionManager는 에이전트마다 고유 ID와 아이콘·색상을 부여하고, Yjs의 Awareness(인식) API를 통해 에이전트 커서 위치가 인간 화면에 실시간으로 나타난다.

에이전트 편집 흐름 (MCP write 도구 호출 시) Claude 에이전트 │ │ MCP: write({document: "spec.md", body: "..."}) ▼ OK Server (MCP Handler) │ │ applyAgentMarkdownWrite() │ ├─ 마크다운 → Yjs Y.Text 패치 생성 │ └─ Hocuspocus에 패치 적용 ▼ Y.Doc (공유 CRDT 문서) │ │ CRDT 병합 (충돌 자동 해소) │ ├──▶ 인간 Tiptap 에디터 (즉시 반영) └──▶ 디스크 .md 파일 (직렬화 저장)

핵심 설계 패턴 2 — 양방향 마크다운 직렬화

리치텍스트(ProseMirror/Tiptap 노드 트리) ↔ 마크다운 텍스트의 손실 없는 왕복 변환이 이 프로젝트의 기술적 난제다. packages/core/src/extensions/에는 표·각주·수학식·위키링크·JSX 컴포넌트 등 수십 개의 "fidelity 확장"이 있다. @handlewithcare/remark-prosemirror 패치 버전을 사용하고, remark/mdast 생태계를 적극 활용해 파싱한다.

핵심 설계 패턴 3 — 스킬 시스템 (에이전트 도구 모음)

ok init 명령을 실행하면 Claude Code·Cursor·Codex의 설정 디렉토리에 OpenKnowledge 스킬이 자동 설치된다. 스킬은 SKILL.md를 포함하는 ZIP 아카이브(.ok/skills/)로 관리되며, MCP 서버의 skills 도구로 설치·업데이트·삭제된다. 에이전트가 이 스킬을 호출하면 OpenKnowledge MCP 서버에 연결해 위키를 탐색한다.

핵심 설계 패턴 4 — 시맨틱 검색 (선택적 임베딩)

기본은 @orama/orama의 BM25 전문 검색이다. 사용자가 search.semantic.enabled: true와 OpenAI API 키를 설정하면 임베딩 벡터가 BM25 점수와 RRF(Reciprocal Rank Fusion)로 융합되어 키워드 없이도 의미적으로 관련된 문서를 찾는다. 문서는 8,000자 단위로 청킹(400자 오버랩)되어 최대 80개 청크로 색인된다.

5디렉토리 구조 해부

모노레포 6개 패키지의 역할과 핵심 파일.

open-knowledge/ ← 모노레포 루트 │ ├── packages/ │ ├── app/ ← 웹 앱 + WYSIWYG 에디터 UI │ │ └── src/ │ │ ├── editor/ ← Tiptap 에디터 핵심 │ │ │ ├── TiptapEditor.tsx # 에디터 메인 컴포넌트 │ │ │ ├── DocumentContext.tsx # 문서 상태 컨텍스트 │ │ │ ├── SourceEditor.tsx # CodeMirror 소스 모드 │ │ │ ├── extensions/ # Tiptap 확장 (슬래시 명령, 위키링크 등) │ │ │ │ └── shared.ts # 모든 확장 합산 진입점 │ │ │ ├── slash-command/ # /명령어 팔레트 │ │ │ └── block-ux/ # 블록 드래그·키보드 탐색 │ │ ├── components/ ← 사이드바, 검색창, 탭 등 │ │ ├── presence/ ← 사용자 식별 (이름/색상) │ │ └── App.tsx ← 앱 진입점 │ │ │ ├── core/ ← 공유 도메인 로직 (앱+서버 공통) │ │ └── src/ │ │ ├── extensions/ ← ProseMirror/마크다운 fidelity 확장 │ │ │ ├── wiki-link.ts # [[링크]] 파싱 │ │ │ ├── wiki-link-embed.ts # ![[임베드]] 처리 │ │ │ └── (30+ 확장 파일) │ │ ├── markdown/ ← remark/mdast 변환 파이프라인 │ │ ├── search/ ← Orama BM25 검색 엔진 │ │ └── config/ ← 설정 스키마 (Zod), 임베딩 기본값 │ │ │ ├── server/ ← 로컬 협업 서버 (Bun 실행) │ │ └── src/ │ │ ├── mcp/ ← MCP 서버 + 도구 등록 │ │ │ └── tools/ # 20+ MCP 도구 (search, write, exec...) │ │ ├── embeddings/ ← 벡터 임베딩 파이프라인 │ │ │ ├── embedder.ts # OpenAI API 클라이언트 │ │ │ ├── chunking.ts # 8000자 청킹 │ │ │ └── semantic-search-service.ts │ │ ├── boot.ts ← 서버 부트스트랩 │ │ ├── persistence.ts ← Y.Doc ↔ 디스크 저장 │ │ ├── shadow-repo.ts ← Git 내부 관리 │ │ └── skill-install.ts ← 스킬 설치/업데이트 │ │ │ ├── cli/ ← npm 패키지 (@inkeep/open-knowledge) │ │ └── src/ # ok init / ok start 명령 │ │ │ ├── desktop/ ← Electron 데스크톱 앱 │ │ └── src/ │ │ ├── main/ # Electron main 프로세스 │ │ ├── renderer/ # Electron renderer (= app 패키지 사용) │ │ └── preload/ # 보안 브릿지 │ │ │ └── plugin/ ← 에이전트 통합 패키지 (stub) │ ├── docs/ ← 문서 사이트 소스 ├── biome.jsonc ← 린터/포매터 설정 ├── turbo.json ← Turborepo 태스크 정의 ├── package.json ← 워크스페이스 루트 (Bun) └── AGENTS.md ← AI 에이전트 작업 가이드
비유

app = 식당 홀 (손님이 보는 공간, Tiptap WYSIWYG 에디터)

core = 주방 레시피 (마크다운 파싱·직렬화 공통 로직, 앱과 서버 모두 사용)

server = 주방 + 서빙 계통 (Hocuspocus 협업 서버, MCP 도구, Git, 임베딩)

cli = 출입문 (ok init으로 프로젝트 초기화, ok start로 서버 실행)

desktop = 건물 외관 (Electron이 웹 앱을 네이티브 앱처럼 포장)

6학습 포인트 (기술별)

이 레포를 통해 무엇을 배울 수 있는가.

① Tiptap v3 — 리치텍스트 에디터 커스터마이징

Tiptap은 ProseMirror 위에 편의 레이어를 얹은 에디터 프레임워크다. OpenKnowledge는 30개 이상의 커스텀 확장(Extension)을 구현하여 [[위키링크]], /슬래시 명령어, 수식 인라인, 테이블 컨트롤, 각주, MDX 컴포넌트 등을 지원한다. "어떻게 에디터에 도메인 특화 기능을 추가하는가"의 실전 교과서다.

배울 것

Tiptap Extension 설계 패턴

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 — 충돌 없는 실시간 동시 편집

Yjs는 CRDT(Conflict-free Replicated Data Type) 라이브러리다. 여러 클라이언트(인간 + 에이전트)가 동시에 같은 문서를 수정해도 자동으로 합산하여 일관된 결과를 만든다. Git merge처럼 충돌이 생겨 수동 해소할 필요가 없다.

배울 것

Yjs Awareness API — 커서 공유

TiptapEditor.tsxbuildAwarenessUser()renderCursor() 함수. 사용자(또는 에이전트)마다 이름·색상을 Awareness 상태에 담아 다른 클라이언트 화면에 커서로 렌더링하는 패턴.

③ MCP(Model Context Protocol) 서버 구현

OpenKnowledge의 서버(packages/server/src/mcp/)는 20개 이상의 MCP 도구를 노출한다. search, write, edit, exec, skills, history, workflow 등 에이전트가 노트북 전체를 조작할 수 있는 API 세트다. Zod로 입출력 스키마를 정의하고, 세밀한 에러 메시지로 에이전트를 안내하는 방법을 볼 수 있다.

④ 마크다운 → ProseMirror 왕복 변환

remark/mdast(마크다운 AST) ↔ ProseMirror 노드 트리의 변환은 놀랍도록 복잡하다. 특히 MDX(JSX 컴포넌트), 수학식, 위키링크처럼 표준 마크다운을 벗어난 확장을 "손실 없이" 왕복시키는 코드(packages/core/src/markdown/)는 파서 엔지니어링의 실전 연습장이다.

⑤ 모노레포 구성 (Turborepo + Bun)

6개 패키지가 서로를 workspace:*로 참조하며, Turborepo가 의존 그래프를 분석해 변경된 패키지만 재빌드한다. 패키지 간 타입 공유, 공통 설정(biome.jsonc), 개발 DX를 어떻게 유지하는지 배울 수 있다.

⑥ Electron + Vite (electron-vite) 데스크톱 앱

packages/desktop/electron-vite로 구성된다. main/preload/renderer 세 프로세스 구조와 contextBridge 보안 패턴, auto-updater 연동, 네이티브 패키지(node-pty, @napi-rs/keyring) 통합 방법을 실제 코드로 배울 수 있다.

7시스템 요구사항 · 설치

직접 실행하기 위한 환경 조건과 명령어.

요구사항

항목최소 버전비고
Node.js24+CLI(ok 명령어) 실행에 필요. LTS 24 권장
Bun1.3.13+개발/빌드용 런타임. npm install로 설치 가능
Git2.x+팀 동기화·히스토리 기능에 필수
macOS데스크톱 앱DMG 설치. arm64(M1/M2) 최적화 빌드 제공
Linux/WindowsCLI 웹앱Node.js 24 설치 후 npm i -g @inkeep/open-knowledge
OpenAI API 키선택시맨틱 검색 활성화 시 필요. 없으면 BM25만 사용

빠른 시작 (CLI 방식, Linux/Windows/Intel Mac)

# 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 (기본값)

8직접 해볼 수 있는 실습 과제

난이도별 3~5개 과제. 코드를 읽는 것을 넘어 직접 만들어본다.

LV.1 — 입문

OpenKnowledge로 개인 Wiki 만들기

npm install -g @inkeep/open-knowledge로 설치 후 ok init으로 개인 위키 폴더를 초기화한다. ok start --open으로 에디터를 열고, 마크다운 파일을 WYSIWYG으로 편집해본다. [[페이지이름]] 위키링크를 입력해 페이지 간 연결을 만들고, 슬래시(/) 명령어로 표·코드블록·Mermaid 다이어그램을 삽입해본다.

목표: WYSIWYG ↔ 소스 모드 전환, 위키링크 동작 확인, 슬래시 명령어 익히기
LV.2 — 초급

Claude Code + MCP로 에이전트가 Wiki 수정하는 것 보기

ok init이 생성한 .mcp.json(또는 .claude/claude_desktop_config.json)에 OpenKnowledge MCP 서버가 등록되어 있다. Claude Code 터미널에서 "spec.md 파일에 '시스템 아키텍처' 섹션을 추가해줘"라고 요청한다. OpenKnowledge 브라우저 탭에서 에이전트 커서가 실시간으로 움직이며 텍스트가 삽입되는 것을 확인한다.

목표: 에이전트-인간 실시간 공동 편집 체험, MCP 도구 호출 이해
LV.3 — 중급

커스텀 Tiptap 확장 만들기 — 간단한 인라인 태그

packages/app/src/editor/extensions/tag.tstag-view.ts를 참고해 #태그 형식의 인라인 태그를 커스텀 색상으로 렌더링하는 확장을 만든다. Node.create()로 노드 타입을 정의하고, inputRules#단어 입력 시 자동 변환을 구현한다. shared.ts에 추가해 에디터에 활성화한다.

목표: Tiptap Node + inputRules 패턴 이해, ProseMirror 스키마 개념 체득
LV.4 — 중급

MCP 커스텀 도구 추가 — "오늘 편집한 문서 요약" 도구

packages/server/src/mcp/tools/today-summary.ts를 만든다. history 도구 코드(history.ts)를 참고해 오늘 날짜 이후 수정된 마크다운 파일 목록을 반환하는 Zod 스키마를 정의하고, registerAllTools()(index.ts)에 등록한다. Claude에서 "오늘 내가 뭘 수정했어?"라고 물었을 때 이 도구가 호출되는지 확인한다.

목표: MCP 도구 등록 패턴, Zod 스키마 설계, Hocuspocus 없이 디스크 접근하는 경로 파악
LV.5 — 고급

로컬 임베딩 모델로 시맨틱 검색 교체

packages/server/src/embeddings/embedder.tsOpenAiEmbedder는 OpenAI 호환 API를 사용한다. OllamaLlama.cpp가 OpenAI 호환 임베딩 엔드포인트를 제공하므로, search.semantic.baseUrl을 로컬 서버(http://localhost:11434/v1)로 설정하고 modelnomic-embed-text로 변경한다. 설정 후 시맨틱 검색이 완전 오프라인으로 동작하는지 확인한다.

목표: 임베딩 파이프라인 이해, OpenAI 호환 API 추상화 패턴, 로컬 AI 인프라 구성

9관련 기술 심화 학습 로드맵

이 레포를 완전히 이해하기 위한 주차별 학습 경로.

주차주제핵심 자료 / 실습
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 코드 탐색

10핵심 키워드 사전

이 레포를 읽으면서 만나는 핵심 개념 정리.

키워드한 줄 설명
CRDTConflict-free Replicated Data Type. 분산 환경에서 순서 없이 병합해도 항상 같은 결과를 만드는 데이터 구조. Yjs의 핵심 이론
HocuspocusYjs용 WebSocket 협업 서버. 여러 클라이언트의 Y.Doc 상태를 중계·동기화
ProseMirror코드로 정의하는 리치텍스트 에디터 엔진. 노드·마크 스키마, 트랜잭션 기반 상태 관리
TiptapProseMirror 래퍼. Extension API로 기능을 플러그인처럼 추가. React/Vue 바인딩 제공
MCPModel Context Protocol. LLM 에이전트에게 외부 도구를 표준 방식으로 노출하는 프로토콜
mdastMarkdown Abstract Syntax Tree. remark가 마크다운을 파싱해 만드는 트리 형식
BM25Best Match 25. 키워드 빈도·문서 길이를 고려한 고전 정보검색 알고리즘. @orama/orama에서 사용
RRFReciprocal Rank Fusion. 여러 랭킹 목록(BM25 + 벡터)을 하나로 합치는 기법
Y.DocYjs의 공유 문서 객체. Y.Text·Y.Map·Y.Array 등 CRDT 타입을 담는 컨테이너
AwarenessYjs의 임시 상태 공유 메커니즘. 커서 위치·사용자 이름처럼 영속화 불필요한 상태에 사용
Wiki Link[[페이지]] 형식 링크. Obsidian이 대중화. OpenKnowledge는 이를 ProseMirror 노드로 구현
electron-viteElectron용 Vite 빌드 도구. main/preload/renderer 세 진입점을 동시에 빌드
Turborepo모노레포 태스크 러너. 의존성 그래프 기반 병렬 실행 + 원격 캐시 지원
BiomeRust로 만든 JavaScript/TypeScript 린터+포매터. ESLint+Prettier보다 10-100배 빠름
Orama풀 타입 안전 인메모리 검색 엔진. BM25 전문 검색 + 벡터 검색 지원
ok initOpenKnowledge CLI 명령어. 노트 폴더에 .ok/ 설정, MCP 등록, 스킬 설치를 한 번에

11참고 링크

더 깊이 파고들기 위한 공식 자료와 관련 기술 문서.