Skip to content

clipscrub 0.2.0

Choose a tag to compare

@logicalicy logicalicy released this 06 Aug 04:47
· 10 commits to main since this release

clipscrub is the redaction CLI behind ClipScrub: on-device OCR, pattern
matching, face and barcode detection, no network. This is a prebuilt universal (arm64 + x86_64)
macOS binary, so you can run the engine without building it and without installing the app.

Install

tar -xzf clipscrub-0.2.0-macos-universal.tar.gz
xattr -dr com.apple.quarantine clipscrub-0.2.0-macos-universal
./clipscrub-0.2.0-macos-universal/clipscrub --help

The xattr line is recursive and points at the directory on purpose. tar carries the download's
quarantine flag onto the extracted binary, and unzipping in Finder instead puts it on the resource
bundle too, so clearing only the one file leaves a copy that Gatekeeper still refuses. The command
is a no-op if nothing was flagged.

Keep ClipscrubKit_ClipscrubKit.bundle next to the binary. The ruleset, the given-names list and
the model prompt live in it, and without it clipscrub exits with unable to find bundle named ClipscrubKit_ClipscrubKit.

The binary is ad-hoc signed. It is not Developer ID signed and not notarized, which is why the
quarantine flag has to come off at all: macOS flags anything a browser downloaded, and Gatekeeper
refuses an ad-hoc signature while that flag is set. If you would rather not clear a quarantine flag
on a stranger's binary, build it yourself with the command below. The package has no third-party
dependencies, so it resolves and compiles offline.

Requirements

macOS 15 (Sequoia) or later, the same floor as the app. Building it yourself also needs Swift 6
(Xcode 26 or the matching Command Line Tools).

Build this yourself

swift build -c release --product clipscrub --arch arm64 --arch x86_64

That is the whole command. SwiftPM builds both slices and joins them, so there is no separate lipo
step. The universal binary and its resource bundle land side by side in .build/apple/Products/Release/.

Two caveats worth stating plainly. Swift builds are not byte-reproducible, so your binary will not
match this one's hash — verify the download against the hash below, and treat your own build as the
stronger check. And the toolchain picks the SDK, so a different Xcode changes the sdk field in
vtool -arch arm64 -show-build clipscrub while minos stays at 15.0.

Verify the download

shasum -a 256 clipscrub-0.2.0-macos-universal.tar.gz
f571b4e175a315f855e4aa9980b9e810e808ab58c8832f19d1ceaea2e9c70cd1

What this is a copy of

This repository is a snapshot of the redaction engine inside ClipScrub, and this tag points at the
tree the attached binary was built from. Version 0.2.0 matches the shipped app.

Every commit here is minted fresh by the script that publishes the snapshot, so the SHAs in this
repo cannot name the source they came from. The two that can, stated rather than derivable:

  • This tree is the engine as of monorepo commit 9c1f2c166fcf66058c1a895cd80626742e19c8a2.
  • The shipped app's build 7 was built from 67d8b6ad968ddf06f57542a35abf51f260777af7, and stamps
    that SHA into its own Info.plist as ClipScrubSourceCommit, so a copy of the app can be checked
    against it.

Between those two commits the engine changed in three files: Package.swift raised the declared
platform floor from macOS 14 to 15 — the app has always required 15, so 14 was a floor nobody could
stand on — plus a line of README and two comments. Detection and redaction are untouched. The
clipscrub inside the app is compiled from this package by the app's own build, so it is the same
source as this download rather than the same bytes.