← Clipnest

Using Clipnest

A guide for everyday use — install, permissions, clipboard history, snippets, and troubleshooting.

Looking for the developer/API reference instead? See docs/API.md on GitHub.

1. What is Clipnest

Clipnest is a small, native menu-bar app for Mac that quietly remembers everything you copy — text, links, images, and files — so you can search back through it and paste it again later. It also has Snippets: reusable bits of text you write yourself, which you can drop into any app by typing a short keyword.

Clipnest lives only in the menu bar (there’s no Dock icon day-to-day, no window that stays open) and is entirely private: nothing you copy or type into Clipnest ever leaves your Mac. There’s no account, no cloud sync, and no analytics — everything is stored in a local database in your user Library folder. The one narrow exception to “no network access” is an optional, once-a-day background check against GitHub’s public Releases API to see whether a newer version exists (on by default, and it never downloads or installs anything on its own — see Settings window); it sends nothing about you or your clipboard, just an anonymous request for the latest release tag.

This guide is written for the Mac. Since 1.0 Clipnest also runs on Linux (Ubuntu with GNOME); the shortcuts reference lists the Linux keys, and Using Clipnest on Linux covers what’s different.

2. Requirements

3. Install

curl -fsSL https://raw.githubusercontent.com/AayushGour/clipnest/main/scripts/install.sh | bash

This works on both macOS and Linux (Ubuntu; see Using Clipnest on Linux). On the Mac, Clipnest installs into your Applications folder and launches. To update later on the Mac:

curl -fsSL https://raw.githubusercontent.com/AayushGour/clipnest/main/scripts/update.sh | bash

Before replacing anything it checks that the new app’s version matches the release and that its code signature is valid and made by the same signer as your installed copy (a mismatch aborts with a SECURITY message and leaves your app untouched). The new app is copied next to the old one and swapped in only after those checks pass, and the old one is restored if the swap fails. Clicking the version in the picker footer does the same, but runs the script from the release tag being installed rather than from main.

Download the .dmg

Grab the latest .dmg from the project’s Releases page, open it, and drag Clipnest into your Applications folder.

First launch — signing, honestly

Clipnest isn’t distributed through the Mac App Store, and it isn’t signed with a notarized Apple Developer ID by default — but the recommended one-line install above doesn’t trigger any Gatekeeper dialog at all. Here’s why: macOS’s “unidentified developer” check is triggered by the com.apple.quarantine flag, and that flag is set by the downloader (Safari, Chrome, Mail, AirDrop…), not by the app itself — curl never sets it. In its place, install.sh/update.sh verify the downloaded .dmg against a SHA-256 checksum published alongside every release, and refuse to install anything unverifiable.

Every release is still signed — with one long-lived, self-signed certificate, not a throwaway ad-hoc identity — which is exactly what lets your Accessibility grant survive updates instead of needing to be re-added every release (see First launch & permissions).

If you instead download the .dmg directly from the Releases page (see Install), your browser will set the quarantine flag, and macOS Gatekeeper will say Clipnest is from an “unidentified developer” the first time you open it. To get past that once:

After that first launch, Clipnest opens normally like any other app. The one-line curl install avoids this step entirely: it downloads with curl (which never sets the quarantine flag) and, as an extra measure, install.sh also clears the flag on the app it installs.

4. First launch & permissions

When Clipnest first launches, it shows a small Welcome window once — also once after you update from a version that didn’t have it — and then sits quietly in your menu bar. The window has three steps: (1) the Accessibility grant (needed to paste straight into other apps and expand snippets; Continue stays disabled until it is allowed, and the hotkey itself opens the picker without it), (2) Open Clipnest at login — a pre-checked switch, applied when you press Continue, that is the same setting as Settings → General → Launch Clipnest at login (if macOS refuses, the reason is shown and nothing is changed), and (3) Try your hotkey — your live ⌥⌘V binding, a button to change it in Settings → Shortcuts, and a live check that confirms the hotkey opens the picker. Skip step 2 or 3, or on step 1 choose the low-key Set up later, which first shows exactly what will not work (picking an item only copies it, snippets will not expand) and needs a second click to confirm. You can also close the window with Esc / ⌘W / the red button; it won’t appear again on its own. Reopen it any time from the menu-bar icon → Getting Started…. While it is open Clipnest shows its Dock icon (macOS requires that to bring the window to the front) and hides it again when you close it (unless Settings is still open). Clipboard capture, browsing, and search all work immediately with no permissions granted at all.

Accessibility is the one permission Clipnest asks for, and it’s needed for two things:

Step 1 of the Welcome window is where Clipnest asks: Allow Accessibility… shows macOS’s “Clipnest would like to control this computer” dialog on demand (nothing prompts at launch while the Welcome is unseen), and the row flips to Allowed on its own within a couple of seconds once you turn Clipnest on in System Settings. If you chose Set up later, you can allow it any time in Settings → Permissions, and Getting Started… shows its current status. If you have already seen the Welcome, the original behaviour applies: at most one automatic dialog ever, then a paste attempt made while Accessibility isn’t granted just silently falls back to clipboard-only (press ⌘V yourself) instead of re-prompting, and neither opening the picker nor pressing ⌥⌘E triggers it. If pressing ⌥⌘E shows “Clipnest needs Accessibility access to expand snippets”, Accessibility isn’t granted — grant it manually (see below).

To grant it (or bring back that one-time dialog on your own terms): System Settings → Privacy & Security → Accessibility → turn on Clipnest — or open Settings → Permissions (⌘,) and click Grant Accessibility…, which shows the same system dialog on demand and is never rate-limited (see Settings window).

If you build Clipnest from source yourself: every fresh Debug build has a new, unsigned code identity, so macOS may ask you to re-grant Accessibility after each rebuild — and if System Settings still shows Clipnest as granted but nothing actually works after an update or rebuild, see Settings window → Permissions for the real fix (toggling it off and back on doesn’t work).

5. Clipboard history

How capture works

Clipnest checks the system clipboard a few times a second and, whenever something new appears, saves a copy — text, rich text, links, images, and files are all recognized. Copying the exact same content again doesn’t create a duplicate entry; it just bumps the existing one back to the top of your history.

Opening the picker

Press ⌥⌘V (Option+Command+V) from anywhere — even inside a full-screen app — and the picker pops up right next to your mouse cursor. You can also click the Clipnest icon in the menu bar and choose Open Clipnest.

The picker never steals keyboard focus from the app you were using until you actually select something, so you can safely open it, look around, and press Esc to go right back to what you were doing.

Searching

The search field is focused automatically as soon as the picker opens — just start typing. Matches are highlighted in the list. Press ⌘F at any point to jump back to the search field (handy after arrowing through results).

Filtering by type

Next to the search field, a row of small icon chips lets you narrow the current tab down to one kind of content: All, Text, Image, File, or Link. Click a chip to filter, click All to clear it. (These chips aren’t shown on the Snippets tab, since snippets don’t have a “kind.”)

Tabs

The picker has three tabs, switchable by clicking or with ⌘1 / ⌘2 / ⌘3:

Tab Shortcut Shows
History ⌘1 Everything captured, newest first
Pinned ⌘2 Only items you’ve pinned, ordered by when you pinned them
Snippets ⌘3 Your saved snippets

Pasting an item

Highlight an item (click it, or arrow to it) and press Return — Clipnest pastes it into whatever app was frontmost before you opened the picker. If the source item had rich formatting, Return keeps it; press ⌥Return instead to strip it down to plain text. (An image with recognized text behaves a little differently — see Recognizing text in screenshots.)

If Accessibility isn’t granted, “pasting” just places the item on your regular clipboard — press ⌘V yourself to finish the paste.

Pinning

Press ⌘P, click the pin icon on a row, or right-click → Pin/Unpin. Pinned items move out of History and into the Pinned tab so your most-used items are always easy to find again.

Deleting

Press ⌘⌫ (macOS) or Ctrl+Delete (Linux) — plain Delete/Backspace never delete an item — click the trash icon on a row, or right-click → Delete, to remove an item for good (this also frees up the disk space it was using, for images/rich text).

Pausing capture

Choose Pause Capture from the menu-bar icon (Linux: the tray icon), or switch on Pause clipboard capture in Settings → General, to stop Clipnest saving what you copy. While capture is paused the status icon shows it: dimmed with a pause mark (macOS menu bar; Linux tray). On macOS VoiceOver reads it as “Clipnest — capture paused”; on Linux the tray tooltip reads “Capture paused — copies are not being saved”. Pause persists across relaunch, and pausing or resuming from Settings updates the icon too. Choose Pause Capture again to resume.

Hovering for a full preview

Hover your pointer over any row and a preview panel appears beside the picker after a brief pause. To get the same preview while moving through the list with the arrow keys, turn on “Show preview when selecting with the keyboard” in Settings -> General (off by default). A row under the pointer always takes priority over the keyboard-selected one:

Recognizing text in screenshots (optional OCR)

Turn on “Recognize text in copied images” in Settings → History (off by default — see Settings window) and Clipnest reads the text in a screenshot right on your Mac, using Apple’s Vision framework: no upload, no model download, no network call of any kind. Once it’s on, a Fast / Accurate quality choice controls how thorough the recognition is — Accurate is the default; it reads punctuation, digits, and arrows correctly but takes a little longer per screenshot, while Fast is quicker but can confuse similar characters (like 1 and l). Neither can read keyboard symbols such as ⌘ ⌥ ⇧.

Once an image has recognized text:

Turning this on is a real privacy trade-off: recognized text becomes indexed, searchable content stored alongside the image, so a screenshot of a password or anything else sensitive turns that into searchable text on disk — which is exactly why it’s off by default. It never runs on anything Clipnest wouldn’t have captured anyway — concealed/transient copies and excluded apps are filtered out before an item is even captured (see Privacy & exclusions), so recognition never sees them either.

How much history does Clipnest keep?

By default, Clipnest automatically keeps only the most recent 2,500 items (raised from 1,000 in 1.6.0; if you had never changed the limit you get the new default automatically, and a limit you chose yourself is kept), trimming older ones as new ones arrive — it isn’t unlimited out of the box. Open Settings → History (⌘, — see Settings window) to change this: cap it by a different number of items, cap it by age instead (30 days by default), or switch to Everything to turn the cap off and keep everything until you delete it yourself. Pinned items are never counted against the cap, no matter which mode you pick. That same tab also has a Clear All History… button to wipe everything at once (including pinned items, after a confirmation), or you can remove Clipnest’s whole data folder yourself (see Uninstall).

6. Snippets

Snippets are text you write yourself — a signature, a boilerplate reply, a shell command — as opposed to things Clipnest captured automatically. Each snippet has two fields:

Creating a snippet

A small editor window opens beside the picker. Fill in the Tag and Body and click Save (or Cancel to discard). Both fields are required.

Editing or deleting a snippet

On the Snippets tab, right-click a snippet → Edit or Delete, or use the always-visible pencil/trash icons on the row.

Pasting a snippet from the picker

Just like History/Pinned: highlight a snippet on the Snippets tab and press Return to paste its Body.

Expanding a snippet by keyword, anywhere

This is the fast path — you don’t need to open Clipnest at all:

  1. Type a snippet’s Tag in any app.
  2. Select it (highlight the text you just typed).
  3. Press ⌥⌘E (Option+Command+E).

Clipnest replaces the selected text with that snippet’s Body. For example, if you have a snippet with Tag sig and Body Best,\nAlex, typing sig, selecting it, and pressing ⌥⌘E turns it into your signature.

Clipnest does not expand text automatically as you type — you type the Tag, select it, and press the shortcut (⌥⌘E by default on the Mac, Alt+Super+E on Linux; both are rebindable in Settings → Shortcuts). The snippet editor shows your current shortcut under the Tag field.

Matching is case-insensitive and ignores surrounding whitespace, so SIG, sig , and Sig all match a Tag of sig.

If expansion can’t happen, Clipnest tells you why instead of beeping, and nothing changes:

Situation Message
Nothing selected “Nothing is selected. Select a snippet tag, then press the shortcut.”
Selection matches no Tag “No snippet uses the selected text as its tag. Check the tag in the Snippets tab.”
Accessibility isn’t granted (macOS) “Clipnest needs Accessibility access to expand snippets. Turn it on in Settings > Permissions.”
The app didn’t accept the replacement “Clipnest couldn’t replace the selection in this app. Try again, or paste the snippet from the picker.”

(The messages show your actual shortcut where they say “the shortcut”.) On the Mac the message appears in a small HUD near the pointer; it never takes focus away from your app and is hidden from screen sharing. On Linux it is a desktop notification titled “Snippet not expanded” (it needs /usr/bin/gdbus or /usr/bin/notify-send; without either, Clipnest falls back to a terminal bell).

Why this works everywhere: Clipnest first tries to read and replace the selection directly through macOS’s Accessibility API (this never touches your clipboard). In apps where that isn’t possible — Electron/Chrome-based apps like VS Code or Slack are common examples — it falls back to simulating a copy and paste instead, and carefully snapshots your existing clipboard beforehand and restores it afterward, so your clipboard ends up exactly as it was. Both paths require Accessibility to be granted (see First launch & permissions).

7. Privacy & exclusions

Clipnest is built to never see or store things it shouldn’t:

Where your data lives on disk

Everything Clipnest stores lives under one folder in your user Library:

~/Library/Application Support/Clipnest/
├── ClipItems.store     # clipboard history (metadata)
├── Snippets.store      # your snippets
└── blobs/              # image & rich-text content, deduplicated by content hash

Nothing here is synced or backed up anywhere outside your normal Mac backups (e.g. Time Machine, if you use it). On Linux the same data lives in ~/.local/share/Clipnest (or $XDG_DATA_HOME/Clipnest).

8. Settings window

Everything about how Clipnest behaves lives in one Settings window, opened with ⌘, from the picker or the menu-bar icon. It has five tabs:

Tab What it controls
General Launch Clipnest at login, pause clipboard capture with one toggle, turn the background update check on/off (see What is Clipnest), and choose whether the item preview also shows when you select a row with the arrow keys (off by default; see Hovering for a full preview).
History How much history is kept (see How much history does Clipnest keep?), the “Recognize text in copied images” OCR toggle and its Fast/Accurate quality (see Recognizing text in screenshots), and Clear All History….
Shortcuts Rebind Clipnest’s two global hotkeys — Open Clipnest and Expand snippet — to whatever key combination you want. Click a shortcut, then press the new combination; it takes effect immediately, no restart needed. (This only rebinds the two global shortcuts — the shortcuts inside the picker itself, listed below, are fixed.)
Apps Exclude specific apps from capture, on top of the built-in password-manager list (always on, can’t be removed — see Privacy & exclusions). Add an app by picking its .app bundle from a file picker; remove one with its − button.
Permissions See whether Accessibility is granted, grant it on demand, or jump straight to System Settings. Also the one place that explains a real gotcha: because Clipnest is signed locally, an update or a rebuild can leave System Settings still showing Clipnest as granted while it no longer actually is. The fix is to remove Clipnest from the Accessibility list with the − button and add it again — toggling the switch off and on does not fix it.

Opening Settings briefly shows a Dock icon while that window is focused — Clipnest goes back to menu-bar-only, no Dock icon, the moment you close it. That’s expected, not a bug.

9. Keyboard shortcuts reference

Global (work from any app)

Action Mac Linux
Open/toggle the picker ⌥⌘V Alt+Super+V
Expand a snippet by Tag ⌥⌘E Alt+Super+E

Inside the picker

Action Mac Linux
Move selection up / down ↑ / ↓ ↑ / ↓
Paste selected item / snippet Return Return
Paste without formatting ⌥Return Alt+Return
Focus the search field ⌘F Ctrl+F
Pin / unpin highlighted item ⌘P Ctrl+P
Save highlighted item as a snippet ⌘S Ctrl+S
New snippet (Snippets tab) ⌘N Ctrl+N
Edit highlighted snippet (Snippets tab) ⌘E Ctrl+Shift+E
Next / previous type filter (History, Pinned) ⌘] / ⌘[ Ctrl+] / Ctrl+[
Show / hide the preview of the highlighted item ⌘Y Ctrl+Y
Delete highlighted item / snippet ⌘⌫ Ctrl+Delete
Switch to History tab ⌘1 Ctrl+1
Switch to Pinned tab ⌘2 Ctrl+2
Switch to Snippets tab ⌘3 Ctrl+3
Open Settings ⌘, Ctrl+,
Close the picker Esc (or the × button at the right of the header) Esc (or the × button)

The two global shortcuts above — Open/toggle the picker and Expand a snippet by Tag — are rebindable from Settings → Shortcuts (⌘,): click a shortcut field and press your preferred key combination; it takes effect immediately (see Settings window). The shortcuts inside the picker (search, pin, delete, switch tabs, and so on, listed in the table above) are fixed and aren’t currently customizable.

Screen readers. Each picker row is a single VoiceOver (macOS) / Orca (Linux) item, spoken as its type, whether it is pinned, its age, and the first ~80 characters (“Text, pinned, 2 minutes ago: …”, “Image, 1200 by 800, 5 minutes ago”, “Snippet Sig, keyword sig: …”). On macOS the row’s actions (Pin/Unpin, Delete, Save as Snippet, Paste as plain text, Copy Recognized Text, Edit) are in the VoiceOver Actions rotor, and VoiceOver’s default action pastes. Keyboard focus stays in the search field while you press ↑/↓, so VoiceOver announces the newly highlighted row instead of moving focus. Tabs and type filters are announced with their full names (“Images filter”) and “selected”; the active type filter also shows its name next to the filter icons. The preview is off by default while arrowing (Settings → General); ⌘Y / Ctrl+Y shows it for the highlighted item on demand.

⌘, (Command+Comma) also opens Settings while the Settings window itself is focused — the standard macOS convention — but it is deliberately not a global shortcut: unlike ⌥⌘V/⌥⌘E above, it only works from inside the picker or from Settings itself, so it never takes ⌘, away from whatever other app you’re using (that app’s own Preferences/Settings shortcut keeps working normally).

10. Troubleshooting

Clipnest isn’t capturing anything I copy. Check whether you’re copying from a password manager (1Password, Bitwarden, LastPass, Dashlane, Keeper) — those are deliberately never captured, by design. If it’s a different app, make sure Clipnest is actually running (look for its icon in the menu bar) — if it quit or crashed, nothing will be captured until you relaunch it.

⌥⌘V (or ⌥⌘E) doesn’t do anything. Another app may already be using that combination — a common source of silent conflicts with global hotkeys. Either quit or check the shortcut settings of whatever else might claim Option+Command+V or Option+Command+E (menu-bar utilities, window managers, other clipboard tools), or just rebind Clipnest’s own shortcut instead: open Settings → Shortcuts (⌘,) and record a new key combination for Open Clipnest or Expand snippet (see Settings window).

Paste puts the item on my clipboard but doesn’t type it into the app. This means Accessibility isn’t granted. Turn it on from System Settings → Privacy & Security → Accessibility, or from Settings → Permissions in Clipnest itself (see Settings window). Granting a permission never takes effect for a paste that’s already in progress — press ⌘V once yourself to finish that one, and every paste after that should work automatically.

⌥⌘E doesn’t expand my snippet. Clipnest shows a short message near the pointer saying why: nothing is selected (highlight the Tag text before pressing the shortcut), the selection doesn’t match any snippet’s Tag, Accessibility isn’t granted (unlike a picker paste, expansion won’t prompt you for the permission on its own), or the app didn’t accept the replacement (see Expanding a snippet by keyword). If you see no message at all, the hotkey itself isn’t reaching Clipnest — see the previous entry.

macOS says Clipnest is from an “unidentified developer” / won’t open. This means you downloaded the .dmg directly through a browser rather than using the one-line curl install — a browser download sets the quarantine flag that triggers this Gatekeeper check, but curl never does. See First launch — signing, honestly: on macOS 15+ use System Settings → Privacy & Security → Open Anyway (Control-click → Open only works on macOS 14), or run xattr -dr com.apple.quarantine /Applications/Clipnest.app, or just switch to the recommended curl install and this won’t come up again.

I rebuilt Clipnest from source and it’s asking for Accessibility again. Expected — an unsigned development build gets a new code identity on every rebuild, so macOS treats it as a “new” app each time and needs Accessibility re-granted. Signing each build with one certificate (scripts/sign.sh "<identity>") keeps the grant across rebuilds. If Settings shows Not granted right after you switched it on, the entry belongs to a different build: remove Clipnest from the Accessibility list with −, or run tccutil reset Accessibility com.clipnest.app, then add it again.

I opened a second copy of Clipnest and it quit straight away. Expected. Only one copy runs at a time, because two copies would both claim ⌥⌘V and ⌥⌘E. The copy that was already running keeps going.

I don’t see a Dock icon or a normal app window — is that right? Yes. Clipnest is a menu-bar-only app by design; look for its icon in the menu bar, and use ⌥⌘V or that menu to reach it. (Opening Settings briefly shows a Dock icon while that window is focused — that’s expected, and it goes away again once you close Settings.)

11. Uninstall

The one-line uninstaller works on macOS and Linux:

curl -fsSL https://raw.githubusercontent.com/AayushGour/clipnest/main/scripts/uninstall.sh | bash

It works on both macOS and Linux, removes the app and keeps your history, snippets and settings. Add --purge (bash -s -- --purge) to delete that data too; CLIPNEST_DRY_RUN=1 shows what it would do without doing it. On Linux, --purge also removes the clipnest-input group, so log out and back in afterwards.

Manual alternative (Mac): drag Clipnest from Applications to the Trash, then, if you also want to remove your data:

rm -rf ~/Library/Application\ Support/Clipnest \
       ~/Library/Preferences/com.clipnest.app.plist \
       ~/Library/Caches/com.clipnest.app \
       ~/Library/HTTPStorages/com.clipnest.app

Everything Clipnest stores is local to those folders — removing them leaves nothing behind.

12. Using Clipnest on Linux

Since 1.0, Clipnest runs on Ubuntu 22.04 and 24.04 with GNOME, on X11 or Wayland, for amd64 and arm64 — a native GTK 4 app built from the same Swift core, so everything in sections 5–8 applies, with the Linux keys from the shortcuts reference.

How Linux behaves differently from the Mac — picker placement on Wayland and the optional GNOME Shell extension, terminals, password managers, and the Ubuntu 22.04 GTK note — is listed under Linux differences.