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 모드로 자유롭게 배치된다. 한 사이트가 여러 "나"의 측면을 자연스럽게 담는 구조.
0. 주요 화면
mock 데이터로 빌드된 React SPA 실제 화면. web/dist-static을 서빙하고 data/*.json을 가짜 콘텐츠로 주입해 Rust 백엔드 없이 정적 모드로 캡처했다.
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 트레잇 구현을 가진다.
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. 빌드 파이프라인
- Phase 6 (v2 SSG pivot):
BuildExt트레잇 도입, rayon 병렬 빌드 - 산출물:
out/폴더에 HTML + JSON + 해시된 자산. SPA는 정적 JSON 데이터에서 읽는다. - React SPA 번들:
web/의 React 19 + TypeScript + Vite.cargo build시 임베드되어 CLI에 포함된다 — 런타임에 Node 불필요. - deploy: GitHub Pages 타겟 구현됨. Cloudflare Pages · Netlify는 추적 중이지만 미구현(
"<target> not yet implemented"로 거부).
7. 인증·배포 모델
- 로컬 관리 서버: 인증 없음 (의도). 항상
127.0.0.1바인딩. 외부 노출 시 reverse proxy 인증 레이어 필수. - CLI 토큰:
--token/OXIBUILDER_TOKEN/~/.config/oxibuilder/credentials(0600) 순서로 해석. 원격 서버 대비 symmetry용. - GitHub webhook:
POST /api/console/activity/webhook은 HMAC-SHA256(X-Hub-Signature-256) 검증.OXIBUILDER_GITHUB_WEBHOOK_SECRET미설정 시 503. - 공개 사이트: 런타임 서버 없음. 운영비 0, 공격 표면 0.
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. 검증
cargo test --workspace— 139 passed / 0 failed (3 ignored · platform-specific)cargo clippy --workspace --all-targets -- -D warnings— cleancd web && bun run build— OK