OpenAthlete
AGPLv3 endurance training platform: EU-oriented hosting, transparent CTL/ATL/TSB logic in code, self-hosting, and full export. Built in Grenoble.
翻訳待ち
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗競馬の観戦メモを残し、レース単位/馬単位でふりかえるための Web アプリ。 Cloudflare Workers + D1 の上で動く SvelteKit アプリケーション。URL は https://uma-memo.com (workers.dev から移している途中。手順は docs/operations.md「独自ドメインへ移す」)。
旧名は k-note。リポジトリ(keiba-note)・Worker・D1・Google Cloud のプロジェクトは旧名のまま (→ docs/operations.md「名前について」)。
文書の目次は AGENTS.md にある。何を作るかは docs/product.md、 どう動くかは docs/architecture.md から読むとよい。
現在のフェーズ: 予想・ふりかえり・共有が動く。
メモは既定で非公開。 見せたいメモだけ1件ずつ共有リンクを発行して渡す。
共有ページ /notes/[id] はログイン不要で開けるが、検索にも一覧にも出ない。
他人のメモはどの画面にも出てこない(→ product.md 第2章 2-2)。
出走馬の登録は画面からではなく data/ の YAML を PR で更新して行う。
| レイヤ | 採用 |
|---|---|
| フレームワーク | SvelteKit 3 / Svelte 5 (runes) |
| アダプタ | @sveltejs/adapter-cloudflare |
| 実行環境 | Cloudflare Workers |
| DB | Cloudflare D1 (SQLite) — プライマリは apac |
| ORM | Drizzle ORM + drizzle-kit |
| 検証 | Valibot |
| スタイル | Tailwind CSS v4 |
| テスト | Vitest / Playwright |
| パッケージ管理 | pnpm |
Node.js は 24 系(CI の node-version)、pnpm は 10.16.1
(package.json の packageManager)を使う。
Dev Container: Docker と Dev Container 対応ツールで clone 済みのリポジトリを開き、Reopen in Container を選ぶ。
.devcontainer/devcontainer.json が Node 24、git、GitHub CLI を用意し、
作成後に Corepack を有効化して以下の install と setup を実行する。Wrangler はローカル依存関係から使う。
VS Code の設定や拡張機能は検証の前提ではない。
Windows で Docker Desktop を使う場合は、WSL2 側の Linux ファイルシステムに clone して開くことを推奨する。
CLI のみ・Dev Container を使えない場合: Node 24、Corepack、git、GitHub CLI を用意する。
Corepack を有効化して packageManager 指定の pnpm を使い、リポジトリのルートで実行する。
Linux では setup が Chromium の OS 依存パッケージを入れるため、apt と sudo が使える環境が必要。
Windows では Chromium の取得を行う。
corepack enable
node --version # v24.x
pnpm --version # 10.16.1
pnpm install --frozen-lockfile
pnpm run setup
pnpm run verify
verify は型 → lint → 単体テスト → E2E の順に動く。vite.config.ts の単体テストの client プロジェクトも
実 Chromium を使うため、test:unit より前に setup を実行する。test:e2e 内の導入だけでは初回の単体テストに間に合わない。
Linux で OS パッケージの導入権限がない場合は、管理者が Playwright の依存パッケージを用意してから setup を再実行する。
権限やネットワークの制約で準備できなければ
検証を完了できないとき に従う。
検証に本番の認証情報は不要。 .dev.vars の作成や Google OAuth の設定も、上の検証の前提ではない。
E2E は専用のローカル D1 と seed のセッションを使い、マイグレーションとデータ準備も自動で行う
(testing.md 第3章)。本番の D1・シークレット・デプロイには触れない。
上の依存関係の導入後、画面を手元で操作するときだけ次を行う。
cp .dev.vars.example .dev.vars # 下記の開発用モック認証、または開発用 Google OAuth を設定
pnpm run db:migrate:local # ローカル D1 にマイグレーションを適用
pnpm run dev
vite dev は adapter-cloudflare が cloudflare:workers を模して、wrangler.toml のバインディング(.wrangler/state のローカル D1)を env として渡す。初回は pnpm run db:migrate:local で表を作る。
E2E は別の .wrangler/e2e を毎回空にして使うので、ここに入れたデータは E2E に混ざらない。
Google Cloud Console でのクライアントの作り方と、承認済みのリダイレクト URI
(http://localhost:5173/auth/google/callback を含む)は operations.md 5 にある。
開発用の値を .dev.vars(ローカル)に入れる。本番のシークレット設定は
operations.md に従って人が行う。エージェントは wrangler secret を実行しない。
| 変数 | 用途 |
|---|---|
GOOGLE_CLIENT_ID | OAuth クライアント ID |
GOOGLE_CLIENT_SECRET | OAuth クライアントシークレット |
ADMIN_EMAIL | サイト管理者(admin)になるアドレス |
メモの書き味を見るあいだは、Google OAuth を通さずに入れる。
.dev.vars に MOCK_AUTH="1" を置くと、ログイン画面を飛ばして
モックユーザー(admin / user の2人)として入る。画面上部に警告帯が出て、
そこで2人を切り替えられる。「他人のメモが1件も出てこない」ことの確認に使う。
この経路は dev ガードの中にあり、本番ビルドには存在しない。
$app/env の dev はサーバー側では静的に false になるため、
分岐ごとバンドルから消える。本番で MOCK_AUTH を設定しても無視される。
招待コードは無い。 Google アカウントがあれば誰でもログインでき、 入ってきた人には自分のメモしか見えない。グループやメンバーの概念は持たない。
ログインした email が ADMIN_EMAIL と一致したときだけ role='admin' になる。
admin ができるのは馬・レース・出走馬(全員共通のマスタ)の修正と、
ユーザーの凍結だけ。admin でも他人のメモは読めない
(→ product.md 第3章)。
This is the beginning of the README. Read the rest at the original. Read the full README ↗