Alumira

Getting started

Alumira is a self-hosted media server for a household's films and series, presented as a streaming service of one's own: artwork first, a profile for each person, every version and language of a title. It plays in a web interface that also works with a TV remote (D-pad), as multi-track / multi-bitrate HLS.

Each file is either pre-encoded (encoded once, ahead of time, into CMAF stems: one per video quality, audio language and subtitle, then served as they are) or played directly (served as it is, converted on the fly by the video chip only for a device that needs it).

Requirements

Alumira and its workers run the FFmpeg installed on the machine, as separate programs: neither distribution includes it. It is looked up in this order: the -ffmpeg option (or ALUMIRA_FFMPEG), an ffmpeg/ directory next to the executable, then the PATH.

System Command Other builds
macOS brew install ffmpeg static builds: https://ffmpeg.martin-riedl.de
Windows winget install Gyan.FFmpeg "gpl" builds: https://github.com/BtbN/FFmpeg-Builds
Linux the distribution's package (apt install ffmpeg…) static "gpl" builds: https://github.com/BtbN/FFmpeg-Builds

Homebrew's build has VideoToolbox but no zimg; distribution packages (Debian, Alpine…) often lack libvmaf; the static builds above have both.

Build and run

cd web && npm install && npm run build && cd ..
go build -o alumira ./cmd/alumira
./alumira serve -listen :7575

Open http://localhost:7575: the onboarding guides the first install (admin account, network, stores, sources, encoding, ladder, metadata, bandwidth, languages, backups, invitations).

Useful options:

Option Effect
-data DIR server data (default: the OS application data directory)
-listen ADDR HTTP listen address (default :7575, or ALUMIRA_LISTEN)
-ffmpeg DIR directory containing ffmpeg and ffprobe (or ALUMIRA_FFMPEG)
-no-worker disable the built-in encoding worker
-web DIR serve the web UI from disk during development (e.g. web/dist)
-reset start over from the onboarding (see below)
-reset-stores with -reset: also delete the stems of the previous setup (-yes skips the confirmation)

Desktop app

cmd/alumira-desktop (macOS, Windows): the app in a window of its own, with an icon in the menu bar or the notification area; it hosts the server or shows one of the network. Built with scripts/build-desktop.sh on a Mac (cgo for macOS; Docker for the Windows installer, NSIS); go run ./scripts/icons makes its icons again from the logo.

Docker (NAS)

The Dockerfile at the root builds an image of Alumira beside an FFmpeg with the video chips' drivers (VA-API and Quick Sync with Intel's, NVENC), for amd64 or arm64: what a NAS needs (Asustor, Synology, QNAP, Unraid…), whose system has no such FFmpeg.

docker buildx build --platform linux/amd64 -t alumira .
services:
  alumira:
    image: alumira
    restart: unless-stopped
    ports: ["7575:7575"]
    devices: ["/dev/dri:/dev/dri"]   # Intel chip: Quick Sync, VA-API
    volumes:
      - /volume1/Docker/Alumira:/data   # its data
      - /volume1:/volume1   # the whole volume, at the same path: stores and sources are chosen in the onboarding

The volume is mounted at the same path inside as on the NAS: the paths Alumira shows are the NAS's, and its onboarding picks the stores and sources there.

Prefer network_mode: host to ports:

Without /dev/dri (or on a NAS without a video chip), it encodes with the processor and converts nothing on the fly.

Where the data lives

What Where
Setup, users, catalogue, queues (SQLite alumira.db), images, backups the data directory: ~/Library/Application Support/Alumira (macOS), %APPDATA%\Alumira (Windows), $XDG_DATA_HOME/alumira or ~/.local/share/alumira (Linux); -data or ALUMIRA_DATA to change it
Normalized stems the stores chosen during onboarding, under media/ (plus a .alumira-store marker)
Originals the sources: never modified, except inbox files, deleted once encoded

Starting over

./alumira serve -reset sets the current setup aside (the data directory is renamed to <dir>.reset-<date>, nothing is deleted) and starts again from the onboarding. Rename the directory back to undo it.

The stems written by the previous setup stay in its stores. -reset -reset-stores deletes them too, after confirmation: they are the only copy of inbox files already moved to the trash.

Console output

Alumira prints one line per meaningful event: encoder detection, storage, new files, identifications, finished passes, failures, workers. Bulk activity is grouped into a single summary line.

Variable Effect
ALUMIRA_COLOR=always|never force colours on or off (automatic on a terminal; NO_COLOR is honoured)
ALUMIRA_DEBUG_HTTP=1 print failed or slow HTTP requests
ALUMIRA_DEBUG_FF=1 debug events on whatever the setting (the ffmpeg command lines among them)
ALUMIRA_STABLE_SECONDS delay before a new file is considered complete (default 60)

Encoding workers

In Administration → Workers → Add, copy the displayed command, for example:

./alumira-worker -server http://alumira.lan:7575 -token <token>

Run it from the worker's folder. Once accepted, the server and token are remembered (user configuration folder): ./alumira-worker alone starts it next time.

The worker is a distribution of its own (scripts/build-worker.sh, see Packages): for macOS, Windows and Linux, a command-line program with a README and, to start it with the machine, a launchd agent or a systemd unit. Like Alumira, it runs the FFmpeg installed on the machine (see Requirements).

The administration names the machine and sets how many chunks it encodes at once; the name the machine gives itself is shown as a hint. SIGTERM (or "Pause" in the administration) finishes the current chunks, then stops the worker: handy for updates. A paused machine stays paused until "Resume", even when started again.

Encoders are tested at startup. On a busy machine, a test that fails slowly, or that contradicts the previous detection of the same FFmpeg build, is tried again; what stays inconclusive keeps its previous answer and is tested again 10 minutes later.

A worker takes the chunks of a job whose encoder it can run for each rendition (specification, §7.3), whatever its FFmpeg build. Each job picks the encoder most machines online share: with a Windows PC, a Mac server in speed mode moves from VideoToolbox to libx264 to share the work.

Development

scripts/make-corpus.sh               # test media corpus (testdata/corpus)
go test ./...                        # tests (use the corpus and FFmpeg)
./alumira dev fake-tmdb              # fake TMDB and OpenSubtitles, to develop without keys
ALUMIRA_TMDB_BASE=http://127.0.0.1:7599/3 ALUMIRA_OPENSUBTITLES_BASE=http://127.0.0.1:7599/os/api/v1 ./alumira serve -web web/dist

Packages

scripts/build.sh          # Alumira: web app + server, archives in dist/
scripts/build-worker.sh   # encoding workers (macOS, Windows, Linux), archives in dist-worker/
scripts/build-desktop.sh  # the desktop app: macOS disk image, Windows installer, in dist-desktop/
scripts/release.sh        # a release: the desktop app, macOS, Windows, Docker images for amd64 and arm64, workers, README and SHA256SUMS, in release/<version>/

The version (the date by default, VERSION=2026.10.06) is the one the server and the workers show.

Licence

Alumira is free software under the GNU Affero General Public License, version 3 or later (LICENSE file at the root of the repository). It may be used, studied, modified and shared; whoever runs a modified version for others, over a network included, must offer them its source code.

Contributions are accepted under the contributor agreement (CLA.md). "Alumira" and its logo are trademarks: a fork takes another name.

Each distribution carries LICENSE and THIRD_PARTY_LICENSES.md, the licences of the components it includes.

Documentation

The documentation is written in Markdown in docs/en and docs/fr (same files in both languages). The HTML site is generated with:

go run ./scripts/docs            # writes docs/site

The generator reports pages or sections present in one language only.