The clipboard manager for vibe coders β native to Mac.
Clipboard history Β· region capture & annotation Β· OCR to clipboard Β· scrolling capture Β· screen recording β GIF Β· voice & meeting notes, transcribed on-device Β· copy-as-code-block Β· batch to PDF/ZIP
Free & open source (Apache 2.0) Β· No telemetry Β· Native Swift, no Electron Β· 100% on-device
Coding with AI is one long copy-paste loop between your editor and Claude, ChatGPT or Cursor. You paste a snippet in, paste the answer back, screenshot the broken UI, re-paste the same stack trace into a second model, and dictate the prompt because the context is already in your head. macOS gives you one clipboard slot and a screenshot that lands on the Desktop.
Klip's answers to that are opinionated on purpose:
- Local-first, because your clipboard holds your keys. Everything lives in
~/Library/Application Support/Klip/. Tokens are encrypted at rest with the key in the Keychain. - Everything on-device, because your audio and your screen should not leave the machine. Transcription runs on Whisper via Core ML. There is no account, no server and nothing to upload to.
β₯β§shortcuts, becauseββ§+letter is already taken by your editor. Option+Shift plus a letter is comfortable to hold, sits on the left of the keyboard, and is rarely claimed β so the global hotkey actually fires.- Native Swift, because a clipboard manager that lags is worthless. AppKit and SwiftUI, real macOS behind-window vibrancy on every floating surface β genuine glass, not a translucent-looking fill.
macOS only for now. macOS 14 (Sonoma) or later, Apple Silicon or Intel. A Windows version is the next big thing on the roadmap.
1. You copy. Klip remembers. Nothing to press. Every text and image copy lands in the history, grouped by day β Today / Yesterday / the weekday, each row carrying just its clock time.
2. You need something from twenty copies ago.
β₯β§E. Type a few characters, matches highlight as you type. β/β, Enter pastes into whatever app you were in. Or narrow with a type chip first: text, links, images, video, voice, credentials, favorites. A chip only appears once you own items of that type.
3. The UI is broken and describing it is hopeless.
β₯β§D, drag over the region. The overlay behaves like ββ§4: no screen dimming, a neutral gray veil on the selection edged by two one-device-pixel strokes β dark outside, white inside β and a live dimension badge at the correct Retina scale. Let go and Klip Snap opens β arrow at the bug, rectangle around the misaligned element, a numbered badge on each thing the model should look at, blur over the customer's email. Copy, paste into the chat.
4. The error is in a screenshot, not selectable text.
β₯β§F. Snip the region, the text is OCR'd straight onto your clipboard. No editor, no window, nothing to close.
5. The context is a whole page, not one screen.
β₯β§S, select the content area. Klip winds the page back to its top, then scrolls and stitches its own way down to the end β one long image. The rewind matters because you scrolled to find the thing; without it the capture would start mid-page and stop after one frame.
6. Explaining the prompt out loud is faster than typing it.
β₯β§R, talk, β₯β§R again. Transcription runs in the background β start another recording immediately. The text lands in history, the audio stays with it. Add your stack's jargon to Context words (GitHub, React, Supabase, webhook) and the proper nouns come out spelled right.
7. You bundle the context. Hit the β icon in the header, tick the error, the screenshot and the config snippet, and combine them into a PDF (one page per item), a ZIP, or a collection for this task.
8. You paste it in the shape the model wants.
ββ© wraps a snippet in triple backticks with a detected language tag. "Copy as Markdown" for one item, or export the whole history. Copying an AI answer out of a dark-themed chat gives you clean text with the bold and the emojis but none of the background, colours or fonts. Then "Copy for WhatsApp" or "Copy for email" when the answer has to go to a human.
Loop closed. Everything you touched is still in the history tomorrow.
- macOS 14 (Sonoma)+ β tested on macOS 26, Apple Silicon.
- Xcode Command Line Tools only, no full Xcode:
xcode-select --installThere is no download link, and that is on purpose. A prebuilt .app handed out on the internet needs Apple Developer ID notarization; without it Gatekeeper quarantines the download and macOS calls Klip damaged or from an unidentified developer. Building it on your own Mac sidesteps that: install.sh signs with a certificate it makes locally, and the app simply opens.
git clone https://github.com/tamibot/klip.git klip
cd klip
./install.shThat builds Klip, signs it, copies it to /Applications and launches it; Klip registers launch-at-login itself on first run. The icon appears in the menu bar; β₯β§E opens the history.
The first build takes about two minutes and is quiet for most of them. Swift Package Manager fetches WhisperKit and everything it drags in β eight packages, around 90 MB of source (WhisperKit, swift-transformers, swift-jinja, swift-crypto, swift-asn1, swift-collections, swift-argument-parser, yyjson) β before a single file compiles, and then compiles in silence. Later builds reuse .build/ and take seconds. That download is source code, not the speech model: the model arrives the first time you record a voice note.
Klip starts in your Mac's language if it speaks it (English, Spanish, French, German, Italian, Portuguese, Chinese, Japanese), and in English otherwise. KLIP_DEFAULT_LANG=fr ./install.sh forces one; so does Preferences βΊ Language, at any point.
On the signing certificate. On first run
install.shcreates a local signing certificate ("Klip Code Signing") in your Keychain so the signature is stable. That is what makes macOS remember the microphone, screen-recording and accessibility permissions across updates instead of re-prompting on every reinstall. Local and reversible: delete it from Keychain Access.
Klip asks for three. The first-run window offers all three up front β next to the speech-model download, which is never a gate; skip any of them there and the feature that needs one asks when you first use it. Nothing is captured until you press a shortcut.
| Permission | What needs it | If you say no |
|---|---|---|
| Screen Recording | β₯β§D annotate Β· β₯β§F OCR Β· β₯β§S scrolling capture Β· β₯β§V screen recording Β· β₯β§M meetings, for the system-audio track |
Those five stop with a pointer to System Settings β a meeting refuses to start at all, before the microphone is even asked for. Clipboard history and voice notes carry on. |
| Accessibility | Auto-paste (Enter pasting into the app you came from) and the automatic scrolling in β₯β§S |
The clip is still copied and focus still returns β you press βV. Scrolling capture falls back to stitching while you scroll, so it still hands you an image. |
| Microphone | β₯β§R voice notes and β₯β§M meetings |
Neither can start. Nothing else changes. |
Screen Recording is the one macOS only honours after Klip is reopened. Accessibility is never requested behind your back β it comes from the Klip menu β "Enable auto-pasteβ¦" or from Preferences βΊ General. macOS may also ask you to approve the login item in Settings βΊ General βΊ Login Items.
./build.sh
open Klip.appinstall.sh does not end with advice. Once Klip is launched it reports what is actually true on your Mac β signature verified, which of the three permissions are recorded as granted, stray Klip*.app copies, a login item left behind by the old bundle id β and lists only what still needs you, with the exact place to do it.
The same check runs on its own, any time Klip misbehaves:
./doctor.shIt adds the rest of the picture: is Klip running, is the installed binary older than Sources/, how big the data folder is, and recent crash reports with the termination reason printed β the line that says CODESIGNING β Launch Constraint Violation when macOS killed Klip over its signature, instead of leaving you to guess why the app vanished. It ends with a plain verdict and one next step per problem.
doctor.sh is read-only: no deletes, no defaults write, no tccutil, no sudo. It never removes the stale login item either β that record belongs to the old bundle id, so it is reported and you remove it by hand in System Settings βΊ General βΊ Login Items & Extensions. It also runs when the Swift toolchain is broken, since that is one of the things it diagnoses.
Permissions are read from macOS's own record, which needs Full Disk Access for your terminal. Without it doctor.sh says unknown β check in the app rather than guessing.
./uninstall.sh # asks before removing anything
./uninstall.sh --dry-run # prints the plan, changes nothingIt quits Klip, removes /Applications/Klip.app β which takes the launch-at-login registration with it β and deletes the "Klip Code Signing" certificate from your login keychain. Then it asks separately about your data: ~/Library/Application Support/Klip, the io.github.tamibot.klip preferences and the credential encryption key in the Keychain, telling you how many images, voice notes and recordings that is before you answer. The default is no. --keep-data leaves all of it alone; --yes removes everything, data included, without asking.
Saving credentials for later takes more than copying the folder. Klip encrypts credentials at rest, and the key lives in the Keychain rather than in
~/Library/Application Support/Klip. Copy the folder and you copy the ciphertext without the key: those items come back permanently unreadable. Klip keeps the sealed text rather than discarding it, so nothing gets worse β but nothing gets it back either. Reveal and copy anything you still need before you remove the key.
Two things no script may touch, both printed again when it finishes:
- The permissions. Remove Klip by hand in System Settings βΊ Privacy & Security under Microphone, Screen Recording ("Screen & System Audio Recording" on macOS 15+) and Accessibility β and in General βΊ Login Items & Extensions if it is still listed.
- The speech models in
~/Documents/huggingface/models/argmaxinc/whisperkit-coreml. That is the shared WhisperKit cache and another app may be using it, so deleting it is your call.
swift build
swift run Klip
./test.shEight global hotkeys, all β₯β§ (Option+Shift) + a letter. All rebindable in Preferences βΊ Shortcuts.
| Shortcut | Action |
|---|---|
β₯β§E |
Open the history panel (Edit history) |
β₯β§R |
Record / stop a voice note |
β₯β§D |
Capture a region and annotate it (Draw β Klip Snap) |
β₯β§F |
Fast text capture: snip a region β OCR straight to the clipboard, no editor |
β₯β§O |
Open the "upload audio/video to transcribe" window |
β₯β§M |
Record a Meeting (mic + system audio) β press again to stop |
β₯β§V |
Record the screen to Video/GIF, region or full screen, with system audio β again to stop |
β₯β§S |
Scrolling capture: select an area β Klip scrolls the whole page itself β one long image |
In the panel:
| Key | Action |
|---|---|
β / β + Enter |
Navigate and pick |
ββ© |
Copy the selected text item as a code block (never a credential) |
ββ« |
Delete the selected item β confirming first if it carries an image or audio |
ββ§F |
Star / unstar the selected item |
Esc |
Backs out one layer at a time: leave multi-select, then clear the search, then close |
ββ§β4 β macOS's own screenshot-to-clipboard β lands in Klip too.
Automatic text and image history Β· instant search with match highlighting and full keyboard navigation Β· type filters (text Β· links Β· images Β· video Β· voice Β· credentials Β· favorites) Β· auto-paste into the active app Β· favorite β Β· delete π with clear-all confirming first Β· grouped by day, dates rendered in the UI language you picked, not the system one.
- Region overlay (
β₯β§D, reused by theβ₯β§Vandβ₯β§Spickers) β rebuilt to feel likeββ§4. No screen dimming: a neutral gray veil marks the selection, edged by two one-device-pixel strokes (dark outside, white inside), live dimension badge at the correct Retina scale, Apple-style crosshair, hint text that fades on its own, no popup animation. Engine is ScreenCaptureKit, not the deprecated capture API. A preference sends region captures either to the annotation editor or straight to the clipboard. - Klip Snap, the annotation editor β select & move any annotation Β· pencil Β· line Β· arrow Β· rectangle Β· ellipse Β· highlighter Β· text (editable, movable, resizable) Β· blur/pixelate Β· spotlight Β· numbered counter badges Β· colour Β· stroke width Β· undo/redo Β· pinch zoom with a live percentage readout. The editor shows the capture and nothing else, no gray dead space around it.
- OCR (
β₯β§F) β on-device Vision. Snip, and the text is on your clipboard and in history. Also available as a row action on any image. - Scrolling capture (
β₯β§S) β select the content area; Klip rewinds to the top, then scrolls and stitches down on its own. Bounded on purpose: 20 steps up, 50 down, and hard caps of 16 000 px or 120 frames auto-finish with what exists, so an endless feed can't run away and it never fails to save. Stitching matches around the known expected offset β that is what killed the seam artifacts a full-range search produced on repetitive content. Cancel from the pill, withEsc, orβ₯β§Sagain to finish now. Needs Accessibility, but is not gated up front: that permission is bound to the code signature and can read as denied while System Settings shows it enabled. Klip tries, and if the content provably did not move it falls back to stitching while you scroll. Result: an image, not an error. - Screen recording (
β₯β§Vfor a region, menu for full screen) β H.264 video + AAC system audio. Klip's own interface sounds are excluded from the track and its windows never appear in the footage. A floating red frame and stop pill mark the region, the menu-bar icon turns red. Crash-safe: the movie is written in two-second fragments, so a crash still leaves a playable file. The recording lands in history as a card with a poster-frame thumbnail and a duration badge, with row actions to play, reveal, save to Downloads, or Convert to GIF (10 fps, β€1000 px, loops forever, first 30 seconds).
All capture flows confirm with a toast and deliberately do not open the history panel β the panel used to land on top of the very thing you had just captured.
- Record (
β₯β§R) or upload files (β₯β§O): audio (m4a, m4b, mp3, wav, WhatsApp.opus, ogg, flacβ¦) and video (mp4, mov, mkv, webmβ¦), whose audio track Klip extracts first. - Transcription runs on-device with Whisper (WhisperKit on Core ML). No key, nothing uploaded β the model downloads once on first use (Tiny ~75 MB Β· Base ~145 MB Β· Small ~464 MB Β· Large v3 Turbo compact ~616 MB Β· Large v3 Turbo full ~3.0 GB), then works offline.
- It runs in the background, so you can start another recording immediately. The original audio is kept with duration and a progress bar: play it, reveal it in Finder, retry a failed transcription. (Videos are not stored β only their text.)
- Per-upload language override, dictation language with auto-detect, and context words β list brands or jargon (GitHub, React, Supabase, webhook) so proper nouns come out spelled right.
- Meeting notes (
β₯β§M) on any call β Zoom, Meet, Teams, FaceTime. Records your microphone and the system audio. No bot joins, nobody sees a recorder. Stop withβ₯β§Magain, or it stops itself after 15 continuous minutes of silence on both sources. Each track is transcribed separately and interleaved chronologically into a "Me:" / "Them:" transcript. Lands in history asMeeting β Jul 9, 2:03 PM(renamable), audio kept and playable, retry on failure.
- Copy as code block β triple backticks with a detected language tag (
ββ©on the selection). - Copy for WhatsApp / for email β WhatsApp markup (
*bold*,_italic_, bullets) or rich email text that keeps bold/italic and paragraph spacing. - Always paste clean (on by default) β a copy from a rich source, like an AI chat on a dark theme, is stored as clean text keeping bold/italic and emojis but dropping the background, colours and fonts.
- Copy as Markdown for one item, or export the whole history to Markdown.
- Save text as a file (
.txt/.md) to drag into a tool that will not let you paste. - Batch multi-select (the β icon in the header): mark several clips, then combine them into a PDF (one page per screenshot/text, US Letter), export a ZIP (PNGs,
.txt, audio), or assign them to a collection. Selected rows are marked by the checkmark alone β no blue fill β and the PDF / ZIP / Collection buttons explain themselves on hover.
- Collections group the clips of one task, filterable by a chip.
- Name any item and find it by that name β especially useful for credentials.
- Type-aware actions: open links, colour swatch for hex values (
#1E90FF). - Mini credential manager β tokens and secrets are detected on copy and encrypted at rest (AES-256-GCM, key in the macOS Keychain, so
items.jsonand backups never hold the secret in the clear). Shown masked with a reveal/copy eye, with their own filter, never auto-pasted, and exported to PDF/ZIP/Markdown as a placeholder rather than in the clear.
- Everything local in
~/Library/Application Support/Klip/(items.json+images/+audio/+videos/), files0600, folders0700. No telemetry, no account, no network service. - Klip ignores content marked concealed by password managers, and you can exclude specific apps by bundle ID.
- Export / import the whole history (images and audio included) as a
.zip. The import is transactional: on any failure the existing history is restored. - Interface in 8 languages: English, Spanish, French, German, Italian, Portuguese, Chinese (Simplified), Japanese.
- Stable signing β macOS asks for microphone, screen-recording and accessibility permissions once and remembers them across updates.
- Launch at login, optional. Interface sounds, optional. Reduce Motion honoured.
β, from the Klip menu.
| Section | What is in it |
|---|---|
| Language | Interface language |
| General | Launch at login Β· always-paste-clean Β· auto-paste Β· sounds Β· where region captures go (editor or clipboard) Β· maximum history items |
| Shortcuts | Rebind all eight. Defaults β₯β§E / R / D / F / O / M / V / S |
| Voice transcription | On-device model, audio language, context words |
| Privacy | Ignore content apps mark as concealed |
| Excluded apps | Apps Klip never captures from |
- Windows version (the big one)
- Share links to your own bucket β upload a clip to storage you own and copy a URL. Removed for now, coming back.
- Favorites sync and optional sync between Macs
Ideas and feature proposals are genuinely wanted β open one at github.com/tamibot/klip/issues. A rough paragraph describing the loop you're stuck in is more useful than a polished spec: most of what Klip does started as somebody's annoyance.
Good places to start:
- A new type-aware quick action. Row actions live in
HistoryView.swift'smoreMenu; adding one for a detected type (emails, numbers, JSON) is a self-contained change. - A "copy for X" formatter.
Markdownify.swiftalready turns a clip into WhatsApp or email shapes; another target is one function plus a menu entry. - A language pass.
L10n.swiftholds eight tables. They must stay key-complete with each other and duplicate-free β a duplicate key in a dict literal traps at launch, not at compile time.
It builds with just the Command Line Tools (swift build), so there is nothing to set up. Code and comments are in English. Run the tests with ./test.sh β 70 of them, in 12 suites, all pure logic. Every push to main and every pull request against it runs ./build.sh and ./test.sh on macOS 14 β results in the repo's Actions tab.
Anyone touching panel or window material should read
DESIGN.mdfirst β the glass breaks in ways that fail silently.
Created and maintained by Martin Velasco O. β @tamibot.
Collaborators: Sebastian Bimbi β @sebasbimbi Β· Miguel Ibarra β @integralmarketingmx.
Interface sounds rendered from raphaelsalaja/audio (MIT Β© 2026 Raphael Salaja).
Apache 2.0 Β© 2026 Martin Velasco O.