dope ass quickshell bar
README.md

eww #

A minimal top bar for Quickshell on Niri.

Features #

  • Window strip — shows all windows on the current workspace, ordered by niri column position. Focused window is highlighted, unfocused are greyscaled. Click to focus.
  • Window thumbnails (opt-in) — set "niriWindowThumbnails": { "enable": true, "labels": true } in ~/.config/ebar/config.json: the bar shows daemon-backed per-window previews, with the optional app_id label in the top-left.
  • System tray — full StatusNotifier support with native DBusMenu popups (including submenus on hover).
  • Audio widget — shows current default sink volume, scroll to adjust by 1%, click to open a sink picker powered by PipeWire directly.
  • Battery — charge percentage with a level/charging icon (via UPower); turns red when low, green while charging. Hidden on machines with no battery.
  • Wattage — live power draw/charge rate in watts (via UPower); shows - while discharging, + while charging. Hidden when idle or on desktops.
  • Media widget — shows the title and artist from an MPRIS player with previous, play/pause, and next controls. Click the title to focus the player's window. Long text scrolls left while hovered, then animates back to the start. Appears before the window strip by default, considers only players that support both previous and next, prefers a playing player when several have titles, and hides when none qualify.
  • Clock — current time, updates every second.

Multi-monitor aware — one bar instance per screen, each showing only that screen's windows.

Dependencies #

Usage #

qs -c ~/.config/quickshell/eww

Or add to your niri config for autostart:

spawn-at-startup "qs" "-c" "/home/callie/.config/quickshell/eww"

Note: Quickshell must be launched with UseQApplication mode for system tray menus to work. This is handled automatically by the //@ pragma UseQApplication directive at the top of shell.qml.

Optional window thumbnail daemon #

The repository includes screencastd, a local user-session daemon that records eligible niri toplevels through niri's native org.gnome.Mutter.ScreenCast D-Bus service and PipeWire. It does not use the desktop portal or the clipboard. The bar consumes the daemon's low-rate PNG compatibility snapshots; native clients can request the per-window memfd with {"op":"get","id":123} on the control socket.

Run it from this checkout:

nix run ./screencastd -- --fps 2 --max-width 640

Enable previews in ~/.config/ebar/config.json:

{
  "niriWindowThumbnails": {
    "enable": true,
    "labels": true
  }
}

Set labels to false to hide the top-left app_id overlay.

For NixOS, import screencastd/nix/module.nix and enable services.ebar-niri-window-castd.enable = true;. The service must run inside the same graphical user session as niri, PipeWire, and the Wayland/EGL display.

Runtime requirements and limitations:

  • NIRI_SOCKET, XDG_RUNTIME_DIR, a session D-Bus, PipeWire, and a working Wayland/EGL environment are required.
  • DMA-BUF frames are imported with GStreamer GL and read back to CPU memory before publishing. The daemon retries individual windows with exponential backoff; one failed cast does not stop unrelated windows.
  • --fps accepts 1, 2, or 3, plus fractions of the form 1/x. For example, --fps 1/5 requests one published frame every five seconds. Because stock niri currently negotiates a minimum of 1 FPS, sub-one rates negotiate a 1 FPS PipeWire stream and locally publish only when the requested interval elapses. Use the daemon's frame timestamps and stats endpoint to verify cadence.
  • A window that has not rendered since capture starts may not produce a first frame until niri requests a redraw (for example, after resize or content animation).

Structure #

eww/
├── shell.qml   # everything, for now
└── README.md

Theming #

All colours and fonts are hardcoded inline and easy to grep for:

Thing Value
Background "black"
Font Inter, 16px, weight 700
Focused window pill #555 fill, #888 border
Hover #2a2a2a fill, #555 border
Popup background "black"
Popup hover #1a1a1a
Separator #333
Disabled text #555
Audio icon font Maple Mono