Vivliostyle CLIでKindle出版環境を作る — kdp-factoryリポジトリ立ち上げの記録
プログラミングコードでKindle出版する環境を、今日一日で立ち上げた。リポジトリ名は kdp-factory。Markdownで原稿を書き、CLIでEPUBを生成し、Kindle Previewer 3で確認するところまで一気通貫で動くようになった。
「ストーリーブックみたいな名前のやつ」の正体探しから始まった
発端は記憶の断片だった。「Kindleの出版に使えるオープンソースのライブラリがあったはず。確かストーリーブックみたいな名前の……」という曖昧な手がかりだけでClaude Codeに調査させたところ、最初に返ってきた答えは GitBook だった。たしかに名前は近い。でも開発停止済みで、後継はHonKitだという。
調査結果を眺めながら数分考えて、思い出した。私が探していたのは Vivliostyle CLI だ。日本発のCSS組版ツールチェーンで、VFM(Vivliostyle Flavored Markdown)で書いた原稿から EPUB と PDF を同時に出力できる。GitBookじゃなくてこっちを詳細に調べ直してもらい、調査ドキュメントを丸ごと書き換えてもらった。
調査で判明した要点はこうだった。
- KDPに公式APIは存在しない。コードで自動化できるのはEPUB生成・検証まで
- MOBI / kindlegen は完全廃止済み。今は EPUB 3 の直接アップロードが標準
- Vivliostyle の EPUB 出力は CSS をそのまま素通しするので、Kindle 非対応の CSS(CSS変数・Flexbox・Grid・
@page)を避けたEPUB専用テーマが要る
最後の1点が、午後の試行錯誤の伏線になった。
kdp-factory リポジトリの立ち上げ
~/Git_repo/ 直下に新規リポジトリ kdp-factory を作った。初期セットアップで指示したのは次の通り。
- パッケージマネージャは npm ではなく pnpm に切り替えてもらった
pnpm buildで PDF + EPUB の生成疎通を確認(PDF 142KB / EPUB 23KB)- ビルド中間生成物の
.vivliostyle/がコミットに混入したので、gitignoreに追加して直前コミットから除外してもらった - CLAUDE.md を作成。リポジトリの目的、pnpmコマンド、今日実証したハマりどころ(configの相対パスがcwd基準で解決される件、Kindle向けEPUBのCSS制約)、執筆ルール(ルビ記法・表の画像化・ページ参照禁止)まで書き込んでもらった
- memo/ ディレクトリを作り、調査メモもそちらに保存
サンプルプロジェクトとして、会計学習書のコンテンツが1冊分入っている。これを実験台にして以降の検証を回した。
余白が大きすぎる — テーマのデフォルト値を疑う
pnpm preview でブラウザのライブプレビューを立ち上げて、最初に目についたのが余白だった。本文の周りに白い空間が広がりすぎていて、ページの半分くらいしか文字が載っていないように見える。「こんなもんですか?」とClaude Codeに聞いたら、使っていたテーマ(theme-techbook)のデフォルト余白の値を調べてくれた。
余白調整のCSSを追加してもらったが、ここで小さい事故が連発した。プレビューが作業ディレクトリを掴んだままでビルドが失敗し、13000番ポートの残骸プロセスの掃除が要った。さらにシェルに $ を食われてコマンドが化け、クォートの修正で再実行。一つずつ潰して、最終的に余白調整は反映された。
Kindle Previewer 3 のファイルロック事件
EPUBの実機確認用に Kindle Previewer 3 を使ったのだが、途中でアップデートのインストーラーが「ファイルを上書きできない」と止まった。スクリーンショットを貼って原因を調べさせたら、犯人はさっきEPUB確認用に起動したKindle Previewer本体だった。プロセス(PID 65304)が実行中のままファイルをロックしていた。プロセスを終了させ、Tempフォルダに残っていたインストーラーを再実行して、3.104.0へのアップデートを完了させた。
ついでに分かった仕様がもう一つ。Kindle PreviewerはGUIが起動中だと、CLIの変換を同時に走らせられない。CLIの品質チェックが失敗して初めて気づいた。
プレビューと実際の出力が違う — 原因は再レンダリングではなかった
新しいPreviewerでEPUBを開いて見比べたとき、手が止まった。ブラウザで見ていたVivliostyleのプレビューと、Kindle Previewerに映っている画面が、だいぶ違う。プレビューにあったサンプル章の表示が、Kindle側には入っていない。
最初は「アップデート後に再レンダリングしていないからでは」と疑った。でも調べさせると、再レンダリングの問題ではなく2つのフォーマットの仕様の違いで、これが正常な挙動だった。ブラウザプレビューはPDF用のレイアウトを描画していて、EPUBはリフロー型なので同じ見た目にはならない。
ここで引き下がらずに食い下がった。「自費出版している人たちは、EPUBでもっと見た目をコントロールできているはず」と。すると話が一段深くなった。「Kindleが解釈できない」のは今入っているPDF用テーマ(CSS変数だらけ)の話で、Kindle自体は普通のCSSをかなり解釈できる。見出しのデザイン、表の罫線・背景色、字下げ、フォント指定(埋め込みも可)、余白。きれいに出している自費出版本はまさにそこを作り込んでいる。今の見た目が素っ気なかったのは、単にEPUB用のCSSが1行も当たっていなかったからだった。
そこでEPUB用CSSを書いてもらい、Kindle Previewerで開き直した。見出しに装飾が入り、表に罫線が通った画面を見て、ようやく「これなら本になる」と思えた。
判明した内容をドキュメントに固定
「どこまでCSSを使っていいか、今回判明した内容をしっかりめに残しておいて」と指示して、EPUB用CSSのドキュメントを書かせた。doc-communicationスキルを参照させて構成を組み、READMEも今日の構成変更に合わせて更新してもらった。口頭のやり取りで分かったことは、その日のうちにリポジトリへ沈めておかないと消える。
既存サイトの章をKDP用に変換するテスト
環境ができたので、実戦テストとして eurekapu-nuxt4 リポジトリにある会計学習ノートのイントロダクション章を、KDP用に変換してもらった。
- 章内の図版7点をPNG化(フォントの描画崩れがないか1枚ずつ目視確認)
- 本文をVFM Markdownに変換して第1章として組み込み
- Kindle変換チェックはエラー0で通過
Kindle PreviewerとブラウザのPDFプレビューを並べて見比べたが、これは率直に良かった。Webページとして書いたコンテンツが、ほぼそのまま本の章になる手応えを得た。
明日への積み残し
フェーズ1のイントロダクションが入ったので、フェーズ2以降の基本論点・決算・帳簿体系・演習も全部入れていきたい。ただしソース側のコンテンツを今まさに修正中で、内容が変わる可能性がある。その前提込みで計画メモを残してもらった。
- フェーズ2〜5の全19章を順次変換する(進捗チェックリスト・行数・図版数の見積もり付きでメモ化済み)
- 着手前にソースの確定状況を確認し、章ごとにソースのコミットハッシュを記録する
- 演習章の特殊構造や、表のSVG化判断を個別に検討する
学び
- 曖昧な記憶でツールを探すと、名前が似た別物(GitBook)を掴まされる。実物(Vivliostyle CLI)に当たるまで疑うこと
- EPUBはリフロー型なので、CSS組版のPDFプレビューと同じ見た目にはならない。「プレビューと違う=バグ」と決めつけない
- 「Kindleでは凝ったレイアウトは無理」は半分嘘。CSS変数やGridを避ければ、見出し・表・フォントはかなり制御できる。素っ気ない見た目の原因は、たいてい「EPUB用CSSを当てていない」だけ
- GUIアプリ起動中のファイルロックとCLI排他は、Windowsでの定番の罠。インストーラーが止まったら、まず実行中プロセスを疑う