daily-snap の画像アップロード。最大辺2048px、AVIF優先(非対応ならWebP)の圧縮、ストレージ抽象と本番 GCS 前提。日記アプリで画像が重い問題への殴り方。
日記に写真を載せると嬉しい。でもストレージと帯域と表示速度が一気に来る。要件(purompt.md)側でも、枚数上限やサイズ上限、圧縮方針が最初から決まっていて、**最大辺 2048px、AVIF 優先(だめなら WebP)**みたいに殴り方が具体だった。
実装済み、と言ってよいのはこの圧縮まわりだ。ここが曖昧だと、スマホから投げただけで日記が重くなる。逆に言えば、画像を軽くする投資は回収が早い。本文より先に体感が死ぬからだ。
本番の置き場所は GCS に寄せる前提で決めた。ローカル開発では抽象の裏にローカル実装を差し込み、本番では同じインターフェースで GCS に差し替える。個人アプリでも、この分離は効く。テストが楽だし、「署名 URL をどう切るか」みたいな論点を後回しにしにくい。
実装の線はリポジトリが正だが、頭の中の整理としては次の段階に分けると説明しやすかった。
purompt.md の上限は「怒りの UX」を減らす柵。設計の難所は、DB に何を残すかだ。画像本体はオブジェクトストレージ、DB にはパス・サイズ・ハッシュなどのメタ。オフラインと組み合わせると、アップロード待ちの状態機械が必要になる。だから前後の記事(オフライン、認証、本番コンテナ)とセットで読むのがちょうどいい。
日記というプロダクトは、テキストだけのときより「生活に近い」。写真はその象徴だと思う。次は、Google ログインと許可リスト、その背後の proxy 地獄に触れる。
実装の気持ちよさというより、サポートコストを減らすのが先だ。画像が重いと、ユーザーからの最初のフィードバックが「遅い」に寄る。個人アプリでも、未来の自分が最初のユーザーになる。だから圧縮は早期投資として扱った。
画像は「添付」じゃなくて、思い出の圧縮表現に近い。軽くするのは、記憶を守るための礼儀、くらいの気持ちでやる。
署名 URL の期限と、クライアントキャッシュの期待値はセットで考える。個人アプリでも「画像が突然見えない」は怖い。
画像付きエントリの詳細画面、複数枚アップロード後の一覧、アップロード前後の容量感が分かるなら Before/After。EXIF やプライバシーに触れるなら個人情報に注意。
位置情報が入っていると思い出は鮮明になるが、公開の仕方によっては危ない。だから「残す/捨てる」を実装で選べるようにしておくのが安全。要件にもバランスの話が出てくるので、コードと README をセットで読むのが早い。
この回のまとめは、画像は 容量・プライバシー・表示速度の三点セット。圧縮はその第一関門で、ストレージ抽象は第二関門。本番 GCS は第三関門、くらいに段階を分けて考えると迷子にならない。
補足として、アップロード上限(枚数と合計サイズ)は「怒りの UX」を防ぐ柵になる。日記は勢いで書きたいので、エラー文言は優しく、理由は具体的に。
最後に、ローカル実装から GCS へ寄せるときに一番きついのは、権限とパス設計だ。公開範囲を誤ると一瞬で終わる。だから抽象を早めに置いた。
アップロード API は「受け取る」「検証する」「保存する」「DB に刺す」を分けるとテストが書きやすい。個人開発でも、一度だけテストを書いたコンポーネントが後で助ける。
daily-snap 開発ログ
前: オフライン日記はロマン…
次: Google ログインの先に待ってたのは、proxy と secureCookie のコンボだった
索引: 04-02 · … 04-30
Next.js App Router で daily-snap の画面をどう分割したか。/today に集める判断、entries・calendar・settings・API 境界の考え方。リポジトリ初期コミット時点の骨格の話。
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 前後のコミットを手がかりに。
AI チャットの SSE(ストリーミング)をローカル・本番で確認した手順と、環境差分で再発しうる罠。ai_artifacts / audit_logs を厚くする理由と、本文をサーバログに出さない方針。
dairy-snap に MAS(マルチエージェント)を入れた理由と、オーケストレータ+サブエージェント分割の効用。04-10 前後の変更と、品質・拡張性・レイテンシのトレードオフの話。