A toolkit for Wayland shells. Write bars, launchers, lock screens and panels in one small typed language; save the file and the running shell follows.
Documentation · Install · Guide · Playground
bar Top {
edge: top; height: 32
split { pad: 0, 12
start { text windows.focused?.title ?? "" }
center { text clock.format("%H:%M") }
end { text pct(battery.percent) }
}
}
That file is a bar on every monitor, themed and animated. It wakes only when something it shows changes: the minute, the focused window's title, the battery.
- Changes move on springs. Change a value and its prop moves there. Spring curves are theme tokens you can retune.
- Save, and the shell follows. What you changed animates to its new value, and the rest keeps its state: an open popup, or the text typed into a launcher.
- Checked before it runs. Every name, field and type is known before the shell starts. A save that does not check leaves the last good shell running, and the check says what is wrong and where.
- Runs where you do. Strand runs on sway, Hyprland, niri and labwc, and every build is tested on all four.
Strand is young: the language may still change before 1.0. Install it for your user, or update it, with the install script (install):
curl -fsSL https://strand.jacobgrant.dev/install.sh | shIt installs the newest release from GitHub (--edge the newest build
of main) on x86_64 Linux with glibc 2.39 or newer. Elsewhere, build it
from this repository:
git clone https://github.com/jakeb-grant/strand
cd strand
cargo build --release -p strand -p strand-authdocs/development.md covers the crates, building
and the test suite. docs/design.md is the source of
truth for how Strand behaves, and
docs/decisions.md records why.
Strand is licensed under either of the Apache License, Version 2.0 or the MIT license, at your option. Unless you say otherwise, any contribution you submit for inclusion in Strand is licensed the same way, with no additional terms or conditions.