본문으로 건너뛰기

모노레포 개요

NeoTavern은 로컬 퍼스트 애플리케이션입니다. 단일 Fastify 프로세스가 API와 선택적인 빌드된 프론트엔드를 제공하며, 외부 데이터베이스, 큐, 컨테이너가 필요하지 않습니다.

모노레포 구조

워크스페이스는 apps/packages/라는 두 개의 최상위 그룹으로 이루어진 pnpm 모노레포입니다.

apps/
server/ # Fastify backend: API, prompt pipeline, SSE, legacy host
web/ # React SPA
plugin-runtime/ # Restricted Node.js process for backend plugins
desktop/ # Tauri 2 shell; runs the server as a sidecar process
packages/
shared/ # UUIDv7 IDs, Result, errors, logger, async utilities
contracts/ # TypeBox API schemas — single source of truth
db/ # SQLite: schema, migrations, repositories, FTS5
ui/ # Headless components on Radix primitives
i18n/ # i18next setup and language resources
plugin-sdk/ # Plugin manifest, permissions, and API contracts
theme-sdk/ # Theme tokens, levels, and inheritance
provider-sdk/ # Provider adapter contract and adapters
legacy-compat/ # window globals and DOM compatibility islands
gestures/ # Framework-agnostic row gestures
plugin-build/ # Plugin build and publish pipeline

  • apps/server — Fastify 백엔드. /api/v2/* API를 노출하고 프롬프트 파이프라인을 실행하며 SSE로 생성 스트리밍을 전송하고 Express 호환 레거시 표면을 호스팅합니다. 각 모듈은 격리된 Fastify 플러그인입니다.
  • apps/web — React SPA. HTTP로 서버와 통신하며 채팅 워크스페이스와 캐릭터, 설정, 프로바이더, 테마, 플러그인 표면을 렌더링합니다.
  • apps/plugin-runtime — 신뢰할 수 없는 백엔드 플러그인이 실행되는 권한 제한 Node.js 프로세스로, 메인 서버 프로세스와 격리됩니다.
  • apps/desktop — Tauri 2 셸. 컴파일된 서버를 자체 포함 Node.js 사이드카로 실행하고 로컬 API가 준비된 후에만 웹뷰를 엽니다.

패키지

공유 코드는 packages/ 아래의 좁은 범위의 패키지에 있습니다. 모든 패키지는 하나의 역할을 가지며, 의존성은 아래 방향으로만 향합니다. serverweb은 패키지에 의존하고, 패키지는 기껏해야 sharedcontracts에 의존합니다. 전체 설명은 패키지를 참조하세요.

데이터 흐름

일반적인 요청은 다음 계층을 통과합니다.

  1. 프론트엔드가 TanStack Query를 통해 /api/v2/* 엔드포인트를 호출합니다.
  2. Fastify가 TypeBox 스키마로 입력을 검증하고 { code, params, traceId } 봉투 형식으로 오류를 반환합니다.
  3. @neotavern/db의 리포지토리가 커서 페이지네이션과 FTS5 검색으로 SQLite를 읽고 씁니다.
  4. 생성은 POST /api/v2/chats/:id/generate로 실행됩니다. 프롬프트 파이프라인이 컨텍스트를 조립하고, 프로바이더 어댑터가 요청을 직렬화하며, 응답이 SSE로 스트리밍되고, 메시지가 저장됩니다.

웹 앱은 단일 페이지입니다. 라우트가 채팅 워크스페이스를 바꾸고, 캐릭터, 설정, 프로바이더, 테마, 플러그인은 보존된 채팅 위치 위의 대화상자 표면에 렌더링됩니다.

로컬 퍼스트 원칙

모든 것이 내 기기에서 실행됩니다.

  • 백엔드는 기본적으로 127.0.0.1에 바인딩됩니다. 원격 접근은 제한된 세션과 HTTPS 요구 사항이 있는 명시적 선택(opt-in)입니다.
  • 모든 데이터는 하나의 로컬 데이터 디렉터리에 있습니다. 단일 SQLite 데이터베이스와 콘텐츠 주소 지정 파일 저장소입니다. PostgreSQL, Redis, Docker가 없습니다.
  • 앱은 오프라인으로 동작합니다. 프로바이더 호출이 유일한 네트워크 트래픽이며, 기본 제공 echo 어댑터로 프로바이더 없이 전체 파이프라인을 테스트할 수 있습니다.
  • 백업, 내보내기, SillyTavern 가져오기는 모두 같은 SQLite 및 파일 API를 통해 로컬에서 이루어집니다.

저장소 계층은 데이터 및 저장소, 생성 경로는 프롬프트 파이프라인을 참조하세요.