A modern, touch-friendly web app for musicians to manage setlists and lyrics with zero clutter and maximum clarity. Designed for live band rehearsals, gigging, and on-stage performance. Fast, offline-first, and fully mobile/tablet-friendly.
- Local-first: All data (songs, setlists, preferences) saved in your browser—no cloud required!
- Batch song upload: Drag in
.txtor.docxlyric files to add your entire songbook in minutes. - Smart title normalization: Cleans up messy file names into proper titles automatically.
- Full setlist management: Create, rename, duplicate, reorder, and delete setlists. Drag and drop songs to build your set.
- Fuzzy setlist import: Paste a setlist (with or without numbering) and the app matches titles to your song library—even if the spelling isn’t perfect.
- Import from Image (OCR): Use a photo of a written/printed setlist and convert it via OCR with fuzzy matching.
- Voice search: Microphone button in search bars for speech-to-text search.
- Quick search and filter: Instantly search by song title or lyrics.
- Performance Mode: Beautiful fullscreen lyric display with swipe navigation, adjustable font size, theme toggle, and auto-scroll for hands-free performing.
- Light/Dark themes: AMOLED Dark (default) and Light. Toggle instantly—even during performance.
- PWA support: Install on your phone/tablet/desktop and use offline.
- Export/Import: Back up your setlists in
.json,.txt,.csv, or print-friendly PDF (auto-fit).
- Open
index.htmlin your browser, or serve the folder locally withnpx serve .or any static server. - For best offline/PWA behavior (service worker) and cross-page data access, use
http(s)(e.g.,http://localhost) rather thanfile://. - Install the app on your device (Add to Home Screen) if desired.
- Click Songs tab.
- Drag-and-drop
.txtor.docxfiles or use the Upload button. - Each file is imported as a song (title auto-normalized).
- Go to the Setlists tab.
- Click + to create a new setlist.
- Drag songs from the left ("Available Songs") column to your setlist on the right.
- Reorder songs by drag-and-drop or use the up/down buttons.
- Switch to the Lyrics tab.
- Pick a setlist (or show all songs).
- Tap a song or click Start to enter performance mode.
- In performance mode:
- Swipe/arrow between songs
- Adjust font size on the fly
- Enable autoscroll for hands-free lyrics
- Toggle dark/light themes for visibility
- Batch Import: Add all your lyric files at once.
- Clean Titles: No more "01_Crazy_Song_FINAL2.txt"—titles are cleaned up for you.
- Setlists: Make, duplicate, and customize as many setlists as you need (by event, gig, etc.).
- Stage Mode: Lyrics are fullscreen, high-contrast, and dead simple. Perfect for tablets.
- Upload, search, add, edit, or delete lyrics.
- Import via
.txtor.docxfiles. - Song titles are normalized on upload (removes numbers, underscores, weird capitalization).
- Create new setlists or edit existing ones.
- Add/remove songs with a single click.
- Reorder with drag-and-drop.
- Import setlists from text files or pasted lists (smart matching to your songbook).
- Import setlists from an image (OCR): click the image button, pick a photo of the setlist, confirm the name, and fuzzy-match to your library.
- Export setlists as JSON, TXT, CSV, or PDF.
- Imports LyricSmith JSON exports directly:
- Use Import → Restore (JSON backup) for LyricSmith library files (
{ songs: [...] }). - Import Songs also accepts plain arrays of songs (
[ { title, lyrics, ... } ]).
- Use Import → Restore (JSON backup) for LyricSmith library files (
- Setlist JSON exports from this app can be imported into LyricSmith; it will import the song content.
- When exporting Songs, you can choose:
JSON (array):[ { title, lyrics, ... } ]— also compatible with LyricSmith.LyricSmith JSON:{ version, exportDate, songCount, songs: [...] }— matches LyricSmith’s default export shape.
- Under Export → Everything, you can now pick:
JSON (songs + setlists): Full backup for this app.LyricSmith Library (songs only):{ songs: [...] }for quick import into LyricSmith.
- Pick a setlist and enter performance mode.
- Fullscreen, responsive, touch-optimized display.
- Font size controls (per-song memory).
- Autoscroll with customizable speed/delay.
- Quick theme toggle for any lighting condition.
- Fast navigation: next/previous song arrows or swipe.
- When "All Songs" is selected, the list is alphabetical; when a setlist is selected, song order matches the setlist.
- Running from
file://? A local fallback passes the setlist song order to performance mode so it still respects your order.
- Choose from AMOLED dark, Light, Blue, Red, and more.
- Theme toggle in the corner (persistent per device).
- Works fully offline.
- Installable as an app (Add to Home Screen).
- Data is stored in browser/IndexedDB (no server needed).
- Service worker auto-registers and pre-caches app assets with a cache-first fetch strategy, including OCR binaries (WASM/data).
- Note: service workers require
httpsorhttp://localhost;file://won’t register a SW (the app still works, including OCR and setlist order fallback).
- Fuse.js (fuzzy song matching)
- SortableJS (drag-and-drop in setlists)
- Mammoth.js (parsing
.docxlyrics) - Tesseract.js (OCR for image setlist import) — vendored locally
- FontAwesome (icons)
- Google Fonts (optional decorative font)
- No cloud storage, no account needed. All data stays in your browser/device.
- Export and back up your data as you like.
- Delete data at any time with the "Delete All Songs" or "Delete Setlist" buttons.
- Backup your data: Export setlists/songs occasionally—especially before clearing browser data.
- DOCX Upload: Only text content is imported—formatting is ignored.
- PDF export: Uses the browser print dialog; each song auto-fits on one page.
- Mic search: Click the microphone icon in Songs or Lyrics search; not all browsers support Web Speech API.
- App updates: After code changes, refresh the service worker (Ctrl/Cmd+Shift+R) to pick up new assets.
- Local vs hosted: For best results, run via
http(s)(localhost or GitHub Pages/Vercel).file://mode works, with setlist-order and OCR fallbacks.
This app is intentionally "no build, no framework, no backend."
If you want to add features, just fork and hack away. Open issues or suggestions welcome!
ISC License (do what you want, just don’t sue).
- Fuse.js for fuzzy search
- SortableJS for drag-and-drop
- Mammoth.js for DOCX parsing
- FontAwesome & Google Fonts for visual polish
Add screenshots to make the README more visual. Suggested images and paths (place files under assets/screenshots/):
- Songs tab:
assets/screenshots/songs.png - Setlists tab (with OCR import button):
assets/screenshots/setlists.png - OCR import flow (image -> detected text prompt):
assets/screenshots/ocr-import.png - Lyrics tab (All Songs alphabetical):
assets/screenshots/lyrics-list.png - Performance mode (lyrics fullscreen, controls visible):
assets/screenshots/performance.png - PDF export preview (auto-fit per song):
assets/screenshots/pdf-export.png
Example markdown (uncomment after adding files):
Tips for great screenshots:
- Use a consistent window size and theme (e.g., Dark) for cohesion.
- For mobile/tablet views, open DevTools device emulator and capture at typical sizes (e.g., iPad portrait).
-
Service worker not updating changes
- Hard refresh: Ctrl/Cmd+Shift+R.
- Or DevTools → Application → Service Workers → Unregister, then reload.
-
Offline/PWA not working
- Service workers require https or http://localhost;
file://will not register a SW. - Check DevTools → Application → Service Workers for registration and activation.
- Service workers require https or http://localhost;
-
Performance page shows all songs instead of setlist (local file mode)
- Fixed by passing a fallback list of song IDs in the URL and reading them in performance mode.
- Make sure you’re on the latest version and open via
index.htmlbefore clicking Start.
-
PDF export doesn’t open
- The export uses the browser print dialog; allow pop‑ups for the site.
- If the preview looks off, try printing to PDF and check margins are “Default” or “None”.
-
OCR accuracy is poor
- Use well-lit, straight-on photos; crop to the setlist area.
- Handwriting varies: printed text recognizes better than cursive.
- After OCR, you can edit the setlist name; fuzzy matching tolerates minor spelling differences.
-
Mic button not working
- Speech Recognition (Web Speech API) isn’t supported in all browsers. Chrome/Edge desktop and Android generally work; iOS support varies.
- Ensure mic permissions are granted.
-
Data missing after browser cleanup
- Data is stored in IndexedDB. Clearing site data removes songs/setlists. Restore from your JSON backup via Import.
-
Drag-and-drop reordering isn’t working
- Ensure you’re interacting in the Setlists tab’s right column (Current Setlist). Some mobile browsers need a firm press before dragging.