Lightweight clipboard history manager for macOS
Project description
Clipsy
A lightweight clipboard history manager for macOS. Runs as a menu bar icon — no admin privileges, no code signing, no App Store required.
Features
- Clipboard history — Automatically captures text, images, and file copies
- Image thumbnails — Visual previews for copied images in the menu
- Sensitive data masking — Auto-detects API keys, passwords, SSNs, credit cards, private keys, and tokens; displays masked previews with 🔒 icon
- Search — Full-text search across all clipboard entries (SQLite FTS5)
- Rich text preservation — Preserves RTF and HTML formatting when re-copying from history (e.g., bold, italic, links from web pages)
- Pin favorites — Option-click to pin up to 5 frequently-used snippets (sensitive data cannot be pinned)
- Click to re-copy — Click any entry in the menu to put it back on your clipboard
- Deduplication — Copying the same content twice bumps it to the top instead of creating a duplicate
- Auto-purge — Keeps the most recent 500 entries, automatically cleans up old ones
- Persistent storage — History survives app restarts (SQLite database)
- Corporate IT friendly — Runs as a plain Python process, no
.appbundle or Gatekeeper issues
Requirements
- macOS
- Python 3.10+ (Homebrew recommended:
brew install python3)
Installation
Via Homebrew (recommended)
brew install brencon/clipsy/clipsy
clipsy
Via pipx
brew install pipx
pipx install clipsy
clipsy
Via pip
pip install clipsy
clipsy
From source
git clone https://github.com/brencon/clipsy.git
cd clipsy
python3 -m venv .venv
.venv/bin/pip install -e .
.venv/bin/clipsy
Usage
After running clipsy, the app installs as a background service and starts automatically on login. A scissors icon (✂️) appears in your menu bar.
Then just use your Mac normally. Every time you copy something, it shows up in the Clipsy menu:
[✂️ Icon]
├── Clipsy - Clipboard History
├── ──────────────────
├── Search...
├── ──────────────────
├── 📌 Pinned ►
│ ├── "my-api-endpoint.com/v1..."
│ ├── "SELECT * FROM users..."
│ ├── ──────────────────
│ └── Clear Pinned
├── ──────────────────
├── "Meeting notes for Q3 plan..."
├── "https://github.com/example..."
├── 🔒 "password=••••••••"
├── [thumbnail] "[Image: 1920x1080]"
├── ... (up to 10 items, configurable)
├── ──────────────────
├── Clear History
├── ──────────────────
├── Support Clipsy
├── ──────────────────
└── Quit Clipsy
Tip: Hold Option (⌥) while clicking an entry to pin/unpin it.
Commands
clipsy # Install and start as background service (default)
clipsy status # Check if running
clipsy uninstall # Remove from login items
clipsy run # Run in foreground (for debugging)
Configuration
| Variable | Default | Range | Description |
|---|---|---|---|
CLIPSY_MENU_DISPLAY_COUNT |
10 |
5–50 | Number of entries shown in the menu |
# Example: show 20 entries in the menu
export CLIPSY_MENU_DISPLAY_COUNT=20
Data Storage
All data is stored in ~/.local/share/clipsy/:
| File | Purpose |
|---|---|
clipsy.db |
SQLite database with clipboard entries |
images/ |
Saved clipboard images (PNG files) |
clipsy.log |
Application log |
Development
# Install with dev dependencies
.venv/bin/pip install -e ".[dev]"
# Run tests
.venv/bin/python -m pytest tests/ -v
# Run with coverage
.venv/bin/python -m pytest tests/ --cov=clipsy --cov-report=term-missing
Architecture
NSPasteboard → monitor.py → redact.py → storage.py (SQLite) → app.py (menu bar UI)
app.py—rumps.Appsubclass; renders the menu bar dropdown, handles clicks and searchmonitor.py— PollsNSPasteboard.changeCount()every 0.5s; detects text, images, and file copiesstorage.py— SQLite with FTS5 full-text search, SHA-256 deduplication, auto-purgeredact.py— Sensitive data detection and masking (API keys, passwords, SSN, credit cards, tokens)config.py— Constants, paths, limitsmodels.py—ClipboardEntrydataclass,ContentTypeenumutils.py— Hashing, text truncation, PNG dimension parsing, thumbnail generation
Dependencies
Only one external dependency:
rumps— macOS menu bar app framework (bringspyobjc-framework-Cocoatransitively)sqlite3— Built into Python
License
MIT License — see LICENSE for details.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file clipsy-1.9.1.tar.gz.
File metadata
- Download URL: clipsy-1.9.1.tar.gz
- Upload date:
- Size: 32.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
261bfbe1ab7e792233d294829474c56deb94f3e26fa9a74060dd79a6c504db93
|
|
| MD5 |
f615b1873ecb477e6f2815d31e395215
|
|
| BLAKE2b-256 |
8be423e4aa05a06b256df4b8a0e44c8c771f7df49b08bc894ea31948c81dd0dd
|
Provenance
The following attestation bundles were made for clipsy-1.9.1.tar.gz:
Publisher:
release.yml on brencon/clipsy
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
clipsy-1.9.1.tar.gz -
Subject digest:
261bfbe1ab7e792233d294829474c56deb94f3e26fa9a74060dd79a6c504db93 - Sigstore transparency entry: 920686371
- Sigstore integration time:
-
Permalink:
brencon/clipsy@843d6eafb2face7d393e7765ee7915552157954b -
Branch / Tag:
refs/heads/main - Owner: https://github.com/brencon
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@843d6eafb2face7d393e7765ee7915552157954b -
Trigger Event:
push
-
Statement type:
File details
Details for the file clipsy-1.9.1-py3-none-any.whl.
File metadata
- Download URL: clipsy-1.9.1-py3-none-any.whl
- Upload date:
- Size: 18.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a6324bda6d72dc2de7a882b4facd480c1b2334009a4ecb2feb836132f3a2260a
|
|
| MD5 |
b51821a7b8eb30215c198f6482ea0ab4
|
|
| BLAKE2b-256 |
6f13a104424ba4bd986d41e8a548ac39647752b1e224f5e2818f6f376286791e
|
Provenance
The following attestation bundles were made for clipsy-1.9.1-py3-none-any.whl:
Publisher:
release.yml on brencon/clipsy
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
clipsy-1.9.1-py3-none-any.whl -
Subject digest:
a6324bda6d72dc2de7a882b4facd480c1b2334009a4ecb2feb836132f3a2260a - Sigstore transparency entry: 920686434
- Sigstore integration time:
-
Permalink:
brencon/clipsy@843d6eafb2face7d393e7765ee7915552157954b -
Branch / Tag:
refs/heads/main - Owner: https://github.com/brencon
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@843d6eafb2face7d393e7765ee7915552157954b -
Trigger Event:
push
-
Statement type: