Skip to content

Releases: hengkysandy/clipd

Clipd 0.7.0

Choose a tag to compare

@hengkysandy hengkysandy released this 16 Aug 04:38

First release since Clipd became open source.

First run is one go now

Granting Accessibility no longer needs a restart. It never actually did:
AXIsProcessTrusted() starts returning true for a process that is already
running, and Clipd simply read it once at launch and never looked again. That
is indistinguishable from the grant not working, so the only apparent fix was
to quit and reopen the app.

  • Clipd asks for the permission at launch, explains why it needs it, and
    opens the right pane of System Settings for you. Before, the first prompt
    came from macOS at your first paste, which is the worst possible moment.
  • The window notices the moment you flip the switch and turns itself into
    "Clipd is ready". Nothing to restart.
  • The menu bar gained Fix This, Grant Accessibility... while the permission
    is missing, so dismissing the window is not a dead end.
  • If macOS ever does hold a stale answer, a Relaunch Clipd button appears
    after a minute. One click, not "quit and reopen".

Open source

Clipd is now public under the MIT license,
with a README and a contributing guide.
Contributions are welcome.

Also new: CLIPD_SUPPORT_DIR runs Clipd against a throwaway database with sync
and Keychain access switched off, which is how the README screenshots are taken
without publishing anything that was really copied.

Installing

Open the DMG and drag Clipd to Applications. Clipd is signed with an Apple
Development certificate, which a free Apple account cannot notarise, so
Gatekeeper needs one command before it will open the app:

xattr -dr com.apple.quarantine /Applications/Clipd.app

Then open Clipd and follow the window. Upgrading from 0.6.0 keeps your history
and your sync settings.

Clipd 0.6.0

Choose a tag to compare

@hengkysandy hengkysandy released this 15 Aug 17:45

Install this on BOTH Macs. 0.3.0 and 0.4.0 both have sync bugs that make two devices disagree, and some fixes here only work when both ends have them.

Gatekeeper will refuse to open it on the second Mac, because a free Apple account cannot notarise:

xattr -dr com.apple.quarantine /Applications/Clipd.app

Name any item

Right click a card and choose Name Item. The name is searched together with the content, so an item becomes findable by a word that appears nowhere in it. A named card shows its name in the header and moves the kind down beside the age. Emptying the field removes the name.

Cmd+1 to Cmd+9 pastes

The number in the corner of a card is now a real shortcut: Cmd+3 pastes card three. Cards past 9 no longer draw a number, because there is no shortcut for them. Pinning a card to a board moved to Ctrl+1 to Ctrl+9, and the card menu shows the new keys.

Copied code keeps its formatting

Swift, JavaScript, TypeScript, Python, JSON, YAML, Markdown, Shell, SQL, HTML, CSS, Go and Rust keep their line breaks and indentation, in a monospaced font with syntax colours, and the header names the language. Detection is conservative, so an ordinary email stays plain text. A YAML file that opens with # comments is read as YAML, not Markdown.

Search covers the whole history

Search used to scan only the newest 500 items held in memory, so with retention set to six months or a year, older items were silently unfindable. It now uses the full text index over everything stored.

Sync fixes

  • A deletion that tied on time was dropped, so one Mac could show an item folded away while the other kept both, forever.
  • Two tied deletions planned a pointless download on every pass.
  • A deduplication decision never reached the other Mac, which could then expire an item this Mac had just refreshed.
  • Listing the bucket stopped at 1000 objects, so cleanup silently stopped working past that.
  • One object written by a newer Clipd would have aborted a whole sync pass. It now skips that object and finishes.
  • An older Mac re-copying a named item can no longer erase the name.

Under the hood

  • Payload format v2 exists and is read, but this build still WRITES the older format, so a Mac on 0.3.0 can still read what this one uploads.
  • No more implicitly unwrapped optionals in the app delegate or the panel. That pattern crashed the app on launch in 0.3.0.

158 Core tests, 150 shell tests.

Clipd 0.4.0

Choose a tag to compare

@hengkysandy hengkysandy released this 15 Aug 16:48

Install this on the second Mac

0.3.0 has a sync bug that makes two Macs disagree permanently about a folded duplicate. Both Macs need 0.4.0.

Gatekeeper will refuse to open it on another Mac, because a free Apple account cannot notarise:

xattr -dr com.apple.quarantine /Applications/Clipd.app

Copied code keeps its formatting

Swift, JavaScript, TypeScript, Python, JSON, YAML, Markdown, Shell, SQL, HTML, CSS, Go and Rust keep their line breaks and indentation on the card, in a monospaced font with syntax colours. The card header names the language. Detection is deliberately conservative, so an ordinary email stays plain text.

Sync fixes, all found by a new two device test

  • A tombstone that tied on time was silently dropped, so one Mac showed a duplicate folded away and the other kept showing both, forever.
  • Two tied tombstones planned a download of an already deleted item, on every pass.
  • A dedup fold never travelled to the other Mac, which could then expire an item this Mac had just refreshed.
  • One object written by a newer Clipd would have aborted the whole sync pass. It now skips that object and finishes.

Also

  • Payload format v2 with an explicit version header. Still reads the two older formats, so a 0.3.0 Mac and a 0.4.0 Mac can still exchange items.
  • No more implicitly unwrapped optionals in the app delegate, which is what crashed the app on launch in 0.3.0.

143 Core tests, 94 shell tests.

Clipd 0.3.0

Choose a tag to compare

@hengkysandy hengkysandy released this 15 Aug 13:42

Install on both Macs.

Duplicates are folded

The same text copied on both Macs used to appear twice: each machine refused its own duplicates, but sync merged on identity rather than content. They are now folded into one.

Measured on a real history: 31 duplicates removed from 80 items.

Pinned items always survive, and if two copies are both pinned, both are kept, since they may be on different boards.

Your bucket no longer grows forever

Deleted items used to keep their encrypted object in R2 permanently, images included. Those are now removed. Measured: 84 objects down to 53.

Images upload 33% smaller

Image bytes travelled base64 encoded inside JSON, so a 2.7 MB screenshot uploaded as 3.76 MB. They now travel as raw binary. The old format is still accepted, so a Mac on an older version is not stranded.

Also fixed

A launch crash: the app could crash on startup whenever the dedup or retention sweep found work to do.

Install: drag to Applications, then xattr -dr com.apple.quarantine /Applications/Clipd.app, then grant Accessibility.

Clipd 0.2.4

Choose a tag to compare

@hengkysandy hengkysandy released this 15 Aug 13:24

New app icon and menu bar icon.

The artwork masters (SVG) now live in art/ and the PNGs are rasterised from them, so the icon stays editable.

Also fixed while installing it: the app was shipping an icns with only four sizes, stopping at 256, so the Dock and Get Info had no large artwork. Xcode's asset compiler silently drops the bigger sizes from a scale-based icon set. The icns is now built with iconutil and ships all ten sizes.

Install: drag to Applications, then xattr -dr com.apple.quarantine /Applications/Clipd.app, then grant Accessibility.

Clipd 0.2.3

Choose a tag to compare

@hengkysandy hengkysandy released this 15 Aug 13:08

Keep history for 3 months or 6 months, as well as the existing Day, Week, Month, Year and Forever.

Three fixes:

  • Settings tabs now have icons instead of blank boxes
  • The retention slider's labels line up with their ticks
  • The menu bar no longer lists your last five clipboard items. That put your clipboard on screen every time you opened the menu, including during screen sharing, and the entries were not even clickable

Install: drag to Applications, then xattr -dr com.apple.quarantine /Applications/Clipd.app, then grant Accessibility.

Clipd 0.2.2

Choose a tag to compare

@hengkysandy hengkysandy released this 15 Aug 12:54

Pinned cards now wear their pinboard's colour. A card on a red board is red, on an orange board is orange, and so on, so you can see what is filed where without switching tabs.

Cards on more than one board show a small dot for each extra board.

The header takes the full colour and the body only a faint wash, because a fully coloured body would make the text hard to read. Selection is now carried by a thicker border, since the header colour is spoken for.

Install: drag to Applications, then xattr -dr com.apple.quarantine /Applications/Clipd.app, then grant Accessibility.

Clipd 0.2.1

Choose a tag to compare

@hengkysandy hengkysandy released this 15 Aug 12:21

Right click a card for Paste, Copy, Pin and Delete. The Pin submenu lists your boards with a tick against the ones the item is already on, plus Create Pinboard.

Four smaller fixes:

  • An empty panel now explains itself instead of showing a blank void
  • Boards can be renamed (right click a tab)
  • Cmd+Left and Cmd+Right cycle between boards
  • Escape clears a search before closing the panel

Install: drag to Applications, then xattr -dr com.apple.quarantine /Applications/Clipd.app, then grant Accessibility.

Known issue: if both Macs copy the same text independently, sync keeps both copies. Deduplication happens per device, not across sync.

Clipd 0.2.0

Choose a tag to compare

@hengkysandy hengkysandy released this 15 Aug 12:13

Pinboards, an app icon, and a delete animation. Install on both Macs.

New

Pinboards. Tabs across the top of the panel, as in the reference app.

  • + creates a board and gives it an unused colour
  • Cmd+1 to Cmd+9 files the selected card on that board, and again removes it
  • Click a board tab to show only its cards; Clipboard shows everything
  • Right click a tab to delete the board
  • Boards and their contents sync between both Macs

Deleting a board never deletes the items on it. A board is a label, not a
container. The dialog says so, and a test named in capitals guards it.

Anything filed on a board is exempt from retention, so a Day or Week setting
will not eat the snippets you deliberately kept.

An app icon, drawn in code so it stays editable (tools/makeicon.swift).

Deleting a card now fades and shrinks it rather than vanishing between two
frames, which read as a glitch.

Fixed

  • Opening the New Pinboard dialog dismissed the panel underneath it. A modal
    takes key focus, which fired the click-away handler, and the name you typed
    went into whatever app was behind.
  • A manifest written by an older build failed to decode entirely, which would
    have stranded a pair of Macs on different versions. Swift's synthesized
    decoder does not fall back to default values; it throws.

Install

  1. Open the DMG, drag Clipd to Applications.

  2. Clear quarantine, or macOS refuses to open it:

    xattr -dr com.apple.quarantine /Applications/Clipd.app
  3. Grant Accessibility in System Settings, Privacy and Security. Per machine.

  4. Settings, Sync: same credentials and the same passphrase on both Macs.

Sync runs automatically: at launch, every 5 minutes, and shortly after you stop
copying.

Known limitations

  • Boards cannot be renamed or reordered from the UI yet
  • The hotkey is not rebindable
  • Never tested on a second display
  • Copying a password from Chrome's or Safari's built in password manager is not
    detected
  • Deleted items keep their object in your R2 bucket; nothing prunes it yet
  • If the real Paste app is running, both open on Cmd+Shift+V

Clipd 0.1.3

Choose a tag to compare

@hengkysandy hengkysandy released this 15 Aug 11:51

Automatic sync. Install on both Macs.

New

Sync now runs by itself. Three triggers:

  • About 5 seconds after launch
  • Every 5 minutes
  • 15 seconds after you stop copying

The last one is debounced, so copying ten things in a row produces one sync, not
ten. Syncing on every copy was deliberately avoided: it would put a network
round trip on the Cmd+C path.

Turn it off with the Sync automatically checkbox in Settings, Sync. The pane
also shows when the last pass ran and what it did, so automatic sync is visible
rather than something you trust blindly. Sync Now still works for an
immediate pass.

Two passes never overlap. Two at once would each write a manifest, and the later
could claim items the earlier had not finished uploading.

After installing on both Macs

Nothing to do. Each Mac uploads what it has and downloads what it lacks, on its
own, within about five minutes. Joining never deletes: an item missing from the
other Mac's index is uploaded, never removed.

Install

  1. Open the DMG, drag Clipd to Applications.

  2. Clear quarantine, or macOS refuses to open it:

    xattr -dr com.apple.quarantine /Applications/Clipd.app
  3. Grant Accessibility in System Settings, Privacy and Security. Per machine.

  4. Settings, Sync: same credentials and the same passphrase on both Macs.

Known limitations

  • No Pinboards, and the hotkey is not rebindable
  • Never tested on a second display
  • Copying a password from Chrome's or Safari's built in password manager is not
    detected
  • If the real Paste app is running, both open on Cmd+Shift+V