Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ledge

A free, native macOS shelf. Replaces Dropover ($7 Pro unlock + its own cloud service) and Yoink ($8.99). A box in the corner of your screen. Invisible until you drag something at it — then it comes out to take the drop, and slides away again when you're done.

Part of Openware — real, self-hostable replacements for software that shouldn't cost anything. Not affiliated with Dropover or Yoink. Written from scratch against the idea, never against their code or assets.

The Ledge shelf holding a stack, a link and a text snippet

A stack of two files, a link, and a text snippet. Stacks fan out and count themselves; links get a colour derived from their domain, because fetching a favicon would mean touching the network.


Read this before you run it

Ledge asks for nothing. No Accessibility prompt, no Full Disk Access, no login, no menu-bar nag. That isn't a promise, it's an architectural constraint, and it decided the design:

  • macOS lets any app watch mouse events globally without permission. Only keyboard monitoring needs Accessibility. So the shelf wakes on where your pointer is, never on what you type.
  • The global shortcut goes through Carbon's RegisterEventHotKey, which also needs no permission. That's why a 1990s API is in here.
  • The edge tab is a real drop target in its own right, so the shelf still works even if no pointer events reach Ledge at all.

It never touches the network. No telemetry, no accounts, no updates, no model. This is the one drop with no .env, because a shelf that needs an API key is the joke this repo is about.

Dropover is not a subscription — it's a one-time unlock from a developer who earned it, and this isn't a takedown. Ledge is here for two other reasons: a shelf is a few thousand lines of AppKit and the floor for that should be zero, and every drop before this one was a web app in a container. This one proves the format survives contact with native Mac software.

How you use it

Drag anything at the corner The shelf comes out to meet the drag. Let go.
Hover the corner Same thing, empty-handed — for getting things back out.
⌃⌘L Show or hide it from the keyboard. Rebindable.
Menu bar Click the icon for the clipboard history, right-click for the menu.
Drag it somewhere else It stays where you put it and adopts the nearest corner, so it keeps hiding in the right direction.

Pin it (📌 in the header) and it stops hiding entirely.

What it does

  • Takes anything — files, folders, images, text selections, links, and file promises, so drags out of Photos, Mail and Notes work too
  • Gives it all back — drag one item, a selection, or a whole stack straight into Finder or any app. Hold to move instead of copy; drag to the Trash to drop it
  • Stacks — select several and press ⌘G, or drop one item onto another. The stack drags out as every file inside it
  • Floats over everything — every Space, every full-screen app, without stealing focus or interrupting the drag you're already in
  • Text and links become real files — a snippet is mirrored to a .txt and a link to a .webloc the moment it lands, so Finder accepts them, while text fields still get the plain string
  • Clipboard history in the menu bar, with pinning. Skips anything a password manager marks concealed
  • Quick Look with space, Reveal in Finder, Open, Save to…, and AirDrop/share
  • Remembers everything across relaunches, including where you put it
  • Adapts to light and dark, your system accent colour, and four corners
  • Haptic tick when something lands, on trackpads that have it

An empty shelf with a drag hovering it

What it doesn't do

  • No Handoff, no cross-device sync, no cloud. Real Handoff needs a paid Apple developer account and iCloud entitlements — an app you build yourself can't have it. Use the share button: AirDrop to your other devices is one click and doesn't need an account
  • Not notarized, no signed DMG. You build it from this folder. It's ad-hoc signed on your own machine, which is why Gatekeeper never gets involved
  • One shelf, not many. The corner is the point. If you want three floating shelves at once, Dropover does that and does it well
  • No upload targets — no S3, Dropbox, Imgur or link shortening. Nothing here talks to a server
  • Doesn't watch your Desktop for screenshots. Drag them in; it won't take them
  • macOS 14+, Apple silicon or Intel. No iOS app, no Windows, no Linux

Build it

git clone https://github.com/openwarehq/ledge
cd ledge
./build.sh
open Ledge.app

That's the whole thing. Needs Xcode or the Command Line Tools; no Xcode project, no signing identity, no pod install, no npm. The build compiles the app, draws its own icon with CoreGraphics (this repo ships no binary art), assembles Ledge.app, and ad-hoc signs it.

Move Ledge.app to /Applications if you like it, then turn on Settings → General → Launch Ledge at login.

Where your things live

~/Library/Application Support/Ledge/
├── shelves.json     # what's on the shelf, and where it sits
├── clipboard.json   # clipboard history
├── staging/         # files Ledge had to create (text snippets, dropped images, .webloc links)
└── clips/           # images from the clipboard history

Files you drag in from disk are never copied — the shelf points at the original. Ledge only deletes files it created itself, and only once nothing points at them.

Keyboard

Click the shelf first, then:

Key Does
Space Quick Look
Open
⌘A Select all
⌘C Copy
⌘G / ⇧⌘G Stack / unstack
Remove from shelf (never deletes your file)
Deselect, then hide
⌘W Hide

Hacking on it

swift test          # 58 tests over the pure logic — no window server involved
swift build         # debug build without assembling the bundle

The package splits in two on purpose:

  • LedgeCore — Foundation only. The shelf and stack model, persistence, staging, clipboard history, preferences, and DockGeometry, which is where every "which corner, how far off screen, what wakes it" decision is a pure function of a rectangle. All of it testable without a screen.
  • Ledge — AppKit and SwiftUI. Panels, drag plumbing, the menu bar.

The shelf grid is positioned by hand from ShelfLayout rather than by a SwiftUI grid, so AppKit's drag hit-testing and SwiftUI's drawing agree on where each tile is by construction instead of by coincidence.

To look at the UI without waving a mouse at it:

./Ledge.app/Contents/MacOS/Ledge --render-preview ~/Desktop

That renders the real views to PNGs. Live window blur is composited by the window server and can't be captured that way, so the glass falls back to a flat fill in those files — everything else is exactly what the app draws.


MIT. Take it, fork it, sell it.

About

A shelf in the corner of your screen. Invisible until you drag something at it. Free, native macOS, no permissions, no network.

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages