
Lucid↗
Quickshell · Qt / QMLThe original experience: floating capsules, Bookends widgets and the dock that becomes a launcher. Installed at a pinned revision, integrated into Omarchy.
Meet Lucent. A native Rust framework and a desktop built on it. Inspired by Lucid. At home on Omarchy.
Explore the desktop Go beneath the surface ↗
A floating bar, seven available widgets, and a dock. All built with the same Rust framework.
Drag a widget background to move it. Release to save.
The dock opens into a keyboard-first launcher. Real app discovery, fuzzy search, and launch-or-focus behavior.
Super + Space → type → Enter. Escape closes.
A five-card carousel keeps the selected wallpaper front and center. Applying it updates the native Lucent background after image validation.
Super + Ctrl + Space → arrows → Enter.Same Omarchy foundation. Separate virtual machines. Each experiment asks a different question about how much of the desktop we should build ourselves.

The original experience: floating capsules, Bookends widgets and the dock that becomes a launcher. Installed at a pinned revision, integrated into Omarchy.

A native shell configured toward the same visual language. Rounded islands, a centered dock and desktop widgets, using its supported TOML configuration.

Our independent framework and desktop client. Declarative components, real system integration, native surfaces and a shared renderer, shaped by the Lucid reference.
Each VM has its own configuration and rollback path. The screenshots capture different test sessions; they are not a controlled performance comparison.
Lucent renders the bar, dock, launcher, selectors, widgets, notifications and native lock/login clients. Hyprland still arranges your application windows. Omarchy still handles the session around them.
Who owns what? ↗A shared engine with independent desktop, picker and session clients. The desktop is one expression of the framework; its colors, calendar and launcher stay in the client.
The client owns the bar, dock, launcher, selectors, widget state and visual identity. An independent hello-layer counter uses the same framework without importing any desktop code.
Applications, workspaces, windows, settings and service snapshots are pure Rust models. Use cases rank searches, choose launch versus focus, clamp widget positions and validate configuration. Ports describe what an external service must do.
Components render declarative elements and update through typed messages. Effects carry work off the UI thread. Subscriptions deliver ongoing updates. SurfaceSpec declares native surfaces; Motion describes transitions. The API is independent of the desktop domain.
The UI crate resolves layout, hit testing, focus and drag gestures. The SCTK runtime owns layer surfaces and keyboard/pointer input, executes effects and manages subscriptions. Compositor frame callbacks schedule only the surfaces that need a redraw.
The renderer shares one wgpu Vulkan device and cached text/image resources across surfaces. Separate adapters talk to XDG applications, Hyprland IPC and system tools. OS operations stay out of component views and the draw loop.
A component owns its state. view describes elements. update handles a typed message and requests effects. The runtime takes care of input, work and redraws.
use lucent_api::*;
#[derive(Clone)]
enum Message { Increment }
struct Counter(u32);
impl Component for Counter {
type Message = Message;
fn view(&self, _: &ViewContext) -> Element<Message> {
Element::row(vec![
Element::text(format!("Count: {}", self.0)),
Element::button("Add", Message::Increment)
.id("increment"),
]).gap(12.).padding(16.)
}
fn update(&mut self, _: Message, fx: &mut Effects<Message>) {
self.0 += 1;
fx.redraw("example");
}
}The dock expands into a launcher. The selector brings the next wallpaper forward. Interrupted transitions continue from their current position.
Lucent uses the spatial curve inspected in the pinned Lucid reference. Frames follow compositor callbacks, and stop when the transition ends.
cubic-bezier(0.38, 1, 0.22, 1)Illustrates the curve and geometry in CSS. The desktop above renders natively through Vulkan.
A widget is a native Wayland surface region. It stays out of the tiling layout, so moving a clock never rearranges your terminal.
Floating capsules reserve their top inset and token-defined height. Workspace pills switch real Hyprland workspaces.
Layer::TopSeven registered widgets. Drag backgrounds to move them; release to save. They sit below application windows.
Layer::BottomThe launcher claims keyboard input while open. Escape or an outside click closes it. Transparent areas otherwise pass clicks through.
Top → Overlay6 vCPUs · 5.77 GiB guest memory
1920 × 1080 · 60 Hz · scale 1
Software Vulkan, Mesa lavapipe.
One logical core, over 600 seconds.
530.61 MiB peak RSS in the sample.
16.47–16.69 ms median submission intervals.
The GPU matters. This VM uses CPU-backed Vulkan. Warm submission intervals are near the 60 Hz refresh interval. The first launcher opening had a 246 ms gap; warm samples reached a maximum of 19.56 ms. The closed dock and background submitted no frames during the ten-minute idle sample. The current normal-desktop RSS target is 300 MiB. These historical animation/idle samples predate the later memory reductions; the review tracks the newer release evidence. Hardware GPU performance is unmeasured; this six-vCPU run is not directly comparable to the historical two-vCPU result.
The full Lucent service, including helper commands, used 1.298% of one core at idle. The service CPU figure excludes separately launched applications, retained system services and the compositor. RSS includes driver mappings. The resource counters separately record texture payload, not total GPU allocation. Frame intervals are render submissions, not scanout.
Full Lucid parity is a destination. Tray hosting, launcher-integrated clipboard and emoji modes, a full control center and widget resizing are still ahead. Wallpaper search and color extraction already work. Notification history currently lasts for the process lifetime.
Desktop placement across multiple outputs, fractional scaling and full Unicode shaping remain unimplemented. The secure locker covers all outputs; virtual output hotplug was tested while locked. Physical Wi-Fi, Bluetooth, battery, brightness, suspend/resume and real media playback were not validated in this VM run.
Explore the colors, type, spacing and motion behind Lucent. Shared tokens connect the native desktop to a living reference you can build from.
Explore the system ↗ Read the docs ↗palette.cyan_300#73dceetheme.dark.primaryIntent, shared across componentstheme.button(…)The same language, made tangibleStart with one isolated VM. Try the launcher, move a widget, explore the framework, and switch back whenever you need.
Open the testing guidepython3 vm/launch.py lucentAlready have Omarchy? The guide also covers building, installing, and rolling back.