SeatShell is a Rust workspace that combines a Wayland session runner, a Slint shell UI, and a small D-Bus service layer around session and application behavior.
At the moment, SeatShell is best understood as four things working together:
- a session launcher that starts and supervises the desktop stack
- a shell UI that renders the desktop, panel, launcher, overview, and notifications
- a user-side launch agent that starts apps and exposes session-local information
- an admin-side discovery daemon that reports users and sessions and brokers guarded session-control actions
Version 0.1.0 uses labwc as the compositor backend for the full session path.
-
crates/seatshell-sessionStartslabwc,seatshell-admin-daemon,seatshell-user-agent, andseatshell-shell, waits for readiness on D-Bus, writes logs, and restarts recoverable child processes when possible. -
crates/seatshell-shellThe main Slint application. It owns the visible desktop experience: panel, launcher, home surface, SingleSeat Overview, command surface, and notification center. It also exposes a shell D-Bus interface for remote view toggles and notification posting. In the running session it also registersorg.freedesktop.Notifications, so desktop notifications can be mirrored into the shell notification center. -
crates/seatshell-user-agentA per-user session D-Bus service used for launching commands or desktop files in the current user context and for reporting simple session-local state such as running apps. -
crates/seatshell-admin-daemonAn admin discovery and session-control service. It currently lists users/sessions, reports policy-group information, and exposes guarded lock/logout/message/state actions. Cross-user delivery breadth and full Linux validation are still intentionally incomplete until authorization and audit design are stronger.
-
crates/seatshell-commonShared domain types such as config structures, user/session models, and core error types. -
crates/seatshell-configConfig loading and layering behavior for system and user configuration. -
crates/seatshell-protocolD-Bus bus names, object paths, and method-name constants shared across services. -
crates/seatshell-notificationsNotification models and storage logic used by the shell runtime.
The intended session flow is:
- a display manager or developer script launches
seatshell-session seatshell-sessionresolves runtime paths and initializes process logs- it starts
labwcunless running in nested--windowedmode - it starts the admin daemon, user agent, and shell
- it waits for required D-Bus names to appear before declaring startup successful
- it supervises children and attempts bounded restarts for recoverable failures
This separation keeps lifecycle control in one place instead of scattering process startup across shell UI code or compositor autostart hooks.
The shell UI is implemented in Slint under crates/seatshell-shell/src/ui/.
Important surfaces include:
-
desktop.slintThe home surface and desktop scene -
launcher.slintSearch, filtering, pinned apps, and browsing -
overview.slintThe SingleSeat Overview concept and session list -
panel.slintThe top-level shell controls and system status strip -
notification-center.slintIn-shell notification history and dismissal -
command-surface.slintA lightweight quick-action overlay -
system-center.slintQuick settings for network, sound, brightness scaffold, notifications, and sessions -
settings.slintA desktop settings scaffold for system integration work -
power-menu.slintSession and power-action surfaces.lockandsign outcan hand off to the admin daemon; restart and power-off remain scaffolds until a system power backend is connected.
Shared colors, spacing, and shape primitives are centralized in:
shell-theme.slintshell-widgets.slint
The shell's Rust main.rs acts as the orchestration layer that:
- loads config
- discovers applications
- derives desktop/launcher models
- polls clock and lightweight system status
- mirrors notification-store state into the UI
- listens for remote shell commands over D-Bus
The shell can route directly to scaffold surfaces for development and future compositor bindings:
seatshell-shell --system-centerseatshell-shell --settingsseatshell-shell --power-menu
SeatShell uses D-Bus as the seam between session components.
- bus name:
org.seatshell.Admin - object path:
/org/seatshell/Admin - current scope: discovery, policy reporting, and guarded session control
Methods currently implemented include:
ListUsersListSessionsGetPolicyGroupLockSessionLogoutSessionSendMessageGetSessionState
- bus name pattern:
org.seatshell.UserAgent.u<uid> - object path:
/org/seatshell/UserAgent - current scope: launching and local session reporting
Methods currently implemented include:
LaunchCommandLaunchDesktopFileListRunningAppsGetSessionInfo
- bus name:
org.seatshell.Shell - object path:
/org/seatshell/Shell - current scope: view toggles and notification intake
View methods include desktop, launcher, overview, notifications, system center, settings, and power-menu routing. lock and sign out can already hand off to the admin daemon; restart and power-off remain scaffold actions until a system power backend exists.
- bus name:
org.freedesktop.Notifications - object path:
/org/freedesktop/Notifications - current scope: in-session notification intake backed by SeatShell's notification center
Methods currently implemented include:
GetCapabilitiesGetServerInformationNotifyCloseNotification
SeatShell treats the overview and future cross-user actions as privileged-shell territory, not ordinary launcher behavior.
That means:
- privileged actions should not bypass user agents
- read-only discovery can ship earlier than mutation
- previews, lock/logout controls, and cross-user launch must be authorization-aware
- audit logging matters before admin controls become real
Current implementation note:
- same-user lock/logout and current-session message delivery are wired
- audit logging is written under the SeatShell runtime log directory
- cross-user messaging, previews, and full Linux authorization validation remain incomplete
See docs/SECURITY.md for the current guardrails.
-
scripts/run-seatshell.shConvenience runner for dry-run, nested, and full-session development paths -
scripts/install-seatshell.shLocal-prefix installer for binaries, session metadata, and launch helpers -
scripts/validate-seathell-install.shInstall-tree validation for generated artifacts -
scripts/validate-display-manager-session.shSession-entry and launcher validation for display-manager scenarios -
resources/labwc/labwcsession resources such as environment, menu, and autostart files -
resources/sessions/seatshell.desktopWayland session entry
The next architecture-level improvements that would raise project quality are:
- real display-manager startup validation on a Linux host or VM
- stronger integration tests around D-Bus and session startup
- clearer desktop-state ownership as interactions move from mock objects to real ones
- portal, polkit, and login-session integration before privileged overview actions ship