A Wayland dock for Linux. Built with Rust, cairo, and smithay-client-toolkit.
- Wayland compositor (Hyprland, Sway, GNOME, KDE, etc.)
- ImageMagick (
convertcommand) - Cairo graphics library
cargo build --releaseArch:
sudo pacman -S cairo imagemagickUbuntu/Debian:
sudo apt install libcairo2-dev imagemagickFedora:
sudo dnf install cairo-devel ImageMagick# Start the dock
./target/release/rusty-dock
# Open config
./target/release/rusty-dock --config
# Show help
./target/release/rusty-dock --help# Export config to file
rusty-dock --export ~/my-config.json
# Import config from file
rusty-dock --import ~/my-config.jsonAdd to your compositor's config:
Hyprland (~/.config/hypr/hyprland.conf):
exec-once = ~/.cargo/bin/rusty-dock
Sway (~/.config/sway/config):
exec ~/.cargo/bin/rusty-dock
Config file: ~/.config/rusty-dock/config.json
You can edit it by hand or use rusty-dock --config.
| Option | Type | Default | Description |
|---|---|---|---|
icon_size |
u32 | 48 | Icon size in pixels |
dock_height |
u32 | 64 | Dock panel height |
icon_padding |
u32 | 8 | Padding around icons |
border_radius |
f64 | 16.0 | Corner radius |
background_opacity |
f64 | 0.85 | Background transparency |
dock_margin |
i32 | 10 | Margin from screen edge |
position |
string | "bottom" | Dock position (top/bottom/left/right) |
auto_hide |
bool | true | Hide when not hovered |
auto_hide_delay_ms |
u64 | 500 | Delay before hiding |
smart_hide |
bool | true | Only reveal on stationary cursor |
smart_hide_trigger_delay_ms |
u64 | 1000 | Time cursor must stay at bottom |
smart_hide_y_threshold |
f64 | 6.0 | Max Y movement to be "stationary" |
enable_animations |
bool | true | Enable animations |
animation_duration_ms |
u64 | 200 | Animation duration |
launch_bounce_duration_ms |
u64 | 500 | Bounce animation duration |
icon_zoom_on_hover |
f64 | 1.3 | Zoom factor on hover |
enable_bounce_on_launch |
bool | true | Bounce when launching apps |
show_app_names |
bool | true | Show tooltips |
show_active_indicators |
bool | true | Show running app dots |
active_indicator_style |
string | "dot" | Style: dot/underline/border/glow |
grayscale_inactive_icons |
bool | false | Gray out inactive apps |
folder_popup_columns |
u32 | 3 | Folder popup grid columns |
folder_popup_icon_size |
u32 | 48 | Folder popup icon size |
show_folder_miniatures |
bool | true | Show mini icons in folders |
debug |
bool | false | Debug mode |
show_smart_hide_zone |
bool | false | Show trigger zone (debug) |
{
"icon_size": 56,
"dock_height": 72,
"icon_padding": 10,
"border_radius": 12.0,
"background_opacity": 0.9,
"auto_hide": true,
"smart_hide": true,
"pinned_apps": [
{
"type": "app",
"name": "Firefox",
"icon": "firefox"
},
{
"type": "app",
"name": "Terminal",
"icon": "utilities-terminal"
},
{
"type": "spacer"
},
{
"type": "folder",
"name": "Games",
"icon": "applications-games",
"apps": [
{"type": "app", "name": "Steam"},
{"type": "app", "name": "Lutris"}
]
}
]
}Simple app:
{"type": "app", "name": "Firefox", "icon": "firefox"}App with custom exec:
{"type": "app", "name": "My App", "exec": "/path/to/app", "args": "--flag"}App from desktop file:
{"type": "app", "name": "Firefox", "desktop_file": "/usr/share/applications/firefox.desktop"}Custom icon path:
{"type": "app", "name": "My App", "icon": "app-icon", "custom_icon_path": "/home/user/icons/myapp.png"}Spacer:
{"type": "spacer"}Folder:
{
"type": "folder",
"name": "Utilities",
"icon": "utilities-terminal",
"show_miniatures": true,
"apps": [
{"type": "app", "name": "Terminal"},
{"type": "app", "name": "File Manager"}
]
}- Right-click context menu (quit, reload config, edit)
- Clippy CI pipeline
- Better error handling (less unwrap())