daily-snap の PWA・オフライン方針。IndexedDB キュー、オンライン復帰時の同期、競合は履歴+UIで拾う想定。現状は開発途中であることを前提に、理想形と足場を分けて書く。
「オフラインでも書ける日記」は聞こえが良すぎる。でも現実は、キュー、リトライ、重複、競合、添付画像が一気に襲ってくる。daily-snap では、まずロマンを捨てずに、足場から入った。Service Worker と IndexedDB、同期のルールを先に決めないと、あとで「データが二重に…」が始まる。
方針としては、追記中心の日記なら append 前提で衝突を減らすのが筋がいい。それでもズレる。だからユーザー回答としても「履歴を保持して UI で復元できる」方向を採用した。LWW だけだと、人間の記憶とログの記憶が食い違ったときにキツい。
実装の細部はリポジトリの進行に合わせて変えてよいが、決めないと後で地獄になる項目は先に言語化しておきたかった。
04-15 のストレージ抽象と直結する。04-14 の別セクションでも触れたが、オフラインほど効く)。ただし、現状は開発途中。ここは盛らない。理想の節目(インストール可能、オフライン追記、復帰同期)と、いま動いている範囲を分けて書くのがこの記事の目的だ。未完成を隠すと、読者も未来の自分も騙すことになる。
画像のオフラインは特に難しい。テキストよりサイズが増え、失敗時のリトライも重い。だから MVP では「テキスト優先」で割り切る判断もありうる。それでもストレージ抽象(後述の GCS 本番)とセットで考えると、**「いったんローカルに置いて、あとでアップロード」**の設計に寄せやすい。
未完成の機能ほど、設計意図が消えやすい。だから「恥ずかしいから書かない」をやめる。オフラインは特に、ユーザー体験の期待値が高い分、言葉を選ばないと誤解が増える。ここは丁寧に、できている/できていないを分ける。
オフラインは「保存」じゃなくて、あとで直す権利の設計だと思う。履歴と UI はそのための保険。完成まで行かなくても、方針は先に言語化する価値がある。
オフラインのバグは再現が難しい。飛行機モードの手順、二端末同時、寝る前の追記、みたいな現実のシナリオをメモしておくと助かる。
PWA インストール促し、オフライン時のエラー表示、オンライン復帰後の同期結果。開発途中でも「いまの挙動」のスナップショットは後で比較に効く。
キャッシュ戦略を誤ると、古いバンドルが残って「直したのに直ってない」が起きる。オフラインほど、更新の見せ方がユーザー体験になる。だから途中実装でも、リロード手順やバージョン表示をどうするかはメモしておきたい。
この回のまとめは、オフラインは 同期の美学が必要で、ロマンだけだとユーザーが裏切られる。だから履歴と UI を保険にする。完成度より、誠実な期待値調整を優先した。
補足として、オフラインの敵は「失敗」より 無言の失敗だ。UI に状態を出せるかどうかが、信頼の大半を決める。
もう一つだけ。オフライン対象をテキストに絞るのは割り切りだが、割り切りを プロダクトの説明に書くのは割り切りじゃない。誠実さの方がずっと難しい。
キューのデータ構造(どのフィールドで重複判定するか、リトライの指数バックオフを入れるか)は、最初は雑でいい。でも 冪等性の方針だけは早めに決める。決めないと、オンライン復帰のたびに世界が増殖する。
次は、画像パイプライン(圧縮と保存先)の話。ここは実装が進んでいる分、具体コードに寄せられる。
daily-snap 開発ログ
前: ローカルでは SSE が笑う…
次: 画像は AVIF/WebP で殴って、本番の置き場所は GCS に寄せた
索引: 04-02 · … 04-30
個人向け日記 daily-snap を始めた動機と、写真・天気・Google カレンダー・AI 対話を同じ舞台に乗せる理由。1日の記録は追記の積み上げと、AI 側の束ねの二層で考える。
dairy-snap を Docker / Cloud Build / Cloud Run 気味に寄せるときに踏んだ地雷の型。standalone、prisma generate、Node heap、ダミー DATABASE_URL、PORT。04-16 前後のコミット列を軸に、個人開発でもハマる点を整理する。
天気(Open-Meteo)と Google カレンダーのキャッシュ・分類が、日記と AI の文脈にどう効くか。entry-weather・WeatherAmPmDisplay・weather-tool などコード上の出所と、設計意図・本番運用をまとめる。
Google OAuth・許可リスト・JWT セッションの方針と、middleware から proxy へ寄せた経緯。HTTPS 背後での secureCookie、Docker 本番との相性。04-17 前後のコミットを手がかりに。
daily-snap の画像アップロード。最大辺2048px、AVIF優先(非対応ならWebP)の圧縮、ストレージ抽象と本番 GCS 前提。日記アプリで画像が重い問題への殴り方。
AI チャットの SSE(ストリーミング)をローカル・本番で確認した手順と、環境差分で再発しうる罠。ai_artifacts / audit_logs を厚くする理由と、本文をサーバログに出さない方針。