Skip to content

Releases: lighthouse-computer/Clip-Board

v1.2.5 — Keyboard nav fix, deterministic truncation

31 May 09:27

Choose a tag to compare

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. Clear now 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

31 May 08:47

Choose a tag to compare

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 → Open

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: `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

31 May 08:03

Choose a tag to compare

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:

  1. Sandbox dropped. com.apple.security.app-sandbox = false is 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. See SECURITY.md for the full rationale.
  2. Activation handoff fixed. NSApp.yieldActivation(to:) now fires before app.activate() so macOS 14+ accepts the foreign-app activation; moved off the deprecated activate(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:

  1. System Settings → Privacy & Security → Accessibility
  2. Remove the existing "Clip Board" entry if present
  3. Re-add /Applications/Clip Board.app and 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 → Open

Verify 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

30 May 17:30

Choose a tag to compare

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.entitlements is now a source-of-truth file with network.client = false and network.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.localizedDescription to .private.
  • Capped AppIconProvider cache at 200 IDs (was unbounded).
  • Cached AppPaths URLs (no per-access fileExists syscall).
  • 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_TARGET inconsistency 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-board

Or 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.appOpenOpen to bypass the Gatekeeper warning.

Full notes in the CHANGELOG.

v1.2.1

30 May 14:15

Choose a tag to compare

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-board

Or 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

30 May 11:57

Choose a tag to compare

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

30 May 09:00

Choose a tag to compare

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 NSVisualEffectView with the system .popover material, 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-board

Visual 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

28 May 21:12
8b29b58

Choose a tag to compare

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

  1. Download `Clip-Board.zip` below and unzip it.
  2. Drag `Clip Board.app` into `/Applications`.
  3. First launch: macOS Gatekeeper will warn — right-click the app → OpenOpen.
  4. 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.