I am the developer of Fasting Timer (widget). Every package I upload to my listing is rejected by the automated security scan, with no detail about the finding, and I have found something that suggests the problem is the listing itself rather than my code. Posting here in case a Garmin engineer can look at it, and in case anyone else has hit the same thing.
What happens
Three rejections in two days, each about 40 minutes after upload:
- Sept 10, 4:10 pm — v2.4
- Sept 11, 4:18 pm — v2.5
- Sept 11, 5:46 pm — v2.5.1
The email is always identical: "An automated scan identified a security threat in the Fasting Timer app." No detail about what was found.
v2.5.1 was a byte-identical binary to v2.5
The same .iq file, re-uploaded without recompiling (SHA-256 0ee2c5e06a0367078be787090ad4f93462e5d5e253666c98c4a8a5a0f9441a16). The only thing I changed between the two submissions was outside the package. It was rejected again. So the rejection is deterministic and does not depend on what is inside the binary.
What I have ruled out
- Payment / donation references. v2.4 had a paypal.me link embedded. I removed it in v2.5 along with the screen that displayed it. Zero payment strings in any of the 41 device binaries. Rejected anyway.
- Suspicious content in the binary.
stringsover all 41 .prg files returns exactly one URL — my own site, which renders the user's exported history from the URL fragment. No base64, no high-entropy blobs, no matches for passw / token / api_key / secret / eval / exec / shell / crypto / wallet / payload. - Domain reputation. That domain was registered in 2018 and is flagged clean by 0 of 89 vendors on VirusTotal.
- Permissions. Background Activity and On-Device Alerts & Notifications only. No Positioning, no Communications.
- Package integrity. Every upload reports Status: Verified, Signature: Verified, 41 compatible devices, SDK 9.2.0.
The part that points at the listing, not the package
On September 9 I accidentally deleted my original listing, and discovered that the App ID of a deleted app stays permanently blocked ("Another application is already using the manifest application ID"). I had to create a new listing with a new App ID. Every submission to that new listing has been rejected. Not one has ever passed.
Today I tried to leave a rating on my own new listing. The store refused it with "you have already rated this app". That listing shows zero reviews and I have never rated it — the rating I left was on the deleted listing, a different listing with a different App ID.
So the review system treats the two listings as the same application, while the store page shows them as separate. Something in the backend still links them. If review state carried over from the deleted listing, other state may have carried over too — which would explain a deterministic rejection that ignores the contents of the binary.
Questions
- Can a Garmin engineer check whether this listing inherited any status or flag from the deleted one?
- Is there any way for a developer to see the actual finding of the security scan? The email gives none, and every blind attempt costs a day.
- Has anyone else recreated a listing after a deletion and then hit permanent scan rejections?
Two things that made this much harder to diagnose
Step 2 of the submission (description, screenshots, release notes) publishes successfully even when the binary is rejected. My store page advertised a new version for two days while the store kept serving an old binary to watches. That is why it took me several attempts to realise the uploads were failing at all.
The Download button in "Manage Your App" does not download anything. It opens a Terms of Use dialog, then a device picker, then a permissions dialog, and ends with "will be installed the next time your device syncs". There appears to be no way for a developer to obtain the binary the store is currently serving, which is exactly what I needed to diagnose this.