{"id":51272804,"url":"https://github.com/ut42tech/summer-rescue","last_synced_at":"2026-06-29T19:02:04.840Z","repository":{"id":367229478,"uuid":"1279857062","full_name":"ut42tech/summer-rescue","owner":"ut42tech","description":"An AI application that fills your spare time during summer vacation. Created by Google AI Studio.","archived":false,"fork":false,"pushed_at":"2026-06-25T04:24:59.000Z","size":165,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-25T06:14:10.879Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ut42tech.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-25T04:24:44.000Z","updated_at":"2026-06-25T04:25:03.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ut42tech/summer-rescue","commit_stats":null,"previous_names":["ut42tech/summer-rescue"],"tags_count":null,"template":false,"template_full_name":"google-gemini/aistudio-repository-template","purl":"pkg:github/ut42tech/summer-rescue","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ut42tech%2Fsummer-rescue","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ut42tech%2Fsummer-rescue/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ut42tech%2Fsummer-rescue/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ut42tech%2Fsummer-rescue/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ut42tech","download_url":"https://codeload.github.com/ut42tech/summer-rescue/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ut42tech%2Fsummer-rescue/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34939227,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-29T02:00:05.398Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-29T19:02:03.961Z","updated_at":"2026-06-29T19:02:04.834Z","avatar_url":"https://github.com/ut42tech.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# 🌞 SUMMER RESCUE\n\n**夏休みのダラダラ防止エージェント**\n\nぽっかり空いた時間を、AI が「いますぐ動ける 1 つのアクション」に変えてくれる Web アプリ。\nプランはワンタップで Google カレンダーに登録できます。\n\n![Next.js](https://img.shields.io/badge/Next.js-15-black?logo=next.js)\n![React](https://img.shields.io/badge/React-19-149eca?logo=react)\n![TypeScript](https://img.shields.io/badge/TypeScript-5-3178c6?logo=typescript)\n![Tailwind CSS](https://img.shields.io/badge/Tailwind-v4-38bdf8?logo=tailwindcss)\n![Gemini](https://img.shields.io/badge/Google-Gemini-8e75ff?logo=googlegemini)\n![Firebase](https://img.shields.io/badge/Firebase-Auth-ffca28?logo=firebase)\n\n\u003c/div\u003e\n\n\u003cimg width=\"906\" height=\"903\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/dc4917c0-fd69-49b2-b2ee-11063a847938\" /\u003e\n\n---\n\n## 💡 コンセプト\n\n「夏休み、気づいたら一日中ダラダラしてた…」をなくすためのツールです。\n\nやる気が出ないときほど、人は「何をするか」を決めるところでつまずきます。SUMMER RESCUE は、\n**予算・移動・気分の 3 つを選ぶだけ**で、AI が重い腰を上げたくなるような具体的なプランを 1 つ提案。\nさらに **想定所要時間つきでカレンダーに登録**することで、「考える → 決める → 動く」の摩擦を限界まで減らします。\n\n最後にはちょっとしたご褒美（終了後は「一番高いアイス」を解禁 🍦）まで用意して、行動を後押しします。\n\n## ✨ 主な機能\n\n- 🔐 **Google ログイン** — Firebase Authentication によるワンクリック認証\n- 🎛️ **条件をタップで選択** — 予算（無料 / 1000円以内 / 贅沢）・移動（自宅 / 近所 / 遠出）・気分（アクティブ / 集中 / リラックス）\n- 🤖 **AI プラン生成** — Google Gemini が条件に合わせた行動プランを構造化 JSON で提案（プラン名・想定時間・タグ・具体的アクション・激励メッセージ）\n- 📅 **ワンタップでカレンダー登録** — Google Calendar API で「15 分後スタート・想定時間ぶん」の予定を自動作成\n- 🔄 **別案の再生成** — 気に入らなければその場で別のプランへ\n- 🎨 **ネオブルータリズム UI** — 太い黒枠とハードシャドウ、夏らしいアンバー基調のベントグリッドレイアウト\n\n## 🧭 使い方（ユーザー視点の流れ）\n\n1. **Google でログイン**（カレンダー登録のため `calendar.events` の権限を許可）\n2. 左パネルで **予算・移動・気分** を選ぶ\n3. **「プランを生成する 🚀」** を押すと、AI がおすすめプランを 1 つ提案\n4. 内容を確認し、よければ **「カレンダーに登録 ✅」**／いまいちなら **「別の案を見る 🔄」**\n5. 予定の時間になったら動く 👉 終わったらご褒美を解禁 🍦\n\n\u003cimg width=\"2064\" height=\"1884\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/b41d1344-ffe9-4597-af14-6d9c07f33131\" /\u003e\n\n## 🏗️ アーキテクチャ\n\n```\nブラウザ (React / Next.js App Router, \"use client\")\n  │\n  ├─ Firebase Authentication ──▶ Google サインイン（calendar.events スコープ付き）\n  │\n  ├─ POST /api/chat ───────────▶ Route Handler（サーバー側）\n  │                                 └─ @google/genai → Gemini で構造化プランを生成\n  │\n  └─ Google Calendar REST API ─▶ OAuth アクセストークンで予定を作成\n```\n\n- AI 呼び出しは **サーバー側の Route Handler（`app/api/chat/route.ts`）** に閉じており、`GEMINI_API_KEY` がクライアントへ漏れません。\n- Gemini は `responseSchema` による **構造化出力** を使い、UI が扱いやすい固定スキーマの JSON を返します。\n- カレンダー登録はクライアントが保持する **OAuth アクセストークン** を使って Google Calendar API を直接呼び出します。\n\n### 技術スタック\n\n| 領域           | 採用技術                                                   |\n| -------------- | ---------------------------------------------------------- |\n| フレームワーク | Next.js 15（App Router / Turbopack）、React 19、TypeScript |\n| スタイリング   | Tailwind CSS v4、`tw-animate-css`、Inter + JetBrains Mono  |\n| AI             | Google Gemini（`@google/genai`、構造化出力）               |\n| 認証           | Firebase Authentication（Google プロバイダ）               |\n| カレンダー     | Google Calendar API（REST）                                |\n| UI 部品        | lucide-react、motion、react-markdown                       |\n| パッケージ管理 | pnpm                                                       |\n\n## 🚀 セットアップ（ローカル開発）\n\n**前提:** Node.js 20+ と [pnpm](https://pnpm.io/) 10+\n\npnpm を入れていない場合は、Node 同梱の Corepack で有効化できます（`package.json` の `packageManager` で版を固定済み）:\n\n```bash\ncorepack enable\n```\n\n### 1. 依存関係をインストール\n\n```bash\npnpm install\n```\n\n### 2. 環境変数を設定\n\n`.env.example` を参考に **`.env.local`** を用意し、ご自身の Gemini API キーを設定します（[Google AI Studio](https://aistudio.google.com/apikey) で取得）。`.env.local` はリポジトリに含まれません。\n\n```env\nGEMINI_API_KEY=あなたのGeminiAPIキー\nAPP_URL=http://localhost:3000\n```\n\n| 変数             | 用途                                                                    |\n| ---------------- | ----------------------------------------------------------------------- |\n| `GEMINI_API_KEY` | サーバー側（`app/api/chat/route.ts`）の Gemini 呼び出しに使用。**必須** |\n| `APP_URL`        | アプリのホスト URL。ローカルでは `http://localhost:3000` のままで OK    |\n\n### 3. Firebase / Google 側の設定\n\nログインとカレンダー登録を動かすには、Firebase プロジェクト（接続先は `firebase-applet-config.json`）側で以下が必要です:\n\n- **Authentication で Google ログインを有効化**\n- **承認済みドメインに `localhost` を追加**（Firebase Console → Authentication → Settings → Authorized domains）\n  → 未追加だとログイン時に `auth/unauthorized-domain` エラーになります。`http://localhost:3000` でアクセスしてください。\n- カレンダー登録を使う場合は、対象の Google Cloud プロジェクトで **Google Calendar API を有効化**し、OAuth 同意画面に `calendar.events` スコープを設定\n\n\u003e ℹ️ `firebase-applet-config.json` に含まれる `apiKey` は Firebase Web 用の公開識別子で、秘密情報ではありません。アクセス制御は Firebase Security Rules と API キー制限で行ってください。\n\n### 4. 開発サーバーを起動\n\n```bash\npnpm dev\n```\n\nhttp://localhost:3000 を開きます。\n\n## 📜 スクリプト一覧\n\n| コマンド     | 説明                                    |\n| ------------ | --------------------------------------- |\n| `pnpm dev`   | 開発サーバーを起動（Turbopack）         |\n| `pnpm build` | 本番ビルド（`output: 'standalone'`）    |\n| `pnpm start` | 本番ビルドを起動（事前に `pnpm build`） |\n| `pnpm lint`  | ESLint を実行                           |\n\n## 📁 ディレクトリ構成\n\n```\napp/\n  api/chat/route.ts   # Gemini を呼び出すサーバー側 Route Handler\n  layout.tsx          # ルートレイアウト（フォント・メタデータ）\n  page.tsx            # メイン画面（ログイン / 条件選択 / プラン表示）\n  globals.css         # Tailwind v4 のスタイル\nlib/\n  firebase.ts         # Firebase 初期化・Google サインイン\n  calendar.ts         # Google Calendar への予定登録\n  utils.ts            # 汎用ユーティリティ\nhooks/\n  use-mobile.ts       # モバイル判定フック\nfirebase-applet-config.json  # Firebase Web 設定（公開値）\n```\n\n## ☁️ 由来\n\nこのアプリは [Google AI Studio](https://ai.studio/apps/98287636-a79d-475a-ba3b-194db702cb12) から書き出した applet をベースにしています。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fut42tech%2Fsummer-rescue","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fut42tech%2Fsummer-rescue","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fut42tech%2Fsummer-rescue/lists"}