AudioMuse-AI-MusicServer

June 2, 2026 · View on GitHub

AudioMuse-AI Logo

Music Server built on the Open Subsonic API to showcases AudioMuse-AI’s advanced music intelligence capabilities. This is not your typical music server. It’s a new way to explore, understand, and rediscover your music library.

The full list or AudioMuse-AI related repository are:

Container Deployment

Pre-built Docker containers are available!

You can run AudioMuse-AI-MusicServer using our automatically built and published Docker containers from GitHub Container Registry. This is the easiest way to get started without needing to compile anything.

docker run -d \
  --name audiomuse \
  -p 3000:3000 \
  -p 8080:8080 \
  -v /path/to/music:/music \
  -v /path/to/config:/config \
  ghcr.io/neptunehub/audiomuse-ai-musicserver:latest

For detailed container usage instructions, deployment options, and release information, see: CONTAINER_RELEASE.md

The containers include both the backend API server and frontend web interface, with automatic nightly builds and easy version management.

After deploying AudioMsue-AI-MusicServer it could be reached BOTH from this url:

Music server configuration

The first login can be done with:

  • User: admin
  • password: admin

The configuration needed is go in the admin tab and:

  • add the path of the song, and start the scanning, depending from the size of the library could takes several minutes. This is just to add the song to the mediaserver
  • configure the path of AudioMuse-AI (the core contianer)

After both of this point done, you can start the Sonic Analysis directly from the Music Server, after the analysis is completed you can run the integrated Sonic Analysis function that now are:

  • Instan mix for both Artist and Song
  • Sonic Path
  • Sonic Fingerprint
  • Music Map
  • Song Alchemy
  • Text Search

IMPORTANT: This is a Open Subsonic API compliant server, so you need to configure AudioMuse-AI with the navidrome deployment, setting url, user and password correctly.

Developer

This is instruction to run both backend and frontned on your developing environment

Compile and run backend

Going in /music-server-backend/

go mod init music-server-backend
go mod tidy
CGO_ENABLED=1 go build -tags fts5 -o music-server
./music-server

Important: the -tags fts5 flag (and CGO_ENABLED=1) are required. They compile SQLite's FTS5 full-text search module into the binary. Without them the build succeeds but search silently returns no results and rescans log no such module: fts5. The Docker image already builds with this flag.

By default the database is created at /config/music.db. To use a different location, set DATABASE_PATH, e.g.:

DATABASE_PATH=/path/to/music.db ./music-server

API will be reacheable on http://localhost:8080/rest/

API actually exposed:

[GIN-debug] GET    /rest/ping.view           --> main.subsonicPing (4 handlers)
[GIN-debug] GET    /rest/getOpenSubsonicExtensions.view --> main.subsonicGetOpenSubsonicExtensions (4 handlers)
[GIN-debug] GET    /rest/getLicense.view     --> main.subsonicGetLicense (5 handlers)
[GIN-debug] GET    /rest/stream.view         --> main.subsonicStream (5 handlers)
[GIN-debug] GET    /rest/scrobble.view       --> main.subsonicScrobble (5 handlers)
[GIN-debug] GET    /rest/getArtists.view     --> main.subsonicGetArtists (5 handlers)
[GIN-debug] GET    /rest/getAlbumList2.view  --> main.subsonicGetAlbumList2 (5 handlers)
[GIN-debug] GET    /rest/getPlaylists.view   --> main.subsonicGetPlaylists (5 handlers)
[GIN-debug] GET    /rest/getPlaylist.view    --> main.subsonicGetPlaylist (5 handlers)
[GIN-debug] GET    /rest/createPlaylist.view --> main.subsonicCreatePlaylist (5 handlers)
[GIN-debug] POST   /rest/createPlaylist.view --> main.subsonicCreatePlaylist (5 handlers)
[GIN-debug] PUT    /rest/createPlaylist.view --> main.subsonicCreatePlaylist (5 handlers)
[GIN-debug] PATCH  /rest/createPlaylist.view --> main.subsonicCreatePlaylist (5 handlers)
[GIN-debug] HEAD   /rest/createPlaylist.view --> main.subsonicCreatePlaylist (5 handlers)
[GIN-debug] OPTIONS /rest/createPlaylist.view --> main.subsonicCreatePlaylist (5 handlers)
[GIN-debug] DELETE /rest/createPlaylist.view --> main.subsonicCreatePlaylist (5 handlers)
[GIN-debug] CONNECT /rest/createPlaylist.view --> main.subsonicCreatePlaylist (5 handlers)
[GIN-debug] TRACE  /rest/createPlaylist.view --> main.subsonicCreatePlaylist (5 handlers)
[GIN-debug] GET    /rest/updatePlaylist.view --> main.subsonicUpdatePlaylist (5 handlers)
[GIN-debug] GET    /rest/deletePlaylist.view --> main.subsonicDeletePlaylist (5 handlers)
[GIN-debug] GET    /rest/getAlbum.view       --> main.subsonicGetAlbum (5 handlers)
[GIN-debug] GET    /rest/search2.view        --> main.subsonicSearch2 (5 handlers)
[GIN-debug] GET    /rest/search3.view        --> main.subsonicSearch2 (5 handlers)
[GIN-debug] GET    /rest/getSong.view        --> main.subsonicGetSong (5 handlers)
[GIN-debug] GET    /rest/getRandomSongs.view --> main.subsonicGetRandomSongs (5 handlers)
[GIN-debug] GET    /rest/getSongsByGenre.view --> main.subsonicGetSongsByGenre (5 handlers)
[GIN-debug] GET    /rest/getCoverArt.view    --> main.subsonicGetCoverArt (5 handlers)
[GIN-debug] GET    /rest/startScan.view      --> main.subsonicStartScan (5 handlers)
[GIN-debug] POST   /rest/startScan.view      --> main.subsonicStartScan (5 handlers)
[GIN-debug] PUT    /rest/startScan.view      --> main.subsonicStartScan (5 handlers)
[GIN-debug] PATCH  /rest/startScan.view      --> main.subsonicStartScan (5 handlers)
[GIN-debug] HEAD   /rest/startScan.view      --> main.subsonicStartScan (5 handlers)
[GIN-debug] OPTIONS /rest/startScan.view      --> main.subsonicStartScan (5 handlers)
[GIN-debug] DELETE /rest/startScan.view      --> main.subsonicStartScan (5 handlers)
[GIN-debug] CONNECT /rest/startScan.view      --> main.subsonicStartScan (5 handlers)
[GIN-debug] TRACE  /rest/startScan.view      --> main.subsonicStartScan (5 handlers)
[GIN-debug] GET    /rest/getScanStatus.view  --> main.subsonicGetScanStatus (5 handlers)
[GIN-debug] GET    /rest/getLibraryPaths.view --> main.subsonicGetLibraryPaths (5 handlers)
[GIN-debug] POST   /rest/addLibraryPath.view --> main.subsonicAddLibraryPath (5 handlers)
[GIN-debug] POST   /rest/updateLibraryPath.view --> main.subsonicUpdateLibraryPath (5 handlers)
[GIN-debug] POST   /rest/deleteLibraryPath.view --> main.subsonicDeleteLibraryPath (5 handlers)
[GIN-debug] GET    /rest/getUsers.view       --> main.subsonicGetUsers (5 handlers)
[GIN-debug] GET    /rest/createUser.view     --> main.subsonicCreateUser (5 handlers)
[GIN-debug] GET    /rest/updateUser.view     --> main.subsonicUpdateUser (5 handlers)
[GIN-debug] GET    /rest/deleteUser.view     --> main.subsonicDeleteUser (5 handlers)
[GIN-debug] GET    /rest/changePassword.view --> main.subsonicChangePassword (5 handlers)
[GIN-debug] GET    /rest/getConfiguration.view --> main.subsonicGetConfiguration (5 handlers)
[GIN-debug] GET    /rest/setConfiguration.view --> main.subsonicSetConfiguration (5 handlers)
[GIN-debug] GET    /rest/getSimilarSongs.view --> main.subsonicGetSimilarSongs (5 handlers)
[GIN-debug] GET    /rest/getSongPath.view    --> main.subsonicGetSongPath (5 handlers)
[GIN-debug] GET    /rest/getSonicFingerprint.view --> main.subsonicGetSonicFingerprint (5 handlers)
[GIN-debug] GET    /rest/star.view           --> main.subsonicStar (5 handlers)
[GIN-debug] GET    /rest/unstar.view         --> main.subsonicUnstar (5 handlers)
[GIN-debug] GET    /rest/getStarred.view     --> main.subsonicGetStarred (5 handlers)
[GIN-debug] GET    /rest/getGenres.view      --> main.subsonicGetGenres (5 handlers)
[GIN-debug] GET    /rest/getApiKey.view      --> main.subsonicGetApiKey (5 handlers)
[GIN-debug] POST   /rest/revokeApiKey.view   --> main.subsonicRevokeApiKey (5 handlers)
[GIN-debug] GET    /rest/startSonicAnalysis.view --> main.subsonicStartSonicAnalysis (5 handlers)
[GIN-debug] POST   /rest/startSonicAnalysis.view --> main.subsonicStartSonicAnalysis (5 handlers)
[GIN-debug] PUT    /rest/startSonicAnalysis.view --> main.subsonicStartSonicAnalysis (5 handlers)
[GIN-debug] PATCH  /rest/startSonicAnalysis.view --> main.subsonicStartSonicAnalysis (5 handlers)
[GIN-debug] HEAD   /rest/startSonicAnalysis.view --> main.subsonicStartSonicAnalysis (5 handlers)
[GIN-debug] OPTIONS /rest/startSonicAnalysis.view --> main.subsonicStartSonicAnalysis (5 handlers)
[GIN-debug] DELETE /rest/startSonicAnalysis.view --> main.subsonicStartSonicAnalysis (5 handlers)
[GIN-debug] CONNECT /rest/startSonicAnalysis.view --> main.subsonicStartSonicAnalysis (5 handlers)
[GIN-debug] TRACE  /rest/startSonicAnalysis.view --> main.subsonicStartSonicAnalysis (5 handlers)
[GIN-debug] GET    /rest/getSonicAnalysisStatus.view --> main.subsonicGetSonicAnalysisStatus (5 handlers)
[GIN-debug] GET    /rest/cancelSonicAnalysis.view --> main.subsonicCancelSonicAnalysis (5 handlers)
[GIN-debug] POST   /rest/cancelSonicAnalysis.view --> main.subsonicCancelSonicAnalysis (5 handlers)
[GIN-debug] PUT    /rest/cancelSonicAnalysis.view --> main.subsonicCancelSonicAnalysis (5 handlers)
[GIN-debug] PATCH  /rest/cancelSonicAnalysis.view --> main.subsonicCancelSonicAnalysis (5 handlers)
[GIN-debug] HEAD   /rest/cancelSonicAnalysis.view --> main.subsonicCancelSonicAnalysis (5 handlers)
[GIN-debug] OPTIONS /rest/cancelSonicAnalysis.view --> main.subsonicCancelSonicAnalysis (5 handlers)
[GIN-debug] DELETE /rest/cancelSonicAnalysis.view --> main.subsonicCancelSonicAnalysis (5 handlers)
[GIN-debug] CONNECT /rest/cancelSonicAnalysis.view --> main.subsonicCancelSonicAnalysis (5 handlers)
[GIN-debug] TRACE  /rest/cancelSonicAnalysis.view --> main.subsonicCancelSonicAnalysis (5 handlers)
[GIN-debug] GET    /rest/startSonicClustering.view --> main.subsonicStartClusteringAnalysis (5 handlers)
[GIN-debug] POST   /rest/startSonicClustering.view --> main.subsonicStartClusteringAnalysis (5 handlers)
[GIN-debug] PUT    /rest/startSonicClustering.view --> main.subsonicStartClusteringAnalysis (5 handlers)
[GIN-debug] PATCH  /rest/startSonicClustering.view --> main.subsonicStartClusteringAnalysis (5 handlers)
[GIN-debug] HEAD   /rest/startSonicClustering.view --> main.subsonicStartClusteringAnalysis (5 handlers)
[GIN-debug] OPTIONS /rest/startSonicClustering.view --> main.subsonicStartClusteringAnalysis (5 handlers)
[GIN-debug] DELETE /rest/startSonicClustering.view --> main.subsonicStartClusteringAnalysis (5 handlers)
[GIN-debug] CONNECT /rest/startSonicClustering.view --> main.subsonicStartClusteringAnalysis (5 handlers)
[GIN-debug] TRACE  /rest/startSonicClustering.view --> main.subsonicStartClusteringAnalysis (5 handlers)
[GIN-debug] POST   /api/v1/user/login        --> main.loginUser (4 handlers)
[GIN-debug] GET    /api/v1/user/me           --> main.userInfo (5 handlers)
[GIN-debug] GET    /api/v1/admin/browse      --> main.browseFiles (6 handlers)
[GIN-debug] POST   /api/v1/admin/scan/cancel --> main.cancelAdminScan (6 handlers)
[GIN-debug] POST   /api/v1/admin/scan/rescan --> main.rescanAllLibraries (6 handlers)
[GIN-debug] POST   /api/cleaning/start       --> main.CleaningStartHandler (6 handlers)
[GIN-debug] POST   /api/alchemy              --> main.AlchemyHandler (4 handlers)
[GIN-debug] GET    /api/map                  --> main.MapHandler (5 handlers)
[GIN-debug] GET    /api/voyager/search_tracks --> main.VoyagerSearchTracksHandler (5 handlers)
[GIN-debug] POST   /api/map/create_playlist  --> main.MapCreatePlaylistHandler (5 handlers)
[GIN-debug] GET    /static/*filepath         --> github.com/gin-gonic/gin.(*RouterGroup).createStaticHandler.func1 (4 handlers)
[GIN-debug] HEAD   /static/*filepath         --> github.com/gin-gonic/gin.(*RouterGroup).createStaticHandler.func1 (4 handlers)
[GIN-debug] GET    /favicon.ico              --> main.main.(*RouterGroup).StaticFile.func14 (4 handlers)
[GIN-debug] HEAD   /favicon.ico              --> main.main.(*RouterGroup).StaticFile.func14 (4 handlers)
[GIN-debug] GET    /manifest.json            --> main.main.(*RouterGroup).StaticFile.func15 (4 handlers)
[GIN-debug] HEAD   /manifest.json            --> main.main.(*RouterGroup).StaticFile.func15 (4 handlers)

Compile and run frontend

Goining /music-server-frontend/

npm install
npm start

Frontend will be reacheable on http://localhost:3000/ you can do the first login with admin/admin

IMPORTANT as you can see, running the code OUT of the container, you had the front-end on the different port 3000