A modern, modular macOS-style panel for Linux supporting both X11 and Wayland.
- Global Menu Bar - Application menus integrated into the panel, supporting both
org.gtk.Menusandcom.canonical.dbusmenuprotocols - Logo Menu - System actions menu with Nova branding
- System Indicators - Network, Bluetooth, Sound, Battery, DateTime, Notifications
- Control Center - Quick access to system settings
- Settings Panel - Theme customization and configuration
- macOS-style Design - Clean, modern interface with transparency effects
- X11 & Wayland Support - Native support for both display servers
- Global Menu Integration - Application menus appear in the panel with automatic in-app menubar hiding
- AppMenu Registrar - Built-in
com.canonical.AppMenu.RegistrarD-Bus service for menu registration - Window Tracking - Shows focused window on Wayland via wlr-foreign-toplevel
- Enhanced Bluetooth - Full Bluetooth management with pairing, audio profiles, and file transfer
- Enhanced Network - Comprehensive network management with WiFi, VPN, hotspot, and bandwidth monitoring
- System Tray Replacement - Modern indicators replace traditional system tray
- Theme Support - Dark and light themes with CSS customization
- Modular Architecture - Easy to extend with new indicators and components
| Feature | Screenshot |
|---|---|
| Logo Menu | ![]() |
| Global Menu | ![]() |
| Global Menu2 | ![]() |
| About | ![]() |
| Network | ![]() |
| Network Settings | ![]() |
- GTK+ 3.0
- GLib 2.0
- GIO 2.0
- GDK X11 3.0
- libwnck 3.0 (X11 window tracking)
- X11
- NetworkManager (libnm)
- libsoup 3.0 (HTTP client, optional - for speed tests)
- gtk-layer-shell (panel positioning)
- wayland-client (protocol support)
- appmenu-gtk3-module (required) - Intercepts GTK3 application menubars and exports them via D-Bus
- appmenu-gtk2-module (optional) - Same for legacy GTK2 applications
Note: NovaBar automatically configures
GTK_MODULES,gtk-shell-shows-menubar, and other settings on first run. A logout/login is required after first launch for all applications to pick up the global menu environment.
- Vala compiler
- Meson build system (>= 0.50.0)
- Ninja build tool
- pkg-config
- wayland-scanner (for Wayland support)
- gettext (for translations)
- X11 or Wayland (wlroots-based: labwc, sway, wayfire, etc.)
- XFCE or compatible desktop environment
- appmenu-gtk3-module (for global menu support)
- Install dependencies (Ubuntu/Debian):
sudo apt install valac meson ninja-build pkg-config gettext \
libgtk-3-dev libglib2.0-dev libgio2.0-dev \
libgdk-x11-3.0-dev libwnck-3-dev libx11-dev \
libnm-dev libsoup-3.0-dev \
libgtk-layer-shell-dev libwayland-dev \
appmenu-gtk3-moduleArch Linux:
sudo pacman -S vala meson ninja pkgconf gtk3 libwnck3 \
networkmanager libsoup3 gtk-layer-shell wayland gettext \
appmenu-gtk-moduleFedora:
sudo dnf install vala meson ninja-build pkgconf gtk3-devel libwnck3-devel \
NetworkManager-libnm-devel libsoup3-devel \
gtk-layer-shell-devel wayland-devel gettext \
libdbusmenu-gtk3- Clone and build:
git clone https://github.com/novik133/NovikBar.git
cd NovaBar
meson setup build
ninja -C build- Build without Wayland (X11 only):
meson setup build -Dwayland=false
ninja -C build- Install:
sudo ninja -C build install- Run:
novabarThe autostart file is installed automatically. To set up manually:
mkdir -p ~/.config/autostart
cp /etc/xdg/autostart/novabar-autostart.desktop ~/.config/autostart/NovaBar's autostart entry runs in the Panel phase (before other applications) to ensure the global menu registrar and environment are ready before apps launch.
NovaBar handles global menu configuration automatically on startup. It:
- Sets
GTK_MODULES=appmenu-gtk-modulein the session environment - Propagates the setting via
dbus-update-activation-environment,~/.xprofile, and~/.config/environment.d/ - Sets
gtk-shell-shows-menubar=truevia xfconf (XFCE) andgtk-3.0/settings.ini - Writes a GTK3 CSS override to hide in-app menubars
- Starts the
com.canonical.AppMenu.RegistrarD-Bus service
The only manual step required is installing the module:
# Ubuntu/Debian
sudo apt install appmenu-gtk3-module
# Arch Linux
sudo pacman -S appmenu-gtk-moduleAfter first launch, log out and log back in so all applications pick up the GTK_MODULES environment variable.
appmenu-gtk-moduleinterceptsGtkMenuBarwidgets in GTK applications- The module exports menus via
org.gtk.MenusD-Bus interface - NovaBar reads these menus and displays them in the panel
- The in-app menubar is automatically hidden (collapsed to zero height)
- NovaBar also hosts a
com.canonical.AppMenu.Registrarfor apps usingcom.canonical.dbusmenu(Qt, Electron, etc.)
- Menus not appearing: Ensure
appmenu-gtk3-moduleis installed and you have logged out/in after first NovaBar launch - Menu shows in both panel and app: The app was launched before NovaBar configured the environment β restart the app
- Specific app not working: Some apps (e.g. Firefox with native titlebar) don't use GtkMenuBar and won't export menus
NovaBar automatically detects Wayland and uses:
- gtk-layer-shell for panel positioning
- wlr-foreign-toplevel-management for window tracking
Supported compositors:
- labwc
- sway
- wayfire
- Hyprland
- Other wlroots-based compositors
NovaBar includes two built-in themes:
- Dark Theme (
novaos.css) - Default dark theme - Light Theme (
novaos-light.css) - Light variant
Themes are installed to /usr/share/novaos/ and can be customized via the Settings panel.
NovaBar/
βββ src/
β βββ main.vala # Application entry point
β βββ panel.vala # Main panel window and layout
β βββ backend/ # X11/Wayland abstraction
β β βββ backend.vala # Runtime detection
β β βββ x11.vala # X11 panel setup
β β βββ wayland.vala # Wayland panel setup
β β βββ popup.vala # Cross-platform popups
β βββ toplevel/ # Window tracking
β β βββ tracker.vala # Abstract interface
β β βββ x11.vala # libwnck tracking
β β βββ wayland.vala # wlr-foreign-toplevel
β βββ wayland/ # Wayland protocol code
β β βββ wlr-toplevel.c # Protocol implementation
β β βββ wlr-toplevel.h # Header
β β βββ wlr-toplevel.vapi # Vala bindings
β βββ globalmenu/ # Global menu integration
β β βββ menubar.vala # Menu bar widget (org.gtk.Menus + dbusmenu)
β β βββ registrar.vala # com.canonical.AppMenu.Registrar service
β β βββ dbusmenu_client.vala # com.canonical.dbusmenu client
β βββ logomenu/ # Nova logo menu
β βββ indicators/ # System indicators
β β βββ network/
β β βββ bluetooth/
β β βββ sound/
β β βββ battery/
β β βββ datetime/
β β βββ notifications/
β β βββ controlcenter/
β βββ settings/ # Configuration interface
β βββ about/ # About dialog
βββ protocols/ # Wayland protocol XML
βββ data/
β βββ novaos.css # Dark theme stylesheet
β βββ novaos-light.css # Light theme stylesheet
β βββ com.canonical.AppMenu.Registrar.service # D-Bus service file
β βββ icons/ # Application icons
βββ po/ # Translation files (.po/.pot)
β βββ novabar.pot # Translation template
β βββ pl.po, de.po, fr.po # Language translations
β βββ POTFILES # Source files with translatable strings
β βββ LINGUAS # Supported languages list
βββ Screenshots/
βββ meson.build
βββ meson_options.txt
βββ CHANGELOG.md
βββ LICENCE.md
βββ README.md
meson setup build --buildtype=debug
ninja -C build
./build/novabar- Create new directory in
src/indicators/ - Implement indicator class extending appropriate base
- Add to
meson.buildsources - Register in
panel.valaright_box
- Follow Vala conventions
- Use 4-space indentation
- Document public APIs
- Maintain modular architecture
- Ensure
appmenu-gtk3-moduleis installed:sudo apt install appmenu-gtk3-module - Log out and log back in after first NovaBar launch
- Restart applications that were running before NovaBar started
- Verify with:
echo $GTK_MODULES(should containappmenu-gtk-module)
- Check X11/Wayland compatibility
- Verify dependencies are installed
- Run from terminal to see error messages
- Ensure compositor supports wlr-foreign-toplevel-management
- Check gtk-layer-shell is installed
- Verify wayland-client is available
- Check for window manager conflicts
- Disable other panels/docks
- Monitor system resources
- Fork the repository
- Create feature branch
- Make changes following code style
- Test thoroughly on both X11 and Wayland
- Submit pull request
GPL-3.0 - See LICENCE for details.
- Built with Vala and GTK3
- Inspired by macOS design principles
- Uses libwnck for X11 window management
- Uses gtk-layer-shell for Wayland support
- Uses wlr-foreign-toplevel-management for Wayland window tracking
- NetworkManager integration for network status
NovaBar - Bringing macOS-style elegance to Linux desktops.





