Installation
Credenza runs on anything that runs Docker, or directly on a Linux machine with systemd. Both installs are the same release with the same version numbers, so you can pick whichever suits the machine and switch later.
| Docker Compose | Linux package | |
|---|---|---|
| Runs on | Anything with Docker and Compose — a NAS, a home server, a VPS | Debian 12+, Ubuntu 22.04+, Fedora, RHEL 9+ and its rebuilds, or any other glibc Linux with systemd |
| Architectures | x86-64, ARM64 | x86-64, ARM64 |
| Database | A second container, already set up | Set up for you by credenza-setup, in Docker or in the machine’s own PostgreSQL |
| ffmpeg | Included in the image | A dependency of the .deb and .rpm; install it yourself with the tarball |
| Upgrades | docker compose pull |
Run the install command again, or your package manager |
Windows and macOS installers are coming soon.
What Credenza needs
Section titled “What Credenza needs”- A PostgreSQL database with three extensions — pgmq (the background job queue), pg_search (search) and pgvector (which pg_search depends on). No distribution ships that combination, so both install methods provide it for you: Compose runs a ready-made Postgres image, and the Linux installer either runs the same image in Docker or adds the extensions to a PostgreSQL you already have.
- ffmpeg, which Credenza uses to read your files and to transcode anything a device cannot play
directly. The Docker image carries its own; the
.deband.rpmpackages pull in your distribution’s, and the tarball expects you to install it (and ICU, if your system lacks it). - Read access to your media, and write access if you want Credenza to save its small
.credenza.jsonmatch files beside your media when you correct a match. It writes nothing else into your media folders.
The server listens on port 8080. Once it is running, open http://<your-server>:8080 in a
browser and it walks you through first-run setup.
Docker Compose
Section titled “Docker Compose”The server and its database run as two containers.
-
Make a folder for Credenza and save this as
docker-compose.ymlinside it.docker-compose.yml services:credenza:image: credenza/credenza:${CREDENZA_VERSION:-latest}restart: unless-stoppeduser: "${PUID:?set PUID in .env}:${PGID:?set PGID in .env}"ports:- "8080:8080"environment:HOME: /dataMediaServer__Database__ConnectionString: >-Host=postgres;Database=credenza;Username=credenza;Password=${POSTGRES_PASSWORD:?set POSTGRES_PASSWORD in .env}volumes:- ./data/credenza:/data# Your media, at the same path on both sides:# it is the path you give Credenza when you add a library.- /srv/media:/srv/mediadepends_on:postgres:condition: service_healthypostgres:image: credenza/postgres:18-pgmq1.12.0-pgsearch0.25.3restart: unless-stoppeduser: "${PUID:?set PUID in .env}:${PGID:?set PGID in .env}"environment:POSTGRES_DB: credenzaPOSTGRES_USER: credenzaPOSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?set POSTGRES_PASSWORD in .env}volumes:- ./data/postgres:/var/lib/postgresqlhealthcheck:test: ["CMD-SHELL", "pg_isready -h 127.0.0.1 -U credenza -d credenza"]interval: 5stimeout: 3sretries: 30Change
/srv/media:/srv/mediato wherever your films, shows and games are. Keep the path the same on both sides of the colon: the path inside the container is the one you type when you add a library, so mounting/srv/mediaat/srv/mediameans the folder is called the same thing everywhere. Add one line per folder if your media is in several places. -
In the same folder, create an
.envfile with a database password and the account the containers should run as, make the data folders, and start everything:Terminal window echo "POSTGRES_PASSWORD=$(openssl rand -hex 24)" > .envecho "PUID=$(id -u)" >> .envecho "PGID=$(id -g)" >> .envmkdir -p data/credenza data/postgresdocker compose up -d -
Visit port 8080 on the machine. The server asks for its administrator, its first libraries and a TMDB token — see First run.
Choosing PUID and PGID
Section titled “Choosing PUID and PGID”Both containers run as the user and group ids in PUID and PGID. The commands above use your own
account. If your media belongs to a different account — a media user, or a network share mounted
with a fixed owner — set them to that account’s ids instead, so Credenza can read the files and
write match files beside them.
Where your data lives
Section titled “Where your data lives”Everything Credenza keeps is in the two folders you created beside docker-compose.yml:
| Folder | What is in it |
|---|---|
data/credenza |
The artwork cache, game saves, the server’s log files and the keys that keep people signed in |
data/postgres |
The database: your libraries, accounts, watch history and every setting made in the browser |
Your media is never copied into either. Transcoding scratch files stay inside the container and are cleaned up as streams end. See Updating for what to back up.
Transcoding on the GPU
Section titled “Transcoding on the GPU”This is optional. Credenza transcodes on the CPU out of the box, and uses a GPU only when it can
reach one. To give it one, save the matching file below as docker-compose.override.yml next to
docker-compose.yml and run docker compose up -d again. Settings → Server → Transcoding then shows
which encoder it chose. See Hardware acceleration for how it
decides.
Needs the NVIDIA Container Toolkit on the host. This also works on Windows under Docker Desktop.
services: credenza: environment: NVIDIA_DRIVER_CAPABILITIES: compute,utility,video deploy: resources: reservations: devices: - driver: nvidia count: all capabilities: [gpu, video]Linux only. The image already carries the VA-API drivers for AMD and Intel graphics. First add the
render device’s group to .env:
echo "RENDER_GID=$(stat -c %g /dev/dri/renderD128)" >> .envThen save the override file:
services: credenza: devices: - /dev/dri:/dev/dri group_add: - "${RENDER_GID:?set RENDER_GID in .env}"One command installs Credenza as a systemd service:
curl -fsSL https://credenza.tv/install.sh | shYou can read the script before running it. It:
- Installs the right package for your system — the
.debon Debian and Ubuntu, the.rpmon Fedora and RHEL, or a tarball on anything else with systemd — after checking it against the release’s checksums. Each package carries its own runtime, so nothing needs installing from Microsoft or compiling. - Asks where the database should run, by starting
sudo credenza-setup:- Docker (recommended) — a container with everything Credenza needs. If Docker is not installed, it offers to install it. Nothing else on the machine changes.
- This machine’s PostgreSQL — it adds the three extensions to the PostgreSQL already running, or installs one first. This restarts PostgreSQL, which briefly disconnects anything else using it, and the script tells you before it asks. This option exists only where pg_search is published: Debian 12 and 13, Ubuntu 24.04 and 26.04, and RHEL 9 and 10 and their rebuilds, with PostgreSQL 15 to 18. Fedora, Ubuntu 22.04, Arch and anything else use Docker.
- Starts the server on port 8080. Open it in a browser to finish setting up.
It asks before installing or restarting anything, and running sudo credenza-setup again later is
safe — use it to switch between the two database options or after upgrading PostgreSQL.
Unattended installs
Section titled “Unattended installs”To answer the database question up front — for a script, or a machine you are not sitting at:
curl -fsSL https://credenza.tv/install.sh | sh -s -- --database docker --yesOther options:
| Option | What it does |
|---|---|
CREDENZA_VERSION=0.1.3 before sh |
Install that version rather than the latest |
--no-setup |
Install the package only; run sudo credenza-setup yourself afterwards |
--database docker or --database system |
Choose where the database runs without being asked |
--yes |
Agree to anything setup would otherwise ask about |
Without a terminal, setup never guesses: it needs --database, and anything it would ask about
needs --yes.
Fedora, RHEL, Rocky and Alma
Section titled “Fedora, RHEL, Rocky and Alma”Fedora’s default ffmpeg has no H.264 encoder, so anything that needs transcoding will not play. Swap it for RPM Fusion’s full build:
sudo dnf swap ffmpeg-free ffmpeg --allowerasingRHEL, Rocky and Alma ship no ffmpeg at all. The installer stops and says so; enable EPEL and RPM Fusion, then run it again:
sudo dnf install epel-releasesudo dnf install https://mirrors.rpmfusion.org/free/el/rpmfusion-free-release-$(rpm -E %rhel).noarch.rpmsudo crb enableLetting the service read your media
Section titled “Letting the service read your media”The server runs as a credenza system user, which needs to read your library folders — and write to
them if you want match files saved beside your media. Usually that means adding it to the group
that owns them:
sudo usermod -aG media credenzasudo systemctl restart credenzaReplace media with whichever group owns your files. For hardware transcoding, the installer has
already added the credenza user to the video and render groups where they exist; install your
GPU’s VA-API driver (such as mesa-va-drivers or intel-media-va-driver) or NVIDIA’s driver as you
would for ffmpeg itself.
Where things are
Section titled “Where things are”| Path | What |
|---|---|
/etc/credenza/credenza.env |
Configuration — see Configuration. Upgrades never overwrite it |
/var/lib/credenza/ |
Game saves, the artwork cache and the keys that keep people signed in |
/var/log/credenza/ |
The server’s log files, also readable at Settings → Server → Logs |
/var/cache/credenza/ |
Transcoding scratch space; safe to delete while the server is stopped |
Docker volume credenza-postgres |
The database, if it runs in Docker |
/usr/lib/credenza/ (tarball: /opt/credenza/) |
The application itself |
journalctl -u credenza shows the log as it happens.
A PostgreSQL on another machine
Section titled “A PostgreSQL on another machine”If you want the database somewhere else entirely, it needs PostgreSQL 15 to 18 with pgmq, pg_search
and pgvector installed and pg_search in shared_preload_libraries. Create a credenza role and
database, then, as a superuser in that database:
CREATE EXTENSION pgmq CASCADE;CREATE EXTENSION pg_search CASCADE;GRANT USAGE, CREATE ON SCHEMA pgmq TO credenza;GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA pgmq TO credenza;GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA pgmq TO credenza;Without the three grants the server starts, but background work — scanning included — never runs.
Put the connection string in /etc/credenza/credenza.env and start the service with
sudo systemctl enable --now credenza.
Removing Credenza
Section titled “Removing Credenza”apt remove, dnf remove, or the tarball’s uninstall.sh stops the service and deletes the
application. It deliberately leaves /etc/credenza, /var/lib/credenza, the credenza user
and the credenza-postgres volume, because game saves and the library database cannot be rebuilt.
To remove those too:
sudo rm -rf /var/lib/credenza /var/log/credenza /var/cache/credenza /etc/credenzasudo docker volume rm credenza-postgressudo userdel credenza