A lightweight, menu-bar clipboard history manager for macOS 14+. Copy any text,
then press ⌘⇧V to summon a floating panel of your recent copies — just like
Windows 11's clipboard history (Win+V). Pick an item, and it becomes your
active clipboard, ready to paste with ⌘V.
Built entirely with SwiftUI + AppKit, no dependencies, no build system beyond the Swift toolchain.
- ⌘⇧V floating panel — appears right at your cursor; click or press ↑ / ↓ / ⏎ / esc to navigate and copy.
- Last 15 text copies stored in memory (newest first, nothing written to disk).
- Duplicates collapsed — consecutive identical copies don't spam the list.
- Menu bar icon with the most recent copies, plus:
- Appearance (System / Light / Dark)
- Panel size (Small / Medium / Large)
- Launch at login
- Optional auto-paste after selecting (Windows-style; needs Accessibility permission to inject the ⌘V keypress — handy, never required)
- Clear history, quit
- Text only — exactly the kind of thing you'd copy-paste between apps.
- macOS 14.0 or later
- Xcode not required — just the Command Line Tools (
swift) that ship on any Mac withxcode-select --install
./build-app.sh # compiles + assembles dist/CopyPal.app
open dist/CopyPal.app # launchTo make "Launch at login" reliable, drag CopyPal.app into /Applications.
| File | Responsibility |
|---|---|
HotkeyMonitor.swift |
Registers the global ⌘⇧V via Carbon RegisterEventHotKey — works system-wide with no Accessibility permission |
ClipboardMonitor.swift |
Polls NSPasteboard.general every 250 ms, catches new text copies |
HistoryStore.swift |
In-memory history, capped at 15, dedupes self-writes |
PanelController.swift |
Non-activating floating NSPanel positioned near the cursor |
PanelView.swift |
The SwiftUI list UI + keyboard/click handling |
MenuBarView.swift |
MenuBarExtra UI, recent copies, and settings |
AppModel.swift |
Coordinator wiring it all together |
The pattern in PanelController.swift is worth a look if you're interested in
non-activating panels — the clipboard stays with your foreground app while the
panel still receives keyboard input.
copy pal/
├── Package.swift # Swift package (executable target)
├── Info.plist # App bundle metadata (LSUIElement → menu-bar only)
├── build-app.sh # Build + .app bundle assembly
├── Assets/
│ ├── AppIcon.icns # App icon
│ └── AppIcon-1024.png # 1024 master PNG
├── Scripts/make-icon.swift # Regenerates the app icon from scratch (pure AppKit drawing)
└── Sources/CopyPal/ # All sources
swift Scripts/make-icon.swift # rewrites Assets/AppIcon.icnsMIT — see LICENSE.