This isn't all good yet so try at your own risk
there is also a boring static mode
Snappy Dock is a small dock for Hyprland.
It has two parts:
snappydock-d: a C daemon that talks to Hyprland, tracks windows, loads config, and launches apps.shell/: a QuickShell/QML frontend that draws the dock, icons, dots, and menus.
The dock is meant to stay simple: quick to build, easy to configure, and easy to debug.
- Shows running Hyprland windows as dock icons.
- Supports pinned apps.
- Left-click focuses a running app or launches a pinned app.
- Right-click opens a menu for focus, launch, pin, unpin, close, float, fullscreen, and move to workspace.
- Includes a launcher button. By default it runs
fuzzel. - Resolves app icons from desktop files and icon themes.
- Reads an INI config file from
~/.config/snappy-dock/config.ini.
Runtime:
- Hyprland
- QuickShell 0.3 or newer
json-c
Build tools:
mesonninja- A C compiler such as
gccorclang json-cdevelopment headers
Package names depend on your distro. Common names are:
- Arch:
meson,ninja,json-c,gcc - Debian/Ubuntu:
meson,ninja-build,libjson-c-dev,build-essential - Fedora:
meson,ninja-build,json-c-devel,gcc
From the repo root:
meson setup build
meson compile -C buildIf build/ already exists, only run:
meson compile -C buildSystem install, usually to /usr/local:
sudo meson install -C buildThis installs:
snappy-dockwrapper scriptsnappydock-ddaemon- QML shell files
config.ini.example
To uninstall a Meson install:
sudo ninja uninstall -C buildAlternatively, you can build and install using the provided native Makefile:
make
sudo make installTo gracefully uninstall and clean up your system afterwards:
sudo make uninstallStart the installed dock:
snappy-dockRestart it after installing changes:
snappy-dock --restartUseful wrapper commands:
snappy-dock --status
snappy-dock --kill
snappy-dock --config
snappy-dock --helpRun from the source tree without installing:
quickshell -p shellCreate your user config:
mkdir -p ~/.config/snappy-dock
cp config/config.ini.example ~/.config/snappy-dock/config.iniIf you are outside the source tree after installing system-wide, copy the installed example instead:
mkdir -p ~/.config/snappy-dock
cp /usr/local/share/snappy-dock/config.ini.example ~/.config/snappy-dock/config.iniEdit it:
$EDITOR ~/.config/snappy-dock/config.iniRestart after changing config:
snappy-dock --restartYou do not need to rebuild or reinstall after changing ~/.config/snappy-dock/config.ini. A restart is enough.
You only need to reinstall after changing files in this repo, such as QML, C source, or snappy-dock.sh:
meson compile -C build
sudo meson install -C build
snappy-dock --restartThe daemon watches the config file and can send updates to the shell while running. A restart is still the clearest way to make sure every setting is applied.
See config/config.ini.example for all settings and plain-language notes.
Common config keys:
| Key | What it controls |
|---|---|
Position |
Dock edge: bottom, top, left, or right |
Alignment |
Placement along the edge: center, start, or end |
FullWidth |
Whether to stretch the dock window across the whole screen width |
Mode |
Dock animation mode: static or snappy (macOS-style magnification) |
[Icons] IconSize |
Icon size in pixels |
[Icons] Theme |
Qt icon theme name, for example Tela-dracula |
[Icons] Fallback |
Icon used when a themed app icon is missing |
Layer |
Wayland layer: background, bottom, top, or overlay |
ExclusiveZone |
How many pixels are reserved for the dock, or auto to detect the dock height |
AutoHide |
Whether the dock hides after the pointer leaves |
HotspotDelay |
Delay (ms) before the dock hides after cursor leaves |
LauncherCmd |
Command run by the launcher button |
LauncherPos |
Launcher button position: start, end, or none |
LauncherIcon |
Icon or text for the launcher (default dots) |
LauncherIconSize |
Size of the launcher icon (0 for auto) |
LauncherHoverBg |
Show hover background for the launcher (true/false) |
LauncherHoverBgSize |
Size of the hover background (0 for auto) |
WorkspaceCount |
Workspaces shown in the right-click move menu |
[Margins] |
Extra edge spacing |
[Font] Family |
Font family used for text (e.g. Sans, FiraCode Nerd Font) |
[Font] Weight |
Font weight (e.g. Normal, Bold) |
Important
Snappy Mode Constraints: When using Mode=snappy, ExclusiveZone=auto does not work reliably due to dynamic geometry changes. You must set ExclusiveZone manually to a fixed pixel value (e.g., 48). It is also highly recommended to use Layer=overlay in snappy mode to prevent the compositor from clipping magnified icons.
Pinned apps are stored here:
~/.config/snappy-dock/pinnedThe file uses one app class name per line. You normally do not need to edit it by hand. Use the right-click menu on a dock icon and choose pin or unpin.
Example:
firefox
Alacritty
codeIf an app does not launch from a pinned icon, check that the class name matches the app desktop file or the window class shown by Hyprland.
| Input | Action |
|---|---|
| Left-click running app | Focus that app |
| Left-click pinned app with no running window | Launch it |
| Right-click icon | Open the app menu |
| Right-click menu: Pin/Unpin | Add or remove the app from pinned apps |
| Right-click menu: Move to workspace | Move a window to another workspace |
daemon/src/ C daemon source
shell/ QuickShell/QML frontend
config/config.ini.example Example config file
snappy-dock.sh Installed wrapper script
meson.build Build and install rulesInstall QuickShell and make sure quickshell is available in your PATH.
Build and install again:
meson compile -C build
sudo meson install -C buildRun the shell directly to see the QML error:
quickshell -p shellIf you installed the dock, reinstall after changing QML files:
sudo meson install -C build
snappy-dock --restartMake sure the app has a .desktop file in one of the normal application directories, such as:
~/.local/share/applications
/usr/share/applications
/usr/local/share/applicationsAlso check that your icon theme contains the icon named by the desktop file. You can set a theme in ~/.config/snappy-dock/config.ini:
[Icons]
IconSize=48
Theme=Tela-dracula
Fallback=application-x-executableRestart the dock after changing Theme; QuickShell reads the Qt icon theme when it starts.
Make sure Snappy Dock is started inside a Hyprland session. The daemon needs Hyprland IPC environment variables such as HYPRLAND_INSTANCE_SIGNATURE.
- FullWidth Taskbar Integration: Currently
FullWidthstretches the dock, but the UI items remain centered. A future update will makeFullWidthexpand the entire bar into a traditional taskbar layout, automatically adjusting and fitting items along the full length.
MIT. See LICENSE.
