Liszt’n Up! is a web-based party game designed for classical music enthusiasts. Inspired by mechanics from board games like Hitster, players compete to guess composers, works, and eras, or place tracks on a timeline.
The game is built on a massive dataset of more than 10,500 works from over 900 composers sourced from MusicBrainz, totaling 27,000+ tracks (each work may contribute multiple movements/parts). Rather than manual curation, the system filters works based on the number of available recordings. Predefined tracklists are generated automatically, with only the Beginner tracklist being manually curated. Users can also create custom tracklists from the entire library.
Designed as a modern web app, Liszt’n Up! is optimized for tablet usage (ideal for placing in the center of a table during a game night) and includes a custom audio engine that performs real-time volume normalization for a consistent listening experience.
- Framework: SvelteKit (Svelte 5 with Runes) + Cloudflare Pages & D1 (Analytics)
- Language: TypeScript
- Styling: Tailwind CSS 4
- State Management: Svelte Stores & LocalStorage persistence
- Audio: Web Audio API (with custom LUFS normalization implementation)
- Icons: Lucide Svelte
- I18n:
svelte-i18n
Important
This project relies on the Deezer API for audio previews. Usage is subject to Deezer's Terms of Service. Commercial use of this application is prohibited without explicit permission from rightsholders.
To get a local copy up and running, follow these steps.
- Node.js (Latest LTS recommended)
- pnpm
-
Clone the repository:
git clone https://github.com/jacbz/lisztnup.git cd lisztnup -
Install dependencies:
pnpm install
-
Start the development server:
pnpm dev
-
Open http://localhost:5173 in your browser.
Note
Browser Compatibility: To bypass Web Audio API autoplay restrictions on WebKit, the game automatically falls back to standard HTML5 Audio on Safari.
Unlike many trivia games with manually curated lists, Liszt’n Up! uses an algorithmic approach to generate its library, with only little manual tweaking. You can inspect the generation logic in the /data directory. The build process compiles this into a compressed lisztnup.json file served to the client.
The game works fully without a dedicated server, but includes an optional backend (leaderboard, pageviews, game sessions, feedback, problem reports) via Cloudflare D1. To set it up:
-
Install the Wrangler CLI:
pnpm add -g wrangler
-
Create a D1 database:
wrangler d1 create lisztnup-analytics
-
Update
wrangler.tomlwith thedatabase_idfrom the output. -
Initialize the schema:
wrangler d1 execute lisztnup-analytics --file=database.sql
-
(Optional) Copy the remote database into your local D1:
wrangler d1 export lisztnup-analytics --remote --output=./d1-remote.sql wrangler d1 execute lisztnup-analytics --local --file=./d1-remote.sql -
(Optional) For Telegram notifications on feedback/reports, set the
TELEGRAM_BOT_TOKENandTELEGRAM_CHAT_IDsecrets:wrangler secret put TELEGRAM_BOT_TOKEN wrangler secret put TELEGRAM_CHAT_ID
Without the D1 binding, the app runs normally — analytics endpoints return 503 and the client silently ignores failures.
Note
Privacy: Analytics are GDPR-compliant — no personal data is stored. IP addresses are hashed with a daily-rotating salt (SHA-256) and immediately discarded. No cookies, no tracking pixels, no third-party analytics.
Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature) - Commit your Changes (
git commit -m 'Add some AmazingFeature') - Push to the Branch (
git push origin feature/AmazingFeature) - Open a Pull Request



