Audio player and management application.
24
stars
3,655
commits
Kotlin
primary language
Feb 26, 2025
updated
Spit Player is a ubiqutious widget-based desktop application. It has modular ui and behavior, including audio playback/library, Phllips Hue integration or voice control features. Uses VLC under hood & css for looks. Built around plugins and widgets.
Is this ready? Yes. Executable downloads are not provided, but can be easily built. Well tested on Windows 8.1 and 10. Linux and OSX compatible, but largely untested.
Can look like this:

Can do this:

You decide. This application has been born out of frustration with how applications today look and are used. The major use cases are:
Ever lost your entire library or song ratings due to corrupted database file? Ever wanted to have song chapters or other cool features? Ever needed multiple playlists or display/manipulate your songs in a way that wasn't possible for some reason?
This application addresses a lot of such issues. However, it may lack features you may be used from other media players, so it may not be for you.
Ever wanted to do things your way?
Pluggable parts of the applications are called widgets and can be developed or changed while the application runs. This application provides several useful widgets, but most importantly the necessary infrastructure to manage and use them conveniently, such as modular layout, different widget launch strategies, be it different types of windows or even separate process.
If you know Java/Kotlin, you can make your own app with a simple text editor and literally few lines of code. Just write your code, hit save and watch as it auto-compiles and reloads in UI. All that with included support for powerful type-safe configuration, skins and access to the internals.
See how.
The voice assistant is largely separate, but also integrated functionality capable of full real-time interaction with user. It uses multiple AI models for text-to speech, llm, speech-to-text to provide for voice control over devices as well as actual chat. It supports voice cloning, multiple speakers, and more.
See voice assistant documentation
Download link coming in the future. Building from the latest sources:
./gradlew build builds the application./gradlew jar creates jar & copies dependencies to /libSong database:
Management system is only as good as its user interface. There are powerful tables that try to be as flexible as possible. Tables:
Spit Player supports reading & writing of song tags
Supported are:
The aim is to be interoperable with other players, where possible. Noteworthy or nonstandard supported tags include:
POPM frame counter)All settings and entire user interface layout serialize into a human-readable and editable files. These can be edited, backed up or switched between applications.
Most of the functionalities are implemented as widgets, that can be loaded, closed, moved and configured separately. Multiple instances of the same widget can run at once in windows, layouts or popups.
Widgets' source files can be created and edited in runtime and any changes will be immediately reflected in the application. This means that if you are a developer you can simply edit code of the .java file, hit save and watch as the widgets are (recompiled and then) reloaded with previous state and configuration.
Controls for playback, like seeking. Supports song chapters.
Table or playing songs. Of course, it is possible to use more of them once. Very handy to have a side-playlist sometimes.
Shows cover and song metadata. Supports cover download (url drag & drop) and rating.
Tag editor
Object-object converting facility.
List<INPUT>) and apply and chain these transformation functions (on every element of the list) to get some
result (List<OUTPUT>). It may sound confusing at first, but it is an intuitive and very powerful thing, particularly when
combined with the ability to see the transformation output as a text at every step and the ability to manually edit
that text and reuse it as an input for further transformation. The final output can be used as text or for an action,
such as
This makes it possible to import song titles from copy-pasted track list found on web by 'cleaning' it up with text line transformations (remove x characters from start, etc.) rather than manually. Changing extension or names of a bunch of files is a piece of cake.
Song tables. User can link them up, so they display increasingly filtered/specialized content. For example, 1st table can display all artists (all unique artists in entire song library), 2nd table linked to 1st would display all unique albums of songs by any artist/s selected in the 1st table. So on until Nth table displays the songs. Combinations are endless. In addition, because of the modular gui, you can set up table size and position as you wish and the layout is not restricted to area of the window (layout has own virtual space, like virtual desktops). Lastly, in is possible to set up widgets (in this case individual tables) to be 'passive' until user allows them to load properly - it is possible to create a multiple views with lots of tables with practically no performance impact at all (by using views only when needed and have them 'sleep', but be prepared and configured all the time).
Image viewer - displays an image
Displays images and thumbnails for images in a directory
Configuring facility displaying settings for either:
Displays hierarchies:
Displays System.out in a TextArea, meant for developers
Configurable icon bar/dock. User can add/remove custom icons executing some predefined.
Plots custom mathematical function in a graph
The application in its self-contained form:
The Interface is minimalistic but powerful and fully modular.
Modules (widgets) are part of layout hierarchy, which can be manipulated, saved or even loaded as standalone application.
There are multiple improvements over standard JavaFX Controls, mostly using custom Skin set by css.
The changes are documented in the source code:








sp.it.pl)This is the application module, containing the source code for the functionality.
For now, the sources are provided with no licence.
Which does not mean anything is permitted, it is the opposite. This may change in the future.
This is a collection of source codes for widgets for this application, found in app/widgets. For portability reasons, each widget specifies its licence. Usually it is The Unlicense.
sp.it.util)This is collection of useful utility methods/extension, with primary intention of supporting the player module of this project.
All the sources, unless specifically stated otherwise in the source code file, are under The Unlicense.
sp.it.demo)This is a collection of demonstrative projects found on the internet, mostly contributed as answers on stackoverflow.com.
The sources are provided with no licence.
Which does not mean anything is permitted, it is the opposite. This is because it would be too time-consuming to find the
authors/contributors and figure things out. If you need to use the code, the files contain information about where to find the authors of the code.
Kotlin
72.0%
Java
19.1%
Python
5.0%
CSS
3.6%
Audio player and management application.
24
stars
3,655
commits
Kotlin
primary language
Feb 26, 2025
updated
Spit Player is a ubiqutious widget-based desktop application. It has modular ui and behavior, including audio playback/library, Phllips Hue integration or voice control features. Uses VLC under hood & css for looks. Built around plugins and widgets.
Is this ready? Yes. Executable downloads are not provided, but can be easily built. Well tested on Windows 8.1 and 10. Linux and OSX compatible, but largely untested.
Can look like this:

Can do this:

You decide. This application has been born out of frustration with how applications today look and are used. The major use cases are:
Ever lost your entire library or song ratings due to corrupted database file? Ever wanted to have song chapters or other cool features? Ever needed multiple playlists or display/manipulate your songs in a way that wasn't possible for some reason?
This application addresses a lot of such issues. However, it may lack features you may be used from other media players, so it may not be for you.
Ever wanted to do things your way?
Pluggable parts of the applications are called widgets and can be developed or changed while the application runs. This application provides several useful widgets, but most importantly the necessary infrastructure to manage and use them conveniently, such as modular layout, different widget launch strategies, be it different types of windows or even separate process.
If you know Java/Kotlin, you can make your own app with a simple text editor and literally few lines of code. Just write your code, hit save and watch as it auto-compiles and reloads in UI. All that with included support for powerful type-safe configuration, skins and access to the internals.
See how.
The voice assistant is largely separate, but also integrated functionality capable of full real-time interaction with user. It uses multiple AI models for text-to speech, llm, speech-to-text to provide for voice control over devices as well as actual chat. It supports voice cloning, multiple speakers, and more.
See voice assistant documentation
Download link coming in the future. Building from the latest sources:
./gradlew build builds the application./gradlew jar creates jar & copies dependencies to /libSong database:
Management system is only as good as its user interface. There are powerful tables that try to be as flexible as possible. Tables:
Spit Player supports reading & writing of song tags
Supported are:
The aim is to be interoperable with other players, where possible. Noteworthy or nonstandard supported tags include:
POPM frame counter)All settings and entire user interface layout serialize into a human-readable and editable files. These can be edited, backed up or switched between applications.
Most of the functionalities are implemented as widgets, that can be loaded, closed, moved and configured separately. Multiple instances of the same widget can run at once in windows, layouts or popups.
Widgets' source files can be created and edited in runtime and any changes will be immediately reflected in the application. This means that if you are a developer you can simply edit code of the .java file, hit save and watch as the widgets are (recompiled and then) reloaded with previous state and configuration.
Controls for playback, like seeking. Supports song chapters.
Table or playing songs. Of course, it is possible to use more of them once. Very handy to have a side-playlist sometimes.
Shows cover and song metadata. Supports cover download (url drag & drop) and rating.
Tag editor
Object-object converting facility.
List<INPUT>) and apply and chain these transformation functions (on every element of the list) to get some
result (List<OUTPUT>). It may sound confusing at first, but it is an intuitive and very powerful thing, particularly when
combined with the ability to see the transformation output as a text at every step and the ability to manually edit
that text and reuse it as an input for further transformation. The final output can be used as text or for an action,
such as
This makes it possible to import song titles from copy-pasted track list found on web by 'cleaning' it up with text line transformations (remove x characters from start, etc.) rather than manually. Changing extension or names of a bunch of files is a piece of cake.
Song tables. User can link them up, so they display increasingly filtered/specialized content. For example, 1st table can display all artists (all unique artists in entire song library), 2nd table linked to 1st would display all unique albums of songs by any artist/s selected in the 1st table. So on until Nth table displays the songs. Combinations are endless. In addition, because of the modular gui, you can set up table size and position as you wish and the layout is not restricted to area of the window (layout has own virtual space, like virtual desktops). Lastly, in is possible to set up widgets (in this case individual tables) to be 'passive' until user allows them to load properly - it is possible to create a multiple views with lots of tables with practically no performance impact at all (by using views only when needed and have them 'sleep', but be prepared and configured all the time).
Image viewer - displays an image
Displays images and thumbnails for images in a directory
Configuring facility displaying settings for either:
Displays hierarchies:
Displays System.out in a TextArea, meant for developers
Configurable icon bar/dock. User can add/remove custom icons executing some predefined.
Plots custom mathematical function in a graph
The application in its self-contained form:
The Interface is minimalistic but powerful and fully modular.
Modules (widgets) are part of layout hierarchy, which can be manipulated, saved or even loaded as standalone application.
There are multiple improvements over standard JavaFX Controls, mostly using custom Skin set by css.
The changes are documented in the source code:








sp.it.pl)This is the application module, containing the source code for the functionality.
For now, the sources are provided with no licence.
Which does not mean anything is permitted, it is the opposite. This may change in the future.
This is a collection of source codes for widgets for this application, found in app/widgets. For portability reasons, each widget specifies its licence. Usually it is The Unlicense.
sp.it.util)This is collection of useful utility methods/extension, with primary intention of supporting the player module of this project.
All the sources, unless specifically stated otherwise in the source code file, are under The Unlicense.
sp.it.demo)This is a collection of demonstrative projects found on the internet, mostly contributed as answers on stackoverflow.com.
The sources are provided with no licence.
Which does not mean anything is permitted, it is the opposite. This is because it would be too time-consuming to find the
authors/contributors and figure things out. If you need to use the code, the files contain information about where to find the authors of the code.
Kotlin
72.0%
Java
19.1%
Python
5.0%
CSS
3.6%