Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
242 commits
Select commit Hold shift + click to select a range
b511b1c
Errors don't set the HTTP status code
spl0k Sep 6, 2020
593666a
Travis s/.org/.com/g
spl0k Sep 6, 2020
b07babb
Version bump
spl0k Sep 27, 2020
0183bcb
Use mediafile rather than mutagen directly
spl0k Oct 24, 2020
194bf5e
Add test for M4A embedded art
spl0k Nov 1, 2020
7d18251
Deduplicate on getAlbumList
spl0k Nov 7, 2020
5c46c96
Some fixes for Windows support (especially for tests)
spl0k Nov 8, 2020
8e3cd5e
Prevent tests from speing some ResourceWarnings
spl0k Nov 8, 2020
1be526b
Subsonic API 1.10.2
spl0k Nov 8, 2020
e0946c0
Remove the ability to skip XSD validation in tests
spl0k Nov 9, 2020
1f3d697
Adding new attributes brought by API upgrade
spl0k Nov 9, 2020
62ae4a9
Update README about API version
spl0k Nov 9, 2020
cec2166
Add ignored articles support
spl0k Nov 9, 2020
883623c
Potential fix for hypothetical Pony version 0.8
spl0k Nov 10, 2020
c2f5ec4
Album listing filtered by year or genre
spl0k Nov 10, 2020
debb396
Ability to grant jukebox right when creating an user from the API
spl0k Nov 10, 2020
52fb367
Implement updateUser
spl0k Nov 10, 2020
d6c00e0
Version bump
spl0k Nov 11, 2020
bc6e768
Fix exception handling
pR0Ps Nov 13, 2020
e29a09e
Test for issue #202
spl0k Nov 14, 2020
dc5084c
Finish transcoding and cache if close to the end
spl0k Nov 15, 2020
bca9104
Trying to replace Travis CI with GitHub Actions
spl0k Nov 21, 2020
0103e60
Tweaking test workflow
spl0k Nov 22, 2020
d6f1a11
Merge branch 'issue202'
spl0k Nov 22, 2020
81d141e
pyupgrade
spl0k Nov 22, 2020
9a3bdc3
Removing shebang and executable flag from explicit python files
spl0k Nov 22, 2020
2c100a0
Properly release resources
spl0k Nov 22, 2020
8cef628
Advertising (and testing) Python 3.9 support
spl0k Nov 25, 2020
6c89acc
scan Api implementation
vincentDcmps Nov 16, 2020
7fa30db
add .vscode to gitignore
vincentDcmps Nov 16, 2020
479d4ec
correct exeption and double daeomon use
vincentDcmps Nov 22, 2020
13b7c4b
add version parameter to ApiTestBase class
vincentDcmps Nov 24, 2020
d08db74
add test for api scan endpoint
vincentDcmps Nov 24, 2020
6bb3cd7
chmod -x
spl0k Nov 28, 2020
36cea89
Improving scan tests
spl0k Nov 28, 2020
f8018b2
Some housekeeping
spl0k Nov 29, 2020
95a2758
Update API doc about scan
spl0k Dec 13, 2020
0b67aeb
Version bump
spl0k Dec 13, 2020
cfc324e
Rewriting docs as reStructuredText
spl0k Dec 29, 2020
ff75ff1
Docs as reST: transcoding
spl0k Dec 29, 2020
2ff1080
Docs as reST: jukebox
spl0k Dec 29, 2020
1c65fde
Docs to reST: api
spl0k Dec 29, 2020
c8db5b8
Simplify API cross references
spl0k Jan 2, 2021
fb41bf2
Improve manpages
spl0k Jan 3, 2021
c52141e
change distinct following #208
vincentDcmps Jan 7, 2021
f92c711
Installation doc
spl0k Jan 9, 2021
15e5114
Database setup doc
spl0k Jan 9, 2021
33d0739
Moving the configuration doc
spl0k Jan 9, 2021
2469698
Some deployment docs
spl0k Jan 10, 2021
22c3727
modify route management
vincentDcmps Jan 13, 2021
e22620b
change route call method
vincentDcmps Jan 16, 2021
bba254f
Import cleanup
spl0k Jan 16, 2021
6bb551a
FastCGI/CGI deployment docs
spl0k Jan 16, 2021
2599f1a
Daemon doc
spl0k Jan 16, 2021
6d56b56
Some doc touches
spl0k Jan 17, 2021
7833726
Sphinx config, sidebar, etc.
spl0k Jan 17, 2021
41f66b5
Merge branch 'docs'
spl0k Jan 17, 2021
11887d0
README update to match doc paths
spl0k Jan 17, 2021
4735003
API doc: try to unify table, left align
spl0k Jan 23, 2021
05b1a11
CRLF -> LF
spl0k Jan 23, 2021
bd370f5
Read lyrics from metadata
spl0k Jan 23, 2021
26a0b7a
Simplfy the README
spl0k Jan 23, 2021
a94cc0e
Usage doc
spl0k Jan 24, 2021
0d55b7c
Docs: fix redundant navigation in sidebar
spl0k Jan 24, 2021
be88f5f
Version bump
spl0k Jan 30, 2021
d05889d
Check id of the user who created the playlist
Whisprin Feb 1, 2021
08329fc
Export playlists to m3u using web interface
Whisprin Feb 1, 2021
dcef74c
Allow renaming users with the CLI
spl0k Feb 7, 2021
8eca8ba
Fixed antipattern
powerexploit Feb 17, 2021
9324025
Added disclaimer before exporting playlist
spl0k Apr 10, 2021
9d34270
Merge branch 'playlist-export'
spl0k Apr 10, 2021
aea8ebe
fix del issue when unschedule scanning queue
vincentDcmps Jun 11, 2021
e6e20d1
Work around race when creating ClientPrefs
spl0k Sep 11, 2021
a1eeeb8
merge identical genre tags in album info
davebiffuk Sep 13, 2021
8652c47
Added test for #221
spl0k Sep 18, 2021
e8d3f16
Slightly improved genre merging
spl0k Sep 18, 2021
5490189
Add cover art to downloaded zip files
pR0Ps Oct 7, 2021
387a5e3
Switch to using `zipstream-ng` to generate and stream zip files
pR0Ps Oct 7, 2021
359e391
Implement recursive downloading of folders
pR0Ps Oct 7, 2021
f8c3d99
Embedded server using poorly designed wrappers on some WSGI servers
spl0k Nov 1, 2021
91cb3fb
black
spl0k Nov 6, 2021
a033d45
Adding doc for the newly added `supysonic-server`
spl0k Nov 6, 2021
ac69059
Also test on Python 3.10
spl0k Nov 6, 2021
8e33b37
Fix test workflow for Python 3.10
spl0k Nov 6, 2021
f4bfc73
Rewriting the CLI using click rather than cmd+argparse
spl0k Nov 11, 2021
a88e261
Remove old stuff
spl0k Nov 12, 2021
64475a8
Small update on WSGI containers doc
spl0k Nov 12, 2021
8ab9f44
Rationalizing/modernizing building stuff
spl0k Nov 14, 2021
b4e737c
Use test discovery rather than explicit suites
spl0k Nov 20, 2021
8f5a9a3
Properly close connections when killing the daemon
spl0k Nov 21, 2021
3b0023e
Test tweaks
spl0k Nov 21, 2021
56fe87a
Supysonic is going to PyPI, update the docs accordingly
spl0k Nov 21, 2021
ddb7c69
Version bump
spl0k Nov 21, 2021
e8f4b2f
Fix typo in setup file
spl0k Nov 21, 2021
632b1bc
Fixed tests
spl0k Nov 28, 2021
98ff737
Drop Python 3.5
spl0k Nov 28, 2021
c3f911b
Display version and proper URL on web UI
spl0k Nov 28, 2021
799bfa3
Code style
spl0k Nov 28, 2021
a02ece7
Fix wrong package name for apt install commands.
baldurmen Dec 3, 2021
09802ae
CI tweaks
spl0k Dec 4, 2021
430d5a0
Try to fix stalling tests
spl0k Dec 4, 2021
5c969e2
Modify the man pages for sphinx.
baldurmen Dec 8, 2021
5de715f
Disable smartquotes dashes in Sphinx.
baldurmen Dec 16, 2021
c24ee94
Don't list sections on manpages index
spl0k Dec 19, 2021
ec92dec
Build and include man pages in distributions
spl0k Dec 31, 2021
62bad3b
Version bump
spl0k Jan 1, 2022
f387cce
Prevent naming collisions when zipping albums
spl0k Jan 29, 2022
4bee23c
Fix covers not being scanned as such when modified
spl0k Jan 30, 2022
e11e775
Pony now has a stable release for Python 3.10 so we're compatible on …
spl0k Jan 30, 2022
8d6821d
Try to fix flaky test
spl0k Jan 30, 2022
65a7131
Version bump
spl0k Feb 27, 2022
bc373e5
Factor in index construction
spl0k Sep 9, 2022
e52a704
Implement musicFolderId paramenter on various endpoints
spl0k Sep 10, 2022
3b0aa20
Advertise hls endpoint as not supported
spl0k Sep 10, 2022
9db3549
Bump API version to 1.12.0
spl0k Oct 1, 2022
0b6891a
Redefined models using peewee
spl0k Nov 27, 2022
6bdee81
Fixing a good chunk of supysonic.db
spl0k Dec 10, 2022
64cf272
Fix supysonic.utils.get_secret_key
spl0k Dec 10, 2022
ccdd73f
Port supysonic.managers.folder.FolderManager
spl0k Dec 10, 2022
e589247
Port supysonic.managers.user.UserManager
spl0k Dec 10, 2022
83ba85a
Port supysonic.scanner
spl0k Dec 10, 2022
cd369f6
Porting supysonic.cli
spl0k Dec 11, 2022
c5246c7
Porting supysonic.watcher
spl0k Dec 11, 2022
2b472b4
Porting supysonic.api.albums_songs
spl0k Dec 18, 2022
7401b4d
Porting supysonic.api.annotation
spl0k Dec 18, 2022
95f77cc
Porting supysonic.api.browse
spl0k Dec 18, 2022
995c2a6
Porting supysonic.api.chat
spl0k Dec 23, 2022
b2c45ff
Porting supysonic.api.media
spl0k Dec 23, 2022
50b98e6
Fix for peewee pre-3.15.4
spl0k Dec 23, 2022
6179daf
Porting supysonic.api.playlists
spl0k Dec 23, 2022
4fa744e
Porting supysonic.api.radio
spl0k Dec 30, 2022
8b93e0b
Fix on scanner queuing
spl0k Dec 30, 2022
dd2ef2f
Porting supysonic.api.search
spl0k Dec 30, 2022
4228381
Fix transcoding tests
spl0k Dec 30, 2022
153c5f4
Porting supysonic.api.user
spl0k Dec 30, 2022
e510f96
Porting supysonic.frontend
spl0k Dec 31, 2022
ee8165b
Fix requesting lyrics
spl0k Dec 31, 2022
e51abfe
Fix independent tests
spl0k Dec 31, 2022
f6b859d
Fix average ratings for peewee pre-3.15.4
spl0k Dec 31, 2022
b87091d
Force tests to run on Ubuntu 20.04 and test for py 3.11 and 3.12
spl0k Dec 31, 2022
6ab0488
Add missing save calls in Last.fm handling
spl0k Dec 31, 2022
4d249ad
Drop Python 3.6
spl0k Jan 1, 2023
09d48fd
Fix pony leftover in jukebox
spl0k Jan 1, 2023
30734fe
Fix getSongsByGenre + remove some useless DISTINCTs
spl0k Jan 2, 2023
14dc636
Fixed error on daemon quit
spl0k Jan 8, 2023
82187fd
pyupgrade
spl0k Jan 8, 2023
399686f
Version bump
spl0k Jan 8, 2023
ba1fbf4
Forgot to update badge and docs about Python version
spl0k Jan 8, 2023
4bbd7e9
Use hex-encoded string for id instead of bytes on DBMSs that don't pr…
spl0k Jan 11, 2023
b57b086
Enforce foreign keys on SQLite
spl0k Jan 14, 2023
09a5fb1
Fix integrity errors when deleting a root folder
spl0k Jan 14, 2023
724f047
Adding missing foreign key on client_prefs
spl0k Jan 15, 2023
ad688a2
Fix FK errors when deleting a user
spl0k Jan 15, 2023
d5a4f18
Genre related fixes
spl0k Jan 15, 2023
be6b617
black
spl0k Jan 15, 2023
36efefc
Fix supysonic-server with gunicorn creating the application too early
spl0k Jan 16, 2023
0957fef
Fix failing deletions from the scanner
spl0k Jan 17, 2023
536c4e9
Version bump
spl0k Jan 20, 2023
f696a2d
Update configuration.rst
lolspark Feb 2, 2023
56162ad
Drop the "pragmas" kw for Python SQLite migrations
spl0k Feb 11, 2023
245e9c7
Merge remote-tracking branch 'lolspark/patch-1'
spl0k Feb 11, 2023
8e2adf8
Fix getting starred stuff
spl0k Feb 25, 2023
eac6bdf
Add a setting to disable log rotation
vithyze Mar 5, 2023
03ac57c
log rotate documentation
spl0k Mar 18, 2023
27df94e
Setting to enable or disable ChartLyrics
spl0k Mar 18, 2023
034a47d
Fix getAlbumList for PostgreSQL
spl0k Mar 18, 2023
cf73d5a
Fix getAlbumList2 for PostgreSQL
spl0k Mar 18, 2023
dc93b43
Docs: add a note about supysonic-server tuning
spl0k Mar 25, 2023
109f81e
Fix bitrate units when scanning
pR0Ps Apr 1, 2023
639c682
Add database migrations to fix up the bitrate units
pR0Ps Apr 1, 2023
62f921d
Fix #252 migrations
spl0k Apr 2, 2023
f3e743d
Version bump
spl0k Apr 2, 2023
893a007
Properly close database connections when they're not in use
spl0k Apr 20, 2023
32a7470
Properly close database connections when they're not in use
spl0k Apr 20, 2023
abe0b79
Properly close database connections when they're not in use
spl0k Apr 21, 2023
4bc80bf
Replace distutils.dir_util.remove_tree() by shutil.rmtree().
baldurmen Jun 13, 2023
a14a7da
Log failed login attempts
spl0k Jul 14, 2023
0fa0d55
Version bump
spl0k Jul 14, 2023
c2a9d42
Fix failing test with Flask >=3.0.0
spl0k Jan 2, 2024
2209b65
Add ReadTheDocs configuration file
spl0k Jan 2, 2024
1feaae7
Silence auth errors from tests
spl0k Jan 2, 2024
a39f2fb
Initial ListenBrainz support
Mar 18, 2024
0f49dfb
Add ListenBrainz documentation and tests
Mar 19, 2024
8d3a31d
Allow non-admin users to link ListenBrainz account
Apr 1, 2024
1cfca94
Move a ListenBrainz test to the net suite
spl0k Apr 1, 2024
4a0437b
Fix(?) watcher queue sometimes not stopping when asked
spl0k Apr 14, 2024
f12e403
Add Python 3.12 support
spl0k May 19, 2024
df51cab
Run the project through an up-to-date black
spl0k May 19, 2024
002f223
Update GitHub actions
spl0k May 19, 2024
813f5a3
Version bump
spl0k May 19, 2024
a1231e0
Fix latest postgresql migration
spl0k May 20, 2024
03b3b65
Version bump
spl0k May 20, 2024
bd53ac0
Fix track duration display
pR0Ps Sep 8, 2024
bad81b7
Migrates to Bootstrap 5, closes #266
ogarcia Dec 1, 2024
ee9cb7a
Fixes unit tests
ogarcia Dec 1, 2024
09920bc
Fixes changemail POST
ogarcia Dec 2, 2024
3911da4
Adds a fancy theme selector
ogarcia Dec 2, 2024
d71a2e0
Categorize messages for better alerts
ogarcia Dec 2, 2024
86af0f3
Fixes spacing between elements on small screens
ogarcia Dec 2, 2024
ecf7878
Improves support for small screens a bit more
ogarcia Dec 4, 2024
0e4ae01
Merge remote-tracking branch 'ogarcia/bootstrap5'
spl0k Dec 7, 2024
15d4c28
Fixes LastFM link and unlink buttons
ogarcia Dec 8, 2024
38f4874
Version bump
spl0k Dec 15, 2024
a717a09
Update GitHub Actions to use current Python versions
spl0k Dec 15, 2024
24a796e
Make build stop complaining
spl0k Dec 15, 2024
37f3039
add missing - to oggdec options
May 8, 2025
a24940c
add option to suppress oggdec output
May 8, 2025
d728901
Rework playlists tracklist as proper DB model
spl0k Oct 29, 2025
4e5469d
Test for playlist tracks reindexing
spl0k Oct 30, 2025
890d396
Update schema files and add migrations
spl0k Oct 30, 2025
37618b8
Fix 20251030 migration
Oct 31, 2025
32ee231
Fix 20251030 migration
spl0k Nov 8, 2025
116ea78
Python 3.9 reached EOL, drop its support
spl0k Nov 8, 2025
91af354
Test against Pyπ
spl0k Nov 8, 2025
df99f55
Modernize project metadata
spl0k Jun 27, 2026
1c2da64
Consolidate tests and fix a XSD issue
spl0k Jun 28, 2026
a06e11b
Drop ChartLyrics integration
spl0k Jun 28, 2026
1a12af4
Fix project metadata
spl0k Jun 28, 2026
08b0170
Fix issue 85 test
spl0k Jun 28, 2026
aac1720
Make transcoding tests OS-independent
spl0k Jun 29, 2026
558ac35
Jukebox tests + deprecation fix
spl0k Jun 29, 2026
302461f
Speed up watcher tests
spl0k Jun 29, 2026
f7764cd
Update .gitignore
spl0k Jun 29, 2026
2847ca8
Strengthen browse/search tests with a better dataset
spl0k Jun 30, 2026
3241f93
Improve tests and fix some issues
spl0k Jul 5, 2026
f7639cb
Upgrade GitHub actions
spl0k Jul 10, 2026
7232df9
Upgrade tool configuration, run isort and black
spl0k Jul 10, 2026
4f73aea
security: state mutating frontend requests are POST only
spl0k Jul 10, 2026
ce4f92b
security: add CSRF protection
spl0k Jul 11, 2026
94c0b0f
Consolidate pyproject.toml
spl0k Jul 11, 2026
39d661c
security: circumvent timing attacks
spl0k Jul 11, 2026
40f3b3b
More security fixes
spl0k Jul 11, 2026
1a6ecde
Small correctness fixes
spl0k Jul 11, 2026
ba1bcbd
Move deamon RPC classes to their own module
spl0k Jul 11, 2026
58b260f
More GitHub actions updates
spl0k Jul 11, 2026
5610deb
security: prevent RCE from daemon IPC
spl0k Jul 12, 2026
6d7c244
Make daemon commands pure DTO
spl0k Jul 12, 2026
e263171
Untangle daemon code a bit
spl0k Jul 12, 2026
c95c5aa
Improve watcher's time handling
spl0k Jul 13, 2026
0c291f4
security: prevent header injection
spl0k Jul 13, 2026
9d93c62
More correctness fixes
spl0k Jul 13, 2026
52b75cd
Make GitHub Actions also run tests on PostgreSQL and MariaDB
spl0k Aug 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions .coveragerc

This file was deleted.

124 changes: 124 additions & 0 deletions .github/workflows/tests.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
# Inspired by python-package

name: Tests
on:
push:
paths:
- supysonic/**
- tests/**
- pyproject.toml
pull_request:
paths:
- supysonic/**
- tests/**
- pyproject.toml
jobs:
build:
name: Build
runs-on: ubuntu-latest
strategy:
matrix:
python-version:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
- "3.14"
fail-fast: false
steps:
- name: Checkout
uses: actions/checkout@v7
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -e .[test]
- name: Run tests
run: |
coverage run -m unittest
- name: Upload coverage
uses: codecov/codecov-action@v7
with:
token: ${{ secrets.CODECOV_TOKEN }}
if: ${{ !cancelled() }}

postgres:
name: PostgreSQL
runs-on: ubuntu-latest
services:
postgres:
image: postgres:16
env:
POSTGRES_PASSWORD: postgres
POSTGRES_DB: supysonic
ports:
- 5432:5432
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- name: Checkout
uses: actions/checkout@v7
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: "3.13"
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -e .[test,test-db]
- name: Enable citext extension
run: psql "postgresql://postgres:postgres@localhost/supysonic" -c 'CREATE EXTENSION IF NOT EXISTS citext'
- name: Run tests
env:
SUPYSONIC_TEST_DB_URI: postgres://postgres:postgres@localhost/supysonic
run: |
coverage run -m unittest
- name: Upload coverage
uses: codecov/codecov-action@v7
with:
token: ${{ secrets.CODECOV_TOKEN }}
if: ${{ !cancelled() }}

mariadb:
name: MariaDB
runs-on: ubuntu-latest
services:
mariadb:
image: mariadb:11
env:
MARIADB_ROOT_PASSWORD: root
MARIADB_DATABASE: supysonic
ports:
- 3306:3306
options: >-
--health-cmd "healthcheck.sh --connect --innodb_initialized"
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- name: Checkout
uses: actions/checkout@v7
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: "3.13"
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -e .[test,test-db]
- name: Run tests
env:
SUPYSONIC_TEST_DB_URI: mysql://root:root@127.0.0.1/supysonic
run: |
coverage run -m unittest
- name: Upload coverage
uses: codecov/codecov-action@v7
with:
token: ${{ secrets.CODECOV_TOKEN }}
if: ${{ !cancelled() }}
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ __pycache__/
# Distribution / packaging
.Python
env/
*env/
py3.*/
build/
develop-eggs/
dist/
Expand Down Expand Up @@ -64,4 +66,7 @@ target/
*~

*.orig
.vscode

# Supysonic runtime-related files
/cache/
11 changes: 11 additions & 0 deletions .readthedocs.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
version: 2

build:
os: ubuntu-22.04
tools:
python: "3.12"

sphinx:
configuration: docs/conf.py

formats: all
13 changes: 0 additions & 13 deletions .travis.yml

This file was deleted.

6 changes: 0 additions & 6 deletions MANIFEST.in

This file was deleted.

70 changes: 70 additions & 0 deletions PACKAGING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# Packaging Notes

Notes for distro package maintainers.

## Man pages

Man pages are not included in the PyPI distribution. They must be built from
the Sphinx sources in `docs/` using the `man` builder:

```
sphinx-build -b man docs <destdir>
```

This produces five section-1 pages, to be installed under `/usr/share/man/man1/`:

| File | Description |
|---|---|
| `supysonic-cli.1` | Management command-line interface |
| `supysonic-cli-user.1` | User management sub-commands |
| `supysonic-cli-folder.1` | Folder management sub-commands |
| `supysonic-daemon.1` | Background daemon |
| `supysonic-server.1` | Standalone web server |

`sphinx` must be available at build time. No other Sphinx extensions are required.

## Configuration sample

A sample configuration file is provided at `config.sample` in the repository
root. It is not installed by the Python build. The conventional install path is:

```
/usr/share/doc/supysonic/config.sample
```

Users copy it to one of the locations Supysonic searches at startup:

- `/etc/supysonic` (system-wide)
- `~/.supysonic` (user, short form)
- `~/.config/supysonic/supysonic.conf` (user, XDG-style)
- `supysonic.conf` (current working directory)

## Entry-point scripts

Three console scripts are declared in `pyproject.toml`:

| Script | Purpose |
|---|---|
| `supysonic-cli` | Administrative CLI (library management, user management, …) |
| `supysonic-daemon` | Optional background daemon (file watcher, jukebox, background scans) |
| `supysonic-server` | Built-in WSGI server (development / simple deployments) |

### systemd unit for the daemon

The daemon (`supysonic-daemon`) is a long-running process suitable for a
systemd service. A minimal unit file:

```ini
[Unit]
Description=Supysonic Daemon

[Service]
User=supysonic
Group=supysonic
ExecStart=/usr/bin/supysonic-daemon

[Install]
WantedBy=multi-user.target
```

See the [daemon documentation](https://supysonic.readthedocs.io/en/latest/setup/daemon.html).
Loading