Skip to content

Repository files navigation

Perch app icon

Perch

A Dynamic-Island for your MacBook's notch

Hover the notch and it springs open into a little island — now-playing with live artwork, a file shelf, your calendar, a clipboard history, and a mirror of the menu-bar items the notch hides. Leave, and it melts back into the bezel.


Perch expanding on hover from the now-playing wings into the full media island

Hover → island. Leave → notch. While music plays, album art and an EQ flank the notch on their own — no hover needed.


macOS 14+ Swift 5.9 SwiftUI + AppKit 168 tests


What it is

Perch turns the dead space around the MacBook notch into a Dynamic-Island-style companion. It's a single borderless panel fused to the hardware notch that moves through four states — idle (invisible), minimal (a background activity peeks out), compact (a glanceable live activity), and expanded (the full interactive island) — with one spring family and a content-hugging shape that takes only the space each module needs.

It is app-agnostic: now-playing comes from the system's private MediaRemote feed (via a vendored perl bridge), so a YouTube tab in Safari shows up the same as Spotify.

Now playing

Collapsed now-playing wings Expanded media module with artwork and scrubber
Compact wings. Album art hugs the notch's left shoulder; an EQ dances on the right; the title marquees below. Appears on its own when audio plays. Expanded. Full artwork, transport, and a drag-to-seek scrubber wired straight to the player.

The modules

Hover to expand, then switch with the icon rail flanking the notch — or swipe across it.

Media Now-playing for any app, live artwork, drag-to-seek
Shelf Drag files onto the notch to stash them; drag out later, or AirDrop the lot
Clips Rolling clipboard history — click any entry to put it back
Today Remaining calendar events with countdown pills, plus a focus session
Do Launch your Apple Shortcuts from the island
Cam A quick webcam mirror
Bar Right-click to reveal every menu-bar item — including the ones the notch hides

The Bar — reach what the notch ate

The Bar module mirroring menu-bar items, including ones hidden behind the notch

macOS silently stops drawing menu-bar icons that don't fit behind the notch. Perch mirrors all of them — captured live with ScreenCaptureKit — and clicking a hidden one opens it for real (an AXPress straight to the suppressed item).

Focus & the lock screen

  • A focus session shows as an orange progress glow beneath the collapsed notch, and as a ring in the compact island.
  • With music playing, the wings stay alive on the lock screen — the panel elevates to the window-shielding level the moment the screen locks, and drops back on unlock.

Run it

./scripts/run.sh

Builds a signed Perch.app into ~/Applications and launches it. The script bakes in a few hard-won requirements (see its comments): a real .app bundle and a stable signing identity so macOS attributes Calendar / Camera / Automation / Screen-Recording prompts to Perch — a bare binary gets silently denied or killed.

A capsule status-bar item provides Quit and a manual toggle. Works on notched MacBooks (the island fuses with the hardware notch) and falls back to a synthetic pill at the top-center on any other display.

How it works (the interesting bits)

  • Universal now-playing. macOS gates the private MediaRemote framework behind an entitlement since 15.4. Perch uses the mediaremote-adapter approach — /usr/bin/perl is an entitled platform binary that loads a tiny adapter framework and streams JSON now-playing diffs. Push, not poll; any app; artwork inline. AppleScript is the automatic fallback.
  • Lock-screen presence is two lines of public API — canBecomeVisibleWithoutLogin plus CGShieldingWindowLevel() — with a watchdog so a dropped unlock notification can never strand the panel above everything.
  • Click-through honesty. The panel pre-grows once to its largest size so module-to-module morphs never resize the window (panel resizes rebuild AppKit tracking areas and fire phantom mouseExited events). A flipped hit-test view passes clicks outside the live island hull straight through to the menu bar beneath.
  • Notch math is pure. Geometry takes screen metrics in and returns window rects out, so placement — including negative-origin multi-display setups — is unit-tested without touching AppKit.

Tests

swift test   # 168 tests — geometry, phase machine, media-stream parsing, swipe accel, …

Status & credits

A proof of concept, built to explore notch UX — then hardened across three rounds of adversarial review. Now-playing uses ungive/mediaremote-adapter (BSD-3-Clause), vendored under vendor/.

About

A Dynamic-Island for your MacBook's notch — now-playing, file shelf, calendar, clipboard, and a mirror of the menu-bar items the notch hides. SwiftUI + AppKit.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages