The lightest beautiful status bar for Wayland.
Midnight Bloom on Hyprland, with the wallpaper blurred through the glass. A real capture, not a mock-up.
Zenith does nothing unless something on the bar changes. No polling helpers, no animations running in the background, a clock that wakes on the minute. And it still looks like the screenshot above: smoked glass, a mint neon accent, one glowing focal element.
It runs on any compositor with wlr-layer-shell: Hyprland (most tested), Sway, niri, river and friends.
paru -S zenith-bar-bin # prebuilt; or zenith-bar to build from sourceNot on Arch? Build from source: GTK 4.22+, gtk4-layer-shell and Rust.
Then start it from your compositor. On Hyprland, with blur for the glass look:
-- hyprland.lua
hl.on("hyprland.start", function() hl.exec_cmd("zenith-bar") end)
hl.layer_rule({ name = "zenith-bar-blur", match = { namespace = "^zenith-bar$" }, blur = true, ignore_alpha = 0.3 })Still on hyprland.conf, or on Sway, niri or river? Those snippets are in installation.
No config file is needed: the default is the bar in the screenshot. To make it yours:
zenith-bar init # writes ~/.config/zenith-bar/config.toml, every default commentedEvery key is optional, so a config only holds what you change:
[bar]
position = "bottom"
monitors = ["DP-1"]
[layout]
left = ["logo"]
center = ["clock"]
right = ["media", "system"]
[theme]
name = "tokyo-night"
accent = "#ff79c6"Save, and the bar updates. A typo keeps the last good config running; zenith-bar check says exactly what's wrong:
config.toml:2:1: unknown key `heigth` in [bar] (did you mean `height`?)
A published JSON Schema gives your editor autocomplete, and gives AI assistants an exact contract.
Start from a curated look with one command:
zenith-bar init --preset bloom # floating glass, glowing clock (the default look)
zenith-bar init --preset minimal # flush, no glow, no motion: the leanest Zenith
zenith-bar init --preset classic # the Zenith 1.x layout in Tokyo NightThemes: Midnight Bloom (default), Tokyo Night, Catppuccin Mocha and Gruvbox Dark. Override the accent, opacity or radius in one line, or restyle anything with your own style.css on top of documented --zb-* variables and zb-* classes.
Every shot below is the same bar over the same wallpaper on Hyprland, changed only by config. The glass bars let the compositor's blur through; minimal is flush and opaque on purpose.
Tokyo Night: [theme] name = "tokyo-night"

Catppuccin Mocha: [theme] name = "catppuccin-mocha"

Gruvbox Dark: [theme] name = "gruvbox-dark"

Your own accent: [theme] accent = "#ff79c6", one line on top of any theme

Preset minimal: flush to the edge, no glow, no motion

Preset classic: the Zenith 1.x layout, reborn in Tokyo Night

Where it started: Zenith 1.x
The original bar, for the record. v2 is a clean rewrite of this look, at a fraction of the cost (see Numbers).
Measured by the benchmark harness in a headless Sway (gles2 renderer) on one laptop (Intel Core i7-13700HX, Arch Linux, GTK 4.24.1), median of three runs, 30 s idle window:
| Zenith 1.x | Zenith 2, bloom |
Zenith 2, minimal |
|
|---|---|---|---|
| Idle CPU | 17.132 % | 0.000 % | 0.000 % |
| Wakeups | 196.55 /s | 1.23 /s | 0.27 /s |
| Time to first frame | 281 ms | 194 ms | 189 ms |
| Proportional memory (PSS) | 92.9 MiB | 58.4 MiB | 58.1 MiB |
Resident memory is 145.6 MiB for bloom, most of it shared GTK, font and GPU driver mappings, and it moves with the machine's page cache: read performance before quoting it. CI holds every preset to its performance budgets on every code change.
- Installation: AUR, source build, Hyprland, Sway, niri and river notes
- Configuration: every key with its default and an example
- Theming: themes, motion, the focal element, every variable and class
- Performance: method, hardware and full results
- Migrating from 1.x: v2 is a clean break; start here
- Contributing and the changelog
MIT © Swastik Patel



