BikeControl (SwiftControl)
Use Zwift Click, Zwift Play, Shimano Di2, or any Bluetooth controller with MyWhoosh, Rouvy, Zwift, and more. Free to try on iOS, Android, Windows, and macOS.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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.