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.carrotin 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-configon 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.