Releases: lighthouse-computer/Clip-Board
v1.2.5 — Keyboard nav fix, deterministic truncation
Two UI fixes that v1.2.4 left on the table
1. Arrow keys no longer bounce between rows the mouse touched
When you press ↓ or ↑, the scroll animation slides a new row under the (stationary) mouse cursor. SwiftUI then fires a hover event on that row, and the parent's hover handler was setting selectedID = item.id — overwriting the keyboard selection on every scroll tick. The visible symptom: the list refused to advance past whichever 2–3 rows the cursor had recently been over.
Fix: mouse location is now anchored at each kb-nav event. The hover handler ignores the selection-stomp until the cursor has actually moved (> 4 pt). Manual hover still takes over as soon as you move the mouse.
2. Hover preview no longer opens for fully-visible short text (root cause)
The v1.2.4 widening of the slack threshold (1 pt → 8 pt) reduced the false-positive rate but didn't kill it — the dual-GeometryReader measurement could race on initial layout. Replaced with a deterministic NSAttributedString.boundingRect measurement against the row's actual width, counting lines directly. No race, no slack heuristic.
Also in this release
- Arrow keys now open the preview popover for the newly selected row (debounced 250 ms so holding the arrow key doesn't flash a popover per scrolling row). Same gating as hover — non-truncated text rows just get the selection highlight; image rows always preview; truncated text rows show full content.
- No more orphan popovers.
Clearnow resets the preview state; if a search filter hides the currently-previewed item, the popover dismisses automatically. - Dead SwiftUI preference keys (
VisibleHeightKey,FullHeightKey) removed.
Install
```bash
brew install --cask light-house-group/taps/clip-board # tap still on 1.2.1 — manual download below until bumped
```
Verify the build
```bash
otool -L "Clip Board.app/Contents/MacOS/Clip Board" # Apple frameworks only
codesign -d --entitlements - "Clip Board.app" # app-sandbox=false (intentional)
```
SHA-256: `700ed98ab9853fcb0a4a02de402e7d78fbd7958d2c010af4b5521ba178226030`
Size: ~457 KB
Signed: Ad-hoc (Gatekeeper bypass via right-click → Open on first launch)
Full diff: v1.2.4...v1.2.5
v1.2.4 — Rich-text paste, configurable history, popover polish
Three user-facing improvements
1. Original formatting preserved on copy and paste
Copy styled text from Mail / Notes / Pages / a browser / an IDE, paste it from history, and the formatting comes back. Clip-Board now captures every standard text-class pasteboard representation the source app published — public.rtf, public.rtfd, public.html, UTF-16 plain text — alongside the UTF-8 plain form. On paste, all representations are written back to NSPasteboard.general so the receiving app picks the highest-fidelity flavor it understands. Plain-text-only fields still paste plain.
Storage trade-off: per-item rich payload is capped at 500 KB. Above that the formatting is dropped and only plain text is stored — pathological copies can't bloat the encrypted history file.
2. Configurable history size
Right-click the menu icon → History Size submenu. Pick 50 / 100 / 250 / 500 / 1000. The active value is check-marked. Lowering the cap immediately trims the oldest unpinned items; pinned items are always preserved regardless of cap.
No "Unlimited" option on purpose — truly unbounded history would break search latency, scroll performance, and per-save encryption time. Hard internal ceiling is 5000 if the stored preference is hand-edited.
3. Hover preview no longer opens for text already fully visible
The v1.2.0 measured-truncation check used a 1 pt slack and could mis-flag short text as truncated due to sub-pixel font-metric rounding. Slack widened to 8 pt (half a line at 13 pt body), and the popover binding is now gated defensively on previewEligible. Image rows still preview on hover, unchanged.
Schema
ClipItem gains an optional richRepresentations: [String: Data]?. Backward-compatible — pre-1.2.4 items decode with the field absent and continue to paste plain text. No migration required.
Install
# Homebrew
brew install --cask light-house-group/taps/clip-board
# Or download the zip below, unzip, drag to /Applications, right-click → OpenVerify the build
```bash
otool -L "Clip Board.app/Contents/MacOS/Clip Board" # Apple frameworks only
codesign -d --entitlements - "Clip Board.app" # app-sandbox=false (intentional)
```
SHA-256: `74fb8eb572ffea0fde184955a9721fa482024d30f8ebd3bd28bc7030217d64cd`
Size: 456 KB
Signed: Ad-hoc (Gatekeeper bypass via right-click → Open on first launch)
Full diff: v1.2.3...v1.2.4
v1.2.3 — Auto-paste fixed
Fixes the auto-paste regression
Auto-paste has been silently broken since 1.0.0. Releases 1.0.0–1.2.2 shipped with ENABLE_APP_SANDBOX = YES carried over from the Xcode template; the macOS App Sandbox blocks NSRunningApplication.activate() on a foreign app, so the synthesized ⌘V landed on Clip-Board (or nowhere) instead of the app you were trying to paste into. Two coupled fixes:
- Sandbox dropped.
com.apple.security.app-sandbox = falseis now set explicitly in the checked-in entitlements file. Every shipping clipboard manager (Maccy, Paste, Alfred, Raycast) runs unsandboxed for the same reason — the sandbox is fundamentally incompatible with cross-app paste injection. Hardening still applied: hardened runtime, no network linkage, AES-GCM-256 at rest, Keychain-bound key (WhenUnlockedThisDeviceOnly, non-syncable), file mode 0600 / dir 0700. SeeSECURITY.mdfor the full rationale. - Activation handoff fixed.
NSApp.yieldActivation(to:)now fires beforeapp.activate()so macOS 14+ accepts the foreign-app activation; moved off the deprecatedactivate(options:)API; bumped the activation budget 500 ms → 600 ms.
Migration
History from pre-1.2.3 installs (~/Library/Containers/Siddharth.Sangwa.ClipBoard/Data/Library/Application Support/ClipboardManager/) is automatically copied to the unsandboxed location (~/Library/Application Support/ClipboardManager/) on first launch. The legacy container is left in place untouched. If macOS prompts to re-authorize Keychain access for the re-signed binary, click Always Allow.
Accessibility re-grant
Because the binary's signature changed in this release, macOS may have invalidated the existing Accessibility grant. After updating:
- System Settings → Privacy & Security → Accessibility
- Remove the existing "Clip Board" entry if present
- Re-add
/Applications/Clip Board.appand toggle it on
Install
# Homebrew (tap will be updated to 1.2.3 shortly)
brew install --cask light-house-group/taps/clip-board
# Or download the zip below, unzip, drag to /Applications, right-click → OpenVerify the build
# Linked libraries — Apple system frameworks only.
otool -L "Clip Board.app/Contents/MacOS/Clip Board"
# Entitlements — app-sandbox=false (intentional), network=false.
codesign -d --entitlements - "Clip Board.app"SHA-256: 1f5e9c8511a7db810309fe0e1398c834fa1c3d521444d460d0024822d5607311
Size: 456 KB
Signed: Ad-hoc (Gatekeeper bypass via right-click → Open on first launch)
Full diff: v1.2.2...v1.2.3
v1.2.2 — copy fidelity, multi-monitor fix, explicit entitlements
Highlights
- Copy fidelity fix. Text is now stored byte-identical to what hit the clipboard. Previously, leading/trailing whitespace (e.g.,
--flag,:) was silently stripped from items in history; pasting from history now reproduces exactly what you copied. - Multi-monitor placement fix. The floating panel opens on the screen the cursor is on, not the screen with the key window. Triggering the hotkey from a secondary display no longer clamps the panel onto your primary display.
- Explicit entitlements file checked in.
Clip Board/Clip Board.entitlementsis now a source-of-truth file withnetwork.client = falseandnetwork.server = false. Reviewers can diff this against the signed binary's entitlements with a single command (see below). - Launch-at-Login default flipped to OFF. Fresh installs no longer silently register themselves as a LaunchServices job; users opt in explicitly via the menu. Existing installs are unaffected (the stored preference takes precedence).
- Thumbnail downscale moved off the main thread — eliminates a UI hitch when capturing large screenshots.
- Snapshot hoisted out of the SwiftUI view body — the filter/partition pass now runs only when its inputs change (items, search text, visible-limit), not on every hover / selection / preview-id tick.
Hygiene
- Tightened logger privacy on
error.localizedDescriptionto.private. - Capped
AppIconProvidercache at 200 IDs (was unbounded). - Cached
AppPathsURLs (no per-accessfileExistssyscall). - Dropped the emoji from
CFBundleDisplayName(rendered inconsistently in Spotlight). - Removed dead
HotkeyManager.unregisterHotkey(). - Removed
ENABLE_TESTABILITY = YES(no test target consumes it). - Fixed
MACOSX_DEPLOYMENT_TARGETinconsistency between project (was 26.0) and target (14.0); both now 14.0. - Docs: corrected the sandboxed app-support path in README; added pasteboard-during-paste caveat and entitlements verification command in SECURITY.md.
Verifying the artifact
# Checksum — should match below.
shasum -a 256 Clip-Board.zip
# After unzip — confirm entitlements (network.client and network.server should be <false/>).
codesign -d --entitlements - "Clip Board.app"
# After unzip — confirm only Apple system frameworks are linked.
otool -L "Clip Board.app/Contents/MacOS/Clip Board"SHA-256 (Clip-Board.zip): c3a40c94c13d1a9e5e25d86ec58a3dd26684df884ebc8366e0ace4334a4cd197
Install / upgrade
brew update
brew upgrade --cask clip-boardOr download Clip-Board.zip below and drag Clip Board.app into /Applications. The release binary is ad-hoc signed — on first launch, right-click Clip Board.app → Open → Open to bypass the Gatekeeper warning.
Full notes in the CHANGELOG.
v1.2.1
Clip-Board 1.2.1
Changed
- Default global shortcut is now ⌥V (Option-V), changed from ⌃⌥⌘V. Existing installs keep whatever shortcut you've already configured — only fresh installs pick up the new default. Re-bind anytime via right-click → Set Shortcut….
- Symmetric panel corners. The drop shadow was offset downward, which made the bottom corners read rounder than the top; the glow is now near-centered and the glass material uses the continuous "squircle" corner curve, so all four corners match. Top padding tightened.
Install
brew install --cask light-house-group/taps/clip-boardOr download Clip-Board.zip below, unzip, and drag Clip Board.app to /Applications. The build is ad-hoc signed — right-click → Open the first time to bypass Gatekeeper.
SHA-256 (Clip-Board.zip): 9c42d1eef5a70f66baacbfb71699a1eb969df90da0eeca72acb58602d0c94f76
v1.2.0 — image & screenshot history, source-app attribution
Clipboard history now captures images, attributes each entry to its source app, and shows the full value for any truncated row.
Highlights
- Image & screenshot history. Any image on the clipboard (screenshots copied with
⌃modifiers, images copied from browsers, etc.) is captured. Stored as individual AES-GCM-encrypted files — never embedded in plaintext — so the encrypted-at-rest guarantee extends to images. Rows show the image shrunk to panel width (aspect preserved); hover 1 s for a full-resolution scrollable preview. Click an image row to copy it back and auto-paste. - Source-app attribution. Each entry shows the icon + name of the app it was copied from, next to the timestamp.
- Full value on hover for any truncated row. Replaced the old length heuristic with real measured truncation — every visually-clipped row is now previewable.
- Fixed the trailing empty space in the text preview popover.
Notes on screenshots
macOS ⌘⇧4 saves to a file by default. To get a screenshot into Clip-Board, copy it to the clipboard — e.g. ⌘⌃⇧4 (region → clipboard) or ⌘⌃⇧3 (full screen → clipboard). Anything that lands on the clipboard as an image is captured.
Install
brew install --cask light-house-group/taps/clip-board…or download Clip-Board.zip below, unzip, drag into /Applications. First-launch Gatekeeper warning bypassed with right-click → Open.
Verification
otool -L "Clip Board.app/Contents/MacOS/Clip Board"Only Apple-shipped frameworks. No network code in the binary.
Changelog
See CHANGELOG.md.
v1.1.0 — multi-select, glass preview, footer, Clear confirmation
Multi-select deletion, system confirmation on Clear, a Liquid-Glass-styled preview popover, and Homebrew distribution.
Highlights
- Multi-select mode — right-click any row → Select enters select mode. Click anywhere on a row to toggle (no leading checkboxes). Search still works; Cancel leaves the mode, Delete N removes everything you picked.
- Clear confirmation — destructive button is bound to Return; ⌥-click variant asks specifically about pinned items.
- Glass full-text preview — the 1-second-hover popover now uses
NSVisualEffectViewwith the system.popovermaterial, matching macOS Tahoe's translucent surfaces. - Attribution footer at the bottom of the panel.
- Homebrew distribution. Install via:
brew install --cask light-house-group/taps/clip-boardVisual cleanup
- Removed the redundant "Clipboard" header label
- Per-row copy glyph removed (row tap auto-pastes; right-click → Copy still available)
- Pin glyph upsized to 14 pt for stronger affordance
Install
brew install --cask light-house-group/taps/clip-board…or download Clip-Board.zip below, unzip, drag into /Applications. First-launch Gatekeeper warning bypassed with right-click → Open.
Verification
otool -L "Clip Board.app/Contents/MacOS/Clip Board"Only Apple-shipped frameworks. No network code in the binary.
Changelog
See CHANGELOG.md.
v1.0.0 — first public release
First public release of Clip-Board — a privacy-first clipboard history manager for macOS.
Highlights
- Encrypted at rest with AES-GCM-256, key stored in Keychain (
WhenUnlockedThisDeviceOnly, non-syncable) - Configurable global hotkey with conflict detection against well-known macOS / app shortcuts (default ⌃⌥⌘V)
- Auto-paste synthesizes ⌘V into the previously focused app (requires Accessibility)
- Pinned items + 100-item rolling history
- 1-second hover opens a scrollable, text-selectable preview for long items
- No network code in the binary; only Apple-shipped frameworks
- Respects transient pasteboard markers (
org.nspasteboard.TransientType,ConcealedType,AutoGeneratedType) — password-manager safety - Per-item size cap (~100 K chars) keeps the encrypted store lean
- Schema-versioned storage with quarantine on corruption — failed decrypts don't silently destroy history
Install
- Download `Clip-Board.zip` below and unzip it.
- Drag `Clip Board.app` into `/Applications`.
- First launch: macOS Gatekeeper will warn — right-click the app → Open → Open.
- For auto-paste: grant Accessibility permission when prompted, or via right-click menu → Enable Auto-Paste….
Requirements
- macOS 14+
- The binary is ad-hoc signed. If you want notarized builds, see the project README — `./scripts/release.sh --notarize` with a Developer ID is all you need.
Verification
You can confirm there's no network code in the binary:
```
otool -L "Clip Board.app/Contents/MacOS/Clip Board"
```
You'll see only Apple system frameworks.
Changelog
See CHANGELOG.md.
Security
See SECURITY.md for the disclosure policy and threat model.