An experimental desktop shell for Windows 11, built around workspaces and an Activities-style overview instead of the taskbar-and-Start-menu flow. Written in Rust against the raw Win32 API.
While GroveShell runs, it draws its own bar along the top of the screen, hides the Windows taskbar, and hands the taskbar's screen space back to your apps. Workspaces sit one keystroke away. Quit it and everything comes back: the taskbar, the work areas, and any windows it had parked. Explorer keeps running underneath the whole time. Nothing here replaces system components, and there is a watchdog plus a standalone recovery script for the day a bad build misbehaves.
This is the overview: workspace cards with your actual wallpaper, window previews with app icons, and a carousel you can drag between workspaces. Opening zooms out of the current workspace. Closing zooms back into the one you picked.
- A top bar on every monitor: Activities button and workspace dots (each reflecting that monitor's own independent workspace set), plus — on the primary monitor only, since these reflect machine-wide state rather than anything per-monitor — a clock with a calendar flyout and a Wi-Fi/volume/ battery status pill. Every bar is per-monitor DPI aware and reserves its strip through the same AppBar mechanism the real taskbar uses.
- Real icon assets (Lucide, ISC-licensed) instead of
hand-drawn shapes, checked into
apps/ui/resources/icons/and embedded into the binary at compile time. States pick the matching variant rather than one icon being reused for everything: Wi-Fi on/off, three volume levels plus muted, five battery levels plus charging, Bluetooth on/off. - A GNOME-style Quick Settings panel behind that status pill (hover it for a
highlight, click anywhere on it to open): a real rounded card with a drop
shadow, and four toggle chips that all flip actual system state, not just
their own appearance. Wi-Fi is a plain Win32 call (
wlanapi.dll); Dark Mode writes the same registry values Settings' own toggle does; Bluetooth and Airplane Mode go through the WinRTWindows.Devices.RadiosAPI, since there's no classic Win32 call for either (Airplane Mode is approximated the way most third-party toggles do it: on means every known radio is off, and it doesn't remember each radio's prior state the way the real OS flag does). Below the chips, a real draggable volume slider with the percentage shown, and battery status with charging/low-battery states. Do Not Disturb, Night Light, and a brightness slider still aren't in: the first two need fragile undocumented registry blobs with no public API at all, and brightness control is unreliable on laptop panels without WMI. - GNOME-style workspaces, independent per monitor. Each monitor has its own
pinned workspace and its own dynamic tail (a spare empty workspace always
waiting at the end), and its own Activities overview — switching
workspaces on one monitor never affects any other.
Ctrl+Alt+←/→switches the workspace on whichever monitor currently has keyboard focus,Ctrl+Alt+Shift+←/→sends the focused window away on that same monitor. Windows on inactive workspaces are parked off-screen rather than hidden, with a snapshot taken at park time so previews don't go blank when apps stop rendering. Monitors can be connected or disconnected while GroveShell is running: a new monitor gets its own bar, workspace set, and overview within a second or two, and unplugging one hands its windows back to the primary monitor's current workspace rather than stranding them. - Live window tracking.
SetWinEventHookpicks up new, closed, and renamed windows in the background, and switching to a parked window through Alt+Tab or the taskbar's own window list brings its workspace along with it. A small identity registry means a recycled window handle never inherits a dead window's workspace or preview. - The Activities overview: one per monitor, each scoped to only that monitor's own workspaces — fixed-size workspace cards in a draggable carousel. The focused card is a little larger than its neighbors, opening and closing animate as a zoom, and cards get rounded corners and drop shadows. Dragging a window's preview onto another card pops it out with a short animation and moves it there, and hovering any preview (or a dock icon) glows it so you can see what you're about to click. A search bar sits at the top the whole time the overview is open, ready for you to type and search open windows or installed apps. All of it is our own double-buffered GDI compositing.
- A dock along the bottom of the focused card, GNOME-dash style: appears only inside the overview, not as an always-visible taskbar. It mirrors your real Windows taskbar's pinned shortcuts and adds a running-indicator dot for anything currently open, pinned or not. A click focuses a running app or launches a pinned one.
- The Windows key remapped to Activities, GNOME-style: a plain tap opens or closes the overview instead of the Start Menu. Holding it down and left-dragging moves whatever window is under the cursor; holding it and right-dragging resizes that window from whichever corner you grabbed. Works on any window, not just this shell's own, through a pair of system-wide low-level hooks. Pushing the cursor into a monitor's top-left corner also opens the overview, the same hot-corner trigger GNOME uses.
- Taskbar replacement. The Windows taskbar is hidden and its reserved strip handed back to applications while GroveShell runs, then restored on exit. If a run dies without cleaning up, the next launch repairs it.
- A safety net: host and watchdog processes with heartbeats, a job object so
child processes die together, and
scripts\recover.ps1, which depends on nothing else working. - A
groveshell-clifor diagnostics:ping,shutdown,list-windows, andlist-monitors.
The full plan lives in docs/PROJECT_PLAN.md §16.
Condensed, with current status:
- Cargo workspace, shared error and logging conventions
- Single-instance host with named-pipe ping
- Watchdog heartbeat and Explorer recovery
- Structured rotating logs, standalone recovery script
- Top-level window enumeration with an eligibility policy (visible, uncloaked, unowned, titled)
-
SetWinEventHooklive tracking (create, destroy, show, hide, name change, foreground), debounced into the workspace model - Generation-counter
WindowIdidentity across HWND reuse -
list-windows/list-monitorsCLI commands
- Low-level mouse and keyboard hooks
- Win+drag move and resize for any window
- Hot-corner activation for the overview
- Win key remapped to Activities
- Workspace domain model (pure, unit-tested) with the dynamic empty-tail policy
- Independent per-monitor workspace sets: one pinned workspace and one dynamic tail per monitor, with live hotplug (new monitors get their own set; disconnected ones hand their windows to the primary monitor)
- Keyboard switching and move-window shortcuts, resolved to whichever monitor currently has keyboard focus
- Park/unpark instead of hide/show, with crash recovery on the next start
- Session persistence across restarts (abandoned for now — still deciding the best approach to matching reopened windows back to their saved workspace, given Win32 gives no stable window identity across a restart)
- Owned dialogs following their owner window: carried along by
park_window/unpark_windowduring a workspace switch, and repositioned to preserve their relative offset when their owner is dragged to a different monitor (manually verified on real hardware)
- Per-monitor top bars with AppBar work-area reservation
- Activities button, workspace dots, clock, calendar
- Per-monitor DPI scaling, rounded bottom corners
- Windows taskbar hidden while running, restored on exit
- Dock (pinned and running apps), overview-only, mirrored from the real taskbar's pins
- GNOME-style Quick Settings: rounded card with a drop shadow, status pill with Wi-Fi/volume/battery glyphs, working Wi-Fi/Dark Mode/Bluetooth/Airplane Mode toggles, draggable volume slider
- Do Not Disturb, Night Light toggles, and a brightness slider (no public API for the first two; brightness needs WMI and is unreliable on laptop panels; deferred)
- Mirroring real system tray icons into the bar (feasibility being checked against this Windows 11 build's actual tray internals, which may need a different technique on newer builds)
- Central settings UI (bar height, keybindings, dock pin management)
- One Activities overview per monitor, each with its own carousel layout engine and focused-card scaling, scoped to only that monitor's own workspaces
- Window previews from our own captures, which survive apps that stop rendering off-screen
- Zoom and fade open/close animations, smooth drag with snap
- Click to focus, click empty space to switch or cancel
- Dragging a window between workspaces in the overview, with pop in/out animations and a hover glow on previews and dock icons
- Application and window search, always visible, not just while typing (type to search, Enter activates the top result)
- Mixed-DPI and display-topology testing
- UI Automation semantics, keyboard-only traversal
- High-contrast and reduced-motion options
- Compatibility rules and ignore list
- Opt-in shell mode for a dedicated test account, with safe mode and full uninstall
cargo build --workspace
cargo test --workspace.\scripts\dev-start.ps1That builds everything and starts the watchdog, host, and UI as background processes, with a small dashboard for pinging and shutting them down. Use the dashboard's graceful shutdown rather than killing the processes: the UI restores the Windows taskbar and un-parks windows in its close path.
Run .\scripts\recover.ps1. It stops every groveshell-* process and makes
sure explorer.exe is running, without relying on any GroveShell binary
working correctly first. If a hard kill left the taskbar hidden, starting and
gracefully quitting GroveShell once also repairs it.
Structured logs land in %LOCALAPPDATA%\GroveShell\logs\, one rotating file
per process: host.log, watchdog.log, ui.log, cli.log.
This project started under a different name that leaned on the GNOME trademark, and was renamed to GroveShell early on. GroveShell takes workflow inspiration from GNOME Shell and nothing else: no GNOME code, assets, or branding. It is independent and not affiliated with, sponsored by, or endorsed by the GNOME Foundation.
Dual-licensed under Apache-2.0 OR MIT. See LICENSE-APACHE and LICENSE-MIT.
The full technical design, architecture, and phased roadmap lives in
docs/PROJECT_PLAN.md. Architecture decisions are
recorded under docs/adr/.


