/Sonata

Your self-hosted music streaming platform.

Primary LanguageTypeScriptGNU General Public License v3.0GPL-3.0


Sonata
Sonata

Your self-hosted music streaming platform.

Key FeaturesHow To UseDownloadCreditsLicense

screenshot

Key Features

  • Interface made in React and Next.js
  • Music data provided by Deezer
    • Artist view of top songs and albums
    • Album view
    • Discover page with various categories of music
  • Live, synced lyrics from lrclib.net
  • Account management system
    • Track history
    • Liked tracks playlist
    • User created playlists
  • PWA Installable on iOS, Android, and Desktop
  • Self-hostable
  • Modular plugin system to utilize different services for playback
  • Guest view for users without an account
  • And more!

How To Use

To clone and run this application, you'll need Git and Node.js (which comes with npm) installed on your computer. From your command line:

# Clone this repository
$ git clone https://github.com/directlycrazy/Sonata

# Go into the repository
$ cd sonata

# Install dependencies
$ npm install

# Create the database directory
$ mkdir database

# Generate database
$ npm run migrate

#Build the app
$ npm run build

Environment Variables

Please ensure the following environment variables are set to ensure the correct function of Sonata. Each can be changed depending on your preferences for how "open" the app should be to guests, and if users should be allowed to sign up.

# Public URL of the application
BASE_URL=http://localhost:3000
# Allow unauthenticated users to access basic functionality (browse, search, listen to audio previews)
GUESTS_ALLOWED=true
# If user signup/account creation is enabled.
SIGNUPS_ALLOWED=false

Start the App

# Run the app
$ npm prod:start

Download

You can download the latest version of Sonata for any platform with Node >= 18. Please refer to the build steps above to get your instance running.

Credits

This software has been made possible thanks to the following open-source packages:

License

GNU GPLv3


Created by @directlycrazy