Free tool, no signup, nothing to install
Fifteen checks against your own DMG or .app, and three more against the update feed it points at, all run on your machine. It tells you which parts of your release are quietly broken for the people who downloaded it, and fine for you.
One file. No installer, no dependencies beyond the Xcode command line tools you already have.
curl -fsSLO https://hawserkit.com/hawser-check.sh
It is 400 commented lines and it is a stranger's shell script, so do not take our word for what it does. It is also readable straight in your browser.
less hawser-check.sh
Point it at a DMG, an app bundle, or a zip containing one. If the app names a Sparkle feed, that feed is fetched and checked too.
bash hawser-check.sh ~/Desktop/YourApp.dmg
bash hawser-check.sh /Applications/YourApp.app \
--appcast https://yourapp.com/appcast.xml
Illustrative output. Yours will be shorter or longer depending on what it finds, and it may well be all green.
Nothing here is exotic. Every verdict comes from codesign, spctl, stapler, plutil or lipo, all already on your Mac and free. The tool's only contribution is knowing which questions to ask and what the answers mean, which is the same thing the kit is for.
get-task-allow did not survive into the shipped build.--appcast points it somewhere else.--offline removes it. Separately, spctl is a Gatekeeper evaluation and macOS may consult Apple during one, which is outside any script's control.We wrote this tool, then ran it against our own shipped app. It came back with one failure, and the failure was real.
Hawser 1.0.1 looks for updates at a GitHub Pages address. That address has returned 404 since 12 August, when we moved this site to a different host. The site move went perfectly. The domain worked, every page worked, everything was green. It did not occur to anyone that the app already out in the world was still asking the old address.
Nothing reported it, and nothing could have. Sparkle reads an unreachable feed as "no update right now" rather than as an error. No dialog, no log line, no sign of any kind. Every copy in circulation simply could not update, and would never have said so.
It had been that way for five weeks, in the product that is sold to prevent exactly this.
The repository is fixed, so the next build is correct. The copies already distributed are not, and cannot be: the update feed is the one component that cannot deliver its own fix, because the fix would have to travel through it. That is the whole reason it is worth checking from outside.
One clarification, because these are two separate facts and they are easy to read as one. The address baked into the app is dead by accident, as described above. The feed we do serve is deliberately empty, for the reason set out in the traps write-up: a Sparkle update archive is downloadable by anyone, and ours would carry the paid kit. Both are true, and only the first is a mistake.
We are telling you this because it is the strongest thing we can say about the tool. We know this pipeline well enough to sell it, we wrote the checks, and we still missed this one for five weeks.
Then your pipeline is in good shape and you should keep your $99. Genuinely: this is the outcome we expect for anyone who has been shipping outside the App Store for a while, and it is worth knowing rather than guessing.
Every failure it prints tells you what to fix, and you can go and fix each one by hand. The difference the kit makes is not knowing about them once. It is that these eighteen checks, plus the rest that only make sense while a build is being produced, run on every release, before the upload to Apple rather than after, and get updated when Apple moves the pipeline again.
You can also verify a finished DMG we built, or read the ten traps in full. Both free.