ClipKitty

ClipKitty icon

Never lose what you copied.

Unlimited history • Instant fuzzy search • Live preview • iCloud Sync • Private by default

ClipKitty clipboard history ClipKitty fuzzy search ClipKitty content filter

Why it exists

You copied that command last week. That code snippet yesterday. That address six months ago. Your clipboard manager either forgot it, couldn't find it, or cut off half the content.

ClipKitty stores everything. Finds it in milliseconds; whether you have 100 items or 100,000. Built for people who copy lots of things and need to find them again.

Why ClipKitty?

ClipKitty
vs Maccy Same simplicity, no limits. Maccy caps at 999 items, slows past 200, and has no multi-device sync. ClipKitty scales to millions and syncs across Macs via iCloud.
vs Raycast Same speed, better search, no expiration. Raycast doesn't save long clips; its free tier expires after 3 months and sync requires a paid subscription. ClipKitty preserves everything forever, syncs via iCloud for free, and finds it faster with smarter, typo tolerant search.
vs Paste Same utility, no subscription. Paste charges $30/year. ClipKitty is free on GitHub or pay once on the App Store.

Features

Installation

Quick Install

Download on the Mac App Store

Manual Download

  1. Download the latest DMG from GitHub Releases.
  2. Drag ClipKitty to your Applications folder.

Getting Started

  1. Press ⌥Space to open your clipboard history.
  2. Type to fuzzy search.
  3. Use Arrow Keys to navigate and Return to paste.

Keyboard Shortcuts

Shortcut Action
⌥Space Open clipboard history
↑ / ↓ Navigate
Return Paste selected item
⌘1–9 Jump to item 1–9
Tab Cycle content type filter
Escape Close

Building from Source

git clone https://github.com/jul-sh/clipkitty
cd clipkitty
make

Requires macOS 15+ and Swift 6.2+.

How Search Works

Search is a latency problem disguised as a text problem.

The search system has a few hard requirements:

Those requirements pull against each other. The naive approach is: every time the user types, scan every clipboard item, compute a fuzzy score against the full text, and sort the results. That works for 100 items. It stops working at 100,000 items, and it really stops working when some items are hundreds of kilobytes or megabytes long.

ClipKitty solves that by splitting search into cheap recall and expensive judgment:

  1. Store everything in full. The source of truth lives in SQLite. Nothing is truncated out of storage. If you copied a huge log, code file, or stack trace, the whole thing is still there.
  2. Index searchable units, not just rows. Small items are indexed as one unit. Large items are indexed as overlapping chunks. This matters because relevance is usually local. If one 16 KB region is a great match, we want to reason about that region, not pay to analyze the entire 1 MB document on every query.
  3. Use Tantivy for fast broad recall. For normal queries, Tantivy indexes trigrams and word positions. That gives a cheap first pass that is typo-tolerant and can still reward phrase-like matches. For very short queries, ClipKitty uses a simpler prefix/contains path because trigrams are not a good fit below 3 characters.
  4. Collapse chunks back to one parent item immediately. Large items are chunked internally, but the product is still item-based. During Phase 1 collection, ClipKitty keeps only the best hit per parent item. If 20 chunks from one giant document match, that still becomes one candidate, not 20.
  5. Make large documents earn their way in. A huge document almost always contains common words like the, error, or function. Without adjustment, those documents float upward on weak evidence and flood the expensive path. Phase 1 therefore blends Tantivy relevance with recency and a size-aware penalty for weak large-document matches. Strong local evidence still wins. Weak “it matched somewhere” evidence does not.
  6. Only rerank the head. Phase 2 is the high-quality, expensive reranker. It does more detailed matching and prepares the signals used for final ordering. But there is no reason to spend that cost on the entire tail. ClipKitty reranks only a bounded top slice, then appends the rest in Phase 1 order.
  7. Use the matched region for snippets, highlights, and preview bootstrapping. For large items, the row snippet and highlight analysis come from the best matching chunk, not from the top of the document. That makes results more legible and avoids wasting time analyzing irrelevant parts of large content on the hot path. When a full preview is opened, those chunk-local highlights are mapped back into full-document offsets.

The important idea is that search quality does not come from doing expensive work on everything. It comes from doing cheap work to find plausible candidates, then doing expensive work only where it can change what the user sees.

Problems This Solves