# Quasar 🎮 A self-hosted video game library manager. Scan ROM files, enrich metadata from multiple APIs (IGDB, RAWG, TheGamesDB), and manage your personal game collection. ## Features - 📁 **ROM Scanning** — Scan directories for ROM files (ZIP, 7z, RAR) - 🔍 **Metadata Enrichment** — Fetch game info, artwork, ratings from 3+ APIs - 🎯 **Game Library** — Create, edit, and organize games by platform - 🎨 **Multi-API Support** — IGDB (Twitch OAuth), RAWG, TheGamesDB - 🛡️ **Privacy First** — All data stored locally, no cloud sync - 🔐 **Secure** — API keys via environment variables, never committed ## Quick Start ### Prerequisites - **Node.js 18+** - **Yarn 4.x** (package manager) ### Installation ```bash # 1. Clone repository git clone https://your-gitea-instance/your-org/quasar.git cd quasar # 2. Install dependencies yarn install # 3. Setup environment cp .env.example .env.local # 4. Get API keys (optional, but recommended) # See: [docs/02-tecnico/apis.md](docs/02-tecnico/apis.md) # 5. Run migrations cd backend npm run prisma:migrate cd .. # 6. Start development servers # Terminal 1: Backend cd backend && yarn dev # Terminal 2: Frontend cd frontend && yarn dev # 7. Open browser # Frontend: http://localhost:5173 # Backend API: http://localhost:3000 ``` ## Usage 1. **Create Platform** — Go to /games, add Nintendo, PlayStation, etc. 2. **Create Game** — Add game manually or import from ROMs 3. **Scan ROMs** — Go to /roms, scan directory with ROM files 4. **Link Metadata** — Search game on IGDB/RAWG, link to ROM 5. **View Library** — See all games with artwork and info ## Project Structure ``` quasar/ ├── backend/ # Fastify API + Prisma + SQLite │ ├── src/ │ │ ├── routes/ # REST endpoints (/games, /roms, /metadata, etc.) │ │ ├── services/ # Business logic (metadata clients, romscanning, etc.) │ │ └── controllers/ # Request handlers │ └── tests/ # Vitest unit tests (63+ tests) │ ├── frontend/ # React 18 + Vite + TypeScript + TanStack │ ├── src/ │ │ ├── components/ # shadcn/ui components + custom components │ │ ├── pages/ # Application pages (Dashboard, Games, etc.) │ │ ├── api/ # API services and types │ │ ├── query/ # TanStack Query configuration │ │ ├── form/ # TanStack Form + Zod configuration │ │ ├── router/ # TanStack Router configuration │ │ ├── types/ # TypeScript type definitions │ │ ├── hooks/ # Custom React hooks │ │ ├── lib/ # Utility functions │ │ ├── styles/ # Global styles and Tailwind config │ │ └── layout/ # Layout components (Header, Sidebar, etc.) │ ├── tests/ # Vitest + React Testing Library (59+ tests) │ ├── public/ # Static assets │ └── index.html # HTML entry point │ ├── tests/ │ ├── e2e/ # Playwright E2E tests (15 tests) │ └── *.spec.ts # Config validation tests │ ├── docs/ # Documentation │ ├── README.md # Documentation index │ ├── 01-conceptos/ # Fundamental concepts and requirements │ ├── 02-tecnico/ # Technical documentation │ ├── 03-analisis/ # Comparative analysis │ └── 04-operaciones/ # Operations and deployment │ ├── .gitea/ │ └── workflows/ │ └── ci.yml # Gitea Actions CI pipeline │ └── .env.example # Environment template ``` ## Configuration ### Environment Variables Copy `.env.example` to `.env.local` (or `.env.development`) and fill in: ```env # Database (local SQLite) DATABASE_URL="file:./dev.db" # API Keys (get from [docs/02-tecnico/apis.md](docs/02-tecnico/apis.md)) IGDB_CLIENT_ID=your_client_id IGDB_CLIENT_SECRET=your_client_secret RAWG_API_KEY=your_api_key THEGAMESDB_API_KEY=your_api_key # App Config NODE_ENV=development PORT=3000 LOG_LEVEL=debug ``` For production, use Gitea Secrets. See **SECURITY.md** and **[docs/02-tecnico/apis.md](docs/02-tecnico/apis.md)**. ## Testing ### General Tests ```bash # Run all tests (unit + config) yarn test # Run backend tests only cd backend && yarn test # Run frontend tests only cd frontend && yarn test:run # Run E2E tests (requires servers running) cd backend && yarn dev & cd frontend && yarn dev & yarn test:e2e # Lint & Format yarn lint yarn format ``` ### Frontend Development and Testing ```bash # Navigate to frontend directory cd frontend # Install dependencies yarn install # Start development server yarn dev # Frontend will be available at: http://localhost:5173 # Build for production yarn build # Preview production build yarn preview # Run frontend-specific tests yarn test # Run frontend tests with coverage yarn test:coverage # Lint frontend code yarn lint # Format frontend code yarn format # Type check frontend yarn type-check ``` ### Backend Development and Testing ```bash # Navigate to backend directory cd backend # Install dependencies yarn install # Start development server yarn dev # Backend API will be available at: http://localhost:3000 # Run backend tests yarn test # Run backend tests with coverage yarn test:coverage # Run specific test file yarn test -- gamesController.spec.ts # Run tests in watch mode yarn test:watch # Lint backend code yarn lint # Format backend code yarn format # Type check backend yarn type-check # Database operations yarn prisma:migrate yarn prisma:generate yarn prisma:studio ``` ### API Testing ```bash # Test backend API endpoints curl http://localhost:3000/health # Test games endpoint curl http://localhost:3000/api/games # Test metadata search curl "http://localhost:3000/api/metadata/search?q=Mario" # Test ROM scanning curl -X POST http://localhost:3000/api/roms/scan -d '{"path":"/path/to/roms"}' ``` ## Troubleshooting ### Backend won't start ``` Error: EADDRINUSE: address already in use :::3000 → Kill process on port 3000: lsof -i :3000 | grep LISTEN | awk '{print $2}' | xargs kill -9 ``` ### Tests failing with "DATABASE_URL not found" ``` → Make sure backend/.env exists with DATABASE_URL → Or: DATABASE_URL="file:./test.db" yarn test ``` ### Metadata search returns no results ``` → Check that API keys are correct ([docs/02-tecnico/apis.md](docs/02-tecnico/apis.md)) → Check logs: tail -f backend/logs/*.log → Test with: curl http://localhost:3000/api/metadata/search\?q\=Mario ``` ### Frontend can't reach backend ``` → Make sure backend is running on http://localhost:3000 → Check frontend/.env has: VITE_API_URL=http://localhost:3000 ``` ## Architecture For detailed architecture and decisions, see [docs/01-conceptos/architecture.md](docs/01-conceptos/architecture.md). ### Tech Stack - **Backend:** Node.js, Fastify, Prisma ORM, SQLite, TypeScript - **Frontend:** React 18, Vite, TypeScript, TanStack Query, TanStack Router, TanStack Form, Zod, Tailwind CSS, shadcn/ui - **Testing:** Vitest (unit), Playwright (E2E) - **APIs:** IGDB (OAuth), RAWG, TheGamesDB ## Security - **No data leaves your system** — Everything stored locally - **API keys stored securely** — Via `.env.local` or Gitea Secrets - **Input validation** — All user input validated with Zod - **CORS configured** — Only allows frontend origin For security guidelines, see [SECURITY.md](SECURITY.md). ## Documentation - **[SECURITY.md](SECURITY.md)** — Security policies and best practices - **[docs/README.md](docs/README.md)** — Documentation index and navigation guide - **[docs/01-conceptos/requirements.md](docs/01-conceptos/requirements.md)** — Project requirements and use cases - **[docs/01-conceptos/architecture.md](docs/01-conceptos/architecture.md)** — System architecture and design decisions - **[docs/01-conceptos/data-model.md](docs/01-conceptos/data-model.md)** — Database schema and entities - **[docs/02-tecnico/apis.md](docs/02-tecnico/apis.md)** — APIs configuration and integration guide - **[docs/02-tecnico/frontend.md](docs/02-tecnico/frontend.md)** — Complete frontend architecture and implementation - **[docs/03-analisis/competitive-analysis.md](docs/03-analisis/competitive-analysis.md)** — Market analysis and competitive research ## Development ### Adding a new feature 1. Create test file: `tests/feature.spec.ts` (TDD) 2. Write failing test 3. Implement feature 4. Run tests: `yarn test` 5. Run lint: `yarn lint` 6. Commit: `git commit -m "feat: add feature description"` ### Running Gitea Actions locally ```bash # The CI workflow is in .gitea/workflows/ci.yml # It runs automatically on push/PR to main or develop # To test locally: # 1. Lint yarn lint # 2. Backend tests cd backend && yarn test # 3. Frontend tests cd frontend && yarn test:run # 4. E2E tests (requires servers running) cd backend && yarn dev & cd frontend && yarn dev & yarn test:e2e ``` ## Contributing Pull requests welcome. Please: 1. Run `yarn test` before pushing 2. Run `yarn format` to auto-format code 3. Add tests for new features ## License MIT (or choose your license) ## Support - **Docs:** See [/docs](/docs) folder - **Issues:** Report bugs on this repo - **Discussions:** Use repo discussions for questions --- **Status:** MVP (v1.0.0) — Ready for self-hosted deployment. **Last updated:** 2026-02-22 **Test coverage:** 122+ unit tests + 15 E2E tests ✅ **Documentation:** Reorganized and consolidated ✅