strand

Install

Strand has no packaged release yet. There is no distribution package, no tagged version and no crate on crates.io. You build it from a checkout of the repository, or take the prebuilt binaries GitHub keeps.

What you need to build it

  • Rust 1.97 or newer. The workspace sets rust-version = "1.97".
  • The development files of fontconfig, xkbcommon, Wayland, PipeWire (with SPA) and PAM, found through pkg-config, plus clang and libclang. On Ubuntu 24.04:
sudo apt-get install pkg-config libfontconfig1-dev libxkbcommon-dev libwayland-dev \
  libpipewire-0.3-dev libspa-0.2-dev clang libclang-dev libpam0g-dev

Other distributions name the packages differently.

Build it

git clone https://github.com/jakeb-grant/strand
cd strand
cargo build --release -p strand -p strand-auth

This writes two programs into target/release/:

  • strand, the shell and its command line;
  • strand-auth, the small helper the lock screen checks passwords with. It is the only program in the workspace that links libpam.

Put both in the same directory on your PATH, for example:

mkdir -p ~/.local/bin
cp target/release/strand target/release/strand-auth ~/.local/bin/
strand --version

strand --version prints strand 0.0.0.

Strand looks for strand-auth beside its own executable, then in /usr/libexec/strand, /usr/lib/strand and /usr/local/libexec/strand, and nowhere else: never on your PATH, since it is the program your password is handed to. When a config has a lock and there is no helper, strand run warns at start, or at the reload that adds the lock, that the lock would have no way to unlock, and strand check reports an error for the config. Both say where to put the helper: beside the strand that is running, with cargo install --locked --path crates/strand-auth --root <prefix> when that strand is in <prefix>/bin, else by copying target/release/strand-auth into its directory. A shell with no lock screen runs without the helper and says nothing about it.

Without the GPU backend

The GPU backend is a default feature. To build without it:

cargo build --release -p strand --no-default-features

That build links no wgpu, vello_gpu or naga, and draws everything on the CPU.

The other tools

Two more programs live in the same repository, outside the shell:

  • strand-dev, the language server and the inspector: cargo build --release -p strand-dev. See Editor setup and the inspector.
  • strand-eval, the sandbox that replays a glitch report: cargo build --release --manifest-path eval/Cargo.toml. It is a workspace of its own, so it lands in eval/target/release/. See Reporting a glitch.

Prebuilt binaries

Every build of the repository on GitHub keeps its release binaries for 30 days, as a workflow artifact named strand-release-binaries: strand-gpu, the default build, and strand-cpu, the build without the GPU backend. Both are built on Ubuntu 24.04. To use one, download the artifact from a green run's page under the repository's Actions tab, rename strand-gpu to strand, make it executable and put it on your PATH.

The artifact holds no strand-auth, strand-dev or strand-eval. A lock screen still needs the helper built from source.

What the compositor needs

Strand runs on a Wayland compositor that offers wl_compositor, wl_shm and zwlr_layer_shell_v1 (layer shell). Without one of them, strand run stops at start and names the one that is missing: "the compositor does not offer zwlr_layer_shell_v1".

Some features need one more protocol:

ProtocolNeeded forWithout it
xdg_wm_basewindow surfaces and popupswindows and popups are not shown
ext_session_lock_manager_v1the lock surfacea lock cannot lock the session, and strand run warns at start
ext_background_effect_manager_v1, with blurcompositor blur behind blurblur draws its tint fallback, and Strand says why once

Hyprland blurs layer surfaces through its own layer rules instead: strand compositor-rules prints the rules for your config, to paste into your Hyprland config. Strand never applies them itself. They are Lua (hl.layer_rule) by default, and --classic prints hyprlang layerrule lines for an older config.

Strand also uses these when the compositor offers them: wp_viewporter, wp_fractional_scale_manager_v1, wp_presentation, wp_alpha_modifier_v1, wp_single_pixel_buffer_manager_v1, zwp_idle_inhibit_manager_v1, wl_data_device_manager and xdg_activation_v1. strand report lists every global your compositor offers, with its version.

The workspaces, windows and wm services read sway's, Hyprland's and niri's own IPC. On a compositor without one of those adapters, the windows and workspaces come from the standard protocols: ext-foreign-toplevel-list-v1, zwlr_foreign_toplevel_management_v1 and ext-workspace-v1.

Compositors

Strand is tested on sway, Hyprland, niri and labwc on every change.

Next: Running a shell.

This page on GitHubThis page as Markdownllms.txt