A daily classical music guessing game (Wordle-style). Listen to an audio excerpt and identify the composer using hint-based feedback.
docker compose -f docker-compose.yml -f docker-compose.dev.yml up -dThis starts PostgreSQL (port 5432) and the audio file server (port 8081), with their ports exposed to the host so the locally-running backend and Vite dev server can reach them.
cd backend
./mvnwLiquibase runs automatically on startup and applies any pending migrations.
cd frontend
npm install
npm run devThe app is available at http://localhost:5173. The Vite dev server proxies /api → http://localhost:8080 and /audio → http://localhost:8081.
Composer and work data comes from the Open Opus API. Nationality data is fetched from the MusicBrainz API.
curl -o dump.json https://api.openopus.org/work/dump.jsonpip install psycopg2-binary requestsThe database must be running and the backend must have started at least once (so Liquibase has applied all migrations).
python3 scripts/import_composers.pyThe script will:
- Clear the
tbl_composerandtbl_composer_worktables - Import all 165 composers whose era maps to our enum (skipping Medieval, Renaissance, Post-War, and 21st Century)
- Look up each composer's nationality on MusicBrainz (takes ~3 minutes due to rate limiting)
- Insert all ~25,000 works
Composers where MusicBrainz returns no country are imported with nationality XX. A summary is printed at the end.
docker compose --profile prod up -dStarts all four services: frontend (nginx, port 80), backend, db, and audio-server. Internal services communicate over the Docker network only — db, audio-server, and backend are not exposed to the host.
Or run with the observability profile as well, to access logs, traces, and metrics through grafana on port 3000.
docker compose --profile prod --profile observability up -d