Football-IQ is a full-stack football dashboard for exploring club information across major European leagues.
Sports & fitnessTypeScript · JavaScriptGitHub @yali4343OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
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.Read the full 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.