← Back to the desktopTHE HANDS-ON GUIDE

From reading
to running.

The prepared VM is the shortest route. Building on an existing Omarchy installation is the next. Here’s how to try both, and how to get back.

01 / PREPARED LAB HOST

Start one experiment.

From the repository root on the host where the lab VMs were prepared, run:

Host · open the Lucent VM
python3 vm/launch.py lucent

This starts the existing guest and opens its console. The guests appear in Virtual Machine Manager under QEMU/KVM User session. The launcher expects the local VM inventory and disks; cloning the repository alone does not create a ready-to-boot VM.

Lucid and Noctalia are separate guests. Shut down the current guest before opening the next:

Host · switch experiments
python3 vm/lab.py shutdown lucent
python3 vm/launch.py lucid
# Later, switch to the C++ comparison:
python3 vm/lab.py shutdown lucid
python3 vm/launch.py noctalia
Login and local access

Use the source Omarchy VM’s existing guest login. Credentials stay in its local login note and are not in this site or Git. SSH is loopback-only: Lucid 2241, Noctalia 2242, Lucent 2243.

Starting from scratch? Follow the repository’s OS installation and VM preparation guide. Disk selection and any destructive OS installation steps remain manual.

02 / INSIDE THE LUCENT GUEST

Take the desktop for a spin.

InputWhat happens
Super + KSearch Omarchy keybindings in the native Lucent menu; Enter runs the selected action
Super + SpaceOpen or close the Rust launcher
Tab / Shift+TabCycle launcher sections forward / backward
Type · ↑ / ↓ · EnterFind an app, select it and launch
Escape / outside clickClose the launcher
Super + Ctrl + SpaceOpen the wallpaper carousel
← / → · EnterSelect and apply a wallpaper
Launcher → WidgetsShow / hide widgets or reset positions
Drag widget backgroundMove a widget; release to save
Dock app iconLaunch the app or focus its window
Workspace pillSwitch a Hyprland workspace

A useful first five minutes

  1. Launch a terminal. Press Super + Space, search for Foot, and press Enter. It opens a real application window.
  2. Try the tiling. Open another terminal. Hyprland manages ordinary windows with the existing Omarchy bindings. Lucent’s widgets stay outside that tiling layout.
  3. Move a widget. Drag the calendar’s background and release. Restart Lucent and the position should return.
  4. Change the background. Open the wallpaper carousel, select with the arrows and press Enter. Lucent persists the choice and paints its native background surface.
  5. Explore the selectors. Toggle widgets, reset their positions, or select the light/dark palette in the launcher header.

The seven available widgets are calendar, clock, weather, media, system monitor, notes and focus timer. Notes currently support one line. The timer supports start, pause and reset; its running state is not persisted across restart.

Control it from a terminal

Guest · Lucent IPC
lucent-cli launcher toggle
lucent-cli wallpapers open
lucent-cli widgets open
lucent-cli inspect
lucent-cli quit

inspect includes geometry and frame counters, as well as the current query and note. Review that personal content before sharing output. quit stops Lucent; explicit integration rollback restores stock UI.

03 / WHO DOES WHAT?

The pieces fit at their boundaries.

What is actually custom in Lucent?

The Rust framework, renderer, native surface runtime, domain models, use cases and desktop client. The visible bar, dock, launcher, wallpaper/widget selectors, seven widgets, notifications and lock/login screens are ours. Established libraries provide Wayland bindings and GPU access.

Why does Lucent still feel like Omarchy?

It runs inside the existing Omarchy session. Hyprland still controls tiling, workspaces and app windows. Lucent owns the background, notification service and authorization UI. Headless swayidle and system services provide session behavior. Lock requests use our secure native locker with an independent token-themed emergency locker. Omarchy supplies selected backend commands and window bindings. The separate Lucent greeter runs under greetd.

Why can Aether and other apps appear in every launcher?

The desktops share the installed applications cloned from the same base VM. A launcher discovers application entries and asks the operating system to start them. An application does not have to use the shell’s UI toolkit. The same app can be launched from Lucid, Noctalia or Lucent.

Are widgets normal windows? Can they be dragged?

They belong to a Wayland bottom-layer surface, with input regions matching the interactive cards. Dragging changes a widget’s position within that surface and saves it on release. They stay below application windows and do not become tiling windows. Resizing is not implemented yet.

Does it really use Vulkan?

Yes. wgpu uses Vulkan for the native renderer, with one shared device and resource cache across surfaces. In the prepared VM the Vulkan implementation is Mesa lavapipe, which renders on the CPU. Hardware GPU performance has not been measured.

Is this a complete copy of Lucid?

It follows the reference layout, palette, typography and primary dock/launcher/selector transitions. Full feature and pixel parity are still incomplete. Tray hosting, full settings and control-center panels, per-monitor layouts and several platform features remain future work.

Where did the original Rust demo card go?

The desktop client now has four persistent surfaces plus on-demand notification and feedback surfaces. The independent hello-layer example is still available to demonstrate child components, typed effects, motion and the native renderer without the full desktop.

Guest · independent framework example
cargo run --manifest-path lucent/Cargo.toml --locked --release -p hello-layer
04 / EXISTING OMARCHY INSTALLATION

Build the native client.

The tested baseline is Omarchy 4.0.4 with Hyprland 0.56.2 and Lua configuration. These integration scripts target Omarchy; they are not a generic installer for an arbitrary Linux session.

Arch build/runtime packages: rust, pkgconf, wayland, libxkbcommon, fontconfig, pam, polkit, swayidle, hyprlock, wl-clipboard, wtype, clang, vulkan-icd-loader and a suitable Vulkan driver. Desktop adapters use native MPRIS D-Bus for media, the PulseAudio protocol for audio, networkmanager and bounded curl for weather/artwork. Headless distribution shortcuts may still use playerctl or wpctl.

Omarchy guest · build and try
cargo build --manifest-path lucent/Cargo.toml --locked --release --workspace
python3 scripts/lucent-setup.py install
systemctl --user start lucent.service

Check the running client first. Then enable its managed startup and shortcut blocks:

Omarchy guest · activate
python3 scripts/lucent-setup.py activate

Installation is per-user. Activation edits marked blocks in user bindings.lua and autostart.lua. Packaged files under /usr/share/omarchy are untouched. Activation stops the exact installed stock shell while unlocked. Native services own its visible responsibilities; explicit rollback restores stock startup and notification ownership.

05 / SETTINGS & SERVICES

Predictable state, real services.

Layout and preferences
~/.local/state/lucent/desktop.json stores versioned widget positions, visibility, pinned apps, notes and palette choice. Saves are atomic. Unsupported versions are left intact and saving is disabled until corrected.
Wallpapers
Place images in ~/Pictures/Wallpapers or ~/.config/lucent/wallpapers. Lucent snapshots and decodes a selection before committing it. The native browser also searches Wallhaven and Alpha Coders. Wallpaper only retains your colors; Wallpaper + colors extracts a semantic palette. Named palettes and current-wallpaper color extraction are available in Themes. Omarchy does not choose Lucent’s palette.
Weather
The Weather and location command opens manual coordinates, Celsius/Fahrenheit, current conditions and a three-day forecast. Preferences use normal desktop settings; the optional ~/.config/lucent/weather.json is imported only while those preferences are absent. Enabled locations refresh from Open-Meteo every 15 minutes and retain their last successful result on failure. There is no IP lookup. Keep personal location files outside Git. This Weather slice awaits its Rust, visual and native acceptance checks.
External integrations
Hyprland changes arrive through its event socket. Clock and system samples run at 1 and 5 seconds respectively. Audio, networking, Bluetooth, power and media use native observations. Only relevant changes invalidate surfaces. Click the media capsule for player selection and targeted playback controls; visible playing progress advances locally from its last native sample.
Application execution
XDG desktop entries are parsed into executable and argument arrays, with supported field codes handled explicitly. Commands are not evaluated through a shell.
Local IPC
A mode-0600 socket lives at $XDG_RUNTIME_DIR/lucent.sock. Commands use an allowlist; a file lock prevents duplicate clients.
NATIVE SESSION UI

Lock, notifications, login.

The bar’s bell opens Lucent’s notification history. The lock button and Super+Ctrl+L request its native secure locker. Wayland enforces the lock; the existing Omarchy PAM policy verifies your password. The login greeter is another client of the same component API and Vulkan renderer, with greetd managing authentication and session startup.

Guest · test and select the native greeter for next boot
sudo pacman -S --needed greetd
sudo python3 scripts/lucent-login.py install
sudo python3 scripts/lucent-login.py test
# After checking VT9, stop the test:
sudo systemctl stop lucent-greeter-test
sudo python3 scripts/lucent-login.py activate

Activation preserves the current desktop. To restore the previous display manager for next boot, run sudo python3 scripts/lucent-login.py rollback. The installer records its original selection and greetd configuration.

06 / BACK TO STOCK

A way back is part of the design.

Lucent

Guest · restore stock integration
python3 scripts/lucent-setup.py rollback

Rollback stops Lucent, removes the managed blocks and restores stock shortcuts and bar visibility. Installed binaries, widget settings and the selected wallpaper remain. For the prepared VM’s original wallpaper:

Guest · restore the original wallpaper
omarchy-theme-bg-set "$(cat ~/.config/lucent/original-wallpaper)"

Lucid or Noctalia

Replacement-shell guest · rollback
~/desktop-lab/scripts/rollback.sh

Log out and back in afterward. The original user configuration is restored; packages remain installed and their before/after inventories remain available for review.

After an Omarchy update

The Lucid/Noctalia integration checks the packaged startup checksum. If it changes, rerun the doctor, review the diff, and stage a fresh override before the next login. Compatibility is verified against the installed baseline.

SESSION WALLPAPER

The same backdrop.

Lock and login screens paint the desktop wallpaper through the native renderer. Centered cover fitting fills each display without stretching. The locker reads the current background at launch; the login screen reads a copy that follows wallpaper changes. The greeter can read that copy while your home stays private.

07 / REPRODUCE THE EVIDENCE

Run the checks.

Repository · code and integration checks
cargo fmt --manifest-path lucent/Cargo.toml --all --check
cargo clippy --manifest-path lucent/Cargo.toml --locked --workspace --all-targets -- -D warnings
cargo test --manifest-path lucent/Cargo.toml --locked --workspace
python3 -m unittest discover -s tests -v

The VM harness sends real QEMU pointer and keyboard events. Run it from the prepared host with the Lucent guest unlocked at 1920 × 1080:

Host · real-input checks and performance
python3 vm/test-framework.py
python3 vm/test-launcher.py
python3 vm/test-visual.py
python3 vm/test-runtime.py
python3 vm/measure-framework.py
python3 vm/measure-framework.py --seconds 120 --profile

The input harness preserves the original widget settings and wallpaper. The measurement tool temporarily sets the stay-awake marker consumed by Lucent’s headless idle adapter, then restores its prior state even when a measurement fails. CPU, memory and display metadata come from the guest.

The optional profile run temporarily enables per-frame CPU timings through a private runtime service override, then removes it and restarts the original configuration even on failure. Reports distinguish preparation, text rasterization, texture uploads and driver calls. Linux RSS/PSS snapshots and known image/buffer payloads have separate scopes; none is a complete GPU allocation measurement.

Validation combines Rust behavior tests, Python configuration/token/architecture checks, native Vulkan visual comparisons and actual VM interactions. Resource tests separately verify that active textures survive redraws on other surfaces. The full validation report separates executed checks from untested hardware paths. Download the recorded performance JSON.

08 / REFERENCES & ATTRIBUTION

Built with a clear lineage.

  • Omarchy ↗The Arch / Hyprland foundation and retained session tools.
  • Lucid ↗Primary visual and interaction reference. The inspected upstream revision is pinned in the lab manifest.
  • Noctalia v5 ↗The native C++ comparison, configured through its supported schema.
  • Amane ↗Architectural research into immediate-mode native desktop shells.
  • Suzuha ↗Reference client studied alongside Amane.
  • Architecture decisions ↗Why this project uses an independent framework and client.
  • Pinned sources ↗Inspected revisions and archive checksums.

Screenshots are actual captures from the lab. Wallpapers retain their original rights and are shown as part of those desktop captures. The site reuses the client’s Lucent Sans and Lucent Display fonts, derived from Google Sans Flex under the SIL Open Font License. See the repository’s asset attribution.

This explanatory site is built with Astro and small browser scripts. The desktop it documents is a native Rust application.