--- name: アーキテクチャ決定事項 description: 技術選定・設計方針の決定理由。なぜその選択をしたかの根拠。将来の AI が同じ議論を繰り返さないために保存。 type: project --- ## 認証方式: Supabase Auth に決定(2026-03-27) **決定**: Supabase Auth を採用する。 - Magic Link メール送信: Resend をカスタム SMTP として Supabase に接続(noreply@soar-enrich.com) - Passkey(指紋・顔): Supabase Auth が標準提供 - VPS server.js は Supabase JWT を受け取って検証するだけ(発行は Supabase) - VPS に作成済みの auth テーブル(magic_link_tokens 等)は将来削除予定(今は放置) **Why:** 実装量が大幅に少ない・habit/pulse を Supabase に移行するときの RLS と自動連携・Resend DNS は Supabase のカスタム SMTP として引き続き活用できる。 **Passkey ドメイン課題:** ワイルドカード DNS `*.posimai.soar-enrich.com → 76.76.21.21` を Eiji さんに依頼予定。設定後に rpID=posimai.soar-enrich.com で全アプリ共有可能。 **How to apply:** X-API-Key・?init_key=・localStorage 認証ロジックは実装完了まで変更禁止。 --- ## データ保存先: VPS PostgreSQL と Supabase の分担 **決定**: 用途によって使い分ける。 | 保存先 | 対象データ | 理由 | |--------|-----------|------| | VPS PostgreSQL | brain 記事・journal 日記・認証・セッション | サーバー側 AI 処理・全文検索が必要。すでに存在する | | Supabase | together(リアルタイム同期)・将来: habit/pulse | リアルタイム購読・RLS によるユーザーデータ分離が自然 | | localStorage | timer 設定・veil 設定 | 端末ごとに持つのが自然な設定値 | **Why:** - VPS: サーバー側で Gemini 呼び出し・検索・集計が必要なデータは API サーバーと同じ場所に置く - Supabase: 「ユーザーが書いて読むだけ」のシンプルなデータは RLS で安全に管理できる Supabase が適切 - ユーザーデータ(habit/pulse)を VPS に置く場合は自前で `WHERE user_id = :me` を全エンドポイントに実装する必要があり、バグ時のデータ漏洩リスクがある **How to apply:** habit/pulse のクラウド移行は Supabase を推奨。brain/journal は VPS から動かさない。 --- ## CDN バージョン: Lucide @0.344.0 固定 **決定**: `unpkg.com/lucide@0.344.0` に固定。`@latest` は使用禁止。 **Why:** - `@latest` を使うと Lucide がバージョンアップしたとき Service Worker が古いバージョンをキャッシュしたままになりアイコンが消える - アイコン名・API の breaking change が起きたとき気づかずにアプリが壊れる - バージョンを固定すれば自分のタイミングで確認して更新できる **How to apply:** CDN 経由で読み込むすべてのライブラリはバージョン番号を明記する。`@latest` は CLAUDE.md 違反。 --- ## ドメイン構成: A案(API を別サブドメインに分離)を採用 **決定・完了(2026-03-26):** - `posimai.soar-enrich.com` → Vercel(76.76.21.21)→ posimai-dashboard - `api.soar-enrich.com` → VPS(85.131.245.239)→ バックエンド API :8090 **完了済み:** - DNS 切り替え完了(A レコード設定済み) - Resend DNS(DKIM/SPF)設定済み・稼働中 - 全フロントアプリの API URL を `api.soar-enrich.com/brain/api` に更新済み **次期計画: ワイルドカード DNS `*.posimai.soar-enrich.com`** - 全アプリを `brain.posimai.soar-enrich.com` 等に統一することで Passkey の rpID 問題を解決 - DNS レコード 1 件で 23 アプリ対応(個別 CNAME 不要) - 実施時期未定(認証方式決定後) **How to apply:** フロントの API URL は `api.soar-enrich.com/brain/api` が正。`posimai.soar-enrich.com` は今や Dashboard URL なので API 参照に使ってはいけない。 --- ## localStorage 廃止方針 **決定**: habit・pulse・reader 既読履歴は将来的に Supabase へ移行する。ただし現時点では対応しない(商用化フェーズ 3)。 **Why:** localStorage はブラウザキャッシュ削除でデータ消失する。有料ユーザーに提供できない。 **How to apply:** 現状の localStorage ロジックには手を付けない。移行は認証実装完了後に着手。