contents

Installation#

Every channel ships the same payload, written by carrot install: the carrot and burrow binaries, a display-manager session entry, and the screencast portal registration. Install from your channel, log out, and pick Carrot at the login screen.

Arch (AUR)#

yay -S carrot

The package builds from source; rustup pulls the pinned nightly toolchain for you.

Fedora (COPR)#

sudo dnf copr enable flammablebunny/carrot
sudo dnf install carrot

Debian / Ubuntu#

Grab the .deb from the GitHub release and:

sudo apt install ./carrot_0.1.0~beta-1_amd64.deb

NixOS#

carrot is not in nixpkgs yet, so there is no pkgs.carrot; it ships as a flake with a NixOS module. Add the input, import the module, flip it on:

# flake.nix
inputs.carrot.url = "github:carrot-wm/carrot";

# configuration.nix
{ inputs, ... }: {
  imports = [ inputs.carrot.nixosModules.default ];
  programs.carrot.enable = true;
}

programs.carrot wires everything: the session entry at the display manager, the screencast portal registration, xdg-open on PATH for the apps carrot spawns, and the default font set so a bare system does not render tofu.

Home Manager has its own module, with the whole config schema as typed options:

imports = [ inputs.carrot.homeManagerModules.default ];
wayland.windowManager.carrot = {
  enable = true;
  settings = {
    layout = { mode = "scrolling"; gaps_in = 5; };
  };
};

settings mirrors the Lua schema as Nix attributes and is written to ~/.config/carrot/carrot.lua; leave it unset to manage the config file yourself.

A plain pkgs.carrot in nixpkgs waits on carrot building with stable Rust.

crates.io#

rustup toolchain install nightly-2026-06-11
cargo +nightly-2026-06-11 install carrot
sudo ~/.cargo/bin/carrot install

This one compiles on your machine. The manifest carries the static-PIE flags itself, so no RUSTFLAGS; it just needs a nightly toolchain active. cargo install puts carrot and burrow into ~/.cargo/bin, and the last line registers the session with your display manager.

From a source build#

The binary installs itself. carrot install writes everything a display manager needs:

cargo build --release
sudo ./target/x86_64-unknown-linux-gnu/release/carrot install

The default prefix is /usr/local; use --prefix /usr if your display manager does not scan /usr/local/share/wayland-sessions. --root DIR stages the whole tree into a directory without leaking it into the recorded paths, which is exactly how the distro packages above are built.

What your system needs#

carrot runs on x86_64 Linux. Beyond that:

  • A Vulkan driver (ICD) for your GPU. carrot never links the Khronos loader; it finds and loads the driver itself, checking VK_ICD_FILENAMES, then /run/opengl-driver/share/vulkan/icd.d (NixOS), /usr/share/vulkan/icd.d, and /etc/vulkan/icd.d.
  • A logind session (systemd-logind) for seat and VT handling. Without one, carrot falls back to direct device access, which covers headless and root setups.
  • The default US layout needs no XKB data at all, since a full keymap is baked into the binary. Any other layout needs xkeyboard-config on disk (see Input devices).

Building it yourself (for contributors)#

carrot builds on pinned Rust nightly (currently nightly-2026-06-11) with the rust-src component, because the static-PIE zero-C build uses -Z build-std. The repo's dev shell provides the exact toolchain, and the libc stack resolves straight from crates.io (the taproot-eyra crate and its siblings), so one clone is enough:

git clone https://github.com/carrot-wm/carrot
cd carrot
nix develop
cargo build --release

Hacking on taproot itself means checking it out as a sibling and flipping the eyra dependency in Cargo.toml to the ../taproot/eyra path noted there.

The GPU driver is C, and it needs a libc at runtime: taproot builds into libtaproot.so, carried as libc.so.6 and libm.so.6. The loader looks next to the binary, then in ../lib/carrot, and CARROT_LIBC/CARROT_LIBM override both; carrot install stages the pair into PREFIX/lib/carrot for you and warns if it cannot find them.

Next#

Head to Running carrot for the first session.