本棚アプリ「ヨミチ」をリリースしました 〜React + Firebase 個人開発の記録〜

143 Views

August 21, 26

スライド概要

note&Zennで書いた記事のスライド版です。

▼シンプルな本棚アプリ「ヨミチ」をリリースしました
https://note.com/unsoluble_sugar/n/n5f6260f6ef5f

▼本棚アプリをReact + Firebaseでリリースするまでの開発記録。セキュリティルールの不備とPA-API廃止対応
https://zenn.dev/unsoluble_sugar/articles/yomichi-product-release

profile-image

フルオタクエンジニア

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

PRODUCT RELEASE 本棚アプリ「ヨミチ」を リリースしました 〜React + Firebase 個人開発の記録〜 2026/08/21 @unsoluble_sugar

2.

今日話すこと 1 「ヨミチ」ってどんなアプリ? 2 開発の進め方と技術構成 3 実データとセキュリティとの戦い 4 個人開発で得た学び 2

3.

CHAPTER 01 「ヨミチ」とは

4.

シンプルな本棚管理アプリ 読書状況・評価・メモをシンプルに記録 タイトル・著者・タグで検索、カテゴリ 絞り込み Googleアカウントでログイン、クラウド 同期 ブクログ形式CSVのインポート/エクスポ ート対応 886冊を登録して運用中 4

5.

名前の由来 「読み + 道」を組み合わせた造語 読みかけの本は、道の途中 「夜道」の響きも重ねている ロゴのカラスは「読書後に顔を上げた瞬 間」「道を見据えた姿」 本の上にとまるカラスがモチーフ 5

6.

始まりはClaude Designのプロトタイプ 6

7.

バーコードでサクッと登録 スマホカメラで書籍裏面のバーコードを 読み取り ISBNを自動検出してまとめて追加 登録済みの本は重複として検知 カメラAPIの都合でHTTPS配信が必須→ 技術選定に影響 978で始まるバーコードを自動読み取り 7

8.

スマホではアプリっぽく使える(PWA) ホーム画面に追加すればネイティブアプ リ風に起動 オフラインでも閲覧・編集できる 本棚は公開設定で共有URLを発行して見 ホーム画面に追加した様子 せられる 8

9.

CHAPTER 02 開発の進め方と技術構成

10.

5フェーズに分割して進行 Phase1 開発基盤 Vite / CI/CD Phase2 → ローカル版 移植 Phase3 → 認証+ クラウド同期 Phase4 → マルチ Phase5 → PWA化 ユーザー公開 Issue駆動: 1 issue = 1ブランチ = 1PR。Claude Codeが実装・テスト・PR作成まで自走 し、人間はレビューとマージだけを担当 10

11.

技術構成: Vite + React + TypeScript バーコード読み取りにHTTPS配信が必須 プロトタイプ(HTML+仕様書)からの 移植と相性が良い app/src/ ├── domain/ # 純粋関数(React・DB非依存) ├── db/ # Dexie.js + IndexedDB ├── firebase/ # Auth / Firestore / Functions ├── store/ # zustand(UI状態のみ) └── features/ # 画面コンポーネント 将来のモバイルアプリ化でも資産を再利 用できる domain層は純粋関数に隔離し、挙動をテ ストで固定 11

12.

BaaS比較 → Firebaseを採用 検討案 採用 Cloudflare / Supabase Firebase 認証・同期・モバイルSDKを揃えるには追 Google認証・オフライン同期・モバイル 加の作り込みが必要 SDKが標準装備。PRごとの使い捨て HTTPSプレビューURLでカメラ機能の実機 確認もしやすい 12

13.

同期戦略: データの「正」を切り替える サインイン中はFirestore(オフライン永続化)が正 未サインインはDexie.js(IndexedDB)のローカルモード useBooks() フックの単一ソースで自動切替、UIは無変更 初回サインインで全件一括アップロード(450件ずつ・冪等) 競合解決はLast-Write-Wins(Firestore既定)で十分と判断 13

14.

クラウドのデータモデル users/{uid} users/{uid}/books/{bookId} users/{uid}/notes/{noteId} publicShelves/{shareId} プロフィール … 蔵書(ローカルと同形 + updatedAt) … メモ・引用 … 公開本棚(公開情報のみの複製) … 公開本棚は公開情報のみを複製する別コレクション 構造的に非公開情報が混ざらないので「誰でも読める」ルールにしても安全 セキュリティルールはエミュレータ上の20件超テストでCI化 14

15.

CHAPTER 03 実データが設計を変えた

16.

884冊の実データで設計を検証 884 冊 69 % 1 /884 検証に使った実データ ISBNがないKindle本(ASIN) openBDの書影カバー率 机上の「ISBN前提」設計は実データが即ひっくり返した 16

17.

実データで見つけた問題と対処 69%がASINでISBNなし 雑誌のJANコードで重複発生 → 識別子をそのまま主キーに採用 → タイトル+著者の突き合わせを追加 著者名の空白差で別人扱い 削除データの同期ずれ → NFKC正規化+空白除去で統一 → 論理削除(deletedフラグ)を採用 17

18.

書影はどこから取るか(権利調査) Amazon画像の直リンク NDLサーチ書影API openBD書影 → 公開サービスでの無断利用 → 2026年3月で提供終了済 → カバー率1/884で実用にな に規約上の懸念。不採用 み。不採用 らず。不採用 結論: Amazonアソシエイト経由で正規利用+開示文言を明示。Kindle本にも表紙が付く副 効果も 18

19.

CHAPTER 04 セキュリティとAPI廃止との戦い

20.

公開前に見つけた重大な不備 Firestoreの read は get (1件取得)と list (一覧クエリ)の両方を含む を許可 → 全ユーザーの共有IDを列挙できてしまう + allow get: if true; // 個別取得のみ許可 + allow list: if false; // 一覧クエリは禁止 - allow read: if true; // get + list allow read: if true のままだと、誰でもコレクション全体をクエリ可能 128bit共有IDの「推測困難性」が意味をなさなくなるところだった 20

21.

そのほかの公開前セキュリティ対応 App Check(reCAPTCHA v3)でクライアント検証 検索APIにユーザー毎のレート制限をかけて連打防止 CSVエクスポートの数式インジェクション対策 Content-Security-Policyヘッダを導入 公開本棚のデータから内部ID(uid)を除去 21

22.

タイトル検索: PA-API廃止の直撃 Cloud Run FunctionsでAmazon商品検索のプロキシを実装 AWS SigV4署名を node:crypto のみで自前実装 ところがPA-API v5は2026年5月に廃止済みだった 後継のCreators APIは「直近30日で適格販売10件」が必要(自己購入は不可) 対応: 認証はOAuth 2.0へ移行済み。資格要件を満たすまでタイトル検索は本番ビルドで非 表示化 22

23.

PWA実装のポイントとハマりどころ vite-plugin-pwa + Workboxでアプリシェルをプリキャッシュ、機内モードでも起動 書影はcache-first(30日)でランタイムキャッシュ 更新は通知式: 新バージョン検出でトースト表示、ユーザー操作で更新 「更新」ボタンが反応しない罠→ controllerchange を自前監視して解決 Service Workerの最終検証はスコープの都合で本番環境が必須 23

24.

ハマったポイント(抜粋) 事象 対処 ルールテスト「No test files found」 vitest設定のincludeに一本化 CIでエミュレータ起動失敗(Java<21) setup-java追加 CSV再インポートで雑誌が重複 タイトル+著者の突き合わせ プレビューURLでサインイン不可 認証の検証は本番で実施 プレビューチャンネル50個の上限到達 有効期限短縮+クローズ時自動削除 PWA更新トーストが不応答 controllerchange監視でリロード確実化 24

25.

意図的に「捨てた」選択 E2Eテストなし: domain層ユニットテスト+実機確認で担保 双方向同期の自前実装なし: Firestoreのオフライン機能に一本化 ダークモード・多言語は見送り: プロトタイプにない仕様は足さない フルSSR不採用: SPA+PWAで完結(OGP生成のみFunctions) 費用: Firestore・Hosting・Cloud Runは無料枠内で月0〜数百円。予算アラート+上限の 二重構えで暴走対策 25

26.

CHAPTER 05 まとめ

27.

個人開発で得た学び 1 進め方(issue駆動・1PR単位)は初日に固定 4 セキュリティルールはテストのCI化で精査 2 実データ検証は設計の前に。現実が机上設計を 5 外部APIの廃止・資格要件は実装前に確認する 覆す 3 人間の担当(マージ・課金・認可・キー)を明 確化 6 Firebaseは個人開発の同期サービスに部品が揃 っている 27

28.

読みかけの本は、道の途中 「ヨミチ」は無料で使えます yomichi-app.web.app 28

29.

参考 シンプルな本棚アプリ「ヨミチ」をリリースしました(note) note.com/unsoluble_sugar/n/n5f6260f6ef5f React + Firebaseでの開発記録(Zenn) zenn.dev/unsoluble_sugar/articles/yomichi-product-release 29

30.

ご清聴ありがとうございました @unsoluble_sugar