narou-viewer is an unofficial self-hosted web novel viewer for personal reading workflows.
narou-viewer は、Web 小説を自分の環境に保存し、ライブラリ管理、リーダー、栞、読書位置、AI 支援機能をまとめて扱う個人利用向け self-hosted viewer です。
- 小説家になろう / カクヨム作品の取得 sidecar と連携したローカルライブラリ管理
- PC / スマホ / タブレット向けの本文リーダー
- 取得済み本文 HTML の表示用整形と、段落、ルビ、画像の reader 向け正規化
- 縦書き / 横書き、文字サイズ、行間、余白などの組版調整
- 明暗テーマや紙面テーマの切り替え、本文フォントの切り替え
- 話単位の既読位置、栞、読書状態の保存
- 本文リーダーの音声読み上げ、速度・音声・ルビ読み設定
- 通信が切れたときに、開いていた画面へ戻りやすくする最低限のオフライン補助
- 作品ごとのストレージ使用量表示
- AI 生成のキャラクター・用語一覧と、AI チャットによる小説内容の確認・整理
- 書籍化情報やカバー候補を扱う publication 情報表示
本文内容を校閲したり別の文章へ改変したりするものではなく、保存済み HTML を読書画面で扱いやすい形に整えます。
合成 fixture を使った画面例です。
ライブラリ画面では、保存済み作品、読書状態、取得状況、AI 機能の状態を一覧できます。
スマホ幅の本文表示では、縦書き本文、ページ送り、下部の読書操作を片手で扱えるようにしています。
読書AIパネルでは、開いている話数までをネタバレ境界として、作品内の人物や状況を確認できます。
人物・用語一覧では、ネタバレ境界を指定して抽出し、並列workerの進み具合と生成済みの人物・用語を同じパネルで確認できます。
本文画面は、明るさや色味の異なるテーマへ切り替えられます。
森林テーマ:
深海テーマ:
ミッドナイトテーマ:
narou-viewer は非公式ツールです。小説家になろう、カクヨム、株式会社ヒナプロジェクト、株式会社KADOKAWA とは無関係です。
- 小説家になろう / カクヨム等の実サイト fetcher は、利用者自身の責任で、各サイトの利用規約と権利者の条件に従って使ってください。
- 取得済みデータを公開、共有、再配布する用途を想定していません。
- 実サイトへの高頻度アクセスや機械的な連続取得を避けてください。実装上の rate limit / retry / timeout / cancel は維持しますが、利用時のアクセス頻度にも注意してください。
- cloud LLM 連携は opt-in です。API key を設定しない状態では外部 LLM provider への生成リクエストは行いません。
- AI 機能を有効化した場合、設定した外部 LLM provider に本文またはその抜粋・要約用テキストが送信される場合があります。
docker-compose.prod.yml は、ローカルまたは任意の self-host 環境で試せる compose サンプルです。TLS や認証は含まないため、公開する場合は前段の reverse proxy、VPN、tunnel などで設定してください。
docker compose -p narou-viewer -f docker-compose.prod.yml up --build既定では同一 host の http://localhost:8080 で開けます。ポートを変える場合は次のように指定します。
NAROU_VIEWER_HTTP_PORT=18080 \
docker compose -p narou-viewer -f docker-compose.prod.yml up --buildnarou-viewer は Compose project 名であり、同じ data volume を使う停止、起動、backup、診断でも同じ値を指定します。
別の project 名を使う場合は .env の COMPOSE_PROJECT_NAME などへ記録し、checkout directory 名から暗黙に決めないでください。
既定では viewer-web を host の 127.0.0.1:8080 に bind します。公開 host では前段の reverse proxy、VPN、tunnel などから転送してください。外部 interface へ直接 bind する場合は、TLS と認証を別途設定したうえで NAROU_VIEWER_HTTP_BIND=0.0.0.0 を明示してください。
compose の主な service:
viewer-web: Nginx。deploy/viewer-web/Dockerfileで build した静的ファイルを配信し、/api/*をviewer-apiへ転送して同一 origin にまとめます。viewer-api:deploy/viewer-api-go/Dockerfileで build した API servicenovel-fetcher: 取得 sidecar。既定の取得 backend として viewer-api から使います。shared-data-init: 初回起動時にshared-dataの必要ディレクトリと所有者を整える one-shot service。shared-data:viewer-apiとnovel-fetcherが共有する named volume
注意:
shared-dataは初期状態では空です。起動時にshared-data-initが/data/novel-fetcherと/data/stateを作成し、non-root container から書き込める所有者へ補正します。novel-fetcherの33006は publish しません。取得 sidecar 連携はviewer-apiの/api/fetcher/*経由で扱います。novel-fetcherの既定 User-Agent は実サイト互換性のため browser-like な値です。ツール名を識別できる UA は既定では送りません。利用者の運用方針に応じて、compose の.envや shell environment からNOVEL_FETCHER_USER_AGENTで上書きできます。- この compose 自体は TLS や認証を終端しません。インターネットへ公開する場合は、Caddy、Traefik、Nginx、Cloudflare Tunnel、VPN など任意の前段で TLS と認証を設定してください。
- AI / Google Books 連携に必要な任意 env は、shell か compose の
.envから渡せます。API key を設定しなければ cloud LLM provider への生成リクエストは行いません。
- 入口:
docs/README.md - アーキテクチャ:
docs/architecture.md - 品質目標:
docs/quality-goals.md - 機能別仕様:
docs/extraction.md,docs/publication-info.md,docs/reader-ai-assistant.md,docs/state-schema-policy.md - 開発手順:
docs/development.md - テスト方針:
docs/testing/testing-strategy.md,docs/testing/e2e-setup.md - self-host とデプロイ方針:
docs/deployment.md - AI 実験・評価手順:
docs/ai-experiments.md - エージェント向け手順:
docs/README.mdの Skills 索引
ローカルの Go コマンドは Go 1.25.12 (GOTOOLCHAIN=local) を使用します。Dev Container では同じバージョンが導入されます。
日常的な確認では、まず lint と高速テストを実行します。
bun run lint
bun run test:unitbuild まで含めて確認する場合:
bun run verify:fastE2E まで含めた最終確認:
bun run verifynovel-fetcher を変更した場合:
bun run verify:novel-fetcherDev Container、worktree、toolchain、E2E fixture の詳細は docs/development.md を参照してください。
apps/viewer-api-go: viewer-api。開発 / E2E / self-host compose の既定 APIapps/viewer-web: React + Vite + TypeScriptservices/novel-fetcher: 取得 sidecar.devcontainer/: Dev Container 定義docs/: 設計、開発、運用、テスト、機能別仕様.agents/skills/: エージェント向けの反復手順
MIT License です。
関連ファイル:






