A lightweight, native clipboard history app for macOS 26 Tahoe. Lives in the menubar, stores the last N items you copied (text, images, files), and lets you paste any of them back with a global shortcut.
- Menubar-only app — no Dock icon, stays out of your way
- Unified clipboard history: plain text, rich text (RTF), images, and file references
- Global shortcut (default:
⇧⌘V) to open the history popover from any app - Auto-paste into the previously focused text field
- Search, pin favorites, deduplicate — clipboard history done right
- Password-aware: respects
NSPasteboardTypeConcealed, so 1Password / Safari AutoFill entries don't leak into history - Bilingual UI: English + German, auto-detects from system, overridable in settings
- Launch at login toggle (
SMAppService) - Optional persistence across restarts (JSON in
~/Library/Application Support/TomsClippyLight/)
Screenshots to be added after first build.
Since this app is unsigned (no Apple Developer ID), macOS will quarantine it by default. You need to remove the quarantine flag manually.
-
Download the latest
TomsClippyLight.zipfrom the Releases page. -
Unzip and move
TomsClippyLight.appto/Applications. -
Open Terminal and run:
xattr -d com.apple.quarantine /Applications/TomsClippyLight.app
Alternatively, use the bundled helper:
curl -fsSL https://raw.githubusercontent.com/tomschmidtdev/toms-clippy-light/main/scripts/install.sh | bash -
Launch the app.
-
On your first paste via the history, macOS will ask for Accessibility permission. Grant it under System Settings → Privacy & Security → Accessibility.
Right-click the menubar icon, choose Settings….
| Option | Default | Description |
|---|---|---|
| Launch at login | off | Auto-start with your Mac via SMAppService |
| Language | Automatic | Override UI language (English / German) |
| History size | 20 | Max number of recent entries (1–100) |
| Persist history | off | Keep history across app restarts |
| Ignore passwords | on | Skip entries flagged by password managers |
| Show history shortcut | ⇧⌘V | Open history popover globally |
Press your configured shortcut (default ⇧⌘V) in any application. The history popover appears with a search field. Click an entry (or press Enter on the first match) to paste it back into the text field you just had focused.
Requirements: macOS 26 Tahoe, Xcode 26+, XcodeGen.
brew install xcodegen
git clone https://github.com/tomschmidtdev/toms-clippy-light.git
cd toms-clippy-light
make build # or: xcodegen generate && open TomsClippyLight.xcodeproj| Target | Purpose |
|---|---|
make generate |
Regenerate .xcodeproj from project.yml |
make build |
Debug build |
make test |
Run unit + UI tests |
make archive |
Release archive (signed with Apple Development cert if available, otherwise ad-hoc) |
make install |
archive + copy .app to /Applications |
make zip |
Distributable .zip under build/ |
make release-local |
Same as zip, prints artifact path |
make clean |
Remove build/, DerivedData/, generated .xcodeproj |
The project uses Swift Testing for unit tests and XCUITest for UI smoke tests. Core services use dependency-injected protocol wrappers (PasteboardProtocol, WorkspaceProtocol, KeyboardSimulating, LaunchAtLoginService) so every system API is replaceable with a fake.
make testPush a tag of the form vX.Y.Z:
git tag v0.1.0
git push origin v0.1.0GitHub Actions will:
- Archive an unsigned
TomsClippyLight.app - Package it into
TomsClippyLight.zip - Compute its SHA-256
- Create a GitHub Release with both artifacts and installation instructions
| Permission | Why |
|---|---|
| Accessibility | Needed to simulate ⌘V against the previously focused app after you pick an entry. macOS will prompt the first time you try to auto-paste. |
The app does not request network access, full disk access, or any other elevated permissions.
- Clipboard contents stay local to your Mac.
- With Persist history disabled (default), nothing touches disk.
- With it enabled, history is stored unencrypted in
~/Library/Application Support/TomsClippyLight/history.json. - Password manager entries (flagged with
NSPasteboardTypeConcealed) are ignored by default.
MIT © 2026 Tom Schmidt