テクノロジースタック
NeoTavern は意図的に地味なスタックで動作します: Node.js 24 LTS、Fastify 5、React 19、Vite 8、厳格な TypeScript、Drizzle ORM 付き SQLite、Tauri 2 デスクトップシェルです。
ランタイムと言語
- Node.js 24 LTS — バックエンドと同梱のデスクトップサイドカーのランタイム。コードは実用的な範囲で Node.js 22 と互換性を保ちます。
- TypeScript strict — すべての場所で有効。正当性のない
any、as unknown as、@ts-ignore、非 null アサーションは禁止されています。システム境界はunknownと明示的な検証を使用します。 - ESM のみ — すべてのアプリとパッケージが ES モジュールを使用します。
バックエンド
- Fastify 5 — API フレームワーク。すべてのバックエンドモジュールは分離された Fastify プラグインです。
- TypeBox + Fastify Type Provider — すべての API 入力と出力に、
@neotavern/contractsから生成された JSON スキーマがあります。 - SSE — ストリーミング生成は Server-Sent Events で実行されます。WebSocket は本当の双方向チャネルのために予約されています。
- AbortSignal — すべての長時間実行操作は
AbortSignalを受け入れ、クライアントが切断したときにきれいにタイムアウトします。
フロントエンド
- React 19 — サーバーサイドレンダリングのないシングルページアプリ。
- Vite 8 — バンドラー兼開発サーバー。Vite はビルドツールのみであり、アプリケーションプラグイン API ではありません。
- React Router — ルーティング。単一のチャットワークスペースと、その上にレンダリングされるシステムサーフェスを備えます。
- TanStack Query — サーバー状態のための唯一のストア。
- Zustand — 一時的な UI 状態のみ: アクティブパネル、テーマと言語の設定、ピン留めされたキャラクター、限定的なセッション限定の下書き。
- Radix Primitives —
@neotavern/uiがラップするアクセシブルなヘッドレスコンポーネント。
データ
- better-sqlite3 経由の SQLite — 単一のデータベースファイル。WAL、
foreign_keys = ON、busy_timeout、プリペアドステートメントで開かれます。 - Drizzle ORM — 型付きスキーマ、リポジトリ、マイグレーション。
- FTS5 — キャラクター、チャット、メッセージの全文検索。
スタイリング
- CSS Modules + カスタムプロパティ + カスケードレイヤー + コンテナクエリ — スタイリングツールキット。テーマは詳細度と戦わずにデザイントークンとレイヤールールをオーバーライドします。
テンプレーティングとローカライゼーション
- Handlebars — インストラクトフォーマットテンプレート。ファイルシステムやコード実行へのアクセスがないサンドボックス環境でレンダリングされます。
- i18next — 名前空間とロケールごとのリソースを持つ、すべてのユーザー向け文字列。
デスクトップ
- Tauri 2 — デスクトップシェル。Node.js サーバーは自己完結型サイドカーバイナリとして同梱されます。
- tauri-plugin-shell と tauri-plugin-updater — プロセス管理と署名付きアップデート。
ツール
- pnpm ワークスペース — モノレポのパッケージマネージャー。
- Vitest — ユニットテストと統合テスト。
- Playwright — デスクトップシェルのスモークテストを含むエンドツーエンドテスト。
意図的に存在しないもの
- PostgreSQL、Redis、Docker、その他インストールして実行しなければならないサービスはありません。
- API プロセス以外にフロントエンド用の SSR や Node サーバーはありません。
- プラグインのセキュリティサンドボックスとしての
node:vmはありません — 信頼できないバックエンドプラグインは代わりに別の制限されたプロセスで実行されます。