← Documentation overviewDesktop integration guide / SYSTEM

One visual shell.
Explicit system adapters.

Lucent owns shell presentation and theme tokens. System services and selected Omarchy commands provide backend behavior.

01 / WHAT STARTS

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.

Active native-shell integration
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 exports

Activation 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.

02 / CURRENT RESPONSIBILITIES

Rendering and behavior
have separate owners.

CapabilityOwnerImplementation and limits
Bar, dock, launcher, widgetsLucent desktopComponents describe trees; the framework lays out, animates and renders Vulkan buffers.
Online wallpaper catalogsLucent native browserWallpaperCatalogPort → OnlineWallpapers uses Wallhaven API / Alpha Coders public pages. PaletteGenerationPort → ImagePalette extracts a dominant seed; Lucent design recipes create the semantic colors.
Desktop wallpaperLucent background surfacesWallpaperPort → 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 wallpapersLucent native media and playback coordinatorWallpaperPlaybackPort → 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, DNDLucentFreedesktopNotifications 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 appearanceLucent tokens + selected paletteNamed semantic sets or wallpaper-derived colors → components. DesktopSettings.palette persists the full role set.
Application colors and modeLucent export → applicationsThemePort → LucentTheme → theme.py. Omarchy is a headless template exporter, never the theme authority.
Lock and loginLucent clients + PAM / greetdSecure session-lock surfaces for locking; a separate greeter process for login. Both share the selected wallpaper and semantic palette.
Permission promptsLucent UI + libpolkit-agentA standard registered polkit agent creates a native authorization client. The trusted library/helper performs authentication.
Idle and sleepswayidle + Lucent lock adapterHeadless compositor/logind integration. Stay-awake suppresses idle locking, while sleep and explicit lock handlers remain.
Lock recoveryIndependent hyprlockEmergency fallback if the native locker fails. Uses exported Lucent tokens and wallpaper; no stock shell is started.
Keybinding and nested menusLucent picker + installed definitionsOmarchy supplies binding/action data. lucent-menu renders the picker with the framework and returns the original selected value.
Audio, display and power menusLucent native panels and domain portsAudio 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.
NetworkingLucent native panel + NetworkManagerNetworkPort → 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.
BluetoothLucent native panel + BlueZBluetoothPort → 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 emojiLucent picker + headless capturePrivate 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 feedbackLucent OSDExisting backend shortcuts translate to transient native feedback, with no notification history entry or keyboard grab.
Tiling, splits, focus, outputsHyprlandThe compositor manages application windows. Lucent sends requests through its compositor adapter.
Window corners and gapsLucent tokens → HyprlandGenerated user configuration supplies radius and spacing defaults. Fullscreen and explicit app rules can override them.
Screenshot region selectionInstalled capture toolsExisting bindings retain grim/slurp and capture commands. Lucent does not implement a replacement region picker.
Updates, packages, storageArch / Omarchy backendsExisting administrative commands remain available. Replacing the shell does not replace the distribution.
Application trayLucent native StatusNotifier/DBusMenu panelTrayPort → 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 pluginsUnsupportedThere 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.

03 / ONE SOURCE OF TRUTH

The direction is outward.

Omarchy consumes generated tokens; it does not send a theme back into Lucent
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 configuration

Choose 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.

05 / CHECK AND RECOVER

Inspect the running owners.

Inside the graphical guest session
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 rollback

Rollback 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.