Scans your Swift/Objective-C source for Apple's Required Reason API usage
(file timestamps, disk space, system boot time, active keyboards, UserDefaults) and checks it
against your PrivacyInfo.xcprivacy manifest -- the two most common causes of an
App Store Connect rejection with code ITMS-91061 (missing declaration) or
ITMS-91055 (invalid reason code). Everything runs in this tab; nothing is uploaded.
A command-line version for CI is in the same
repository
(node check.mjs .).
Open your project folder in Finder/Explorer, select every .swift/.m/.mm/.h file plus PrivacyInfo.xcprivacy (select-all works), then choose them here. Not at your project right now? instead.
No files selected yet.
Common questions
Why did App Store Connect reject my app with ITMS-91061 (Missing privacy manifest)?
Your app (or an SDK it embeds) calls one of Apple's Required Reason APIs -- file timestamps, disk space, system boot time, active keyboards, or UserDefaults -- without a PrivacyInfo.xcprivacy file declaring an approved reason. This tool scans your source for those calls and tells you exactly which category and file is missing a declaration.
What does ITMS-91055 (Invalid API reason declaration) mean?
Your manifest declares a reason code that Apple doesn't recognise for that category -- often a code copy-pasted from a different category's example. This tool checks every declared code against Apple's published list per category and flags any that don't match.
Is my source code uploaded anywhere?
No. The browser tool reads the files you select using the File API and never sends them anywhere -- everything happens in memory in your tab. The CLI never makes a network call either.
Does a clean report mean Apple will approve my app?
No. This is evidence of what your code and your manifest currently say, produced by pattern-matching known API symbols -- it is not App Review, and it cannot see reflection, dynamic dispatch, or third-party SDK binaries. Always confirm against Apple's current documentation before submitting.