← 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
| Binary | Role |
|---|---|
otto | The compositor itself |
otto-bar | Top bar: clock, tray, application menus |
otto-islands | Dynamic island: notifications, activities, dialogs |
otto-lock | Screen locker |
otto-greeter | Login screen client for greetd |
otto-rdp | Remote desktop bridge |
xdg-desktop-portal-otto | Screen 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
| Flag | Use |
|---|---|
--tty-udev | Bare metal: DRM/KMS + libinput. The real session. Needs logind/seatd, or root. |
--winit | Runs as a window inside another Wayland or X11 session. Best for trying Otto out. |
--x11 | Runs as an X11 client. Basic and not actively maintained. |
--headless | No display output; used by the test harness. |
Other flags
| Flag | Effect |
|---|---|
--login | Run as a greeter host; see Login Greeter |
--probe | Print the connectors, resolutions and refresh rates Otto can see, then exit |
--systemd-notify | Send READY=1 and activate graphical-session.target (for Type=notify user units) |
--version, --help | As 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:
- Keyboard shortcuts. The shipped
/etc/otto/config.tomldefines them. If you write your own config from scratch, Otto starts with no bindings at all. See Keyboard Shortcuts. - Screen sharing. This needs
xdg-desktop-portalinstalled and aportals.confpointing at Otto. See Screen Sharing. - Screen locking. This needs
/etc/pam.d/otto-lock. Debian and Ubuntu users must install it manually. See Lock Screen. - Lid and power button. Otto handles these itself, which requires
HandleLidSwitch=ignoreandHandlePowerKey=ignoreinlogind.conf. See Power Management. - 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.