Ameinias isn’t exactly a jukebox; more like a compulsively overdesigned shuffle play. It picks tracks from your collection, and plays them. You tell it which ones suck. It’s also web-based, and designed for use in conjunction with a streaming audio server (shoutcast) but can also be used standalone as a tray app.


Latest Releases:

Or view all downloads here.

Or use Docker to run it as an ogg-vorbis streaming server with web interface:


It starts with a very simple premise: you have some audio tracks. Most of the music is there because you want to listen to it. Some tracks suck. For the most part, though, it’s your music and you just want to hear it.

Saying that a track sucks does not necessarily mean you never want to hear these tracks. Some of them only kind of suck. But you sure don’t want to hear sucky songs as often, or even at the same volume level. And some suck so badly you really should never hear them again. And once you say it sucks, you want the player to remember.

What does it mean to “suck”? This is a measure of your opinion of whether a track is worth hearing. Regardless of genre, some tracks just suck.

This is not a crowd-sourced opinion, or “people who liked this also liked”. The track played and you voiced your opinion directly and specifically.

So, the first concept for the user interface was an interface with *nothing* but a suck button. But sometimes you’re just in the mood for ukelele music. Sometimes you just want to hear METAL. And sometimes you’re in the mood to hear METAL played on ukeleles. Obviously these attributes of a track can be treated the same as the overall Suck level.

And so the Track Attribute Manager was born.


Various features were added to support this sort of random inclusive-by-default, always-running jukebox.

How tracks are chosen

Ameinias initially picks tracks at random and puts them in the queue. When the time comes to play them, it looks at the Suck level, and then rolls the dice. If the suck level is higher than the number rolled, it skips the track. Trakcks with very high suck level (~90%) are always skipped.

If a track is playing but you realize that it sucks, you can click the Suck button. When you do this, the Suck level of a program is increased, and the dice are rolled again. You can do this as many times as you like, or just click the Mega Suck button to do it three times in a row to pretty much guarantee that a track will be skipped for the forseeable future.

Sucky songs are played at lower volume levels. The amount of attenuation is relative to how much they suck.

Moods are like the Suck metric, except you can turn them off. Multiple moods could be superimposed, but at this time I only support one mood for simplicity. Everybody listening to the server must be in the same mood. :)

Level matching

You’re playing music from a lot of different albums and, if you are me, from a lot of different genres. You want the levels to match, but you also want the tracks to have impact and dynamics, and you don’t want clipping.

I solve this problem with a (multi-band linear phase soft-knee) leveling compressor (with limiting and soft clipping). This helps to level out the music while preserving most of the dynamics. It also remembers the levels from the last time the track played.

Album segments

Sometimes albums should be played in order. Ameinias will occasionally enqueue a segment of tracks in order as they appear on the album. They still have to pass the suck and mood checks when it’s time to play them though!

Multiple users

You might want to let someone else’s opinion influence your playlist. All of the currently logged-in users’ opinions are merged.

Cats and Mice

You might want to let someone else have limited control, for example let them influence the playlist but not change the mood. You can do that by setting the user’s type to “Mouse”. When the cat logs out, the Mouse has full control.


The user interface is web-based. Combine it with Shoutcast or Icecast and listen to the stream wherever.


Plays mp3 and aac files. Could easily play other types with a little testing and work.

The actual program

The Windows version lives in the system tray.

The server version is designed to be left running 24/7 on a headless system, combined with a shoutcast or icecast server. The user interface is a web app.

Quick Screen Cap

The SUCK button should be BIGGER!



Diabled features

Some features are currently disabled, because they really need a proper user interface before I release them to the unsuspecting public:

  • Automatic daily generation of nonsuck.m3u playlists based on previous preferences
  • Could easily play other audio file formats; just have to add the extension and test routines
  • Standalone server as a docker image
  • Skins or custom GUIs or whatever. The web interface is deliberately located outside the engine so that it can be customized


It should runs on nearly any platform, as it is written in pure Java.

  • Requires Java 8 or better (runtime 1.8, yes that’s weird and I don’t know why they do it that way). OpenJDK is the reference platform.


To run with docker-compose and send audio to a UDP port, use:

  image: tekhedd/ameinias:3.3.1
    – “80:7076”
    OUTPUT_URI: “udp://audiosink:7077”
    – adata:/adata
    – mp3:/mp3

Database is created in the adata volume, and the mp3 volume should contain audio files you want to play. You can pipe the output from UDP to an audio device using a container that has aplay (I built one from scratch):

  image: ??
restart: unless-stopped
      – audiosink
  # privileged: true # On some systems you may need this to write audio
    – /dev/snd
  command: /bin/bash -c “while true ; do socat -d -u UDP-RECV:7077 EXEC:’aplay -c 2 -f S16_LE -r 44100′; sleep 1; echo “RESTARTING”; done”

Or, alternatively, redirect the data to ices2 or another streaming client.


View current bugs or feature requests at Trello.

Come to the Ameinias Facebook Page to tell me about bugs, suggestions, or just tell me how it sucks and you could do it better. :)


Ameinias is the third incarnation of the Track Attribute Manager. The first version was written in the 90s in C++ using obscure Object Database technology and CVS. It played mp3 files. The second version was written in the ’00s using C# and mono, and used SQLite. It added dynamic level control and a Web-based multi-user interface. It worked better. Ameinias v3 is written in Java, still uses SQLite, and has a linear phase multiband level control system and adds support for AAC files, and is be the first version available to, you know, you.