A macOS-style dock and menu bar for Windows 11. Written from scratch in Rust on plain Win32. No Windhawk, no Explorer patching, about 13 MB of memory.
Every shot is a frame of one screen recording on a Windows 11 laptop. Full quality: docs/macdock.mp4
- The app in front, in bold, with File / Edit / View / Window / Help menus that send the real shortcuts (Ctrl+S, Ctrl+Z, …) to that app
- System menu with Automatically Hide Dock and Quit MacDock
- Battery, Wi-Fi, search, Control Center and the clock (which opens the notification center)
- AI usage for Claude Code and Codex: a ring with the limit closest to running out and the live
burn rate in tok/s. Its flyout shows tok/s over 5 and 30 minutes, the last 24 hours, each limit with the
points used per 5 / 30 minutes, when the current pace would hit it, and every session that burned
tokens in the last 30 minutes (title, project, model, branch, its own tok/s). Read from the agents' local logs
(
~/.claude/projects,~/.codex/sessions); by default nothing is sent anywhere. Codex reports its own limits. Claude Code logs none: turn onClaudeUsageOAuthto read its real 5-hour and weekly limits from Anthropic with Claude Code's own login (every 2 minutes, only to api.anthropic.com; MacDock never refreshes the token), or setClaudeLimit5hfor an estimate from local tokens.
- Dock and menu bar are real AppBars: maximized windows stop at them.
- A fullscreen game hides both, puts the render loop to sleep and removes the mouse hook. On the author's laptop that measured 0.00% CPU and a 17 MB working set while a game was in front.
- Idle on the desktop: 0% CPU and about 13 MB private memory, because nothing redraws unless something is moving (see Rust vs the old C# build).
Download: grab macdock.exe from the latest release
and run it. Windows 11 only, nothing else to install. Each release is built by GitHub Actions from its tag.
Build from source: you need Windows 11 and Rust. Follow these steps in order:
- Install Rust from rustup.rs (run
rustup-init.exe, accept the defaults). - Switch to the GNU toolchain, so you don't need Visual Studio Build Tools:
rustup default stable-x86_64-pc-windows-gnu
- Open a new terminal, then build and run:
git clone https://github.com/GodrezJr2/MacDock.git cd MacDock cargo build --release .\target\release\macdock.exe
The first build takes a few minutes because it compiles the dependencies.
The result is one ~1 MB exe with no runtime to install; copy it wherever you like.
MacDock hides the Windows taskbar while it runs and restores it when you quit.
- Quit: Windows logo in the menu bar → Quit MacDock
- If it was killed and the taskbar is still hidden:
macdock.exe --restore - Start with Windows: Windows logo in the menu bar → Open MacDock at Login
Settings live in %APPDATA%\MacDock\config.json, created on first run.
| Key | Default | What it does |
|---|---|---|
Pinned |
Explorer, Chrome, Outlook, Terminal, VS Code, Discord, Settings | Dock items: shell:AppsFolder\<AppID>, a .lnk or an .exe |
IconSize |
52 |
Icon size at rest, in pixels |
Magnify |
1.75 |
Size of the icon under the pointer, relative to rest |
AutoHide |
false |
Slide the dock away until the pointer touches the bottom edge |
Genie |
true |
Genie minimize and restore |
IconTiles |
true |
Put every icon on a squircle tile |
Badges |
true |
Red unread badges |
MenuBar |
true |
Show the menu bar |
TrayIcons |
true |
Host notification-area icons behind the ^ item |
HideTaskbar |
true |
Hide the Windows taskbar while MacDock runs |
AiUsage |
true |
Claude Code / Codex usage item in the menu bar (shown once either has logs) |
ClaudeUsageOAuth |
false |
Read Claude's real 5-hour / weekly limits from api.anthropic.com/api/oauth/usage with the login in ~/.claude/.credentials.json |
ClaudeLimit5h |
null |
Tokens per 5-hour Claude block that count as 100% (input + cache writes + output) |
A crash writes %APPDATA%\MacDock\panic.log and still puts the taskbar back.
The frosted dock without a blur API
Windows ignores window regions for layered windows, so accent blur behind a rounded plate showed up as a black or grey square. The plate is instead painted with a blurred slice of your wallpaper, mapped to its position on screen. Because the dock is an AppBar, the wallpaper is almost always what sits behind it.
A genie with no flash
For a title-bar minimize, a low-level mouse hook (on its own thread) sees the press on the minimize button and MacDock pre-draws the first frame from a fresh snapshot; on release the overlay is shown from the hook itself, so the animation is already up when the window disappears. Only the mesh's bounding box is redrawn and pushed to the screen each frame. Snapshots are shrunk off the UI thread and saved to disk, so windows minimized before a restart still animate on restore.
Unread badges
The taskbar keeps app badges to itself, so the count is the larger of a (N) prefix in the window title
and the Action Center toasts that arrived since you last had the app in front (read from the notification
database through the system's own winsqlite3.dll).
Battery power on a laptop that does not report it
The battery driver only knows the battery side. On battery its discharge rate is the whole system's draw; on the adapter nothing measures the input. MacDock reads CPU package energy through Windows' Energy Meter Interface and GPU power through NVML, and learns the rest (screen, RAM, SSD, fans) while unplugged. Sensors are read off the UI thread, and a sleeping NVIDIA GPU is left asleep instead of being woken every second.
- Built and tested on one machine: a Windows 11 laptop at 2560×1600, 125% scale, with an NVIDIA GPU. Other setups may show rough edges; issues are welcome.
- Dock and menu bar live on the primary monitor; other monitors have no taskbar while MacDock runs.
- While the
^tray flyout is open, a WinUI 3 app started at that moment can fail to start, because the tray host registers its ownShell_TrayWnd. The host only runs while that flyout is open. - GPU power needs an NVIDIA GPU; without one the breakdown shows CPU and the rest.
MacDock started as C# / WPF on .NET 10 and was rewritten in Rust (plain Win32, tiny-skia, WinRT through the
windows crate) to make it lighter. Same features, same config.json. Measured on the same laptop and screen,
20 s idle plus a 10 s scripted pointer sweep over the dock:
| C# / WPF | Rust | |
|---|---|---|
| Private memory | 320-379 MB | 12.9 MB |
| CPU idle | 0.04-0.6% | 0% |
| CPU while magnifying | 2.0-2.3% | 1.65% |
| Threads | 21-26 | 11 |
| On disk | 30 MB + .NET runtime | 1.1 MB exe |
The C# version is kept at the tag csharp-final.
- Built by @GodrezJr2 with Claude Code as an AI pair programmer.
- macOS and the Dock are trademarks of Apple Inc. MacDock is an independent project, not affiliated with or endorsed by Apple.



