Skip to content

Repository files navigation

ClickGraft

Make HP Click run natively on Apple Silicon.

HP ships HP Click for macOS as an Intel-only build, so on an M-series Mac it runs under Rosetta — and it is painfully slow. ClickGraft grafts the official Apple Silicon Electron runtime onto a copy of your installation. Your original app is never touched.

Not affiliated with, endorsed by, or supported by HP Inc. See NOTICE.


Is it actually faster?

Measured on an M-series Mac, stock 4.8.117 under Rosetta vs. the ClickGraft build. Median of 3 runs each, both with the updater disabled so neither could pull a background download.

Rosetta ClickGraft
Time to finish starting up 57.1 s 5.0 s 11× faster
CPU burned getting there 79.2 s 5.6 s 14× less
Main-thread stalls, idle 17 0
Total blocking time, idle 9.0 s 0 ms
Input latency, 95th percentile 298 ms 2.5 ms

The last three rows are the "I clicked and nothing happened" problem. Under Rosetta the app isn't uniformly slow — it's periodically dead, freezing its own main thread seventeen separate times while sitting idle. Run-to-run startup ranged 54–109 s; ClickGraft's ranged 4.9–5.3 s.

Why this works at all: HP already compiles the hard parts for arm64. DjCoreServicesNative-Electron.node, DjConnServicesNative-Electron.node, the entire Adobe PDF Print Engine, and the Qt libraries all ship as universal binaries containing arm64 code today. The only Intel-only component is the Electron runtime — a file HP downloads rather than compiles. ClickGraft swaps that one piece.


Requirements

Xcode Command Line Tools. That is the entire list.

It provides the python3 ClickGraft runs on, plus codesign, install_name_tool, lipo, otool, and nm. No Homebrew. No compiler. No pip install.

You probably don't have to install it yourself. /usr/bin/python3 is one of the Command Line Tools stubs, so opening ClickGraft on a Mac that lacks them makes macOS offer its own installer automatically — accept it, wait for it to finish (it is a large download, several minutes on a good connection), and ClickGraft opens. Confirmed on a clean Mac.

If you decline that installer, ClickGraft cannot start and will appear to do nothing when opened. Reopen it to get the prompt back, or install the tools yourself with xcode-select --install.

You also need your own legally installed HP Click 4.8.117. ClickGraft ships no HP software and cannot obtain it for you.


Install and first run

  1. Download ClickGraft.zip from the latest release.
  2. Unzip it and drag ClickGraft.app wherever you like.
  3. Double-click it.

That's it. ClickGraft is signed with an Apple Developer ID and notarized by Apple, so it opens normally — no right-click, no "unidentified developer" warning, and no "damaged, move to Trash" dialog.

macOS may show a one-time "ClickGraft is an app downloaded from the Internet. Are you sure you want to open it?" confirmation, and the very first launch can take a few extra seconds while macOS checks the notarization. Both are normal and happen once.

The wizard walks you through six screens: what it does, requirements, choose your app, review the plan, build, done. Nothing is written until you approve the plan, which lists every patch, every library added, and everything downloaded.

Running from source instead? Build the app with ./packaging/build_app.sh and open dist/ClickGraft.app. The command line works too — see below.


What you end up with

HP Click (Apple Silicon).app, next to your original.

⚠️ The two apps cannot run at the same time

Both share Electron's single-instance lock via shared settings. Launching one while the other is running makes the second exit silently — no window, no error message, nothing. It looks like the app failed to start.

Quit one before opening the other. Sharing settings is deliberate: your printers and preferences carry over.

To uninstall: drag HP Click (Apple Silicon).app to the Trash. Your original was never modified, so there is nothing else to undo.


Command line

The wizard is the supported path, but everything is available headless:

python3 -m clickgraft.cli preflight                      # check the environment
python3 -m clickgraft.cli build   --source "/Applications/HP Click.app"
python3 -m clickgraft.cli verify  --app    "/Applications/HP Click (Apple Silicon).app"
python3 -m clickgraft.cli probe   --app    "/Applications/HP Click.app"
python3 -m clickgraft.cli gui                            # launch the wizard

Supported versions

HP Click Electron Status
4.8.117 39.8.4 Supported

New releases are meant to be picked up quickly. When HP ships an update the work is mostly mechanical — probe reads the new bundle, checks every anchor, and confirms the Electron version — so the aim is a ClickGraft release not long after HP's. Fast turnaround here is a goal of the project, not a favour.

ClickGraft refuses anything else rather than guessing. Patches are anchored to exact strings inside minified files, and the Electron version must match the source exactly — the native modules are built against Nan, whose ABI is not stable across Electron majors.

To get a new version supported, run probe. It reads the app and Electron versions from the bundle, counts archive entries, checks every patch anchor, scans for architecture gaps, and writes a report plus a draft manifest. The wizard offers the same thing as a button when it meets an unknown version. Open an issue with that report attached and the version can be added.


How it works

  1. Copy your app to a staging directory (ditto, so it's a fast APFS clone).
  2. Download electron-vX-darwin-arm64.zip from the official Electron releases and verify it against that release's published SHASUMS256.txt.
  3. Replace the Electron framework, the four helper executables, and the main binary. HP's Info.plist files, icons, localizations, and native modules are left alone.
  4. Add the arm64 libraries HP's own arm64 slices need but never shipped — see below. Fetched from Homebrew's CDN and SHA-256 verified.
  5. Apply four archive patches from the version manifest, each asserting its anchor appears exactly once.
  6. Give the copy its own bundle identifier so macOS keeps the two apps distinct.
  7. Ad-hoc sign inner-to-outer, then rename into place.

The archive rebuild asserts, before anything is written: entry counts unchanged, every unpatched entry byte-identical to the source, every integrity hash correct, zero unused space, and all unpacked files present on disk and matching. A rebuild that quietly drops metadata is the single most dangerous failure mode here, so it is checked rather than assumed.

The bug HP hasn't noticed

The arm64 slices of HP's own native modules reference idn2_* and nghttp2_* symbols with no library to resolve them — HP links a curl built with IDN and HTTP/2 support and ships neither library. The x86_64 slices have no such references, which is why the Intel build has never shown it. These resolve at call time, so the app starts fine and would abort later on the affected code path. ClickGraft bundles and preloads those libraries. Strong evidence HP's arm64 binaries have never actually been run.

ClickGraft also fixes a genuine HP bug that exists on Intel too: three shared files ship as ES modules while index.html loads one as a classic script, so the stock app throws Uncaught SyntaxError: Unexpected token 'export' in its renderer on every launch. The patched build logs zero.


Known limitations

  • The build ClickGraft produces is ad-hoc signed, not Developer ID signed — deliberately. Attaching a developer identity to a modified copy of someone else's application would misrepresent its origin. The build stays on your machine, where ad-hoc signing is both sufficient and more honest.
  • Printing works, on one printer, verified once. A ClickGraft build printed a real job to an HP DesignJet T1600dr PostScript on 2 August 2026: three pages sent, three pages printed, with nesting and cut marks enabled. Colour gradients, fine line art and small type all came out correctly. That is one printer, one operator and one job — encouraging rather than conclusive, and reports from other DesignJets are still the most useful thing you can send. Auto-rotation and multi-roll selection remain unexercised.
  • One unresolved symbol. _png_init_filter_functions_neon comes from a libpng compiled into HP's native module and cannot be supplied externally. It is recorded as an accepted, unverified risk in the manifest.
  • One orphaned Intel binary remains (AdobeAXE16SharedExpat). Nothing links it and it is never loaded; the live path uses a universal build.
  • A path caveat for scripts: the output bundle contains parentheses, so pgrep -f "HP Click (Apple Silicon)" treats them as a regex group and silently fails to match. Escape them or match on HPClickExe instead.

Contributing

See CONTRIBUTING.md — please read the scope section first.

The most valuable contributions are manifests for new versions (run probe and attach the report) and real-hardware print testing, which is the biggest gap in what has been verified.

ClickGraft's scope is deliberately narrow: making the app run natively, plus repairing what the repack would otherwise leave broken. Changes to what the application is permitted to do are out of scope, for reasons set out in CONTRIBUTING.

python3 -m pytest tests/ -q

Legal

ClickGraft distributes no HP or Adobe software. It operates on a copy you already installed, on your own machine, and produces output only there. Do not redistribute a ClickGraft-produced bundle — it contains proprietary code this project has no right to convey.

ClickGraft will never add logic to defeat a protection measure that is actually enforced. If a future version of HP Click starts verifying its payload, ClickGraft will stop and report it. Full terms in NOTICE.

Licensed under the MIT License.

About

Make HP Click run natively on Apple Silicon. Grafts the official arm64 Electron runtime onto a copy of your own installation — ships no HP code.

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages