BetterTavern

SillyTavern のキャラクターカードで遊ぶインタラクティブノベル。AI が一人称で物語を一場面書き、最後に選択肢を二つ出します。選択肢にないことをしたいときは、自分で一文書けます。

今のところ、サーバーは自分で動かす必要があります。Android は APK をそのままインストールできます。iPhone 版はまだ App Store に出ていないので Expo Go で開き、Web 版はローカルで起動します。

iOS · Android · タブレット · Web
霧港の夜番

霧は海から上がってきた。桟橋の先まで来たときには、もう手すりまで呑まれていた。灯台はすぐ目の前なのに、灯りは消えている。 源さんは手紙に書いていた。霧港の灯りが消えたら、誰かがともしに行かなければならない、と――その手紙を書いた本人が、三日前から姿を消している。 背後で鐘が一つ鳴った。低く、湿った音。まるで水の底から浮かび上がってきたようだった。

選択肢を押すと読み進められます。主人公の名前の変更、ダークモードの切り替え、世界の状態の表示も試せます。実際には、各場面は設定したモデルが書きます。

キャラクターカードSillyTavern V1・V2・V3、PNG または JSON
モデルDeepSeek、OpenAI、Grok、Gemini、Hugging Face、または OpenAI 互換 API
サーバーPython(FastAPI)と PostgreSQL。Docker Compose でデプロイできます
画面の言語中文 · English · 日本語
01

物語をはじめる

必要なのはキャラクターカードと主人公の名前だけ。ほかの設定は空欄のままで構いません。

STEP 1

キャラクターカードを読み込む

SillyTavern の V1・V2・V3 キャラクターカード(PNG または JSON)に対応しています。カードの画像は物語の表紙に、ワールドブックは冒頭の世界づくりに使われます。

STEP 2

主人公に名前をつける

名前は必須です。立場(通りすがりの旅人、昔なじみ……)や、一場面の長さ、文体も選べます。一枚のカードで物語をいくつも始められます。

STEP 3

一場面読んで、一つ選ぶ

AI が一人称で次の場面を書き、最後に選択肢を二つ出します。どちらかを選べば続きへ。別のことをしたいときは「自分で書く」を押します。

02

世界の状態

物語の開始時に、AI がキャラクターカードを読んで、人物・場所・アイテム・組織・秘密を整理します。以降の場面はすべてこれを踏まえて書かれ、展開に合わせて更新されます。

  • 人物・場所・アイテム・組織ごとに、いまの状態を記録
  • 関係図:誰がどこにいて、誰が何を持ち、誰と誰がつながっているか
  • 主人公がまだ知らない秘密は隠しておき、確認してから表示
未公開の秘密 1 件

ノードにマウスを重ねると関係が強調され、クリックで詳細が見られます。ノードをタップすると、詳細と関係が見られます。

主人公自分 · 湊

新しい夜番。目的:灯りをもう一度ともすこと。

灯台にいる
03

長編

本文は監督モデルが書きます。世界の状態、あらすじ、プロットはバックグラウンドで別に整理され、次の場面を待たせません。各場面を書くときはそれらがすべてコンテキストに入り、古い細部は監督が原文を読み返します。

AGENT RUNTIME

1 ターンのあいだ、誰が何をしているか

プレイヤーが待つ · api プロセス
読む:振り返り、原文、状態、プロット過去のターンを想起(読み取りのみ、最大 2 回)ターンを保存し、整理タスクを積む
PostgreSQLデータもタスクキューもここにある
原文ターンラベル世界の状態伏線章のまとめあらすじプレイヤー像プロット取り消し記録タスクキュー
タスクを取る · 世界の状態を書き戻すタスクを取る · まとめとプレイヤー像を書き戻すタスクを取る · プロットを書き戻す
バックグラウンド · worker プロセス · バックグラウンド用モデル
全体像プレイヤーが待つのは監督の一場面だけです。世界の状態、章のまとめ、プロットはバックグラウンドで整理され、次のターンはそれを待ちません。まだ整理されていないターンは、原文のままコンテキストに入ります。

あらすじ

章が終わると、バックグラウンドがその章をまとめ、古い章は物語全体のあらすじにまとめられます。原文はずっと残ります。人物や場所の状態は別に保存しているので、まとめても失われません。

長期プロット

プロットは本筋をビートに分けたもので、監督はどの場面を書くときも今のビートを見ています。展開がそれたら、バックグラウンドがプロットを直します。まだ回収されていない伏線は、別に記録しておきます。

巻き戻し

前のどの場面にも戻って、選び直せます。世界の状態、あらすじ、プロットも、その場面のときの状態に戻ります。巻き戻せる回数はセーブごとに上限があり、初期設定では 1 回です。

自分で書く

選択肢にない行動は「自分で書く」を押して、何をするかを一文で監督に伝えます。

切れても続きから

ネットワークが切れたり、アプリがバックグラウンドに回ったりしても、戻れば途切れたところから書き続けます。重複も欠けもありません。

結末を書く

「その他」から「結末を書く」を押すと、どんな結末にしたいかを伝えたうえで、AI が長めの結末を書きます。

04

モデルとデータ

モデル

「設定 → モデル」で追加します。プロバイダーを選んで API キーを貼り付けると、モデルの一覧が自動で出ます。いくつも追加でき、物語を書くモデルはワンタップで切り替えられます。料金は使った分だけモデルのプロバイダーに支払います。

sk-…貼り付け

キーは暗号化して保存し、以降は末尾 4 文字だけを表示します:•••• 3f9a

データの置き場所

クライアントスマホ・タブレット・Web
あなたのサーバー物語、世界の状態、暗号化したキー
モデルのプロバイダーこの場面に必要な前の展開だけを受け取る
  • 物語、世界設定、モデルのキーは、すべて自分で動かすサーバーに保存されます。キーは暗号化され、アプリには末尾 4 文字だけが表示されます。
  • サーバーが選んだモデルのサービスへ前の展開を送るのは、物語を書くときだけです。
  • サーバーの動作ログには、物語の内容もキーも記録しません。
05

クライアント

スマホ・タブレット・Web のクライアントは同じサーバーにつながり、アカウントと物語を共有します。外観はシステムに合わせるか、ライト・ダークに固定できます。本文は明朝体かゴシック体を選べ、文字サイズも変えられます。

スマホ

iOS と Android

React Native(Expo)で、両プラットフォームを同じコードで作っています。Android は APK をダウンロードしてインストールできます。iPhone 版はまだ App Store に出ていないので、今は Expo Go で開きます。

タブレット

iPad と Android タブレット

スマホと同じアプリです。画面が広いときは本文を中央に組み、世界パネルを横に並べられます。

Web

パソコンのブラウザ

サイドバーとキーボードショートカットがあり、キャラクターカードのファイルはウィンドウにドロップして読み込めます。ローカルでは make web で起動します。

06

デプロイ

今のところ公開サービスはありません。自分のパソコンかクラウドでサーバーを動かし、クライアントからそこへ接続します。

用意するもの

  • サーバー:Docker、または Python 3.12+ と uv、PostgreSQL 16
  • クライアント:Android は APK。iPhone は Expo Go と、パソコンに Node 22.18+
  • モデル:プロバイダーの API キー、または OpenAI 互換 API のローカルモデル

本番環境で初めて起動する前に、マスターキーとトークン署名鍵を生成してください。マスターキーをなくすと保存済みのモデルのキーを復号できなくなるので、別にバックアップしておいてください。

ターミナル · Docker
$ git clone https://github.com/Hexthebaldy/BetterTavern.git$ cd BetterTavern# 鍵を生成し、出力された 2 行を deploy/.env に書き込む$ docker compose -f deploy/docker-compose.yml run --rm migrate bettertavern keygen$ docker compose -f deploy/docker-compose.yml up -d# API は 127.0.0.1:8000 で待ち受ける。外部から使うときは TLS 付きのリバースプロキシの後ろに置く
ターミナル · ソースから
$ git clone https://github.com/Hexthebaldy/BetterTavern.git$ cd BetterTavern$ cp apps/server/.env.example apps/server/.env# Docker で PostgreSQL を起動。手元の PostgreSQL 16 を使うならこの行は飛ばし、.env の DATABASE_URL を変える$ make db-up$ make install && make migrate$ make dev# 別のターミナルで、世界の状態を整理するバックグラウンドタスクを起動$ make worker# API ドキュメント:http://localhost:8000/docs
ターミナル · Web
$ make js-install$ make web# ブラウザで http://localhost:5173 を開く# デプロイ時は make web-build で apps/web/dist を作り、API と同じドメインで配信する
ターミナル · スマホ
$ cp apps/mobile/.env.example apps/mobile/.env# apps/mobile/.env のアドレスをパソコンの LAN の IP に変える$ make mobile-install$ cd apps/mobile && npm start# スマホの Expo Go でターミナルの QR コードを読み取る
07

よくある質問

そのほかの質問は GitHub Issues へどうぞ。

かかりません。BetterTavern はオープンソースです。物語は自分のモデルのキーで書くので、料金は使った分だけモデルのプロバイダーに支払います。

はい、今のところ公開サービスはありません。物語、世界の状態、キーはすべて自分で動かすサーバーに保存されます。常時つけておくパソコンか、小さなクラウドサーバーが一台あれば十分です。

Android:このページ上部の「Android 版をダウンロード」から APK をダウンロードしてインストールします。インストール時に、ブラウザやファイル管理アプリからのインストールを許可するよう求められたら許可してください。Google Play にはまだ出ていません。iPhone:App Store にはまだ出ていないので、今は Expo Go で開きます。パソコンでクライアントを起動し(上の「デプロイ」の「スマホ」を参照)、ターミナルの QR コードをスマホで読み取ってください。スマホとパソコンは同じネットワークにつなぐか、Tailscale などのツールでつないでください。インストールしたら、ログイン画面の下にサーバーのアドレスを入力します。

SillyTavern のキャラクターカードです。PNG 画像か JSON ファイルで、V1・V2・V3 のどれでも使え、最大 16 MB です。PNG カードのデータは画像ファイルの中にあるため、圧縮した画像やスクリーンショットではデータが失われます。元のファイルを使ってください。

使えます。モデルを追加するときに「カスタム互換エンドポイント」を選び、OpenAI 互換 API のアドレスを入力します。エンドポイントが同じマシンや LAN の中にある場合は、サーバーで ALLOW_PRIVATE_ENDPOINTS=true を設定してください。

開始時に AI が世界の状態を整理し、その後は一場面ごとにバックグラウンドが展開に合わせて更新して、次の場面はそれを踏まえて書かれます。章が終わると、それまでの展開はまとめになります。バックグラウンドが管理するプロットも、監督が書くときに参照します。古い細部は監督が原文を読み返します。おかしな方向に進んだら、前の場面に戻って選び直せます。

画面は中国語・英語・日本語で、「設定 → 言語」で切り替えます。物語の本文の言語は決まっておらず、ふつうは開始時の画面の言語、キャラクターカード、自分が書いた文に合わせて書かれます。

BetterTavern は物語の内容を集めません。書くときに必要な前の展開は選んだモデルのプロバイダーへ送られ、その扱いは各社の規約によります。気になる場合は、自分のパソコンで動かすモデルを使えます。