shuffleset
Free self-hosted image
Run shuffleset on your own server.
This is the same core media streamer behind shuffleset.stream, packaged as a self-host container image. It is free to run for your own media library. The source is not open yet; we may open parts of it later.
Container image
A separate build with fewer moving parts.
The self-host image is published separately from the hosted service image. It leaves out catalog admin, accounts, Noise Factor deployment config, and other service-only wiring.
registry.noisefactor.io/shuffleset-selfhost:latest
Setup
Mount your library roots.
Create a working folder, download the compose file, point AUDIO_DIR and VIDEO_DIR at your library roots, then start Docker Compose. Those roots can contain any number of artists, sets, shows, and episodes. The image is hosted in the Noise Factor registry, so Docker needs registry access before it can pull. By default Caddy listens at http://localhost:8080 and proxies to shuffleset.
mkdir shuffleset
cd shuffleset
curl -fsSLO https://shuffleset.stream/selfhost/docker-compose.yml
mkdir -p audio video
cat > .env <<'EOF'
AUDIO_DIR=./audio
VIDEO_DIR=./video
SITE_URL=http://localhost:8080
EOF
docker login registry.noisefactor.io
docker compose up -d
Library model
Content is config-driven.
Add as many artists, audio sets, shows, and gallery episodes as you want. Each folder has an index.json file for titles, descriptions, ordering, visibility, and file lists.
Content types. Audio sets are track lists. Video episodes are clip lists. Slideshow episodes play images or videos full-screen in sequence.
Presentation modes. Playlist. The default episode view is a player that moves through the files list. Gallery. Set "style": "gallery" for a browsable grid and lightbox. Set "style": "slideshow" for a full-screen sequence.
audio/
artist-slug/
index.json
live-set/
index.json
mp3/
track-01.mp3
video/
artist-slug/
index.json
visual-show/
index.json
episode-one/
index.json
files/
clip-01.mp4
gallery-episode/
index.json
files/
image-01.jpg
Index files
Use JSON to name and order things.
Artist indexes can define sets_order and shows_order. Set, show, and episode indexes define metadata and files. If a files list is omitted, shuffleset scans the folder.
{
"metadata": {
"title": "Gallery Episode",
"description": "Photos and short clips",
"style": "gallery"
},
"files": [
{ "file": "image-01.jpg", "title": "Image 01" },
{ "file": "clip-01.mp4", "title": "Clip 01" }
]
}
{
"sets_order": ["live-set", "studio-set"],
"shows_order": ["visual-show", "tour-diary"]
}
Access control
Add basic auth if this is not public.
The compose file runs Caddy in front of shuffleset. If you set both auth variables, Caddy adds HTTP basic auth. If you leave them blank, the instance serves without a password.
docker run --rm caddy:2-alpine caddy hash-password --plaintext 'choose-a-password'
# then add these to .env
SHUFFLESET_AUTH_USER=admin
SHUFFLESET_AUTH_HASH='$2a$14$paste-the-caddy-hash-here'
Terms
Free to use, with project boundaries.
You can run the published image for your own personal, team, or internal business media server.
Please do not redistribute the image, repackage the bundled app, remove branding, or use it to offer a competing hosted media service.
This is free as in no cost to run, not open source software. We may open some or all of it later, but today's download is governed by the self-host license.