尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證夢の内容を記録するアプリケーションです。
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗YumeTree(ユメツリー) は、朝の夢を忘れる前に記録し、モルペウスと一緒に感情や画像で振り返るAI夢ノートです。
夢の内容を記録すると、OpenAI API が分析文と感情タグを返し、日々の夢を単なるメモではなく、自分や大切な人と振り返るきっかけに変えます。
音声入力、AI分析、感情タグ、夢の画像生成を通じて、ひとりでも、家族・恋人・友達とも楽しめるプライベートな夢の記録体験を目指しています。
🌐 本番URL: https://dreamjournal-app.vercel.app
YumeTree(ユメツリー)は、夢の記録・AI 分析・感情タグの可視化・夢の画像生成を組み合わせた、プライベートなAI夢ノートです。 フロントエンドは Next.js 16、バックエンドは Rails 7.2 API を採用し、認証、AI 連携、寄付・月額課金、監視、テストまでを個人開発で一貫して構築しています。
技術選定では「モダンだから」ではなく、ひとりでも、大切な人とも迷わず使える UX と、継続運用しやすい構成になるかを重視しています。
子どもでも扱いやすく、大人も迷わず使えるよう、ひらがなを多めに使った表現やシンプルな入力導線を意識しています。
記録した夢は OpenAI API(デフォルト gpt-4o-mini)で分析し、短い解釈文と感情タグを返します。使用モデルは OPENAI_CHAT_MODEL 環境変数で切り替え可能な設計にしており、本番挙動を変えずにコスト・品質の比較検証ができます。日々の夢を単なるメモで終わらせず、自分のセルフケアや、大切な人との会話のきっかけに変えることを狙っています。
Whisper API を使った音声録音→テキスト変換→分析の一連フローを実装しています。 「朝起きたばかりで文字を打つのが面倒」という場面に対応し、録音ボタン一つで夢を記録できます。
夢の内容や AI 分析結果をもとに OpenAI の画像生成モデル(gpt-image-1)で画像を生成し、夢の世界をビジュアルで表現できます。
月次 31 枚上限(check_monthly_image_limit)でコストを管理し、Rack::Attack による追加のレート制限も設けています。
2026 年 5 月廃止予定だった dall-e-3 から gpt-image-1 へ移行済みで、b64_json レスポンスを直接 DB に保存することで期限切れ URL の問題を解消しています。
月別アーカイブページでは、その月の記録数・記録日数・感情 Top 3 などの統計をまとめて表示します。 連続記録のストリークバッジも用意し、日々の記録継続を楽しめる仕組みを取り入れています。
さらに「きもちインサイト」ダッシュボード(/insights)では、今月の振り返りを 1 ページに集約しています。KPI・ムードカレンダー(各日を最頻感情色で塗るヒートマップ)・モルペウスの月まとめ・きもち TOP5・半年分の記録トレンドを、追加の API を増やさずクライアント側の集計で表示します。
記録を「続けたくなる」体験にするため、夢を残すたびに木が育つ「夢の森」を用意しています。プロフィール(自分・家族など)ごとの森を俯瞰でき、収穫演出やモルペウスの案内で、記録の継続そのものが小さな達成になるよう設計しています。
ホームには「今週のゆめニュース」ウィジェットを配置し、直近 7 日間の夢をプロフィールごとに要約します。新しい API を追加せず、ホームが既に取得済みの夢・プロフィールデータをその場で集計する軽量な実装にしています。
認証は JWT を HttpOnly Cookie で扱い、フロントエンドとバックエンドを分離した構成でも安全にセッションを維持できるようにしています。
決済は2種類の Stripe フローを実装し、いずれも本番稼働済みです。
checkout.session.completed Webhook → Payment 永続化checkout.session.completed / invoice.payment_succeeded / customer.subscription.deleted)→ users.premium フラグ更新graph TD
Browser["Browser"]
FE["Next.js 16<br/>(Vercel)"]
BE["Rails 7.2 API<br/>(Render)"]
DB[("PostgreSQL")]
AI["OpenAI API<br/>(gpt-4o-mini / whisper-1 / gpt-image-1)"]
Stripe["Stripe"]
Sentry["Sentry"]
Browser -->|HTTPS| FE
FE -->|REST API + Cookie| BE
BE --> DB
BE -->|Dream analysis / Image generation| AI
BE -->|Checkout Session| Stripe
Stripe -->|Webhook POST| BE
「ひらがな中心の表示」「夢詳細の閲覧モードと編集モードの分離」「パスワード可視化トグル」「ライト / ダークモード切り替え」など、使いながら分かりにくかった点を小さく改善してきました。
BottomTabBar(ホーム / きもち / 記録 / もり / 設定)、デスクトップでは常駐サイドバーと ⌘K コマンドパレットを提供し、画面移動や最近の夢へのアクセスを各デバイスに適した操作で行えるようにしています。ランディングページも 2 カラムのデスクトップ向けレイアウトへ刷新しました。個人開発でも変更を積み重ねやすいよう、Jest・RSpec・Playwright を併用して回帰確認しやすい状態を保っています。
夢の番人キャラクター「モルペウス」を全11画面にそれぞれ配置し、アプリ全体のトーンを統一しています。
MorpheusImage コンポーネントがバリアント(home / analysis / login など)に応じた画像を切り替え、画像読み込みエラー時は SVG フォールバックで表示を保証します。
variant 変更時にエラー状態を useEffect でリセットすることで、画面遷移をまたいだ状態リークも防いでいます。
未ログインユーザーを即座に /login へリダイレクトするのではなく、ページ自身が MorpheusLoginRequired コンポーネントでやさしく案内する設計にしています。
バックエンドの API 認証は維持したままフロントの導線を緩和することで、新規ユーザーがアプリの価値を感じてからアカウント登録できる流れを作っています。
さらに /trial ページでは、アカウント登録なしに AI 分析を最大3回体験できるトライアルフローを提供しています。初回のボタン押下時にバックエンドでトライアルアカウントを自動生成し、分析結果をその場で確認できます。残り分析回数のカウントダウン表示と、上限到達時のアップグレード誘導カードを組み合わせることで、「体験 → 価値実感 → 登録」の自然な流れを設計しています。
夢と感情の関係は多対多で表現しています。さらに、AI 分析結果の保存形式が変わった後も既存データを壊さず扱えるよう、表示側で新旧フォーマットを吸収する実装にしています。
dream_profiles により、「自分」「子ども」「家族」「ペット」など、誰の夢かを分けて記録できるようにしています。
既存ユーザーには self プロフィールを補完し、「自分」プロフィールはアーカイブ不可にすることで、既存の夢データの基準が失われないようにしました。
この機能では、モデル・API・フロントエンドUIの実装に加えて、本番DB migration、既存ユーザー補完、本番ブラウザでの /profiles 動作確認、一時的な補完処理の撤去まで行いました。
さらに Supabase Security Advisor の rls_disabled_in_public 警告に対応し、フロントエンドから Supabase へ直接アクセスしていない構成を確認した上で、public.dream_profiles の Row Level Security を有効化しました。policy なしの Default Deny 方針により、Rails API という正規ルートは維持しつつ、Supabase の直接アクセス口を閉じています。
Sentry をフロントエンドとバックエンドの両方に導入し、本番での例外や不安定な挙動を検知しやすくしています。 加えて、CORS 設定、HttpOnly Cookie、環境変数管理のほか、Rack::Attack によるレート制限(登録・分析 API・画像生成を個別に制御)を整備しています。 パスワードポリシーはバックエンドのモデルバリデーションとフロントの入力チェックを一致させ、「8文字以上・英字と数字を各1文字以上含む」を二重に保証しています。登録フォームには3段階の強度バーをリアルタイム表示し、入力中にポリシー充足状況を視覚的にフィードバックします。
認証基盤の強化(2026年7月): 当初は 1 ユーザーにつき平文リフレッシュトークン 1 本という構成でしたが、以下のように多端末・漏洩耐性を意識した設計へ作り直しました。
user_sessions テーブルを新設し、リフレッシュトークンは SHA-256 digest のみを保存。有効期限・失効時刻・端末情報(user_agent / ip_address / last_used_at)を持たせ、複数端末でのログイン維持とセッション単位の失効に対応します。ログアウト時は該当セッションのみを失効します。旧 users.refresh_token(平文カラム)は、既存ログインを切らさないための一時的な互換経路として残し、使用時に消去する移行方式にしています。EmailVerificationBanner を表示し、再送・確認導線を案内します。reset_password_token_digest として保存する方式に統一しました。寄付(一回払い)と月額サブスクリプション(¥500/月)の2フローを実装し、いずれも本番稼働済みです。
共通の設計方針として、ensure_stripe_customer_id! による顧客再利用、Webhook 署名検証(STRIPE_WEBHOOK_SECRET)、ProcessedWebhookEvent による重複イベント排除、PaymentsObservability による構造化ログを整備しています。
Subscription フローでは client_reference_id → stripe_customer_id → email の3段階フォールバックでユーザーを解決し、解約時には customer.subscription.deleted を受けて premium フラグを安全に降ろす設計にしています。
一次切り分け用に docs/runbook-payments.md も用意し、機能実装だけでなく運用時の対応手順まで残しています。
日本時間(JST)での日付処理を lib/date.ts に集約し、toLocaleString("ja-JP") が返す「2026年」のような日本語文字列が URL パラメータに混入するバグを防いでいます。
en-CA ロケールで YYYY-MM-DD 形式を取得し、.slice(0,7) で月キーを生成することで、Vercel(UTC 環境)でも JST 基準の月グループが正確に機能します。
実装の背景・設計判断・はまりポイントを Zenn にまとめています。
OPENAI_CHAT_MODEL 環境変数を活用して gpt-5-mini / gpt-5-nano の品質・コストを評価)gpt-4o-mini, whisper-1, gpt-image-1), Stripe Checkout / Subscription / Billing Portal, Sentrygit clone https://github.com/isekaisaru/dream-journal-app.git
cd dream-journal-app
cp backend/.env.example backend/.env
make dev-up
| Service | URL |
|---|---|
| Frontend | http://localhost:3000 |
| Backend API | http://localhost:3001 |
| PostgreSQL | localhost:5432 |
GitHub Actions で main への Push / PR 時に Playwright、RSpec、Jest を実行し、主要フローの回帰を検知できるようにしています。
Playwright E2E カバレッジ(CI 実行分)
CI(GitHub Actions)では認証不要・APIモック済みのシナリオを自動実行しています。
| シナリオファイル | カバー内容 |
|---|---|
smoke.spec.ts | アプリ起動・ログインリンク表示 |
donation.spec.ts | 寄付フロー・Stripe Checkout 遷移 |
dream-detail-flow.spec.ts | 夢詳細表示・編集モード切り替え |
registration-flow.spec.ts | パスワード強度バー(弱い/普通/強い)・バリデーション・登録成功→/home 遷移 |
trial-flow.spec.ts | 残り分析回数バッジ・AI分析成功・上限到達時のアップグレードカード表示 |
認証が必要なシナリオ(home-flow.spec.ts、month-summary-flow.spec.ts)はローカル環境で実行します。
Tyougorou 物流・現場マネジメント経験を経て、手触りのあるソフトウェアで課題解決を行うため Web 開発技術を習得。要件定義から実装、デプロイ、運用改善まで一貫して取り組んでいます。