Clipee: my own clipboard history for macOS

A native clipboard history that replaced Alfred's: 1 hotkey, type a few letters, Return copies the entry back. It opens in 20 ms, filters 11,000 entries in under 5 ms and runs actions on any entry.

The Clipee app icon: a white clipboard with a red edelweiss on black, with the name Clipee under it

Clipee is my clipboard history. I press ⇧⌘P, type a few letters, press ↩, and the entry is back on the clipboard. ⌘K runs an action on it first: translate it, clean it, sort it, or hand it to 1 of my own scripts.

It replaced the clipboard history in Alfred (see Alfred). Claude Code built it on 23rd October 2026, from 29 questions I answered that day. Alfred's clipboard feature went off the same evening.

Every screenshot in this note comes from the QA run, on test data.

The Clipee window in dark mode with test data: a search field, type filters All, Text, Links, Images and Files with their keys, a list of entries with source app icons and Command-number shortcuts, the first row selected in red, and a preview pane on the right

Why I replaced Alfred's clipboard history

Before the build, Claude Code read a copy of Alfred's clipboard database and counted how I use it:

What I found Value
History opened About 12 times a day, by hotkey or by keyword
Copies recorded 121 a day on average, 235 on the busiest day
History kept 6,477 entries in 3 months, 4.4 MB of text
Multi-line entries 34%
Accents 524 entries with German umlauts, 202 with French accents
Formatting kept None: Alfred stores plain text only

3 things pushed me off it:

  • It went down with the launcher. On 19th October 2026 Alfred froze, and my clipboard history froze with it. Clipee is its own process, so a hung launcher can't take the history down.
  • Plain text only. A copy from an email or a web page lost its links and its bold.
  • The window opened in the same place whatever screen I was working on. I have 4.

I also wanted the jobs I do around the clipboard in the same window. The biggest, "send the clipboard to a new scratch file", ran 147 times in 30 days through a separate Alfred keyword.

What it does

Feature How it works
Search Every word must match, anywhere in the text. Case and accents ignored: muller finds Müller
Newest first Always, also when filtered. Row 2 is always the copy before
Type filters Tab cycles All, Text, Links, Images, Files. ⌃⌘A, ⌃⌘T, ⌃⌘L, ⌃⌘I, ⌃⌘F pick 1
Copy as copied ↩ brings back rich text, images and file lists as they were. ⌥↩ gives plain text
Rows 1 to 9 ⌘1 to ⌘9 copy a row directly
Previous entry ⌃⌥⌘V from any app copies the entry before the last one. Press again to swap back
To a scratch file ⌃⌥⌘E sends the clipboard to a new Textee scratch, see Textee: my own text editor for macOS
Where it opens In the centre of the screen with my focused window, never on the screen I share
Source app Each row shows the app it came from, with its icon
Pause From the menu bar, or clipee pause 15, before a screen share

It copies, it never pastes

This was my call. ↩ puts the entry on the clipboard and closes the window. I paste myself, with my own paste key. Clipee needs no Accessibility permission, and it never types into the wrong window.

Actions on ⌘K

⌘K turns the list into a menu of actions for the selected entry. I type to filter, with short keywords: tfr translates to French, trim trims the lines.

The Clipee action menu in light mode: Send to Textee, Copy as plain text, Translate to English, French and German, then text actions such as Trim the lines, Sort the lines, Remove duplicate lines, lowercase, UPPERCASE, Title Case, kebab-case, snake_case and camelCase, each with its group and keyword

  • 21 text actions: trim, sort, remove duplicate lines, case changes, clean tracking parameters from URLs, parse a URL, percent and base64 encoding, pretty and validate JSON. They port an Alfred workflow I had, with the same keywords.
  • 3 translations, to English, French and German, through a local model in Ollama. Nothing leaves my Mac. A sentence takes about 7 seconds when the model is cold.
  • My own scripts, from a small JSONC file. Clipee puts the entry on the clipboard and on standard input, then copies or shows the output. A script that hangs is killed after its timeout, and Clipee carries on.

The result of an action goes on the clipboard as a new entry. Nothing pastes.

The name comes from my older Python clipboard scripts, see Clipee. Those scripts now run from this menu.

Privacy

  • Password managers are skipped. Copies from 1Password, Passwords and Keychain Access, and any copy marked concealed or transient, are never recorded.
  • Text that looks like a key or token shows masked, isn't searchable, and expires after 24 hours.
  • The history expires. Text after 90 days, images and file lists after 30.
  • It stays on the Mac. 1 folder only my user can read, not synced, not in git, never in a log.

Speed

Measured by the QA script inside the app on my Mac Studio:

Metric Budget Measured
Hotkey to window, 11,000 entries < 30 ms 20 to 24 ms
Filter per keystroke, p95, 11,000 < 15 ms 4.7 ms
Filter per keystroke, p95, 51,000 - 24 ms
Memory, 11,000 entries < 80 MB 59 MB
Load at launch, 6,579 entries - About 100 ms
CPU when idle ~ 0% 1 check every 250 ms

How it's built

Stack

  • Swift 6 and AppKit, about 5,100 lines, no dependencies. Pieces come from my other apps: the window from Lastee: my own recent-files app for macOS, the SQLite wrapper from Hifee.
  • ClipeeCore, a Swift package with no AppKit: search, history rules, the store, the actions, the Alfred import. 15 unit tests.
  • SQLite holds the history, 1 file that the CLI reads directly.
  • No search index. 3 months of my copies are 4.4 MB of text. Clipee keeps a folded copy of each entry in memory (lowercase, no accents) and runs memmem for each word. That's fast enough at 51,000 entries.

Engineering notes

  • macOS has no "copied" notification. A timer on a background queue reads the pasteboard's change count every 250 ms and reads the content only when it changed.
  • The main thread never touches the disk. The store has its own queue. App icons and image previews load in the background. ↩ hides the window first, then copies.
  • A watchdog restarts it. A background thread checks the main thread every 100 ms. A stall of 3 seconds writes a log line and quits with code 70, and launchd starts Clipee again. A normal Quit stays quit.
  • The source of a copy can lie. By default it's the app in front. When a tool writes the clipboard for another app (my dictation app pastes into the terminal, see Dictee: my own local dictation app), it can set the nspasteboard.org source marker, and Clipee shows that tool instead.
  • The same text is 1 entry. A repeat copy moves the old entry to the top, matched by a SHA-256 hash.
  • It fits the small screens. On a 1024x600 screen the 1,100x680 window shrinks to fit, with a margin.

Agent interface

My agents use Clipee through its CLI, see What is NicAI. Every command takes --json. A write goes through a clipee:// URL opened in the background, and the CLI confirms it from a state file the app rewrites after each action.

clipee status --json      # running, paused until, entries, newest copy
clipee get 3 --json       # entry 3: kind, time, value (secrets refused without --secret)
clipee pause 10 --json    # stop recording for 10 minutes, confirmed
clipee textee --json      # the clipboard to a new Textee scratch

QA

110 end-to-end checks run the real app on a private pasteboard with a scratch history folder. They never touch my clipboard, never register a hotkey and never take the focus, so they run while I work. They cover capture of every type, the skip rules, secrets, search, every key, the actions, a fake Ollama, the Alfred import, the CLI and the watchdog. They fail when a speed budget breaks.

How I built it

  1. Usage review and questions. On 21st October 2026 Claude Code read Alfred's clipboard data, my Alfred workflows, my clipboard scripts and the hotkeys of my other apps. It wrote 29 questions, each with a recommendation.
  2. Answers and spec. I answered on 23rd October 2026. The spec records 24 decisions.
  3. Build and switch-over. Version 1.0 the same day. On the first launch it imported Alfred's 6,477 entries. Alfred's clipboard history went off, and its keyword now opens Clipee. Rollback is 1 checkbox in Alfred.
  4. Polish and agent interface. Filter keys and the source marker on 24th October, then version 1.0.1 with the agent interface. 7 commits in all.

The repository is private for now but has no personal paths in it and an MIT licence.

What I left out

Pins, paste stacks, OCR on images, sync with another Mac, and a settings window. The 2 settings files reload as soon as I save them.

Further reading

The app Clipee replaced:

What it's built on:

NicAI
Written by NicAI, Nic's AI assistant, for his personal knowledge base. Researched and drafted by the model, not hand-written by Nic. Verify anything you plan to act on.