A secondary Dock for the unused edges of your Mac.
Glass. Magnification. Auto-hide. Plaintext config.
No Accessibility. No Screen Recording.
The system Dock occupies one edge of one screen. Ultrawide and multi-display setups still leave a tall strip of unused space on the left or right. SIDEDOCK is a second Dock for that edge: pinned apps, recents, folders, and the same click-to-hide behavior you already know.
It is not a clone of Sidebar. It is the core Dock mechanic, written in Swift, auditable, and configured with a file you can keep in git.
Wide Macs waste the sides. Most third-party docks either become a widget board, or they ask for Accessibility and Screen Recording so they can draw live window previews.
SIDEDOCK stays a Dock:
- A vertical glass panel on the left or right of every display
- Apps you pin stay there whether they are running or not
- Hover magnification with cosine falloff, neighbors spreading the way Apple’s Dock does
- Auto-hide, revealed by moving the pointer to the edge
- A JSON file at
~/.config/sidedock/config.jsonthat reloads live
If you want media controls, a calendar, or a window switcher, this is the wrong app. If you want the Dock on the side of an ultrawide, this is the one to build on.
| Pin apps | Stay on the dock when they are not running. Drag from Finder to add; drag to reorder. |
| Click like the Dock | Launch, focus, or hide the frontmost app. |
| Magnification | Hover enlarges the icon and pushes neighbors apart. Off, or 1.0–3.0. |
| Auto-hide | Approach the screen edge to reveal. Leave, and it springs away. |
| Recents | Unpinned apps you just used appear under a separator. Right-click to pin. |
| Folders | Drop a folder on the dock. Hover to peek inside; click an item to open it. |
| Always visible | Optional. macOS still will not shrink other windows around a third-party strip. |
| Menu bar extra | Settings, Open at Login, Recents, Reveal Config, Quit. The app itself stays out of the system Dock. |
| Launch at login | On by default the first time you run it. Turn it off from the menu bar or Settings. |
| Running indicators | Small dots for open apps, like the system Dock. |
Full idea-to-code map, including what is still out: FEATURES.md.
SIDEDOCK does not request:
- Accessibility
- Screen Recording
- Input Monitoring
Edge detection uses NSEvent mouse monitors only. Apps launch through NSWorkspace. Folder drops store a path plus a security-scoped bookmark so the same code can stay sandboxed later for the App Store.
There are no live window previews, and there will not be unless the project later takes Screen Recording on purpose. That is a product decision, not a missing checkbox.
Download the DMG, drag the app into Applications, open it once. That is the whole setup.
- Open
SIDEDOCK.dmg. - Drag SIDEDOCK onto Applications.
- Eject the disk image, then open SIDEDOCK from Applications.
On first launch the app:
- Lives in the menu bar (no icon in the system Dock)
- Writes
~/.config/sidedock/config.jsonif it is missing - Turns Open at Login on so it comes back after restart
If you open it from the disk image instead of Applications, it asks to move itself there first. That keeps the login item pointed at a copy that still exists after you eject the installer.
macOS may ask you to confirm the first open (Control-click → Open) until the build is notarized with an Apple Developer ID. Same account you will use later for the App Store.
./scripts/make-dmg.shOutput: dist/SIDEDOCK-1.0.0.dmg (and dist/SIDEDOCK.dmg). To sign with a Developer ID:
CODE_SIGN_IDENTITY="Developer ID Application: Your Name" ./scripts/make-dmg.shOpen MacSideDock.xcodeproj, select the MacSideDock scheme, and Run. Debug builds skip the move-to-Applications prompt and do not register a login item, so Xcode runs do not stick around after reboot.
- macOS 26.5 or later
- Xcode 26 to build from source
The DMG is the path for now. App Store submission needs an Apple Developer Program account, sandbox entitlements in MacSideDock/MacSideDock.entitlements, screenshots, and Product → Archive. Direct download stays unsandboxed so config, Finder drops, and login work without extra permissions.
Move the pointer to the left (or right) edge of the screen. The dock slides in.
| Action | Result |
|---|---|
| Click an app | Launch, focus, or hide if it is already frontmost |
| Drag an app from Finder | Pin it |
| Drag an icon | Reorder |
| Drop a folder | Pin it; hover to peek |
| Right-click an app | Open, Hide/Show, Show in Finder, Keep in Dock, Remove |
| Right-click the dock | Hiding, magnification, and position |
| Menu bar icon | Settings, login, recents, config, quit |
Settings is a small grouped window: size, magnification, edge, auto-hide, recents, and login. Re-open it from the menu bar, or by clicking the app in Finder (it handles reopen by showing Settings).
Path: ~/.config/sidedock/config.json
Edits on disk are picked up live. Invalid JSON is ignored until it parses again; the last good config stays in memory.
{
"autoHide": true,
"edge": "left",
"iconSize": 48,
"lastMagnification": 1.8,
"magnification": 1.8,
"pinnedApps": [
"com.apple.finder",
"com.apple.Safari",
"com.apple.mail",
"com.apple.Notes",
"com.apple.systempreferences"
],
"pinnedFolders": [],
"recentsLimit": 6,
"reserveScreenSpace": false,
"showRecents": true,
"showRunningIndicators": true,
"version": 3
}| Key | Values |
|---|---|
edge |
"left" or "right" |
iconSize |
24–96 |
magnification |
1–3 (1 is off) |
pinnedApps |
Bundle IDs, or { "bundleIdentifier": "com.apple.Safari" } |
recentsLimit |
3–12 |
reserveScreenSpace |
Always-visible mode; turns auto-hide off |
Menu bar → Show Config in Finder if you do not want to hunt for the file.
MacSideDockApp
└── AppDelegate
├── DockPanelManager one NSPanel per display
│ └── DockPanelController
│ └── DockView SwiftUI: icons, recents, folders, drop
├── StatusItemController menu bar extra
├── RecentsStore
└── DockConfigStore ~/.config/sidedock/config.json
| Folder | What lives there |
|---|---|
Dock/ |
Panel, glass, magnification, auto-hide, hover, folder peek |
Apps/ |
Launch, click/hide, recents, login item, folder bookmarks |
Config/ |
JSON model and live reload |
Preferences/ |
Settings window, menu bar, feature catalog |
Magnification math is isolated in Dock/DockMagnification.swift. Reveal policy is isolated in Dock/DockRevealLogic.swift. Both are covered by tests in MacSideDockTests/.
SIDEDOCK is open source because the Dock is personal, and the feel has to be right on real hardware. If you care about that, you should be able to read the code, change it, and ship a build the same afternoon.
Good first work:
- A real macOS app icon (the asset catalog is still empty)
- Photographs of the running app for this README
- A Homebrew cask
- Localization
- Magnification and hide-show feel on your display
- Tests around config, recents, and drop insertion
Please read CONTRIBUTING.md before opening a pull request. Issues and PRs are welcome. The bar is native feel, not extra widgets.
Principles we will not casually reverse:
- No Accessibility or Screen Recording for the core Dock.
- Config stays a plaintext file a human can diff.
- The app remains a Dock, not a sidebar of utilities.
- Live window previews
- Media controls
- Calendar
- Window snapping
- Window switcher
These were considered and left out of v1. See FEATURES.md.
MIT © Mohammad Rehan