- Category
- Mac Apps
- Platform
- macOS 14+
- Version
- 0.2.0
- Size
- 3.6 MB
- License
- MIT
A macOS clipboard manager that gives you back exactly what you copied: every format the pasteboard offered, multi-file copies kept as multiple files, and Chinese search that actually finds things.
Try it in your browser
The demo below runs entirely in your browser on made-up sample data — it does not connect to any real service. Get the real thing on GitHub.
Keys: ↑ ↓ to move, ↵ to copy, ⌘1–9 to pick (your browser may claim ⌘1–9 — ⌥1–9 also works here), ⌘P pin, ⌘⌫ delete, esc clears the search. Double-click a row to copy it.
Why bigrams: the same query against two tokenisers
Both columns search the index built from the sample items above (prefix queries on both sides, sensitive items excluded). The panel itself also runs the title-prefix and substring-fallback layers, as the app does.
A run of Han characters is one token.
Han runs become overlapping two-character tokens; the query must match them consecutively.
Fidelity, not just text
One copy is one NSPasteboardItem carrying several types: public.rtf,
public.html, public.utf8-plain-text, plus whatever private types the
source app adds. Clipflow stores all of them and writes all of them back, so formatting survives
the round trip. Copy three files and you get three files back; the pasteboard's multi-item structure
is kept instead of being flattened into one.
Copying a file only ever puts a public.file-url on the pasteboard (a 200 MB video is
76 bytes there), so that reference is what gets stored and pasted, as with any clipboard manager.
The preview pane lists which formats an entry holds and how big each one is, because fidelity is
the point and should be visible.
Chinese search that works
SQLite FTS5's default tokeniser treats a run of Han characters as a single token, so a word in the middle of a sentence is never found. Clipflow tokenises in the app layer: Han runs become overlapping bigrams and are queried as a phrase, so the bigrams must appear consecutively and precision holds. Latin text is indexed by word plus camelCase parts and queried by prefix. A capped substring fallback covers fragments in the middle of a word and single characters.
Results are ordered by recency, never by relevance score: ranking 20,000 hits took 46 ms versus 0.30 ms by recency, and the most recent match is usually the one you want.
Private by construction
- No telemetry, no account, no analytics. Capture, storage, search and paste are all local.
- The only network request is the update check against GitHub releases. It sends no identifiers and can be switched off.
org.nspasteboard.ConcealedType,TransientTypeandAutoGeneratedTypeare honoured, and a blocklist covers 1Password, Bitwarden, LastPass, Dashlane, KeePassXC and similar.- Content that looks like a JWT, an AWS key, a private key or
password=is marked sensitive, kept out of the search index and expires on a short TTL. - Database files are
600, directories700.
Measured performance
Figures from the project README: 48,000 items on an M4 Pro, reproducible with the scripts in bench/.
| Operation | Median | P95 | Budget |
|---|---|---|---|
| List recent 20 | 0.09 ms | 0.11 ms | — |
| Chinese phrase search | 0.16 ms | 0.19 ms | 16 ms |
| Identifier search | 0.45 ms | 0.55 ms | 16 ms |
At 1,000,000 items the store measured 518 MB with a P95 search of 0.27 ms, so latency stays flat as history grows.