{"id":50241147,"url":"https://github.com/ut42tech/tecnova-platform","last_synced_at":"2026-05-26T21:05:09.777Z","repository":{"id":355258873,"uuid":"1227398394","full_name":"ut42tech/tecnova-platform","owner":"ut42tech","description":null,"archived":false,"fork":false,"pushed_at":"2026-05-13T07:39:07.000Z","size":533,"stargazers_count":1,"open_issues_count":3,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-13T09:33:47.550Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","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":"LICENSE","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-05-02T16:19:52.000Z","updated_at":"2026-05-08T16:24:58.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ut42tech/tecnova-platform","commit_stats":null,"previous_names":["ut42tech/tecnova-platform"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ut42tech/tecnova-platform","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ut42tech%2Ftecnova-platform","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ut42tech%2Ftecnova-platform/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ut42tech%2Ftecnova-platform/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ut42tech%2Ftecnova-platform/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ut42tech","download_url":"https://codeload.github.com/ut42tech/tecnova-platform/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ut42tech%2Ftecnova-platform/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33538703,"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":"ssl_error","status_checked_at":"2026-05-26T15:22:15.568Z","response_time":63,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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-05-26T21:04:39.873Z","updated_at":"2026-05-26T21:05:09.766Z","avatar_url":"https://github.com/ut42tech.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cstrong\u003etec-nova Nagasaki 統合管理プラットフォーム\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/ut42tech/tecnova-platform/actions/workflows/ci.yml\"\u003e\n    \u003cimg src=\"https://github.com/ut42tech/tecnova-platform/actions/workflows/ci.yml/badge.svg\" alt=\"CI\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/ut42tech/tecnova-platform/actions/workflows/deploy-api.yml\"\u003e\n    \u003cimg src=\"https://github.com/ut42tech/tecnova-platform/actions/workflows/deploy-api.yml/badge.svg\" alt=\"Deploy API\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"./LICENSE\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/license/ut42tech/tecnova-platform?color=blue\" alt=\"License: MIT\"\u003e\n  \u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/badge/node-%3E%3D22-brightgreen?logo=node.js\" alt=\"Node.js ≥22\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/pnpm-10-F69220?logo=pnpm\" alt=\"pnpm 10\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/TypeScript-6-3178C6?logo=typescript\" alt=\"TypeScript 6\"\u003e\n\u003c/p\u003e\n\n---\n\n長崎大学 NUTIC で開催される子ども向けファブリケーション活動 **「テクノバながさき」** の運営基盤プラットフォーム。\n\n参加者のチェックイン / アウト、活動ログ記録、研究データ収集を統合的に支える内製システム。  \nAPI-first なアーキテクチャで、複数のクライアント（iPad チェックイン機 ・ メンタースマホ ・ 管理 PC）を同一バックエンドから提供します。\n\n---\n\n## 📸 Screenshots\n\n|      iPad チェックインアプリ（`apps/checkin`）       |           管理ダッシュボード（`apps/admin`）           |\n| :--------------------------------------------------: | :----------------------------------------------------: |\n| ![Checkin App](./docs/images/screenshot-checkin.png) | ![Admin Dashboard](./docs/images/screenshot-admin.png) |\n\n---\n\n## ✨ Features\n\n### Phase 1 — MVP（✅ 実装済み）\n\n| 機能                             | 説明                                                    |\n| -------------------------------- | ------------------------------------------------------- |\n| 📱 iPad PWA チェックイン         | QR / バーコードでワンタップ入退場                       |\n| 🆕 「初めての方」フロー          | 事前登録情報から本人選択 → 自動採番 → アクティベート    |\n| 🗂️ 事前登録管理                  | 学生側スプシの未アクティベート行を admin から追加・削除 |\n| 🔗 Google Sheets 連携            | 教員側のプライバシー要件に配慮した双方向分離設計        |\n| 🔐 Google OAuth + 許可リスト     | 運営者のみがアクセスできるシンプルな認証                |\n| 📊 管理ダッシュボード            | 当日の来場状況をリアルタイム把握                        |\n| 🔍 名前検索 \u0026 手入力             | QR が読めない場合のフォールバック                       |\n| 📋 受付履歴 \u0026 一括チェックアウト | 当日の全操作ログとワンタップ一括退場                    |\n| 📂 Drive 自動連携                | アクティベート時に GAS 経由で Drive フォルダ自動生成    |\n\n### Phase 1.5 — 運用開始後\n\n- 📝 メンタースマホアプリ（30 分グリッドのログ記入・未記入ハイライト）\n- 🏷️ 活動カテゴリ・機材マスタ管理\n- 📤 ログ CSV エクスポート\n\n### Phase 2 — 中長期\n\n- 🔍 振り返りシートの Vision LLM 経由 OCR 取り込み\n- 🌐 公開 API（混雑状況配信）\n- 📈 分析ダッシュボード（クラスター分析支援）\n\n---\n\n## 🏗️ Architecture\n\n### システム全体図\n\n```mermaid\ngraph TB\n    subgraph Clients[\"🖥️ クライアント\"]\n        C1[\"📱 Checkin\u003cbr/\u003e\u003csmall\u003eiPad PWA\u003c/small\u003e\"]\n        C2[\"📱 Mentor\u003cbr/\u003e\u003csmall\u003eスマホ PWA\u003c/small\u003e\u003cbr/\u003e\u003csmall\u003e(Phase 1.5)\u003c/small\u003e\"]\n        C3[\"💻 Admin\u003cbr/\u003e\u003csmall\u003ePC ブラウザ\u003c/small\u003e\"]\n    end\n\n    subgraph Hosting[\"☁️ Vercel\"]\n        V1[\"Next.js\u003cbr/\u003e:3000\"]\n        V2[\"Next.js\u003cbr/\u003e(未着手)\"]\n        V3[\"Next.js\u003cbr/\u003e:3001\"]\n    end\n\n    subgraph Edge[\"⚡ Cloudflare\"]\n        API[\"Hono API\u003cbr/\u003eWorkers\"]\n        D1[(\"D1\u003cbr/\u003eSQLite\")]\n    end\n\n    subgraph External[\"🔗 外部サービス\"]\n        GS[\"Google Sheets\u003cbr/\u003eAPI\"]\n        GA[\"Google OAuth\u003cbr/\u003evia Better Auth\"]\n        GAS[\"GAS Webhook\u003cbr/\u003eDrive 連携\"]\n    end\n\n    C1 --\u003e V1\n    C2 --\u003e V2\n    C3 --\u003e V3\n\n    V1 -- \"REST (type-safe)\" --\u003e API\n    V2 -. \"REST\" .-\u003e API\n    V3 -- \"REST (type-safe)\" --\u003e API\n\n    API --\u003e D1\n    API --\u003e GS\n    API --\u003e GA\n    API -. \"waitUntil\" .-\u003e GAS\n```\n\n### リクエスト処理フロー\n\n```mermaid\nsequenceDiagram\n    participant iPad as 📱 iPad PWA\n    participant API as ⚡ Hono API\n    participant Auth as 🔐 Better Auth\n    participant D1 as 🗄️ D1 (SQLite)\n    participant GS as 📊 Google Sheets\n\n    iPad-\u003e\u003eAPI: POST /checkin/activate\n    API-\u003e\u003eAuth: Cookie 認証チェック\n    Auth--\u003e\u003eAPI: mentor 認証 OK\n    API-\u003e\u003eGS: スプシから事前登録取得\n    GS--\u003e\u003eAPI: 参加者情報\n    API-\u003e\u003eD1: participants INSERT + 採番\n    D1--\u003e\u003eAPI: 新規 ID (5桁)\n    API--\u003e\u003eiPad: { participantId, displayId }\n```\n\n---\n\n## 🛠️ Tech Stack\n\n### Backend\n\n| Technology                                                                                                    | Purpose                              |\n| ------------------------------------------------------------------------------------------------------------- | ------------------------------------ |\n| ![Hono](https://img.shields.io/badge/Hono-4-E36002?logo=hono\u0026logoColor=white)                                 | Ultrafast web framework for the edge |\n| ![Cloudflare Workers](https://img.shields.io/badge/Cloudflare_Workers-F38020?logo=cloudflare\u0026logoColor=white) | Edge runtime                         |\n| ![D1](\u003chttps://img.shields.io/badge/Cloudflare_D1_(SQLite)-F38020?logo=cloudflare\u0026logoColor=white\u003e)           | Workers-native database              |\n| ![Drizzle](https://img.shields.io/badge/Drizzle_ORM-0.45-C5F74F?logo=drizzle\u0026logoColor=black)                 | TypeScript-first ORM                 |\n| ![Better Auth](https://img.shields.io/badge/Better_Auth-1.6-000?logoColor=white)                              | Framework-agnostic authentication    |\n\n### Frontend\n\n| Technology                                                                                           | Purpose                      |\n| ---------------------------------------------------------------------------------------------------- | ---------------------------- |\n| ![Next.js](https://img.shields.io/badge/Next.js-16-000?logo=next.js)                                 | React framework (App Router) |\n| ![React](https://img.shields.io/badge/React-19-61DAFB?logo=react\u0026logoColor=black)                    | UI library                   |\n| ![shadcn/ui](https://img.shields.io/badge/shadcn%2Fui-000?logo=shadcnui\u0026logoColor=white)             | Component library            |\n| ![Tailwind CSS](https://img.shields.io/badge/Tailwind_CSS-4-06B6D4?logo=tailwindcss\u0026logoColor=white) | Utility-first CSS            |\n| ![Vercel](https://img.shields.io/badge/Vercel-000?logo=vercel\u0026logoColor=white)                       | Hosting \u0026 deployment         |\n\n### Tooling\n\n| Technology                                                                                   | Purpose                  |\n| -------------------------------------------------------------------------------------------- | ------------------------ |\n| ![pnpm](https://img.shields.io/badge/pnpm-10-F69220?logo=pnpm\u0026logoColor=white)               | Monorepo package manager |\n| ![Turborepo](https://img.shields.io/badge/Turborepo-2-0F0F0F?logo=turborepo\u0026logoColor=white) | Build orchestration      |\n| ![Biome](https://img.shields.io/badge/Biome-2.4-60A5FA?logo=biome\u0026logoColor=white)           | Lint \u0026 format            |\n\n---\n\n## 📁 Repository Structure\n\n```\ntecnova-platform/\n├── .github/workflows/\n│   ├── ci.yml                     # Biome check + Type check (PR / main push)\n│   └── deploy-api.yml             # D1 migration + Workers deploy (main push)\n├── apps/\n│   ├── api/                       # Hono on Cloudflare Workers\n│   │   └── src/\n│   │       ├── index.ts           # エントリポイント + CORS/Auth middleware\n│   │       ├── routes/            # checkin/* / api/* ルート群\n│   │       ├── middleware/        # requireAuthenticatedMentor 等\n│   │       ├── lib/               # auth factory, checkin ロジック\n│   │       └── types.ts           # Env bindings 型定義\n│   ├── checkin/                   # Next.js 16 — iPad PWA\n│   │   └── src/\n│   │       ├── app/               # App Router pages (/, /login, /first-time, etc.)\n│   │       ├── components/        # QRスキャナ, 受付カード, 履歴テーブル\n│   │       └── lib/               # api-client, auth-client\n│   └── admin/                     # Next.js 16 — 管理画面 (PC)\n│       └── src/\n│           ├── app/               # ダッシュボード, 参加者一覧, メンター管理\n│           ├── components/        # データテーブル, フォーム\n│           └── lib/               # api-client, auth-client\n├── packages/\n│   ├── db/                        # Drizzle schema + D1 migrations\n│   ├── shared/                    # 共通型・Zod スキーマ・Sheets 連携\n│   └── ui/                        # 共通 UI (api-client / MeProvider / JST utils)\n├── docs/\n│   ├── requirements.md            # 全体要件定義書\n│   ├── mvp.md                     # MVP 実装ガイド\n│   └── handoff.md                 # セッション引き継ぎノート\n├── biome.json\n├── turbo.json\n├── pnpm-workspace.yaml\n└── tsconfig.base.json\n```\n\n---\n\n## 📚 Documentation\n\n| ドキュメント                                        | 内容                                                                                                                                                                    |\n| --------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| 📘 [`docs/requirements.md`](./docs/requirements.md) | プロジェクトの背景・目的、ステークホルダー、データモデル、API 設計方針、非機能要件、リスク管理、設計判断の根拠を網羅した全体要件定義書                                  |\n| 📗 [`docs/mvp.md`](./docs/mvp.md)                   | 最初の 2 週間で何をどう実装するかに集中した実装ガイド。Drizzle スキーマ、API 仕様、画面仕様、Google Sheets API 連携の詳細実装、セットアップ手順、トラブルシュートを含む |\n| 📙 [`docs/handoff.md`](./docs/handoff.md)           | 開発引き継ぎノート。進捗ステータス・既知の罠と回避策・残タスクをまとめた実装者向けドキュメント                                                                          |\n\n---\n\n## 🚀 Getting Started\n\n### Prerequisites\n\n| ツール                | バージョン         |\n| --------------------- | ------------------ |\n| Node.js               | ≥ 22               |\n| pnpm                  | ≥ 10               |\n| Cloudflare アカウント | Workers + D1       |\n| Vercel アカウント     | —                  |\n| GCP                   | Sheets API + OAuth |\n\n### Setup\n\n```bash\n# Clone\ngit clone https://github.com/ut42tech/tecnova-platform.git\ncd tecnova-platform\n\n# Install dependencies\npnpm install\n\n# Copy env example\ncp .env.example .env.local\n# .env.local に必要な値を設定（apps/api は別途 .dev.vars が必要）\n\n# Generate D1 migrations\npnpm --filter @tecnova/db db:generate\n\n# Apply migrations to local D1 (Miniflare)\npnpm --filter @tecnova/api db:apply:local\n\n# Start all dev servers\npnpm dev\n```\n\n\u003e [!TIP]\n\u003e `pnpm dev` は Turborepo 経由で `api` (`:8787`)・`checkin` (`:3000`)・`admin` (`:3001`) を同時起動します。\n\n詳細なセットアップ手順は [`docs/mvp.md`](./docs/mvp.md#8-セットアップ手順) を参照してください。\n\n---\n\n## 🚢 Deployment \u0026 CI/CD\n\n### パイプライン概要\n\n```mermaid\ngraph LR\n    subgraph Trigger[\"🔔 トリガー\"]\n        PR[\"Pull Request\"]\n        Push[\"Push to main\"]\n    end\n\n    subgraph CI[\"🔍 CI (ci.yml)\"]\n        Lint[\"Biome check\"]\n        TC[\"Type check\"]\n    end\n\n    subgraph Deploy[\"🚀 Deploy API (deploy-api.yml)\"]\n        TC2[\"Type check API\"]\n        Migrate[\"D1 Migration\u003cbr/\u003e(remote)\"]\n        WD[\"wrangler deploy\"]\n    end\n\n    subgraph Vercel[\"▲ Vercel\"]\n        VA[\"auto deploy\u003cbr/\u003echeckin + admin\"]\n    end\n\n    PR --\u003e CI\n    Push --\u003e CI\n    Push -- \"paths: apps/api/**\u003cbr/\u003epackages/db/**\u003cbr/\u003epackages/shared/**\" --\u003e Deploy\n    Push --\u003e Vercel\n\n    Lint --\u003e TC\n    TC2 --\u003e Migrate --\u003e WD\n```\n\n### デプロイ先\n\n| アプリ         | プラットフォーム   | トリガー                                    |\n| -------------- | ------------------ | ------------------------------------------- |\n| `apps/api`     | Cloudflare Workers | GitHub Actions — `main` push (paths filter) |\n| `apps/checkin` | Vercel             | GitHub 連携 — 自動デプロイ                  |\n| `apps/admin`   | Vercel             | GitHub 連携 — 自動デプロイ                  |\n\n### Required GitHub Secrets\n\n| 名前                    | 用途                                                        |\n| ----------------------- | ----------------------------------------------------------- |\n| `CLOUDFLARE_API_TOKEN`  | Workers / D1 への deploy・migration 権限を持つ API トークン |\n| `CLOUDFLARE_ACCOUNT_ID` | Cloudflare Account ID                                       |\n\n\u003e [!NOTE]\n\u003e Worker の Secrets（`GOOGLE_SERVICE_ACCOUNT_KEY` 等）は CI ではなく `wrangler secret put` で別途登録します。\n\n---\n\n## 🗺️ Roadmap\n\n- [x] 設計・要件定義\n- [x] **Phase 1: MVP チェックインシステム**\n  - [x] モノレポ・CI/CD 基盤構築\n  - [x] Drizzle スキーマ + D1 マイグレーション\n  - [x] Google Sheets API 連携\n  - [x] Better Auth（Google OAuth）認証基盤\n  - [x] チェックイン iPad PWA アプリ\n  - [x] 「初めての方」フロー + 自動採番\n  - [x] QR スキャン + 手入力 + 名前検索\n  - [x] 受付履歴 + 一括チェックアウト\n  - [x] 管理ダッシュボード + 参加者一覧 + メンター管理\n  - [x] 事前登録管理（admin）\n  - [x] GAS Drive webhook 連携\n  - [x] shadcn/ui テーマ統一\n  - [x] 本番デプロイ（Workers + Vercel）\n  - [ ] フロントエンド UX の最終調整\n  - [ ] 本番運用手順の確定（リハーサル / Wi-Fi 断フォールバック）\n  - [ ] 昨年度データの D1 反映\n- [ ] **Phase 1.5: メンター業務支援**\n  - [ ] メンタースマホアプリ（`apps/mentor`）\n  - [ ] 活動ログ記入機能\n  - [ ] CSV エクスポート\n- [ ] **Phase 2: 中長期改善**\n  - [ ] 振り返りシート OCR\n  - [ ] 公開 API\n  - [ ] 分析ダッシュボード\n\n---\n\n## 🤝 Contributing\n\nこのプロジェクトはテクノバながさき固有の運用要件に基づいて設計されていますが、類似の教育・ファブリケーション活動の運営基盤として参考にしていただけます。\n\nIssue・Discussion での質問は歓迎します。\n\n---\n\n## 📄 License\n\n[MIT](./LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fut42tech%2Ftecnova-platform","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fut42tech%2Ftecnova-platform","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fut42tech%2Ftecnova-platform/lists"}