Skyderby
Turn GPS tracks from your skydives and BASE jumps into real flight analysis — plus worldwide rankings and competition scoring. Free to start.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
An endurance training app: adaptive plan generation across nine published
coaching methodologies, readiness and load engines, an LLM coach, and
Garmin / Strava / Apple Health integration. Live at
attune.coach.
"Broken Arrow Training" is legacy branding. The repo name, the migration
airlock's legacy path, and vite.config.ts's fallback base path still carry
it; the product does not.檢視完整 README ↗An endurance training app: adaptive plan generation across nine published coaching methodologies, readiness and load engines, an LLM coach, and Garmin / Strava / Apple Health integration. Live at attune.coach.
"Broken Arrow Training" is legacy branding. The repo name, the migration airlock's legacy path, and
vite.config.ts's fallback base path still carry it; the product does not.
| Path | What it is |
|---|---|
src/engines/ | The domain engines — plan generator, readiness, MIM, terrain, descent, running, hyrox, general fitness |
src/__tests__/ | 315 test files / ~3982 tests, including property-invariant "laws" and golden plan snapshots |
api/ | Python serverless functions (coach, sync, auth, garmin, apple) deployed by Vercel |
worker/ | Cloudflare worker for the Strava OAuth token exchange |
ios/ | iOS wrapper app |
scripts/airlock/ | Standalone migration page served at the legacy origin; carries users' local data to attune.coach |
docs/initiatives/ | Intent → plan → close-out per initiative, with a registry |
docs/adr/ | Architecture decision records |
npm install
npm run dev # local dev server
npm test # vitest — gates every publish
npm run build # tsc -b && vite build
pytest -m "not eval" api/coach/tests # keyless Python suite
CLAUDE.md is the standing brief — commands, deploy topology, and the hard
constraints (notably: api/requirements.txt pins are the deployment, and the
DB schema is applied by hand). Read it before changing anything under api/
or .github/workflows/.
Three surfaces, three independent routes:
deploy.yml runs the suite, builds, and publishes dist/ to
the separate repo mcbeebe/attune-coach (gh-pages), which serves
attune.coach. That repo is a build artifact; it takes no hand-authored
commits.wrangler deploy.Because they are independent, they can drift. Every build stamps its commit
SHA into version.json and the bundle, and /api/version reports what Vercel
built; Settings → Deploy Diagnostics compares all three so a stale browser
is distinguishable from a stale backend.
The cross-device sync layer (/api/sync) stores per-(athlete, key)
JSONB rows in a Vercel Postgres (Neon) database. Provisioning the
database via Vercel automatically injects POSTGRES_URL,
POSTGRES_URL_NON_POOLING, and POSTGRES_PRISMA_URL into the
project's env vars; the schema still has to be applied once per fresh
database:
# 1. Pull the env vars Vercel injected into this project
vercel env pull .env.local
# 2. Apply the schema (idempotent — re-running is safe)
psql "$(grep '^POSTGRES_URL_NON_POOLING=' .env.local | cut -d= -f2- | tr -d '"')" \
-f scripts/db/init.sql
Use the non-pooling URL for DDL like this (the pooled URL goes
through PgBouncer in transaction mode and rejects some DDL). The
serverless functions in api/sync.py use the pooled POSTGRES_URL
because they're short-lived.
To verify:
psql "$POSTGRES_URL_NON_POOLING" -c '\dt'
# expect to see user_state in the list
Full PR scope, verification matrix, and follow-up roadmap (PR B / C /
D) live in docs/pr-a-sync-plan.md.