{"id":47754751,"url":"https://github.com/roblillack/canoe","last_synced_at":"2026-05-28T06:09:49.219Z","repository":{"id":334785014,"uuid":"1142762498","full_name":"roblillack/canoe","owner":"roblillack","description":"A stacking window manager for the River Wayland compositor, written in Rust","archived":false,"fork":false,"pushed_at":"2026-05-21T13:11:57.000Z","size":825,"stargazers_count":81,"open_issues_count":7,"forks_count":2,"subscribers_count":4,"default_branch":"main","last_synced_at":"2026-05-21T14:57:09.108Z","etag":null,"topics":["river","wayland","wayland-client","wayland-compositor","window-manager","windows-3-x"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/roblillack.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-26T20:32:14.000Z","updated_at":"2026-05-21T07:54:04.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/roblillack/canoe","commit_stats":null,"previous_names":["roblillack/canoe"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/roblillack/canoe","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roblillack%2Fcanoe","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roblillack%2Fcanoe/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roblillack%2Fcanoe/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roblillack%2Fcanoe/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/roblillack","download_url":"https://codeload.github.com/roblillack/canoe/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roblillack%2Fcanoe/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33596345,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-28T02:00:06.440Z","response_time":99,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["river","wayland","wayland-client","wayland-compositor","window-manager","windows-3-x"],"created_at":"2026-04-03T04:05:32.425Z","updated_at":"2026-05-28T06:09:49.214Z","avatar_url":"https://github.com/roblillack.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Canoe 🛶 - River Window Manager\n\n![Canoe screenshot](./assets/canoe-screenshot-1.png)\n\nA stacking window manager for the River Wayland compositor, written in Rust.\n\n## Features\n\n- Stacking window management\n- Server-side decorations with classic window borders \u0026 titlebars\n- Titlebar/edge window movement and resizing (Super+Drag anywhere)\n- Multihead support (focus/send windows across outputs)\n- Window switcher (keyboard cycle + desktop right-click menu)\n- Window focus follows click\n- Minimized windows shown as icons on the desktop (can be disabled)\n- Optional forcing server-side decorations via per-window rules\n- Optional \"swallowing\" of client-side decoration via per-window rules\n\n## Installation\n\n```bash\ncargo install canoe\n```\n\n## Running\n\n```bash\nriver -c canoe\n```\n\n## Building From Source\n\n```bash\ncargo build --release\n```\n\n\n## Keyboard Shortcuts\n\n| Shortcut | Action |\n|----------|--------|\n| `Super+Shift+Return` | Open terminal (foot) |\n| `Super+Space` | Open application launcher (fuzzel) |\n| `Super+l` | Lock the screen (swaylock) |\n| `Super+w` | Close focused window |\n| `Super+Tab` | Focus next window |\n| `Super+Shift+Tab` | Focus previous window |\n| ``Super+` `` | Focus next window of the same application |\n| `Super+Enter` | Toggle fullscreen |\n| `Super+Down` | Unfullscreen/unmaximize, otherwise minimize focused window |\n| `Super+Up` | Maximize focused window |\n| `Super+h` | Minimize focused window |\n| `Super+m` | Minimize focused window |\n| `Super+Left` | Snap focused window to left half; restore if snapped right |\n| `Super+Right` | Snap focused window to right half; restore if snapped left |\n| `Super+Alt+Left` | Send focused window to previous output |\n| `Super+Alt+Right` | Send focused window to next output |\n| `Super+Alt+Up` | Send focused window to previous output |\n| `Super+Alt+Down` | Send focused window to next output |\n\n## Mouse Actions\n\n| Action | Result |\n|--------|--------|\n| Click on window | Focus window |\n| Drag titlebar | Move window |\n| Drag window edges | Resize window |\n| `Super+Left Drag` | Move window (anywhere) |\n| `Super+Right Drag` | Resize window (anywhere) |\n\n## Configuration\n\nCanoe reads `~/.config/canoe/canoe.toml`.\nThe main modifier defaults to `super`, but you can change it:\n\n```toml\nmain_modifier = \"alt\"\n```\n\nThe launcher defaults to `fuzzel`. You can override it with a command or argv:\n\n```toml\nlauncher_cmd = \"fuzzel\"\n# Or with arguments:\nlauncher_cmd = [\"fuzzel\", \"--dmenu\"]\n```\n\nThe terminal defaults to `foot`. Override it the same way:\n\n```toml\nterminal_cmd = \"alacritty\"\n# Or with arguments:\nterminal_cmd = [\"wezterm\", \"start\"]\n```\n\nThe screen locker defaults to `swaylock`. Override it the same way:\n\n```toml\nlock_cmd = \"swaylock\"\n# Or with arguments:\nlock_cmd = [\"swaylock\", \"-f\", \"-c\", \"000000\"]\n```\n\n### UI Settings\n\nUI options live under the `[ui]` table and let you tune borders, titlebars, and menu colors.\nColors accept `#RGB`, `#RRGGBB`, or `#RRGGBBAA`.\n\n```toml\n[ui]\nborder_width = 10\nborder_active = { outer = \"#FFD000\", mid = \"#000000\", inner = \"#FFD000\" }\nborder_inactive = { outer = \"#000000\", mid = \"#000000\", inner = \"#000000\" }\ntitlebar_text_active = \"#000000\"\ntitlebar_text_inactive = \"#808080\"\ntitlebar_bg_active = \"#FFD000\"\ntitlebar_bg_inactive = \"#202020\"\nmenu_bg = \"#000000\"\nmenu_text = \"#FFFFFF\"\nmenu_highlight_bg = \"#FFD000\"\nmenu_highlight_text = \"#000000\"\nbutton_bg = \"#202020\"\nbutton_highlight = \"#FFD000\"\nbutton_shadow = \"#000000\"\nshadows_enabled = true          # master toggle; when false menus fall back to a flat L-shape\nshadows_active_size = 20        # soft shadow size for the focused window (and menus)\nshadows_inactive_size = 10      # soft shadow size for non-focused windows\nshadows_color = \"#00000033\"     # shadow color used for the soft drop shadow\nfont_name = \"Sans\"\nfont_size = 12.0\ndesktop_background = \"#101010\"\nicons_enabled = true            # set to false to hide minimized-window icons on the desktop\nicons_font_name = \"Sans\"        # optional; defaults to a regular-weight variant of font_name\nicons_font_size = 10.0          # optional; defaults to font_size * 0.80\nicons_text = \"#FFFFFF\"          # optional; defaults to menu_text\nicons_highlight_bg = \"#FFD000\"  # optional; defaults to menu_highlight_bg\nicons_highlight_text = \"#000000\"# optional; defaults to menu_highlight_text\n```\n\n### Rule Matching\n\nRules live under `[[rules]]` in `canoe.toml`. App ID matching uses OR across the\napp-id fields, and property matching uses AND across the listed properties.\n\n```toml\n[[rules]]\nmatch_app_id = [\"foot\", \"kitty\"]   # exact match, any value matches\nmatch_app_id_prefix = \"mate-\"      # prefix match (e.g. mate-calc)\nmatch_props = [\"toplevel\", \"csd_only\"] # all props must match\n```\n\nSupported `match_props` values:\n- `toplevel` (window has no parent)\n- `csd_only` (client does not support SSD)\n\nThe matching windows can have parts of their content \"swallowed\". This removes\nthe client-side decoration on my Firefox, for instance:\n\n```toml\nmatch_app_id = \"firefox-esr\"\nmatch_props = \"toplevel\"\nforce_ssd = true\nswallow_top = 48\n```\n\n## Requirements\n\n- [River](https://codeberg.org/river/river) Wayland compositor\n- foot terminal (for Super+Shift+Return)\n- fuzzel (for Super+Space launcher)\n- swaylock (for Super+L screen lock)\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Froblillack%2Fcanoe","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Froblillack%2Fcanoe","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Froblillack%2Fcanoe/lists"}