Quartz Publishing — Vault to humanerd.kr Pipeline

Obsidian vault를 source of truth로 사용하면서, 자동 빌드 + 배포로 humanerd.kr에 게시하는 pipeline.

흐름

Obsidian vault (P0~P6 + memories)
    ↓ symlink
humanerd-site/content/ (insights, blog, portfolio, services, growth, knowledge, ...)
    ↓ npx quartz build
public/ (정적 HTML)
    ↓ wrangler pages deploy
Cloudflare Pages
    ↓ DNS
humanerd.kr

트리거

트리거메커니즘latency
vault 파일 변경fswatch LaunchAgent (com.drewgent.quartz-fswatch)5s debounce → build → deploy
cron jobsite-spec-audit-weekly (일 04:00 KST)일 1회
수동bash ~/.drewgent/P4-cortex/scripts/quartz-deploy.sh즉시

3-pillar 매핑 (2026-06-01 reorg)

  • /insights/[slug]/ — 영구 essay (P4-cortex/knowledge/)
  • /portfolio/[slug]/ — Drewgent 산출물 (P4-cortex/portfolio/)
  • /blog/[year]/[slug]/ — 시간순 article (P2-hippocampus/memories/insights/)

Content Pipeline — Status State Machine (2026-06-02)

Quartz build 시 DraftFilter plugin이 모든 article을 검사. status field로 라이브 노출 여부 결정 — 모든 콘텐트는 pipeline을 거쳐야 함.

draft (작성)
    ↓
in_review (검토 중)
    ↓
polished (윤문 완료) [plugin include]
    ↓
published (발행 완료) [plugin include] → humanerd.kr 라이브

archived (보관) → plugin EXCLUDE
domain: draft → plugin EXCLUDE
status field 없음 → plugin EXCLUDE (default-draft, strict)

Plugin include list (live 노출):

  • status: published
  • status: polished

Plugin exclude list (404):

  • status: draft
  • status: in_review
  • status: archived
  • status: publish (단수형 — plugin include에 매칭 안 됨, naming convention 일관성 필요)
  • domain: draft
  • status field 없음 (default-draft, strict)

이전 incident: 5/23~5/26 자동 생성 article 4개 (gemini-cli-shutdown, remove-ai-watermarks, claude-code-essence, flue-sandbox-agent) 가 user 검토 없이 라이브 노출됨. 6/2 strict default-draft 적용으로 모두 영구 404 처리.

Quartz 설정 핵심

  • transformers: [Plugin.FrontMatter(), DraftFilter(), ...]status field 기반 exclude
  • ignorePatterns: [..., "drafts/**"] — DraftFilter가 exclude한 file은 drafts/ namespace로 이동 + ignorePatterns로 public/에서 완전 제외
  • Plugin.AliasRedirects() — 옛 URL redirect 자동 생성
  • Plugin.ContentIndex({ enableSiteMap: true, enableRSS: true }) — sitemap + RSS

새 Article 작성 가이드

  1. vault에 .md file 작성 (memories/insights/ for blog, P4-cortex/knowledge/ for insights, P4-cortex/portfolio/ for portfolio, humanerd-site/content/services/ for services)
  2. frontmatter에 status: draft 명시 (작성 중)
  3. 검토 후 status: published 또는 polished 로 변경 → live 노출
  4. fswatch가 변경 감지 → quartz build → wrangler deploy → 5s debounce 후 humanerd.kr 반영

frontmatter 없으면 영구 404. 새 article은 반드시 status field 명시.

LaunchAgent

com.drewgent.quartz-fswatch
  → watches: memories/insights, P4-cortex/growth, P4-cortex/knowledge, humanerd-site/content
  → debounce: 5s
  → command: bash ~/.drewgent/P4-cortex/scripts/quartz-fswatch.sh

com.drewgent.quartz-deploy (KeepAlive)
  → command: bash ~/.drewgent/P4-cortex/scripts/quartz-deploy.sh
  → project: humanerd-site
  → CF Account: dc0199b6b6c27bc9bb2f3201d47cb643

Cloudflare Pages

  • Project: humanerd-site
  • Account ID: dc0199b6b6c27bc9bb2f3201d47cb643
  • Deploy mode: directory (no git)
  • Domain: humanerd.kr