Reading the repo
Reading the repo
How to install on Linux
Music Index & Library Organizer (MILO) - Create multiple user libraries for Plex, Navidrome, and others from one master pool without duplicating files.
Saved setup from 3 h ago
Will it work on Linux?
Heads-upIt also needs 9 settings in .env (1 secret).
MILO can run directly from source with Node.js/npm or be deployed using its Docker image. For release downloads, see GitHub Releases; each release provides its source ZIP and release notes. The published container image is ghcr.io/kenwetech/milo.
Download and extract the laatest MILO-vX.X.X.zip archive from GitHub Releases.
Install the project dependencies from the project directory:
npm install
Set the environment variables you need (see Configuration).
Start the server:
npm start
The default port is 8088, and the server listens on 0.0.0.0. On a network where mDNS works, you may also be able to access MILO at http://milo.local:8088.
The container needs persistent storage for its database, a mounted master music collection, and a persistent location for the administrator library and the base directory used by relative library paths. A starting compose.yaml is shown below:
services:
milo:
image: ghcr.io/kenwetech/milo:latest
container_name: milo
restart: unless-stopped
ports:
- "8088:8088"
env_file:
- .env
environment:
PORT: 8088
MASTER_POOL_DIR: /music
LIBRARY_PATH: /app/MILO_Libraries
volumes:
# MILO database, sync history, and organizer history
- ./data:/app/data
# Library root used by the initial admin and relative user-library paths
- ./MILO_Libraries:/app/MILO_Libraries
# Your existing master music collection (write access is needed by the Organizer)
- /path/to/your/music:/music
# Persist certificates when using MILO's built-in HTTPS
- ./ssl:/app/ssl
Replace /path/to/your/music with the host directory containing the master music collection. Keep ./data, ./MILO_Libraries, and (when using built-in HTTPS) ./ssl in persistent host storage so application history, user-library links, and certificates survive container replacement or upgrades. Ensure the container user has enough permission to read the master music and create library links.
How LIBRARY_PATH works: In this example, the initial administrator's library path is /app/MILO_Libraries. LIBRARY_PATH also serves as the base for relative library paths for other accounts. For example, entering alice as a user's relative library path resolves to /app/MILO_Libraries/alice. An absolute library path is used as given, so it must also exist and be accessible inside the container. The library root must be a persistent mount; otherwise a container replacement can discard its directory structure.
Set a strong FLASK_SECRET_KEY in the .env file next to your Compose file. For example:
FLASK_SECRET_KEY=replace-with-a-long-random-secret
SPOTIPY_CLIENT_ID=
SPOTIPY_CLIENT_SECRET=
APPLE_DEVELOPER_TOKEN=
DRIVEPOOL_DRIVES=
You do not need to set DB_PATH for the Compose example above; it defaults to the app's data/milo.db path, which is persisted by ./data:/app/data. MILO also stores sync_history.db beside the configured main database, so keeping the database directory persistent preserves that history too.
When accessing MILO from the host, open http://localhost:8088. On another device, use the server's LAN address and port. http://milo.local:8088 may work if mDNS announcements are available across your network and Docker setup.
The DrivePool physical-path lookup uses configured Windows drive letters and PoolPart.* folders. A typical Linux-based container cannot directly use host Windows drive letters such as D: or E:. Configure DRIVEPOOL_DRIVES only in a deployment where those paths are actually visible in the MILO process; do not copy Windows drive letters into a Linux container and expect the lookup to work. Hard links still need compatible physical storage and permissions.
Then run bash setup.sh. It stops at the first error and is safe to run again. Servers and tests aren't started; it lists them at the end. Read it first.
git clone https://github.com/KenWeTech/MILO.git cd MILO
Node.js
# https://nodejs.org/en/download (or nvm)
In the maintainers' order. Do the README instructions above first — they cover steps outside the terminal.
npm install npm start
No reports for Linux yet.
Opens a chat with this manual already filled in, for Linux. It uses your own account; gitmanual sends nothing.