GITHUB 레포 딥다이브 · 2026-07-30 · BHOLMESDEV/HUBBLE.MD · 사람과 AI 에이전트가 함께 쓰는 마크다운 노트장

bholmesdev/hubble.md 딥다이브
폴더 하나가 곧 API가 되는 로컬 우선 노트 앱

Hubble은 모든 노트를 내 컴퓨터의 평범한 마크다운(.md) 파일로 저장하는 무료·오픈소스 데스크톱 노트 앱이다. Notion·애플 노트처럼 블록 에디터로 편하게 쓰지만, 뒤에서는 독점 클라우드 DB가 아니라 그냥 폴더 안의 텍스트 파일이 쌓인다.

진짜 차별점은 슬로건에 있다 — "The best notepad for you and your agents"(당신과 당신의 에이전트를 위한 최고의 노트장). 노트가 그냥 파일이라, Claude Code·Codex·Cursor 같은 코딩 에이전트를 그 폴더에 붙이면 에이전트가 파일을 직접 읽고 고치고, Hubble은 그 변경을 실시간으로 다시 불러온다(live-reload). 나아가 에이전트에게 "이 노트들을 표로 보여줘"라고 시키면, 에이전트가 HTML 앱을 하나 써넣고 Hubble이 그걸 샌드박스 미니앱으로 실행한다.

(저장소 bholmesdev/hubble.md · 언어 TypeScript(모노레포) · 라이선스 MIT · 데스크톱 버전 v0.1.23 · 별 약 1,090 · 포크 63 · 생성 2026-02-17 · 저자 Ben Holmes(@bholmesdev, Astro 코어팀))
목차
  1. 한 줄 정체
  2. 왜 주목받는가 — 에이전트 시대의 노트장
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 — Electron 3분할과 HTML 앱 샌드박스
  5. 디렉토리 구조 해부
  6. 학습 포인트 — 기술별 배울 것
  7. 시스템 / 실행 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 로드맵 (주차별)
  10. 핵심 키워드 사전
  11. 참고 링크

1한 줄 정체

이 프로젝트가 정확히 무엇인지 한 문장으로

Hubble은 "내 폴더에 쌓이는 마크다운 파일을, 사람도 AI 에이전트도 함께 편집하는 노트 앱"이다. Notion 같은 블록 에디터(/ 명령, 마크다운 단축키, 프론트매터 속성)를 쓰지만 저장 형식은 평범한 .md 텍스트다. 그래서 에이전트를 그 폴더에 붙이면 곧바로 협업이 되고, 에이전트가 노트를 고치면 Hubble이 즉시 화면을 갱신한다. 여기에 "HTML 앱"이라는 확장 개념으로, 노트 폴더를 표·책장·지도 같은 맞춤 뷰로 바꿀 수 있다.

한 장의 비유

"클라우드 사서 대신, 내 책장 위에서 같이 일하는 도우미"

Notion은 책(노트)을 회사 창고(클라우드 DB)에 넣어 두고, 창고 규칙(플러그인 SDK)을 통해서만 정리를 돕는다. Hubble은 책을 내 방 책장(로컬 폴더)에 그대로 두고, 사람이든 AI 도우미든 같은 책장에서 직접 책을 꺼내 고치게 한다.

도우미(에이전트)가 새 정리 도구가 필요하면? Hubble은 앱스토어를 뒤지지 않는다. 도우미에게 "이 책들 목록표 하나 만들어 줘"라고 말하면, 도우미가 그 자리에서 HTML 파일 한 장을 써넣고, 그게 곧 그 폴더 전용 미니앱이 된다.

용어
로컬 우선(local-first)
데이터의 원본(진실의 출처)이 내 컴퓨터 디스크에 있고, 클라우드는 있으면 좋은 보조(동기화)일 뿐인 설계 철학. 인터넷이 끊겨도 동작하고, 서비스가 망해도 내 파일은 남는다. Hubble에서 노트는 언제나 폴더 안 .md 파일이며, 클라우드 동기화는 선택 기능(그것도 아직 개발 중)이다.
용어
프론트매터(frontmatter)
마크다운 파일 맨 위에 ---로 감싸 적는 YAML 메타데이터 영역. 제목·태그·날짜·완료여부 같은 "속성"을 담는다. Hubble은 이 프론트매터를 File Properties(파일 속성)의 단일 진실원으로 삼아, true/false는 체크박스로, 2026-07-30은 날짜로 자동 해석한다.

2왜 주목받는가 — 에이전트 시대의 노트장

트렌딩 이유와 비슷한 도구 대비 강점

Hubble이 떠오른 배경엔 "코딩 에이전트가 파일을 직접 다루는" 흐름이 있다. Claude Code·Codex·Cursor는 결국 폴더 안 파일을 읽고 쓰는 도구다. 그렇다면 노트 앱이 파일을 독점 DB에 가둘 게 아니라 그냥 폴더에 풀어 두면, 에이전트가 곧바로 1급 협업자가 된다는 게 Hubble의 통찰이다. README의 핵심 문구: "Point your agent at your notes folder to start collaborating. Hubble will live-reload as your agent edits."

두 번째 무기는 확장 방식이다. 보통 앱은 플러그인 SDK(자바스크립트 API)를 배워야 기능을 늘린다. Hubble은 "에이전트에게 HTML 앱을 짜 달라"로 대체한다. 파일시스템 자체가 확장 표면이 되는 셈이다.

비슷한 것들과의 비교

항목HubbleNotionObsidian
저장 형식로컬 .md + 프론트매터클라우드 독점 DB로컬 .md
편집 경험블록 에디터(WYSIWYG)블록 에디터주로 마크다운 원문
에이전트 협업폴더가 곧 API · 라이브리로드API 있으나 파일 아님파일 편집 가능(리로드 수동)
확장 방식에이전트가 HTML 앱 작성제한적 API/통합JS 플러그인 SDK
가격/라이선스무료 · MIT 오픈소스상용(부분 무료)무료(비오픈소스)

"그냥 마크다운 폴더 열면 되잖아?"에 대한 답

맞다, 텍스트 에디터로도 .md는 연다. 어려운 건 (1) Notion급 편집 경험을 주면서도 원본을 평문으로 유지, (2) 외부(에이전트) 편집을 안전하게 실시간 반영, (3) 에이전트가 짠 임의의 HTML을 시스템을 망치지 않게 실행하는 것이다. Hubble은 마크다운↔리치텍스트 왕복 변환 엔진, chokidar 파일 감시 라이브리로드, 그리고 불투명 출처(opaque origin) 샌드박스 iframe + 토큰 인증 브로커로 이 셋을 각각 정공법으로 풀었다.

비유

번역가와 원문의 관계. 당신은 예쁜 편집 화면(리치텍스트)에서 글을 쓰지만, 디스크에는 늘 "원문 마크다운"이 저장된다. 화면과 원문 사이를 오가는 동시통역사(remark 파서 + ProseMirror 직렬화기)가 있어, 어느 쪽에서 고쳐도 뜻이 어긋나지 않게 왕복 번역을 보장한다. 그래서 에이전트가 원문을 고쳐도, 사람이 화면에서 고쳐도 충돌 없이 같은 파일이 유지된다.

3기술 스택 전체 지도

package.json과 소스에서 읽어낸 실제 의존성

Hubble은 pnpm 워크스페이스 모노레포다(전부 TypeScript ~5.8, 린트·포맷은 ESLint+Prettier가 아니라 Biome 2.4, React Compiler까지 켜져 있음). 크게 apps/*(실행되는 3개 앱)와 packages/*(공유 코어)로 나뉜다.

① apps/desktop — 메인 Hubble 앱 (Electron)

② apps/web — 마케팅 랜딩(hubble.md)

③ apps/www — 브라우저판 Hubble (개발 중, HEAVILY WIP)

④ packages/* — 공유 코어

용어
ProseMirror / Tiptap
ProseMirror는 리치텍스트(WYSIWYG) 에디터를 만드는 저수준 툴킷으로, 문서를 사람이 보기 좋은 트리 구조(document model)로 다룬다. Tiptap은 그 위에 얹은 사용하기 쉬운 래퍼다. Hubble은 이 트리와 마크다운 텍스트 사이를 왕복 변환한다.

4아키텍처 심화 — Electron 3분할과 HTML 앱 샌드박스

파일이 화면이 되고, 에이전트가 그 파일을 만지기까지

Hubble의 도메인 모델은 CONTEXT.md의 용어집이 곧 설계도다. 핵심 개념: Workspace(.hubble/config.json이 있는 논리적 노트 묶음. 클라우드가 아니라 설정 파일의 존재로 정의됨), HTML App(폴더 안의 .html 파일을 Hubble이 실행하는 미니 UI), Embed(마크다운 안에 인라인으로 박은 HTML 앱), Workspace Snapshot(원자적으로 조립된 로딩 완료 상태 — 이게 완성돼야 화면을 그린다).

┌──────────────────────────────────────────────────────────────┐ │ 코딩 에이전트 (Claude Code / Codex / Cursor) │ │ └─ 노트 폴더의 .md 파일을 직접 편집 │ └───────────────────────────┬──────────────────────────────────┘ chokidar 파일 감시 │ 변경 감지 → externalFileChange ▼ ┌──────────────────────────────────────────────────────────────┐ │ Main 프로세스 (electron/main.ts, ~1,935줄) │ │ 유일한 Node/파일시스템 접근자 │ │ 파일 read/write/watch · 워크스페이스 설정 · 전역 검색 │ │ ★ 권한 그랜트(grantedFiles/grantedRoots @ grants.json) │ │ hubble-asset:// 프로토콜로 HTML 앱 서빙 · 자동 업데이트 │ └───────────────────────────┬──────────────────────────────────┘ contextBridge (contextIsolation:true, nodeIntegration:false) window.desktopApi ── 타입 안전한 단일 IPC 다리 ── ▼ ┌──────────────────────────────────────────────────────────────┐ │ Renderer (React 19, src/) │ │ Tiptap 에디터 · 사이드바 · 툴바 · 터미널 패널 · 설정 │ │ 상태: @simplestack/store (src/store/) │ │ │ │ ┌── 마크다운 왕복 변환 ──────────────────────────────┐ │ │ │ .md 텍스트 → [remark AST] → markdownToProsemirror │ │ │ │ ← prosemirrorToMarkdown ← [편집] │ │ │ │ (frontmatter는 YAML로 분리 = File Properties 원본) │ │ │ └────────────────────────────────────────────────────┘ │ │ │ │ ┌── HTML 앱 실행 (IframeView.tsx) ────────────────────┐ │ │ │