Skip to content

Repository files navigation

Shove

Shove

Shoves the menu bar aside. A chevron, a divider, nothing else.

English · 한국어 · 日本語

A menu bar that has run out of room hides the icons on its left, and it never tells you which ones. Shove gives you a divider you can drag icons past, and a chevron that shoves everything on the far side off the edge until you want it back.

Requires macOS 14 or later (Apple Silicon or Intel). No dependencies, no permissions — not Accessibility, not Screen Recording. It only ever changes the width of its own menu bar item.

Install

Two ways in, depending on what you already have.

Have Xcode 16? Homebrew builds it from source in a few seconds.

brew tap logcat-io/tap
brew install shove
cp -R "$(brew --prefix)/opt/shove/Shove.app" /Applications/
open /Applications/Shove.app

No Xcode? Take the built app instead — nothing else needed.

  1. Download Shove-<version>.zip from Releases
  2. Unzip it and move Shove.app to /Applications
  3. Run this once, because the app is signed but not notarised:
/usr/bin/xattr -dr com.apple.quarantine /Applications/Shove.app
open /Applications/Shove.app

Why Homebrew builds rather than downloads. Shove is signed ad-hoc rather than notarised with a paid Apple Developer ID, and macOS quarantines anything downloaded — which is what the third line above clears. Nothing built on your own machine is quarantined. That route needs Xcode 16 itself rather than only the command line tools, which have shipped an older Swift than the package requires.

Why copy rather than symlink. macOS does not count a symlink in /Applications as an installed app: Spotlight will not index it and Finder shows it without its icon.

Build it from the repository

git clone https://github.com/logcat-io/shove.git
cd shove
./Scripts/install.sh

Setting it up

Shove settings

This part is manual and cannot be otherwise: macOS gives no way for one app to move another app's menu bar icon. You arrange them once.

  1. Hold and drag menu bar icons past the divider, the thin bar to the chevron's left.
  2. Click the chevron to shove them off the edge.
  3. Click it again to bring them back. The chevron itself never moves out of reach.

Settings has an option to bring them back when the pointer reaches the menu bar instead. It is off by default, because every trip to a File menu crosses the bar and would shuffle the icons under a pointer that was going somewhere else.

Right-click the chevron to see what is currently hidden, by name. macOS will not let one app click another's menu bar icon, so the list says where things went rather than offering to fetch them; bring them back and click the real one.

Optionally, set it to shove them aside on its own after a while, in Settings.

If you cannot see the chevron

A menu bar with no room left hides new icons too, including Shove's own — which leaves nothing to click and nothing to drag. Free up a little space once and both appear:

  • System Settings → Control Center — set the readouts you do not use to "Don't Show in Menu Bar". Each one is roughly 40 points.
  • Or quit a menu bar app you are not using.

Once Shove is placed and shoving for you, the room comes back several times over.

How it works

macOS offers no API to hide another app's status item, and Shove does not try. It creates two items of its own:

[ icons you dragged here ] [ divider ] [ chevron ] [ everything else ]

Shoving widens the divider past the width of the screen. A status item's right edge stays put as it grows, so the left edge runs off the display and takes everything on that side with it. Bringing them back sets the width to ten points. That is the entire mechanism, and it is why no permissions are involved.

Why there are two items when you can only see one. The chevron looks like it could do the widening itself. It cannot: a status item whose origin leaves the display is dropped from the screen entirely, item and image together. Measured while shoved, the widened item sat at x=-863 and appeared in no on-screen list, so a chevron drawn on it went too and nothing was left to press. The item that is widened can never be the item you press.

So the divider stays. Taking its mark off to make it look like one control was tried and put back: macOS reserves sixteen points of padding for a status item however narrow it is set, so a blank divider bought no room and left a gap with nothing to explain it. Removing the item entirely while unshoved was tried too — recreating it on the next shove placed it at a default slot sixty-eight points from the chevron, with an icon stranded between the two, and shoving hid nothing.

The two are created in the reverse of the order they appear, since a status item made later is placed further left. The chevron is created first so it stays on the visible side of the divider.

Development

swift test              # 32 tests, core logic only, no AppKit involved
./Scripts/install.sh    # build and install into /Applications
swift Scripts/make-icon.swift

ShoveCore holds the parts worth testing — the width policy, the auto-hide rule, preferences — and knows nothing about AppKit. Shove is the two status items and a settings window.

Licence

MIT. See LICENSE.

About

Folds the menu bar away. One chevron, one divider, nothing else.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages