OpenAthlete
AGPLv3 endurance training platform: EU-oriented hosting, transparent CTL/ATL/TSB logic in code, self-hosting, and full export. Built in Grenoble.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
A full-stack football dashboard for exploring club, squad, and league data across four major European leagues — Premier League, La Liga, Serie A, and Bundesliga.
Pick a league, pick a club, and see its current squad, stadium, coach, and background in one place. Football-IQ is also a continuous learning project: the codebase is deliberately built and extended the way a production application would be, one real feature at a time, rather than through disposable exercises.查看完整 README ↗https://github.com/user-attachments/assets/261fc675-43b6-41ed-b9fa-6649ec111173
A full-stack football dashboard for exploring club, squad, and league data across four major European leagues — Premier League, La Liga, Serie A, and Bundesliga.
Pick a league, pick a club, and see its current squad, stadium, coach, and background in one place. Football-IQ is also a continuous learning project: the codebase is deliberately built and extended the way a production application would be, one real feature at a time, rather than through disposable exercises.
Live demo: https://football-iq-frontend.onrender.com (backend runs on Render's free tier and spins down when idle, so the first request after inactivity can take a few seconds)
Backend — app/Backend
@fastify/swagger + @fastify/swagger-ui for OpenAPI documentationFrontend — app/Frontend
Data sources
Persistence & deployment
render.yaml): a Node web service for the backend, a static site for the frontendThe backend follows a layered service architecture:
routes/ Fastify route handlers — HTTP concerns, schema-validated request/response
↓
services/ Business logic (ClubService, LeagueService, FootballSyncService, ...)
↓
integrations/ Typed HTTP clients for each external data provider
↓
db/ Prisma client
Route handlers and services depend on interfaces (ClubService, LeagueService, FootballSyncService), wired at startup through a tsyringe container (container.ts), keeping the route layer decoupled from the Prisma-backed implementations.
Data flows in from external providers through a one-way sync pipeline (services/football-sync/): a FootballSyncService orchestrates dedicated syncers per concern (clubs, squads, player profiles, stadium images), which normalize third-party payloads into the local Prisma schema. Most reads are served entirely from the local database; the one exception is GET /clubs/:id/description, which calls the Wikipedia API on demand and degrades gracefully to null if it fails, rather than failing the request.
The backend exposes a REST API under two resources, /clubs and /leagues. Full interactive documentation — generated from the same Zod schemas that validate requests — is served at /documentation when the backend is running (e.g. http://localhost:3000/documentation).
| Method | Path | Description |
|---|---|---|
GET | /clubs | List all supported clubs |
GET | /clubs/selection | Get the currently selected club |
PATCH | /clubs/selection | Select a club |
GET | /clubs/:id | Get a club by ID |
GET | /clubs/:id/players | Get a club's squad |
GET | /clubs/:id/description | Get a club's Wikipedia-sourced description |
GET | /leagues/:slug | Get a league's emblem, description, and computed statistics |
cd app/Backend
npm install
Create a .env file with:
DATABASE_URL=postgresql://...
API_FOOTBALL_KEY=...
FOOTBALL_DATA_API_KEY=...
THESPORTSDB_API_KEY=...
Run migrations and seed the base league data:
npx prisma migrate dev
npm run db:seed
Sync clubs, squads, and stadium data from the external providers:
npm run sync:football-data
Start the API:
npm run dev
The API listens on http://localhost:3000; Swagger UI is available at http://localhost:3000/documentation.
cd app/Frontend
npm install
npm run dev
The app runs on http://localhost:5173 and expects the backend at http://localhost:3000 (configurable via VITE_API_BASE_URL).
# Backend
cd app/Backend
npm test # Vitest unit tests
npm run lint # oxlint
# Frontend
cd app/Frontend
npm run lint # oxlint
render.yaml defines a Render Blueprint with two services: a Node web service for the Fastify backend (running Prisma migrations on deploy) and a static site for the Vite-built frontend.
Football-IQ is under active, incremental development as part of a structured backend/frontend learning roadmap (see ProgramGoal.md). Current focus is production-quality data modeling and performance (PostgreSQL schema design, indexing, query optimization); authentication, containerization, CI/CD, and distributed-systems topics are planned for later phases and are not yet implemented.
No license file is currently published for this repository.