Build1 distinct publisher3 min readUpdated
One engineer's log of shipping a Python app to macOS and Windows beta users. Three checkpoints in the signing pipeline hand back a pass on builds that users cannot open.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
The shape shared by most of what broke here is a tool that reports success on an artifact a user cannot run. `codesign --verify` passes ad-hoc signed binaries, because verification checks integrity rather than who signed [9]. `xcrun notarytool submit --wait` returns a clean exit code for a completed upload, not an accepted build, so Apple can answer `status: Invalid` while the script marches on, tries to staple a ticket that was never issued, collects "Record not found" and error 65, and declares the release shipped [11]. Add the script's own success report and that is three places in one pipeline where a green result sits on top of a build that will not install [2].
The identity trap runs the other way. `security find-identity -v -p codesigning` says "0 valid identities found" with the certificate and its private key both sitting in the keychain, because Apple's Developer ID G2 CA intermediate is absent and the trust chain cannot be built; the error text does not mention any of that [5]. The check that actually settles it is `codesign -d -vvv` showing three authority lines, from the Developer ID Application leaf up through the Developer ID Certification Authority to Apple Root CA [6].
What the author ends up building is a distrust of the tools rather than a better one: pick binaries by `file -b` type instead of filename, since Qt and Python framework binaries carry no extension at all and every `find -name "*.dylib"` loop online skips them [7]; use `find -exec` to avoid the argument-length ceiling that a long `Developer ID Application: Name (TEAMID)` string pushes `xargs` into [8]; then grep the authority back out of every Mach-O as a guard [10]. The payoff is arithmetic. A broken build fails on your own machine in 20 seconds instead of 15 minutes into Apple's queue, a loop 45 times shorter on exactly the error class most likely to repeat [1].
The translocation bug is the one no local test reaches. A user who launches from Downloads or a mounted DMG gets a randomized read-only path, so the updater downloaded, installed, relaunched the old version and downloaded again without end, and it never reproduced on the developer's machine because developers do not run their own app out of quarantine [13].
One caution on scope. The account puts Windows antivirus heuristics and browser download blocking next to notarization as the things that consumed weeks [2], but the material here documents the Apple half at error-message granularity and leaves the Windows half asserted. It is one engineer's log of one app, roughly 33k lines of PySide6, MediaPipe and ONNX [1]. The $99 a year Apple Developer fee is the only sum of money in the whole gauntlet; every other cost in it is engineering time [3].
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
Building the app took months; getting it to install and run on other people's machines took weeks of fighting Apple's notarization, Windows antivirus heuristics and browser download blocking, and almost none of it was documented in one place.
The paperwork requires an Apple Developer account at $99/year, a Developer ID Application certificate, an app-specific password, and storing credentials once with xcrun notarytool store-credentials.
The author built a desktop app in Python using PySide6, MediaPipe and ONNX, about 33k lines, and shipped it to beta users on macOS and Windows.
Without Developer ID signing plus notarization, users see "App is damaged and can't be opened. You should move it to the Trash.", a message the author says kills the app for non-technical users.
security find-identity -v -p codesigning reported "0 valid identities found" with the certificate and private key in the keychain, because Apple's Developer ID G2 CA intermediate certificate was missing so the trust chain could not be built, and nothing in the error indicated this.
The decisive test is that codesign -d -vvv on the app shows three authorities: Developer ID Application, Developer ID Certification Authority, and Apple Root CA; fewer means a broken chain.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Specific and reproducible, but single-source and self-reported
The account supplies exact commands, exact error strings, file paths and working shell fixes, which makes most claims independently testable by a reader. It is nonetheless one engineer's log of one app, published by one publisher, with no second source, no toolchain versions and no third-party reproduction; the generalization that every signing script online uses name-based globs is asserted without samples.
One shipped beta; no evidence of uptake of the described fixes
There is real-world deployment signal — the app reached beta users on macOS and Windows, and field incidents (first-tester translocation loop, Avast EvoGen quarantine mid-install) came from that deployment. But adoption is confined to a single developer's app: nothing in the supplied material shows other projects, templates or CI pipelines adopting the file-type signing loop, the authority guard or the 'status: Accepted' parse.
Claims broadly match the evidence, with mild understatement of caveats
Framing is unusually restrained for the genre: no product pitch, no performance claims, and the strongest quantitative statement (a roughly 45x shorter feedback loop) is simple arithmetic on the author's own 20-second and 15-minute figures. If anything the post undersells its uncertainty in the other direction by universalizing from one bundle ('every signing script you'll find online'), which is the one place rhetoric outruns evidence.
Low commercial pressure, some topical self-branding
The content is a debugging log with no vendor, sponsor or product being sold, and it names a cost it pays ($99/year) rather than one it collects. The residual incentive is reputational: it is published on a developer-content platform under a topical account handle ('shipyourpythonapp'), which rewards authoritative how-to framing and gives a reason to present one project's fixes as general practice. Supplied material discloses no monetization, affiliation or product behind the account, so this reads as weak rather than absent incentive.
Moderate on mechanics, low on generality
Confidence is reasonably high that these specific failures and fixes occurred as described, because the errors, commands and remedies are precise and internally consistent. It is low that they generalize: one publisher, one author, one app, one point in time, with Apple and antivirus behaviour both known to change and with no independent confirmation of the diagnoses or of how widely the described pipeline patterns are used.
invest
Your Landed Cost Is Being Litigated By Companies With $306,000 Problems1 distinct publisher
security
Apple dates its EU app rewrite: October 1, 2026, and the install fee becomes a 5% commission1 distinct publisher
build
796 pages of semantic search with no vector database, and what it cost to skip one1 distinct publisher
product
watchOS 27 demotes the honeycomb: five most-used apps plus Siri is the new default1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 21, 2026