← Otto User GuideGetting Started

Installing Otto, launching it on your hardware, and the handful of things worth checking on first run.

Installing

Each block below installs the latest release. Copy it as it is: there is no version to fill in and the package manager pulls in the dependencies. Packages are built for x86_64 and need Ubuntu 24.04 or newer, Debian 13 or newer, Fedora 41 or newer, or Arch; nightly builds too.

Debian / Ubuntu

curl -fLO https://github.com/nongio/otto/releases/latest/download/otto-amd64.deb
sudo apt install ./otto-amd64.deb

Fedora / RHEL

sudo dnf install https://github.com/nongio/otto/releases/latest/download/otto-x86_64.rpm

Arch Linux

curl -fsSLO https://github.com/nongio/otto/releases/latest/download/PKGBUILD
makepkg -si

makepkg fetches the release tarball itself and checks it against the checksum in the PKGBUILD, which each release pins. If you already downloaded it, drop the PKGBUILD next to it and it will be used without downloading again.

On Debian, Ubuntu and Fedora the package manager also installs the recommended extras: the GStreamer plugins for video in Peek and remote desktop, and polkit. On Arch, the GStreamer plugins, the desktop portal and file search are optional dependencies; to get the full set:

sudo pacman -S --needed --asdeps xdg-desktop-portal localsearch gst-plugins-base gst-plugins-good gst-plugins-bad gst-libav gst-plugin-pipewire

Add vulkan-intel or vulkan-radeon for the Vulkan renderer on your GPU.

Once it is installed, Otto appears in your login manager’s session menu. Pick it there and log in, then run through the first-run checklist.

Nightly builds

Every commit to main is packaged as a nightly build. It is what is being worked on rather than what has been tested, so expect rough edges and keep a release installed if you need the machine to work.

# Debian / Ubuntu
curl -fLO https://github.com/nongio/otto/releases/download/nightly/otto-nightly-amd64.deb
sudo apt install ./otto-nightly-amd64.deb

# Fedora / RHEL
sudo dnf install https://github.com/nongio/otto/releases/download/nightly/otto-nightly-x86_64.rpm

# Arch Linux
curl -fLO https://github.com/nongio/otto/releases/download/nightly/PKGBUILD-nightly-bin
makepkg -p PKGBUILD-nightly-bin -si

The URLs never change, so running the same commands again is how you update. Each nightly is versioned as the release it was built from plus the commits since (1.4.1+nightly.r566.gcb851c3, say), so it installs over that release and the next nightly installs over it; PKGBUILD-nightly-bin is pinned to the night’s tarball, so on Arch it fetches the new one rather than reusing one downloaded before. The nightly package replaces otto-bin on Arch.

Going back to a release is a downgrade, which the package manager wants told: sudo apt install --allow-downgrades ./otto-amd64.deb, sudo dnf downgrade ./otto-x86_64.rpm, or makepkg -si from the release PKGBUILD above on Arch.

Building from source

git clone https://github.com/nongio/otto
cd otto
cargo build --release --workspace --exclude otto-rdp
cp otto_config.example.toml otto_config.toml
PATH="$PWD/target/release:$PATH" target/release/otto --winit

Otto starts its top bar, dynamic island, file manager and Settings as separate programs, by name, through PATH. A build leaves them in target/release, which is not on your PATH. The last line puts that directory first on PATH for this one run, so Otto finds what you just built. Without --workspace, cargo build only builds otto itself. The copied otto_config.toml is read from the working directory as a local override, and its [[exec_once]] entries autostart the top bar and island; a source build has no /etc/otto/config.toml. Leave --winit off to choose the backend automatically (see Launching). For a real session, copy the binaries somewhere on your PATH, such as ~/.local/bin.

You need libwayland, libxkbcommon, libudev, libinput, libgbm and libseat; the full list, with the Debian/Ubuntu install line, is under Prerequisites. Add xwayland if you want to run X11 applications. Otto runs without it: build with --no-default-features --features "egl,winit,udev,renderer_sync" to leave XWayland support out, and X11-only applications will not start. On Arch, OTTO_XWAYLAND=0 makepkg -p PKGBUILD-git -si does the same for the package. Minimum supported Rust version is 1.87.0 for the compositor itself; building the whole workspace (otto-rdp pulls in GStreamer) needs 1.96.0.

What gets installed

BinaryRole
ottoThe compositor itself
otto-barTop bar: clock, tray, application menus
otto-islandsDynamic island: notifications, activities, dialogs
otto-lockScreen locker
otto-greeterLogin screen client for greetd
otto-rdpRemote desktop bridge
xdg-desktop-portal-ottoScreen sharing portal backend

Packages also install /etc/otto/config.toml (a copy of otto_config.example.toml), a wayland-sessions entry so Otto appears in your display manager, the portal service files, and (on Arch and Fedora) the PAM service for otto-lock.

Launching

After installing, “Otto” appears in the session list of GDM, SDDM, LightDM and friends. Pick it and log in.

To start it by hand:

otto                # auto-detects the backend

Otto chooses --winit when WAYLAND_DISPLAY is set (it runs as a window inside your Wayland session), and --tty-udev otherwise. It does not look for X11: on an X11 session pass --winit explicitly, or Otto tries to take over the display from your running desktop.

Backends

FlagUse
--tty-udevBare metal: DRM/KMS + libinput. The real session. Needs logind/seatd, or root.
--winitRuns as a window inside another Wayland or X11 session. Best for trying Otto out.
--x11Runs as an X11 client. Basic and not actively maintained.
--headlessNo display output; used by the test harness.

Other flags

FlagEffect
--loginRun as a greeter host; see Login Greeter
--probePrint the connectors, resolutions and refresh rates Otto can see, then exit
--systemd-notifySend READY=1 and activate graphical-session.target (for Type=notify user units)
--version, --helpAs expected

--login and --systemd-notify are orthogonal to the backend flag and can be combined with it.

Use --probe first if you are writing display profiles — it tells you the exact connector names (eDP-1, HDMI-A-1, …) and modes to put in your config.

First-run checklist

Otto ships lean: the top bar and the dynamic island are separate programs, and nothing is started for you unless you ask. A useful starting configuration in ~/.config/otto/config.toml:

[[exec_once]]
cmd = "otto-bar"

[[exec_once]]
cmd = "otto-islands"

See Autostart for XDG autostart and systemd integration.

Then, in rough order of how much you will miss them:

  1. Keyboard shortcuts. The shipped /etc/otto/config.toml defines them. If you write your own config from scratch, Otto starts with no bindings at all. See Keyboard Shortcuts.
  2. Screen sharing. This needs xdg-desktop-portal installed and a portals.conf pointing at Otto. See Screen Sharing.
  3. Screen locking. This needs /etc/pam.d/otto-lock. Debian and Ubuntu users must install it manually. See Lock Screen.
  4. Lid and power button. Otto handles these itself, which requires HandleLidSwitch=ignore and HandlePowerKey=ignore in logind.conf. See Power Management.
  5. Clipboard persistence. Wayland loses clipboard contents when the source app exits. See Clipboard.

Quitting

Logo+Q and Ctrl+Alt+Backspace always quit Otto. These two are wired into the compositor ahead of the config file and cannot be rebound or removed, so there is always a way out of a session whose config is broken.

Where to go next

Take the Desktop Tour to learn what everything on screen is, then Configuration to start making it yours.