oxi · Static Site Generator · Rust

oxibuilder

인간과 AI 에이전트를 위한 개인 사이트 생성기. 블로그·프로젝트·영화/책 리뷰·소설·링크 큐레이션·액티비티 피드를 각자의 extension으로 분리하고, 한 lobby로 묶는다. CLI 또는 AI 에이전트 한 문장으로 콘텐츠를 추가하고, oxibuilder build && oxibuilder deploy로 GitHub Pages에 올린다.

로비(Lobby) 컴포지션. 9개 extension(blog · projects · movies · books · novels · links · scraps · activity · profile)이 각자의 DB 테이블·라우트·CLI·BuildExt 트레잇 구현을 가지면서, 한 lobby 안에서 grid · canvas · list 모드로 자유롭게 배치된다. 한 사이트가 여러 "나"의 측면을 자연스럽게 담는 구조.

역할
설계·구현·공개 (15개 workspace 멤버)
언어
Rust 2024 (rust 1.96+)
스택
Axum · SQLite (WAL) · rayon · ed25519-dalek · React 19 (SPA)
정보
MIT · 139 tests passed

0. 주요 화면

mock 데이터로 빌드된 React SPA 실제 화면. web/dist-static을 서빙하고 data/*.json을 가짜 콘텐츠로 주입해 Rust 백엔드 없이 정적 모드로 캡처했다.

oxibuilder public lobby in grid mode — 9 extension cards (profile/blog/projects/links/novels/movies/books/scraps/activity) in a 3-column grid with lucide icons
Lobby · grid 모드 — 9개 extension이 3열 그리드. 로비의 기본 배치.
oxibuilder public lobby in canvas mode — same 9 extension cards with floating-card animation
Lobby · canvas 모드 — 같은 9개 카드의 떠 있는 캔버스 배치. 정적 캡처에선 grid와 시각 차이가 미미.
oxibuilder blog post detail — Korean markdown rendered post with code block and tags
블로그 포스트 — 마크다운 본문·코드 블록·태그가 실제로 렌더링된 모습.
oxibuilder admin console dashboard — sidebar with Dashboard/Content/Extensions/Themes/Deploy/Settings, stat cards, recent content list, quick actions
관리 콘솔 대시보드 — 통계 카드·최근 콘텐츠·Quick Actions. 127.0.0.1:8787 로컬 서버 + React SPA.

2. 무엇을 다른 방식으로 풀었나

기존 정적 사이트 빌더는 "글쓴이가 repo를 열고 → 파일을 만들고 → 커밋 메시지를 쓰고 → push하고 → 빌드를 기다리는" 흐름을 전제로 한다. oxibuilder는 그 friction을 한 CLI 명령 또는 AI 에이전트 한 문장으로 줄인다.

"여러 측면의 나"를 한 사이트에서 다룰 수 있도록 각 측면을 extension으로 격리하고, 모든 콘텐츠의 출판·검색·빌드를 한 lobby로 묶는다.

1.1 안전 보장

모든 콘텐츠는 draft(published_at = NULL)로 시작한다. 출판은 항상 별도의 명시적 단계. AI 에이전트가 의도치 않게 공개 콘텐츠를 올리지 못하도록 하는 안전장치다.

3. 두 개의 바이너리

oxibuilder-console

로컬 관리 서버 — Axum + SQLite (WAL), FTS5 search(tokenize='trigram'), 백그라운드 잡 스케줄러(cron), OpenAPI/Swagger UI, rate limiting. 127.0.0.1 바인딩 전용 (인증 없음).

./target/release/oxibuilder-console
# → http://127.0.0.1:8787

oxibuilder (CLI)

콘텐츠 관리 + 빌드 + 배포 + 쿼리. --json 출력으로 AI 에이전트가 그대로 소비.

oxibuilder blog new "..." --file post.md
oxibuilder project add --title-ko "..." --publish
oxibuilder build
oxibuilder deploy --target github-pages

4. 9개 Extension

각 extension은 자신의 DB 테이블·라우트·CLI·BuildExt 트레잇 구현을 가진다.

profile · blog · projects

프로필 카드, 마크다운 블로그, 프로젝트 카탈로그.

links · novels · scraps

링크 큐레이션, 장편 소설, HN/GeekNews 스크랩.

movies · books · activity

TMDB 영화, Aladin/Google Books, GitHub activity feed.

5. AI 에이전트 인터페이스

모든 CLI 명령은 --json 옵션을 받는다. 그게 에이전트 계약이다.

# 에이전트용: 스키마 조회
oxibuilder query/schema --format json

# 에이전트용: 콘텐츠 추가
oxibuilder blog new "Hello world" --lang en --file post.md --json
# → { "data": { "slug": "…" } }

# 에이전트용: 출판
oxibuilder blog publish <slug>

# 에이전트용: 상태 조회
oxibuilder status --json

외부 통합(TMDB · Aladin · Google Books)은 API 키가 없으면 자동으로 비활성화된다. 원치 않는 외부 호출은 일어나지 않는다.

6. 빌드 파이프라인

  1. Phase 6 (v2 SSG pivot): BuildExt 트레잇 도입, rayon 병렬 빌드
  2. 산출물: out/ 폴더에 HTML + JSON + 해시된 자산. SPA는 정적 JSON 데이터에서 읽는다.
  3. React SPA 번들: web/의 React 19 + TypeScript + Vite. cargo build 시 임베드되어 CLI에 포함된다 — 런타임에 Node 불필요.
  4. deploy: GitHub Pages 타겟 구현됨. Cloudflare Pages · Netlify는 추적 중이지만 미구현("<target> not yet implemented"로 거부).

7. 인증·배포 모델

8. 워크스페이스 구조

oxibuilder/
├── crates/
│   ├── oxibuilder-core/        # management + build pipeline
│   ├── oxibuilder-console/     # binary (oxibuilder-console) — local management server
│   ├── oxibuilder-cli/         # binary (oxibuilder) — content + build + deploy + query
│   ├── oxibuilder-deploy/      # deploy targets
│   ├── oxibuilder-wasm/        # WASM runtime
│   └── oxibuilder-ext-*/       # 9 extensions
├── web/                        # React 19 + TS + Vite SPA (static JSON)
├── deploy/                     # deploy config templates
├── registry/                   # curated extension index
├── doc/                        # design spec (Korean, internal) — 00..08
└── docs/                       # ops notes (English)

9. 검증

10. 레포지토리

⬡ github.com/project-oxi/oxibuilder