Claudio Ortolina 3bc07c703c Improve Dockerfile
1. Split npm deps from assets copy — package.json + package-lock.json copied and installed before the full
assets/ directory (lines 69-73)
2. Split compile from assets.deploy — separate RUN commands (lines 76-77)
3. Node from image instead of nodesource — node:24-slim stage replaces curl | bash (lines 21, 29-32)
4. --no-install-recommends — on both builder (line 26) and runner (line 90)
5. Strip unused locales — rm -rf /usr/share/locale /usr/share/i18n after locale-gen (line 95)
6. SHELL with strict flags — set in both builder (line 34) and runner (line 97) stages
2026-03-29 23:30:17 +01:00
2026-03-26 23:09:05 +00:00
2024-10-07 08:12:05 +01:00
2026-03-29 23:11:36 +01:00
2026-03-13 10:52:01 +00:00
2026-02-16 18:06:47 +00:00
2026-03-20 23:26:54 +00:00
2026-03-13 11:49:53 +00:00
2025-10-16 20:46:22 +01:00
2025-10-07 17:21:39 +03:00
2026-03-07 18:57:18 +00:00
2026-03-20 23:38:18 +00:00
2026-02-05 11:14:20 +00:00
2026-03-29 23:30:17 +01:00
2026-03-29 17:27:53 +01:00
2026-03-29 17:27:53 +01:00
2026-03-25 14:57:50 +00:00

Music Library

Features

  • Add records from MusicBrainz, with optional override of specific pieces of data
  • Manage a collection and a wishlist of records, with ways to quickly search and filter based on records' metadata
  • Browse record releases and select a collected release
  • AI-powered chat for records and artists, with web search
  • Artist details with biography, discography, and similar artists
  • Wishlist with links to online stores for purchasing
  • Curate record sets (e.g. "best live albums")
  • Universal search across collection, wishlist, artists, and record sets
  • Integration with Last.fm:
    • display latest scrobbles, and where possible connect them with records in the collection or wishlist
    • scrobble a record
    • store a local copy of the complete scrobble history, and setup rules to fix its data as needed
    • audit scrobble data quality and identify tracks with missing MusicBrainz IDs
  • Similarity search via OpenAI embeddings
  • Barcode scanning for quick imports
  • Stats dashboard with collection overview, top artists, top albums, and records on this day
  • All data stored in SQLite databases for portability and ease of backup/restore

Screenshots

Stats dashboard

Stats dashboard

Collection

Collection

Searching for a record to add

Searching for a record to add

Record details

Record details

Record releases

Record releases

Record chat

Record chat

Artist details

Artist details

Wishlist record details

Wishlist record details

Record sets

Record sets

Scrobble rules

Scrobble rules

New scrobble rule

New scrobble rule

Universal search

Setup

The project is managed and configured via mise-en-place:

  • mise install will pull the correct Erlang, Elixir and Node.js versions
  • mise run dev:setup will setup dependencies and database structure

Important

The project uses Fluxon UI, so it requires a valid set of credentials. See the env section in mise.toml for the required environment variables.

It's recommended to use the git hooks included in the project. Install with:

mise generate git-pre-commit --write --task=dev:precommit

Environment configuration

Required environment variables for development are listed in mise.toml.

You can create a mise.local.toml with the required variables (sample values are included at the top of mise.toml).

For production, please see compose.yaml for a list of required variables.

Running the application

Start the Phoenix endpoint with mise run console (along with an attached IEx session).

Now you can visit localhost:4000 from your browser. The default password for development is change me.

Auditing Scrobble Data Quality

The application includes a Mix task to audit scrobbled tracks and identify data quality issues such as missing MusicBrainz IDs for artists and albums.

Running the Audit

# Audit all tracks
mix scrobble.audit

# Audit with detailed output including sample tracks
mix scrobble.audit --verbose

# Audit only artist issues
mix scrobble.audit --type artist

# Audit only album issues
mix scrobble.audit --type album

# Output as JSON for processing
mix scrobble.audit --format json

Understanding the Audit Report

The audit report shows:

  • Total number of scrobbled tracks
  • Artists with missing MusicBrainz IDs (grouped by artist name)
  • Albums with missing MusicBrainz IDs (grouped by album title and artist)
  • Track counts for each issue

Fixing Data Quality Issues

After identifying issues, you can:

  1. Create Scrobble Rules: Navigate to the Scrobble Rules page in the web interface and add rules to map artist or album names to their correct MusicBrainz IDs.

  2. Apply Rules: Use the "Apply Rules" button in the Scrobble Rules page to update existing tracks, or run in IEx:

    MusicLibrary.ScrobbleRules.apply_all_rules()
    
  3. Re-audit: Run the audit again to verify the fixes worked.

The application also provides helper functions in the MusicLibrary.ScrobbleActivity context:

  • count_tracks_missing_artist_musicbrainz_id/0
  • count_tracks_missing_album_musicbrainz_id/0
  • get_artists_missing_musicbrainz_id/1
  • get_albums_missing_musicbrainz_id/1

Deployment

The application is deployed via Coolify, using a Docker Compose strategy.

CI

See the .github folder.

Architecture

See the docs folder.

Favicons

This favicon was generated using the following graphics from Twitter Twemoji:

S
Description
No description provided
Readme 63 MiB
Languages
Elixir 77.4%
Python 10%
TypeScript 6.6%
HTML 3.7%
Shell 1.4%
Other 0.8%