Skip to content

Installer Script

install.sh is the umbrella installer for the full Deckery stack. It is idempotent — re-running is safe and will update components to their latest version.

What it does

  1. Clone / update sub-repos — clones makima-deckery and deckery-hud next to the deckery repo. When running from a tagged release, each sub-repo is checked out at the same tag as the main repo. If a matching tag is missing in a sub-repo, the installer exits with a clear error. See Updates for details on the release-pinning mechanism.

  2. Create the distrobox container — runs distrobox assemble create using distrobox.ini in the repo root. The container (Arch Linux) is shared by all three services. On subsequent runs this step is a no-op.

  3. Build and install Makima — delegates to makima-deckery/install.sh, which compiles the Rust binary inside the container and deploys it to ~/.local/bin/.

  4. Install Deckery HUD — delegates to deckery-hud/install.sh, which installs Python/GTK4 packages inside the container and links the systemd service.

  5. Install Deckery Tray — installs Python/GTK3 packages inside the container, links the launch script to ~/.local/bin/deckery-tray, and installs deckery-tray.service.

  6. Install the app icon and .desktop launcher — copies the icon to the hicolor icon theme and installs a .desktop file so Deckery appears in the application launcher.

  7. Copy the Steam Input config — copies desktop_neptune.vdf to Steam's controller config directory if it differs from what's already there.

  8. Link the default makima config — symlinks configs/Steam Deck.toml to ~/.config/makima/Steam Deck.toml. App-specific configs are copied once and not overwritten on subsequent runs.

Service hierarchy

Deckery-tray manages the entire stack:

deckery-tray.service   ← starts on login, owns the distrobox container
    ├── makima.service         (PartOf tray — stops and restarts with it)
    └── deckery-hud.service    (PartOf tray — stops and restarts with it)

Starting the tray starts everything. Stopping it stops everything cleanly.

Manual invocation

# First install / update — always use get.sh
bash <(curl -sSL https://raw.githubusercontent.com/Plasma-Deckery/deckery/main/get.sh)

get.sh fetches the latest release tag, checks out that tag, sets DECKERY_RELEASE_TAG, and then calls install.sh. Running install.sh directly without this env var skips release pinning and runs in development mode (sub-repos pull their latest main branch instead of a matching tag).