尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证陸上選手向けの総合プラットフォーム
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗陸上競技の投稿・大会情報・練習の記録をつなぐコミュニティ。スマートフォンでは ホーム/大会/メモ/コーチ/ケガ の5タブ、PCではヘッダーから移動します。マイページはヘッダー右上の人のアイコンにあります。
本番: https://track-talk.netlify.app
利用者向けの説明は /guide、投稿ルールは /guidelines、利用規約は /terms、個人情報の取り扱いは /privacy にあります。マイページから開けます。
| 入口 | 内容 |
|---|---|
/ | 新しい・人気・募集・レビュー、+から投稿。投稿カードを左右に送る |
/upload | 文章、YouTube・Instagram・XのURL、自分の動画、クラブチームや練習相手の募集 |
/posts/[id] | 詳細文の下に画像・動画。コメントのカードから会話を開く |
/competitions | 月・地域別の大会、国内主要大会、今後の世界大会 |
/memo | 感覚メモと競技会の記録。感覚メモを書くとビンに玉がたまる |
/coaching | 動画添削(コーチを選んで依頼)・サポートプラン・コーチ専用画面の縦並び。公開設定がオフのときは準備中と募集を案内 |
/coach | 未ログインはログインへ。未応募は応募案内、承認済みも公開設定がオフなら準備中 |
/coach/apply | 名前・担当種目・記録・成績や指導経験、SNS/ホームページ、顔写真の応募 |
/injury | ケガのグループと復帰データ。グループの投稿は参加者のみ閲覧できる |
/me | 自分の投稿・保存・アカウント設定・通知・利用ガイド・問い合わせ・退会 |
/admin | アプリ管理。管理者のマイページで「自分の投稿」の上に入口を表示 |
閲覧できる範囲と書き込める範囲は異なります。投稿・いいね・保存・コメント・応募などにはログインが必要です。メールとパスワード、またはGoogleアカウントで登録できます。初回はニックネームと種目を設定します。
コーチ応募のSNS/ホームページは 1〜3件必須。SNSのアカウント名やホームページのURLなどを各300文字以内で入力できます。空行と重複は除きます。顔写真がない応募は承認できません。指導年数・競技年数は応募画面にはありません。募集期間中は本人と運営が内容を確認し、公開後のコーチ紹介に使用します。
同じブラウザで最後に開いたメインタブを記憶し、次回トップから起動した際に復元します。詳細への直接リンクは優先します。詳細画面の下部バーも所属タブの色を保ちます。
pagination=cursor、meta.has_more、meta.next_cursor を使用し、毎回の総件数集計と深いOFFSETを避けます。通常のページ番号方式も残しています。実装は apps/web/lib/masonry-feed.ts・fetch-posts.ts・home-feed-cache.ts、APIは apps/api/internal/httpx/home_feed.go を参照してください。画面付近のカードと600件を目安にした本文の保持、取得キャッシュ48ページ・15分の上限を設けます。全座標・IDは閲覧件数に応じて増えるため、全体の保持量が一定になる方式ではありません。
| 場所 | 役割 |
|---|---|
apps/web | Next.js 16、React 19、TypeScript、Tailwind CSS 4の画面 |
apps/api | Go 1.27.3、chi、pgx、sqlcの業務APIと認可 |
apps/api/migrations | PostgreSQLのスキーマ変更。API起動時に適用 |
apps/api/queries | sqlc用SQL。変更後に make sqlc で再生成 |
deploy / .github/workflows | Cloud Run・Netlifyへの手動公開と定期処理 |
docs | 実装の説明・設計・公開手順 |
認証はSupabase Auth、ファイル保存はCloudinary、公開先はWebがNetlify、APIが東京のCloud Runです。業務データの操作はGo APIに集約し、ブラウザからPostgRESTで直接更新しません。
必要なもの: Node.js 22、Go 1.27.3、Docker。SQLの再生成にはsqlcが必要です。
cp .env.example .env
# .envに開発用の認証設定等を入力する。秘密情報はコミットしない
make db
make migrate
make api
# 別ターミナル
cd apps/web
npm ci
npm run dev
Webは http://localhost:3000、APIは http://localhost:8080/health。MakefileはローカルDB(既定 127.0.0.1:55432)を使用し、.env の本番接続先をそのまま利用しません。
外部サービスを使わないDockerプレビューは make local、停止は make local-down。専用DBとローカル認証を使い、デモログインは [email protected] / demo-password です。プレビューではコーチング機能を有効にできます。本番のGoogleログイン・決済・アップロードの確認とは別です。
ローカル認証は通常 LOCALAUTH_TLS_CERT_FILE と LOCALAUTH_TLS_KEY_FILE を必須とし、証明書を読み込めない場合は起動しません。Dockerプレビューだけは LOCALAUTH_ALLOW_INSECURE_HTTP=1 でHTTPを明示的に許可し、ホストの 127.0.0.1:9998 に限定して公開します。cmd/localauth を直接起動する場合の待受先は既定で 127.0.0.1:9999 です。このサービスは本番では使用しません。
環境変数の全項目は .env.example、Cloud Runの雛形は deploy/cloud-run/env.example.yaml を参照してください。
| 設定 | 用途 |
|---|---|
DATABASE_URL | APIのPostgreSQL接続先 |
SUPABASE_URL / SUPABASE_JWT_AUD | JWT検証(JWKS)。SUPABASE_JWT_SECRET はローカルの HS256 用で、本番では入れない |
SUPABASE_SERVICE_ROLE_KEY | 退会時の認証アカウント削除 |
CLOUDINARY_* | ファイル保存と署名 |
NEXT_PUBLIC_API_BASE_URL / NEXT_PUBLIC_SUPABASE_URL / NEXT_PUBLIC_SUPABASE_ANON_KEY / NEXT_PUBLIC_SITE_URL | ブラウザ向けの公開設定 |
NEXT_PUBLIC_POSTHOG_KEY / NEXT_PUBLIC_POSTHOG_HOST | 任意の匿名の利用状況計測。未設定なら無効。接続・無料枠の確認は 計測の説明 |
COACHING_ENABLED / NEXT_PUBLIC_COACHING_ENABLED | オフでAPIの利用者向け機能を閉じ、画面は準備中にする。応募・審査は継続 |
COACHING_NEW_ACCEPTANCE_ENABLED | 新しい申込み・購入の受付を制御。画面の公開設定とは別に判断 |
COACHING_MESSAGING_ENABLED / NEXT_PUBLIC_COACHING_MESSAGING_ENABLED | オフで有料の1対1のやりとり(契約のやりとり欄・サポートプランの追加相談・添削の確認質問と補足)の送信を止める。電気通信事業の届出が受理されるまで立てない。空の間は大会サポート・対面指導のプランを公開できない |
COACHING_CONSULTATION_ENABLED / NEXT_PUBLIC_COACHING_CONSULTATION_ENABLED | オフで動画添削のあとの追加相談(質問1回・回答1回の一方通行、1つの添削につき1回)の送信・支払い・回答を止める。下書き・閲覧・通報・返金・取り下げは止めない。既定は空(停止) |
COACHING_COACH_LIST_ENABLED / NEXT_PUBLIC_COACHING_COACH_LIST_ENABLED | オフでコーチ一覧(/coaches とコーチの詳細、GET /v1/coaches)だけを閉じる(画面は準備中、API は 404)。コーチングを開けていても一覧とは別に切り替える。動画添削の申込み(指名候補 GET /v1/coaching/nominees)は止めない。既定は空(停止) |
COACHING_TICKET_SALES_ENABLED | 空(停止)のまま。チケットの新規販売は終了し、動画添削・追加相談は都度払い(カード・PayPay)。購入済みチケットの残高・履歴・返金は使える |
REVIEW_RANDOM_ASSIGN_ENABLED | 空(停止)のまま。動画添削は選手がコーチを選ぶ方式だけ。空の間はコーチ未選択の申込みを受け付けず、運営からの割り当て・別コーチへの再割り当てをしない |
STRIPE_* | 公開後の決済・返金・送金。募集だけの間は購入画面を提供しない |
VAPID_* | 端末へのプッシュ通知 |
SENSE_SUMMARY_ENABLED / |
募集だけを提供する場合は、netlify.toml の NEXT_PUBLIC_COACHING_ENABLED を "0" にします。APIは「Configure Coaching Availability」ワークフローを enabled=false で実行して閉じます。画面のフラグだけでAPIを保護しないでください。再公開時は説明・規約・プライバシーポリシー、決済・返金・未成年者の同意を確認し、両側の設定を合わせます。
秘密鍵、DB接続文字列、service role、Cloudinary secret、Stripe secretはAPI・ホスティング・GitHub Secretsのみに保存します。ブラウザには NEXT_PUBLIC_* の公開値だけを渡してください。
make test-api
make test-web
cd apps/web
npm run lint
npx tsc --noEmit
npm run test:e2e
API統合テストにはローカルのPostgreSQLが必要です。CIは専用PostgreSQLでAPIを検証し、WebのLint・型・単体テスト、ログインから投稿までの操作、大量投稿の追加読み込みと位置復元を確認します。DBを使わずスキップされたテストだけで本番の動作確認が完了したと判断しないでください。
API更新は同じイメージを予算停止用サービスにも反映します。既存の依頼や返金がある状態で公開範囲を変える場合、利用者への案内と対応経路を先に確認してください。
管理者は profiles.is_admin = true の利用者です。マイページの「アプリ管理」から、通報・問い合わせ・商品・コーチ応募の審査などを扱えます。管理APIはサーバー側で権限確認します。
大会の自動取り込みは .github/workflows/imports.yml、コーチングの期限処理等は deploy 内の運用スクリプトを参照してください。詳しい公開手順は docs/cloud-run-deploy.md、確認項目は docs/launch.md にあります。
NEXT_PUBLIC_SENSE_SUMMARY_ENABLED| 感覚メモのAI振り返りの公開設定 |
SENSE_SUMMARY_DAILY_LIMIT / SENSE_SUMMARY_MINUTE_LIMIT | 要約APIの全員合計の試行上限。既定は直近24時間400回・直近1分10回(失敗も含む)。設定と根拠 |
GEMINI_API_KEY | 大会データの抽出(GitHub Actions の取り込み) |
ANTHROPIC_API_KEY / SENSE_SUMMARY_MODEL | 感覚メモのAI振り返り(Claude。既定は claude-haiku-5-5) |
SMTP_* / RESEND_API_KEY / MAIL_FROM | 提供中のメール送信 |
REMINDER_SECRET / STORAGE_CLEANUP_SECRET | 月1回のお知らせ・保存期限の毎日の整理を Cloud Scheduler から呼ぶときの秘密の値。deploy/cloud-run/monthly-reminder.sh・storage-cleanup.sh が作って入れる。空なら呼べない(404) |
STAFF_MFA_REQUIRED | 1 で管理者・承認済みコーチの API に二段階認証を求める。全員が /me/security で設定してから立てる |
NEXT_PUBLIC_TURNSTILE_SITE_KEY | 登録・ログイン・パスワード再設定の自動操作対策(Cloudflare Turnstile)。先にこれを入れて Web を出し直し、そのあと Supabase の CAPTCHA を有効にする |