anush ([ɑˈnuʃ]) is a desktop shell named after my wife (Անուշ) currently integrated with
skarwm to make it as beautiful as she
makes my life. It owns the bar, launchers,
clipboard, tray, weather, notifications, wallpaper tooling, desktop
configuration, and persistent shell state. It does not own or launch a window
manager; a WM configuration starts the shell by pointing Quickshell at
anush/shell.
Required:
- Quickshell;
- Python 3 for state migration and shell helpers;
- Papirus icon theme for application and accent-matched folder icons;
- JetBrainsMono Nerd Font for typography and Symbols Nerd Font Mono for consistently sized bar icons;
- for the current skarwm adapter,
skarwm-msgavailable inPATH.
Optional desktop integrations:
- Picom, Dunst, Feh, and Kitty for the supplied desktop configuration;
- Clipmenu and Xdotool for clipboard history and pasting;
setxkbmapandxkb-switchfor keyboard layouts;- renCal for calendar events;
- NetworkManager, its command-line/editor tools, BlueZ, Blueman,
pactl, and Pavucontrol for network, Bluetooth, and audio controls; - brightnessctl, powerprofilesctl, redshift, xset, and xrandr for hardware and power controls;
- curl, xcolor, xdg-open, flameshot, xinput, notify-send, and xterm for individual widget actions;
- ImageMagick for wallpaper-derived themes;
- lxqt-policykit-agent, xss-lock, Betterlockscreen, and Udiskie for the supplied full desktop startup configuration.
Missing optional tools disable only the related action or widget. renCal is available from the LazyLinux repository used by skarwm for Odin:
printf '%s\n' 'repository=https://github.com/lazylinuxos/lazy-repo/releases/latest/download' \
| sudo tee /etc/xbps.d/99-repository-lazy.confsudo xbps-install -S quickshell picom dunst feh kitty xss-lock \
betterlockscreen udiskie lxqt-policykit NetworkManager bluez blueman pavucontrol \
curl flameshot brightnessctl xrandr python3 renCal xterm xinput xdotool xcolor \
clipmenu xkb-switch setxkbmap ImageMagickPackage availability depends on the enabled Void repositories; the Nerd Font may need separate installation.
Install into ${XDG_CONFIG_HOME:-$HOME/.config}/anush:
make installLaunch it directly with:
qs --no-duplicate -p ~/.config/anush/shellThere is deliberately no anush session executable or display-manager entry. The active WM decides how to start the shell. For skarwm, copy the supplied configuration or add the autostart command yourself:
cp ~/.config/anush/config/skarwm/config.rc ~/.config/skarwm/config.rcautostart : "qs --no-duplicate -p ~/.config/anush/shell"
Future WM integrations belong under config/<wm>/ and should point to the
same shell entry point without coupling anush to their session lifecycle.
With a current skarwm build, anush also replaces the WM's native keybinding, notice, and reminder windows automatically. The keybinding window searches both shortcuts and action descriptions and highlights every matching row. Reminder expiry notices remain visible until clicked; ordinary status notices still close after 2.5 seconds. If anush is not running, skarwm falls back to its built-in windows.
config/ external application and WM integration examples
shell/common/ shared QML types and state management
shell/components/ QML grouped by feature
shell/scripts/ shell helper programs
shell/states/ default state document
shell/shell.qml Quickshell entry point
Persistent settings live in
${XDG_STATE_HOME:-$HOME/.local/state}/anush/shell-state.json. Set
ANUSH_STATE_DIR to override that directory. The sections are bar,
weather, launcher, keyboard, tray, tags, pomodoro, theme,
windowManager, windowList, and desktop.
The optional Window list Bar widget uses one shared pill containing one icon per application. Clicking a group with multiple windows opens a window picker; a single-window group focuses immediately. Each Bar shows windows from the workspace currently displayed on that Bar's output and, by default, only windows on that output. Right-click the pill or any icon to toggle the persistent cross-monitor view. That mode removes only the output filter; it keeps the owning Bar's workspace filter:
"windowList": {
"showWindowsFromAllMonitors": false
}Right-click the launcher button to choose an icon-theme icon or an image file. Image paths inside the anush config directory are stored relative to that directory for portability. An unavailable or deleted custom icon falls back to the built-in anush glyph; Reset clears the saved customization.
Rounded corners are controlled by the canonical theme.cornerRadius value.
It is watched at runtime along with the rest of the state, so editing the state
file updates open shell surfaces without a restart. 0 keeps every non-circular
surface square; larger values derive coherent small, medium, and large radii:
"theme": {
"cornerRadius": 10
}Committing the corner-radius slider also updates corner_radius in
config/skarwm/config.rc atomically and requests a skarwm configuration reload.
Set ANUSH_CONFIG_DIR when anush's writable configuration lives somewhere
other than its installed config/ directory.
The layout/appearance popup switches between the built-in Srcery dark and
light modes below the accent colors. The selection is stored as theme.mode
and updates the running shell immediately:
"theme": {
"mode": "light"
}Theme.qml exposes mode-independent roles including background, surface,
surfaceVariant, foreground, foregroundMuted, accent,
accentForeground, outline, hover, pressed, error, warning,
success, shadow, and overlay. Built-in and wallpaper-derived palettes
both populate this API, allowing future palette generators to remain separate
from component styling.
In light mode, wallpaper-derived palettes lift the wallpaper's dominant background hue into a light surface and enforce readable contrast for text and accent roles; the fixed Srcery light theme continues to use its canonical cream.
Bars can optionally shrink along their long axis to their natural widget size while the native panel window remains centered on each screen. This keeps the surrounding desktop clickable and preserves the bar's workspace reservation:
"bar": {
"fitContent": true,
"floating": true,
"separateSections": false
}These settings are also available as Fit to content and Floating in the bar layout popup. Floating mode uses the same 8-pixel gap as bar popups; a full-width horizontal bar is inset from the left and right edges as well. The workspace reservation remains intact.
On full-length bars, Sections can replace the continuous background with separate start, center, and end surfaces. Empty sections are not drawn; side bars arrange the three surfaces vertically.
The power menu's Display settings item opens a centered XRandR-backed configuration surface. Changes are staged until Apply; mode, refresh rate, scale, orientation, enabled state, primary output, mirroring, and snapped monitor positions are configured together. Potentially disruptive changes must be confirmed within 15 seconds or the independent rollback watchdog restores the previous layout. XRandR remains the persistence owner.
ShellState.qml merges section updates and writes the complete document
atomically. On first launch, it imports compatible state from the former
skarwm files when present; afterward shell-state.json is the only active
state source.
The Notepad bar widget opens an animated sidebar from the configurable left
or right screen edge. It supports multiple tabbed UTF-8 Markdown notes under
${XDG_DATA_HOME:-$HOME/.local/share}/anush/notepad/; the + tab button creates
a new file. The header provides compact/extended width and close controls; the
footer persists whether the drawer opens from the left or right. Writes are
debounced and atomic, and failures or external changes
never discard the in-memory text. Set ANUSH_NOTEPAD_DIR to choose another
directory. ANUSH_NOTES_FILE remains available for a specific legacy file.
The sidebar can also be controlled through Quickshell IPC:
qs -p ~/.config/anush/shell ipc call notepad toggle
qs -p ~/.config/anush/shell ipc call notepad newNote
qs -p ~/.config/anush/shell ipc call notepad saveThe supplied skarwm configuration binds Super+Shift+N to toggle Notepad.
The shortcut calls the global Notepad IPC handler directly, so it remains
available when the Notepad bar widget is hidden.
Application configuration is under config/, shell scripts are always
resolved relative to shell/, and QML components are grouped by function
under shell/components/.
The desktop setup was inspired by drew/dwm-setup.

