SeatShell is a Rust/Slint Wayland shell focused on a built-in SingleSeat Overview for managing local user sessions.
Version 1.0.0 uses labwc as the compositor backend. The shell UI starts as normal Slint windows, while the service layer exposes D-Bus interfaces for user-agent launch requests and read-only admin discovery.
SeatShell is not trying to beat GNOME or KDE at feature count. Its chance to become a memorable project is to be smaller, clearer, and more opinionated:
- a recognizable desktop shell with strong visual authorship
- a trustworthy local-session overview instead of a generic control center
- a keyboard-friendly launcher and daily workflow
- a session/runtime stack that is understandable to contributors
The current architecture is a compact Rust workspace:
seatshell-sessionsupervises the session lifecycleseatshell-shellrenders the UI in Slintseatshell-user-agentlaunches apps in the user sessionseatshell-admin-daemonexposes read-only session discovery
For more detail, see docs/ARCHITECTURE.md, ROADMAP.md, and CONTRIBUTING.md.
This repository is at a first working release:
- Cargo workspace packages are versioned at 1.0.0.
- Shared config, session, protocol, and notification models build.
- Slint shell window renders a desktop surface, panel, launcher, and SingleSeat Overview.
- Desktop and launcher views expose clickable application rows with search/filter support, quick-launch picks, and recent-app recall.
- Launcher discovers
.desktopfiles and launches parsed commands without brittle whitespace splitting. - Launcher parses comment/category metadata so the shell can present richer desktop-friendly app cards.
- Overview is fed from runtime session data through the admin D-Bus service, with a local fallback for development.
- The running shell owns
org.seatshell.Shell, so labwc hotkeys and menu actions control the existing shell instead of spawning extra overview/launcher windows. - Configured panel position is applied, so
panel.position = "top"moves the panel to the top edge. seatshell-user-agentregisters launch and session-info D-Bus methods.seatshell-admin-daemonregisters read-onlyListUsers,ListSessions, and policy-group D-Bus methods.seatshell-sessionstarts labwc, the admin daemon, the user agent, and the shell from colocated binaries or an installed prefix.- Session logs are written under
~/.local/state/seatshell/logsby default. scripts/run-seatshell.shnow launches a standalone labwc-backed session by default and supports--windowedfor nested desktop testing.- labwc/session resources are checked in.
cargo check
cargo run -p seatshell-shell
cargo run -p seatshell-session -- --dry-run
cargo run -p seatshell-session -- --dev-dry-run
cargo run -p seatshell-admin-daemon
cargo run -p seatshell-user-agent
cargo run -p seatshell-shell -- --windowed
scripts/run-seatshell.sh --dry-runContributor docs:
For a first pass on macOS, stay in the windowed shell path instead of trying to boot the full Wayland session:
cargo run -p seatshell-shell -- --windowedThat path is the best place to validate the shell UI on macOS:
- inspect the panel, desktop, launcher, overview, command surface, and notifications
- resize the window to catch spacing or clipping issues
- confirm launcher search, pinned apps, recents, and overview keyboard navigation still behave correctly
If Cargo fails during linking on macOS, accept the Xcode license first:
sudo xcodebuild -licenseFor the first real Linux session pass, use the session runner or nested script:
scripts/run-seatshell.sh --windowed
scripts/run-seatshell.shWith a shell already running, control that process through D-Bus:
seatshell-shell --toggle-launcher
seatshell-shell --toggle-overview
seatshell-shell --show-desktopBuild and run the desktop shell from release binaries:
cargo build --workspace --release
scripts/run-seatshell.sh
scripts/run-seatshell.sh --windowedInstall the release binaries, application launchers, and SeatShell session file into ~/.local:
scripts/install-seatshell.shInstall into a temporary or custom prefix for validation:
scripts/install-seatshell.sh --debug --prefix /tmp/seatshell-install
PREFIX=/tmp/seatshell-install scripts/validate-seathell-install.sh
PREFIX=/tmp/seatshell-install scripts/validate-display-manager-session.shThe installer now generates:
- an absolute-path Wayland session file under
share/wayland-sessions - a
seatshell-startlauncher that exports SeatShell runtime/share paths - a login-session path that can use
dbus-run-sessionwhen needed - a display-manager-friendly session entry with
TryExecand LightDM desktop naming
To validate a real login-manager install on the host:
PREFIX=/usr/local scripts/validate-display-manager-session.sh --strict-hostThat host validator detects the active display manager, checks whether seatshell.desktop is installed in a display-manager-visible Wayland session directory, validates the generated launcher, and runs it with --dry-run.
The default config is loaded from /etc/seatshell/config.toml, then ~/.config/seatshell/config.toml when those files exist. Missing files are fine; built-in defaults are used, and partial user config now layers cleanly over system defaults instead of replacing them wholesale.
Runtime state defaults to ~/.local/state/seatshell, with per-process logs under ~/.local/state/seatshell/logs. You can override those with SEATSHELL_STATE_DIR and SEATSHELL_LOG_DIR.
On macOS, Rust builds that link binaries require the Xcode license to be accepted first. If linking fails with an SDK/license error, run sudo xcodebuild -license in Terminal and then rerun the Cargo command.