---
title: "Installation — DemoStage docs | UniverLab"
source: "https://univerlab.org/demostage/docs/installation/"
---

[← DemoStage](/demostage/)Documentation

# Installation

Last updated 2026 · Sol 273 · 14:37 UTC (2026-09-30T14:37Z)

DemoStage ships a single binary, `demo`.

## One-line installer

    curl -fsSL https://install.univerlab.org/demostage | sh

## With cargo

    cargo install demo-stage

## From source

    git clone https://github.com/UniverLab/demo-stage
    cd demo-stage
    cargo install --path .

## Self-update

If you installed the `demo` binary yourself (installer script or a GitHub release archive), it updates itself — only when you ask:

    demo update           # asks first; the default answer is no
    demo update --check   # exit 0 = current, exit 1 = a newer stable release exists, exit 2 = the check could not be completed

There is **no background update check**: `demo` only contacts GitHub when you run `demo update`. The swap replaces just the binary — your `demo.toml` scores, recordings and capture sources are untouched.

A binary installed with **cargo** is owned by cargo, so `demo update` refuses and tells you to run:

    cargo install --force demo-stage

## Optional external tools

`gif` works with **no external dependencies**.

*   **`mp4`** → [ffmpeg](https://ffmpeg.org/). You don’t have to install it: the first `mp4` export **auto-downloads a managed static ffmpeg** (tectonic-style) into a cache and reuses it. A system ffmpeg on your `PATH` is used if present.
*   **browser panes** (`demo open`, composited into `gif`/`mp4`) → Chromium/Chrome. A system browser is used if present, otherwise a managed one is fetched.

Run **`demo doctor`** to check all of this and get platform-specific fixes (`demo doctor --fix` installs them on apt-based Linux). One gotcha it flags: on Ubuntu/WSL the default Chromium is a **snap**, whose sandbox blocks the debug port the automation needs — install a non-snap Google Chrome (picked automatically), or just run `demo doctor --fix`.

If a download can’t run (offline), `demo export` fails with a clear message; the pure-Rust targets keep working regardless.