One visual shell.
Explicit system adapters.
Lucent owns shell presentation and theme tokens. System services and selected Omarchy commands provide backend behavior.
Lucent starts with the session.
The user Hyprland configuration prepends Lucent’s compatibility commands to PATH and starts lucent.service. The installed Omarchy startup callback still invokes omarchy-launch-shell, but its user-level adapter starts the same Lucent service. Systemd keeps one instance. Packaged files are untouched.
Hyprland login
→ user PATH / autostart
→ lucent.service → session.py → lucent-desktop
├─ background / bar / dock / widgets / notifications / OSD
├─ lucent-polkit.service → libpolkit-agent + native dialog
├─ lucent-idle.service → swayidle → secure lock
└─ lucent-clipboard.service → wl-paste → private history
Permission request → polkit → lucent-polkit → SessionScreen
Lock request → lock.py → lucent-lock → ext-session-lock
Theme selection → ThemePort → LucentTheme → app exportsActivation stops only the current user’s installed stock shell and its restart supervisor, after checking native readiness. It refuses to interrupt a secure lock. A desktop failure restarts Lucent; it does not silently switch visual shells. Explicit rollback restores stock startup. Read the supervisor and the installer.
Rendering and behavior
have separate owners.
| Capability | Owner | Implementation and limits |
|---|---|---|
| Bar, dock, launcher, widgets | Lucent desktop | Components describe trees; the framework lays out, animates and renders Vulkan buffers. |
| Online wallpaper catalogs | Lucent native browser | WallpaperCatalogPort → OnlineWallpapers uses Wallhaven API / Alpha Coders public pages. PaletteGenerationPort → ImagePalette extracts a dominant seed; Lucent design recipes create the semantic colors. |
| Desktop wallpaper | Lucent background surfaces | WallpaperPort → LucentWallpaper stages an immutable source copy; AssetPort → NativeAssets decodes it off the UI thread before the coordinator commits selection. Named outputs have separate background surfaces; static wallpaper selection remains shared. |
| Live wallpapers | Lucent native media and playback coordinator | WallpaperPlaybackPort → NativeVideoWallpapers validates owned MP4/WebM/GIF imports and decodes through FFmpeg libraries. The client supplies default/per-monitor policy and latest-frame delivery; Vulkan presents reusable stream textures. Single-output native playback/input/pause/restart checks pass; hardware and multi-output acceptance remain open. |
| Notifications, history, DND | Lucent | FreedesktopNotifications owns the D-Bus name. Native components render toasts and grouped durable history; versioned targets protect actions. JsonNotificationHistory owns private storage; notification shortcuts route here. |
| Palette and shell appearance | Lucent tokens + selected palette | Named semantic sets or wallpaper-derived colors → components. DesktopSettings.palette persists the full role set. |
| Application colors and mode | Lucent export → applications | ThemePort → LucentTheme → theme.py. Omarchy is a headless template exporter, never the theme authority. |
| Lock and login | Lucent clients + PAM / greetd | Secure session-lock surfaces for locking; a separate greeter process for login. Both share the selected wallpaper and semantic palette. |
| Permission prompts | Lucent UI + libpolkit-agent | A standard registered polkit agent creates a native authorization client. The trusted library/helper performs authentication. |
| Idle and sleep | swayidle + Lucent lock adapter | Headless compositor/logind integration. Stay-awake suppresses idle locking, while sleep and explicit lock handlers remain. |
| Lock recovery | Independent hyprlock | Emergency fallback if the native locker fails. Uses exported Lucent tokens and wallpaper; no stock shell is started. |
| Keybinding and nested menus | Lucent picker + installed definitions | Omarchy supplies binding/action data. lucent-menu renders the picker with the framework and returns the original selected value. |
| Audio, display and power menus | Lucent native panels and domain ports | Audio compatibility actions target the native desktop child and AudioPort adapter. Power compatibility routes now target PowerPort and the Rust child, with native UPower/profile/logind adapters and backlight controls. Display configuration uses DisplayPort and HyprlandDisplays: complete drafts, observed Apply, Keep/Revert and independent timeout/crash rollback; only Keep atomically saves the captured user monitor file. Seven real-input checks pass on one QEMU output, with exact file restoration and independently verified one-restart recovery after the intentional UI crash. Physical/multiple-output, hotplug and suspend acceptance remain open. Native output/input/application controls and silent virtual playback/capture routing are verified; physical audio hardware remains unverified. |
| Networking | Lucent native panel + NetworkManager | NetworkPort → NetworkManager owns the system-bus connection and observed state. Framework masked input, buttons and scrolling provide scans, visible/hidden joins, saved activation, targeted disconnect and confirmed deletion. Enterprise provisioning, secret-agent prompts and physical hardware validation remain open. |
| Bluetooth | Lucent native panel + BlueZ | BluetoothPort → BlueZ owns observations, explicit Agent1 conversations and native control. The Rust child owns token-based views, zeroizing input, animation and focus. Native input, virtual-controller pairing/radio controls and the rebuilt external-signal fix pass. Decline/Escape termination, unpaired Disconnect and native compatibility entrypoints pass on the virtual controllers; incoming/profile and physical acceptance remain pending; no request is automatically accepted or trusted. |
| Clipboard and emoji | Lucent picker + headless capture | Private bounded history via wl-paste; sensitivity hints are honored. Emoji data is read from the installed distribution. Selection copies/pastes after releasing focus. |
| Volume and brightness feedback | Lucent OSD | Existing backend shortcuts translate to transient native feedback, with no notification history entry or keyboard grab. |
| Tiling, splits, focus, outputs | Hyprland | The compositor manages application windows. Lucent sends requests through its compositor adapter. |
| Window corners and gaps | Lucent tokens → Hyprland | Generated user configuration supplies radius and spacing defaults. Fullscreen and explicit app rules can override them. |
| Screenshot region selection | Installed capture tools | Existing bindings retain grim/slurp and capture commands. Lucent does not implement a replacement region picker. |
| Updates, packages, storage | Arch / Omarchy backends | Existing administrative commands remain available. Replacing the shell does not replace the distribution. |
| Application tray | Lucent native StatusNotifier/DBusMenu panel | TrayPort → StatusNotifier owns watcher registration, current item lifetimes and native application menus. The SDK child renders prepared icons and explicit actions. Owned SNI/DBusMenu fixtures pass native gestures, overflow and owner-retirement checks; third-party application interoperability remains open. |
| Optional stock plugins | Unsupported | There is no stock QML plugin host. Unsupported plugin IPC fails instead of starting another shell. |
Audio, Wi-Fi, Bluetooth, power and tray have native panels. Enterprise networking, Wi-Fi QR and custom stock plugins remain outside their current coverage. Real tray applications and hardware-specific radios, audio, battery, brightness, sleep and display behavior still need acceptance. The live-wallpaper VM report establishes single-output import, changing native pixels, pause/resume, input and restart on its recorded source; the historical image-lifetime samples retain their original workload and source. The Display-binary 120-second software-Vulkan video sample records 384.82 MiB mean and 403.88 MiB peak RSS, above the 300 MiB target. The earlier Weather cohort retains its 424.12/424.15 MiB result. These different workloads are not a matched comparison. Multi-output, physical-GPU efficiency and actual presentation pacing remain open. The readiness guide separates accepted native fixtures from real application and hardware coverage.
The direction is outward.
design/tokens.json
├─ primitive palette / spacing / type / motion
└─ semantic roles → component recipes
├─ generated Rust → Lucent clients
├─ generated CSS → documentation/design system
├─ window rules → Hyprland
└─ selected semantic palette → application configuration
├─ Omarchy templates (headless, background preserved)
├─ GTK named colors + desktop color-scheme
├─ Foot / tmux colors and browser toolbar policy
└─ login palette + emergency lock configurationChoose a named palette or extract colors from a wallpaper. The component updates its semantic roles, schedules persistence of the complete palette on the settings queue and invokes ThemePort on the separate ordered theme queue. LucentTheme runs the export adapter. The standard Omarchy theme picker is replaced, and arbitrary stock theme names are rejected while the integration is active. Light/dark is only an application compatibility hint derived from the palette’s surface luminance.
The exporter calls the installed template generator with OMARCHY_THEME_HEADLESS=1 and OMARCHY_THEME_SKIP_BACKGROUND=1. It does not run theme hooks or a reverse synchronization loop. Application support differs: GTK applications may override named colors; browsers may need a reload/restart for managed toolbar colors; websites and app-specific themes remain their own content.
Exports have a first-run backup and managed CSS blocks. Failures appear as theme_error in inspection and in the theme panel. The native palette can change before an external application finishes applying its export. See the token reference and the export adapter.
Inspect the running owners.
systemctl --user status lucent.service lucent-polkit.service lucent-idle.service lucent-clipboard.service
lucent-cli inspect
hyprctl -j layers
# Explicit return to the original desktop integration
python3 scripts/lucent-setup.py rollbackRollback removes only managed blocks, restores the application theme backup, stops native desktop services and starts the installed stock shell. Native binaries and saved preferences remain. Login-manager rollback is separate. Review startup and command contracts after distribution updates; keep local process dumps, credentials and private screenshots out of Git.