Icebar is a lightweight, Wayland status bar written in Rust, powered by iced and iced-layer-shell.
It aims to provide a minimal, fast, and hackable bar/popup system designed for wlroots and smithay compositors (Hyprland, Sway, Niri, etc.), with dynamic tray integration and interactive popups.
Built for people who want full control instead of heavyweight desktop panels.
- 🧊 Native Wayland layer-shell bar
- ⚡ Written entirely in Rust
- 🎨 UI powered by
iced - 🖱 Interactive popups
- 🔔 Status Notifier / system tray support (DBusMenu)
- 📍 Cursor-aware popup positioning
- 🧩 Modular architecture (easy to extend)
- 🪶 Lightweight and compositor-friendly
Icebar is not a traditional desktop environment panel.
Instead, it acts as a:
- Wayland layer-shell surface
- Tray watcher (StatusNotifierItem)
- Popup/menu renderer
- Event-driven UI application
- listens for tray applications via DBus
- renders tray items inside a bar
- opens contextual menus as popups
- communicates directly with Wayland outputs
- dynamically positions UI relative to cursor/output
Conceptually:
Tray Apps ──DBus──▶ Icebar Core
│
▼
iced UI Renderer
│
▼
Wayland Layer Surface
Icebar targets smithay and wlroots based compositors, including:
- Hyprland
- Sway
- Niri
- Others layer-shell compatible compositors
X11 is not supported.
- Rust
- iced (GUI framework)
- iced_layershell
- zbus (DBus communication)
- Wayland layer-shell protocol
- wpctl (Volume handling)
iced provides a declarative UI model inspired by Elm architecture.
paru -S icebar-git
or
yay -S icebar-git
--
Requirements for building:
- Rust/Cargo (stable/2024)
- gcc-libs
- libxrandr
- libxcb
Build And Install With:
git clone https://github.com/HaruNashii/Icebar
cd Icebar
cargo build --release
mkdir -p $HOME/.local/bin
cp -rf target/release/icebar $HOME/.local/bin/Tip: Run it from your compositor autostart for best results.
- Example (Hyprland):
exec-once = icebar
- Example (Sway):
bar {
swaybar_command icebar
}
Icebar includes a bash script that lets you manage and apply themes from a collection of preset configurations.
Place your themes in a folder called themes next to the script. Each theme must be a subdirectory containing a config.ron file:
icebar-theme-switcher.sh
themes/
├── dracula/
│ └── config.ron
├── nord/
│ └── config.ron
└── catppuccin-mocha/
└── config.ron
chmod +x icebar-theme-switcher.sh
./icebar-theme-switcher.shThe script will:
- Scan
./themes/and list every valid theme (subdirectories that contain aconfig.ron) - Prompt you to pick a theme by number, or press
qto quit without making any changes - Check for an existing config at
~/.config/icebar/config.ronand offer two options if one is found:- Backup — renames the existing config to
config.ron.backup_YYYYMMDD_HHMMSSbefore installing the new one, so nothing is lost - Overwrite — replaces the current config permanently; requires a second confirmation (
yes) before proceeding
- Backup — renames the existing config to
- Copy the chosen theme's
config.ronto~/.config/icebar/config.ron
After the script finishes, restart Icebar to apply the new theme.
Note: The script creates
~/.config/icebar/automatically if it does not exist yet.
src/
├── main.rs → application entry point
├── subscription.rs → iced subscriptions
├── update.rs → iced message handler
├── view.rs → iced renderer handler
├── ron.rs → ron configuration handler
├── tray.rs → StatusNotifier watcher
├── context_menu.rs → context menu UI + logic
├── modules/ → bar components
├── helpers/ → small helpers
1. Layer Shell Integration
- Creates anchored Wayland surfaces without a desktop environment.
2. Tray Watcher
- Uses DBus to detect and interact with tray applications.
3. Popup Engine
- Menus are rendered as independent iced views that can:
- follow cursor position
- anchor to outputs
- react to clicks outside the window
4. Event Model
- Icebar follows iced's update/view architecture:
- Message → Update → State → View
Icebar focuses on:
- simplicity over feature bloat
- hackability
- learning modern Wayland APIs
- experimenting with iced + layer-shell
- This is intentionally closer to a framework for a bar than a finished desktop panel.
Experimental / Work in Progress Expect:
- breaking changes
- incomplete modules
- rapid iteration
The project is primarily a learning and experimentation platform.
- Icebar crashing on Gnome.
- Explanation: Icebar depend on Layer Shell which Gnome doesn't implemented yet!!!
- Context menu not closing when clicking outside the window on Niri
- Bar size not working on Niri
- Plugin/modules API For Custom Modules
- Better tray icon handling
- Animations (very low priority right now)
Contributions are welcome!!! Good areas to help:
- Wayland handling
- iced widgets
- tray compatibility
- performance improvements
- compositor testing
- architecture improvements
Steps:
fork → branch → commit → pull request
(Accepting screenshots to display here, if you have one and want to share, i would appreciate it)
MIT License. See LICENSE for details.
