Skip to content
nexdeck
Install

One container, and then look around

No database beside it, no cache, no build step. The first start creates the administrator and offers a board with invented, moving data. So you can see all of it before you type a single key.

An infrastructure board with hosts, containers, disks and reachability
Starting

Three lines

Terminal
mkdir nexdeck && cd nexdeck
curl -fsSL https://raw.githubusercontent.com/DerKezorm/nexdeck/main/docker-compose.yml -o docker-compose.yml
docker compose up -d

nexdeck is then at http://your-host:5175. The image comes from ghcr.io/derkezorm/nexdeck.

1 Create the administrator On the first call. Name, password, done. An e-mail address is worth adding, otherwise there is no way back from a forgotten password.
2 Look around Take the board with invented data that is offered. It moves like a real one and shows what the cards can do.
3 Connect something Create an integration under System: address, key, test. Its cards then stand in the library.
4 Drop and drag Pull cards onto the board, size them, set them up. The preview shows every change straight away.
Settings

Environment variables

All of them, with their defaults, are in .env.example in the repository. These are the ones you actually need.

VariableDefaultPurpose
NEXDECK_SECRET_KEYgeneratedEncrypts stored API keys and signs sessions. Set it once and keep it.
NEXDECK_PUBLIC_URLemptyHow browsers reach nexdeck. Needed for OpenID Connect and Web Push.
NEXDECK_URL_BASEemptySub path when nexdeck runs below one, e.g. /deck.
NEXDECK_DEMO0Start every card with invented data.
NEXDECK_LOG_LEVELINFODEBUG logs every adapter request.
PUID, PGID1000Owner of the files in the data volume.
DOCKER_GIDdetectedGroup of the mounted Docker socket, when detection fails.

The Docker socket is already mounted in the compose file. That is how you see this host's containers, restart them and follow their logs. On a Synology the same socket serves Container Manager. If you would rather not, take the line out; everything else keeps working.

Reverse proxy

One line everybody has to remember

Inside, nexdeck speaks plain HTTP on port 8000 and trusts X-Forwarded-Proto when it comes to its cookies.

The data arrives over Server-Sent Events, and no proxy that buffers will pass those through. Traefik and Caddy need nothing. nginx needs one line:

nginx
location / {
    proxy_pass http://nexdeck:8000;
    # Without this line the cards stand still.
    proxy_buffering off;
}

How you notice

The page loads, the cards fill in once, and after that nothing moves. It looks as if nexdeck were broken, and it is the proxy.

Two more traps

  • A broadcast stays inside the container's network. Wake-on-LAN only reaches machines on the same network.
  • Set the secret key before the first integration is created. Replace it later and the stored credentials can no longer be read.
Next

And when something goes wrong

The documentation

Integrations and widgets, Docker labels, boards as files, kiosk displays and the API live in the repository under docs/.

Report an issue

Most useful with the version of the service involved. For an integration with a beta badge, that is exactly the missing proof.

Build on it

Backend Python with FastAPI, interface React and Vite. An adapter is one file, and its cards need no frontend code.