Internal staging build

Download KeystrokePro

Unreleased builds for internal testing. They are unsigned, they point at the staging API, and they will not run without the setup below.

Version —

Run it on macOS

Drag the app into Applications first. The second line is one command — it clears Gatekeeper's quarantine flag, then launches with your Access token in the environment.

xattr -dr com.apple.quarantine "/Applications/KeystrokePro (staging).app"

CF_ACCESS_CLIENT_ID=your-client-id CF_ACCESS_CLIENT_SECRET=your-client-secret \
  "/Applications/KeystrokePro (staging).app/Contents/MacOS/KeystrokePro (staging)"

Check your token first

200 means Access accepted the pair and the API verified it. 302 means it was not recognised — the token is wrong, or no Service Auth policy allows it yet.

curl -s -o /dev/null -w "%{http_code}\n" \
  -H "CF-Access-Client-Id: your-client-id" \
  -H "CF-Access-Client-Secret: your-client-secret" \
  https://api-staging.keystrokepro.io/health

These builds are unsigned

Code signing is a later milestone, so each OS will try to stop you.

macOS
Gatekeeper reports the app as damaged on Apple Silicon, because nothing has signed it. Clearing the download quarantine flag is what gets past that — it is the first line of the macOS command above.
Windows
SmartScreen shows a blue warning. Choose More info → Run anyway.
Linux
Prefer the .deb. Ubuntu 24.04's AppArmor policy blocks the AppImage sandbox, so the AppImage needs --no-sandbox.

You must launch them from a terminal

The staging API sits behind Cloudflare Access. The app reads an Access service token from the environment of whatever launched it, and never bundles one — so opening it from Finder, the Start menu or a dock icon leaves every API call rejected and sign-in failing.

Ask for a service token, then use the macOS command above — it passes both values through to the app. Verify the pair first with the check above.

Full per-OS instructions live in docs/desktop-staging-distribution.md.