Alumira Documentation

Getting started

Alumira is a self-hosted media server for a personal collection of films and series. Each file is encoded once, ahead of time, into CMAF stems (one per video quality, audio language and subtitle); playback serves them as they are, with no transcoding, as multi-track / multi-bitrate HLS to a media-first web interface that also works with a TV remote (D-pad).

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. With network_mode: host in place of ports, the desktop apps of the network find it by themselves; otherwise its address is typed in them. Without /dev/dri (or on a NAS without a video chip), it encodes with the processor and converts nothing on the fly.

For Alumira Connect (an address on the Internet in one click), network_mode: host: Alumira asks the router to open its port and knows the machine's IPv6 address only from there.

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 moved to .alumira-trash once normalized

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; the server and token are then remembered (user configuration folder), so ./alumira-worker alone starts it next time.

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.

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. It remembers the server and the token once accepted: ./alumira-worker alone is enough afterwards. Like Alumira, it runs the FFmpeg installed on the machine (see Requirements).

A worker takes the chunks of a job whose encoder it can run for each rendition (§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. A commercial licence is available for uses that cannot meet these terms (an appliance, a closed product). 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.