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

25 Oct 2026

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.

All features

02 Nov 2026 Everything Clipee does today, in version 1.0.1.

  • History window. ⇧⌘P opens it in the centre of the screen I work on, never on the screen I share.
  • Search. Every word must match, case and accents ignored, newest first.
  • Type filters. Tab or ⌃⌘A, ⌃⌘T, ⌃⌘L, ⌃⌘I, ⌃⌘F for All, Text, Links, Images and Files.
  • Copy as copied. ↩ restores rich text, images and file lists. ⌥↩ gives plain text. ⌘1 to ⌘9 copy a row.
  • Never pastes. No Accessibility permission needed.
  • Previous entry. ⌃⌥⌘V from any app copies the entry before the last one, and swaps back.
  • To a scratch file. ⌃⌥⌘E sends the clipboard to a new Textee scratch.
  • Source app. Each row shows the app it came from, or the tool that set the nspasteboard.org source marker.
  • Preview pane. Text, images and file lists show on the right.
  • 21 text actions on ⌘K. Trim, sort, dedupe, case changes, URL cleaning, encodings, JSON.
  • 3 local translations. English, French and German, through Ollama.
  • My own scripts. 1 line each in actions.jsonc, with a timeout.
  • Privacy rules. Password managers skipped, keys and tokens masked and expired after 24 hours, text kept 90 days, images and files 30.
  • Pause. From the menu bar or the CLI, with a red dot while paused.
  • Delete. ⌘⌫ removes an entry from the history.
  • Duplicates. A repeat copy moves the old entry to the top.
  • Alfred import. The 1st launch read Alfred's history.
  • Watchdog. A 3 s stall quits the app, and launchd starts it again.
  • Agent CLI. clipee with --json: status, stats, get, pause, resume, previous, textee, reload, describe.

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, such as my dictation app that pastes into the terminal, it can set the nspasteboard.org source marker, and Clipee shows that tool instead. A tool with no app bundle gets its name and icon from the settings file, so my dictations show with Dictee's red logo. For the dictation app, see Dictee: my own local dictation app.
  • It finds my screen without permissions. The window list gives the frame of the front app's top window, which needs no Screen Recording grant (titles would). Clipee opens on the display that holds most of that window, or under the mouse when there is none.
  • 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

Examples, with dummy data

25 Oct 2026 All values in this section are dummy data, not my history or my scripts.

An action is 1 line in ~/.clipee/actions.jsonc. Clipee reloads the file when I save it:

// Example actions (dummy names and paths)
{"actions": [
  {"id": "shout", "title": "Shout", "keyword": "sh", "run": ["tr", "a-z", "A-Z"], "output": "copy"},
  {"id": "crm-note", "title": "Add to CRM note", "keyword": "crm", "group": "Sales",
   "run": ["~/scripts/crm_note.py"], "output": "notify", "timeout": 30}
]}

output: copy puts the script's output on the clipboard as a new entry. notify shows its last line in a card. A tool that marks its copies gets a name and an icon in settings.json:

{"sources": {"com.example.dictation": {"name": "Dictation", "icon": "~/tools/dictation/icon.png"}}}

What an agent gets back from clipee get (dummy entry):

{
  "ok": true,
  "n": 3,
  "kind": "text",
  "copied_at": "2026-10-25T09:41:00+02:00",
  "value": "Invoice 4711 from Acme GmbH, due 15th November"
}

A key or token comes back refused, with exit code 3, unless the call adds --secret.

QA

132 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.

02 Nov 2026 Alfred itself went off on 24th October, replaced by my own launcher Launchee, see Launchee: my own keyboard launcher for macOS. The c keyword moved with it: in Launchee, c and a few letters open Clipee with that search.
4. Polish and agent interface. Filter keys and the source marker on 24th October, then version 1.0.1 with the agent interface and its own menu bar glyph. 8 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.