@spectrex/ascdoc
v1.1.4
Published
π©Ί Release readiness auditor for App Store Connect
Downloads
38
Maintainers
Readme
π©Ί ASC Doctor
Catch App Store rejection risks before you submit.
ASC Doctor is a read-only release auditor for App Store Connect. It analyzes your metadata, screenshots, URLs, and localizations against App Store guidelines and instantly gives you a risk score and an actionable HTML report.
Features at a glance:
- π Read-only: We only read your data using the official ASC APIβwe never modify it.
- π€ CI-ready: Native GitHub Actions annotations and non-zero exit codes for pipeline failures.
- π URL Reachability: Real-world testing of privacy, support, and marketing URLs (detects broken or non-HTTPS links).
- β¨ Beautiful Reports: Interactive HTML reports, Markdown for PR comments, and JSON for automation.
- π Compare Mode: Audit only the changes since your last live version to spot regression risks.
β‘ Quick Start
Experience it instantly via our demo data (no API key required):
npx @spectrex/ascdoc --demo --format html --output report.html
# Then open report.html in your browser!Curious what a report looks like? π΄ Sample "Bad" Report (Failing) π’ Sample "Good" Report (Passing) π Sample JSON Data (For CI integrators)
π― What It Catches
| Module | What It Checks | |--------|---------------| | π Localization | Placeholder text ("TODO"), name repetition, missing descriptions, broken URLs | | π± Screenshots | Missing required device types (6.9", 13" iPad), checksum duplicates across locales | | π Age Rating | Unset declarations, gambling inconsistencies, Kids-category conflicts | | π¬ Subtitle/ASO | Generic text ("Best App Ever"), name repetition, exceeding 30-char limits | | π Privacy | Missing policy URLs, non-HTTPS links, unreachable privacy endpoints | | π³ Subscriptions | Missing display names, trial messaging without billing terms, localization gaps | | π Storefronts | Limited territories, missing major markets, wasted localization effort | | π Review Info | Missing contact info, missing demo account credentials, empty review notes |
βοΈ Audit vs. Manage (The "Why")
ASC Doctor does not replace tools like fastlane or asc.
- Fastlane/ASC is for writing and executing changes.
- ASC Doctor is for verifying your readiness before the App Store Review team does.
We catch the human errors those tools don't: unreachable URLs, "Lorem ipsum" hidden in deep localizations, or missing billing terminology in your subscription descriptions.
What it does NOT do:
- Modify any data on App Store Connect.
- Upload binaries or screenshots.
- Automate the submisson process itself.
π Risk Scoring
Every finding is weighted by severity and contributes to a 0-100 risk score:
| Grade | Meaning | Score Range | |-------|---------|-------------| | π’ A | Ship it! | 90-100 | | π‘ B | Almost ready | 75-89 | | π C | Needs attention | 50-74 | | π΄ D | High risk | 25-49 | | β F | Do not submit | 0-24 |
Severities: π΄ Critical (β15pts) Β· π High (β8pts) Β· π‘ Warning (β3pts) Β· βΉοΈ Info (β1pt)
π Setup
ASC Doctor uses the App Store Connect API.
- Go to Users and Access β Integrations β App Store Connect API
- Generate an API Key with App Manager role.
- Download the
.p8key and note your Key ID and Issuer ID.
π CI/CD Integration
Exit Codes
0: Audit completed successfully (all findings within score threshold).1: Tool error or audit failed (--min-scoreor--strictthreshold not met).
GitHub Actions
To get native annotations on your commits, use --format github:
- name: Audit App Store readiness
run: npx @spectrex/ascdoc --format github --min-score 80
env:
ASC_KEY_ID: ${{ secrets.ASC_KEY_ID }}
ASC_ISSUER_ID: ${{ secrets.ASC_ISSUER_ID }}
ASC_PRIVATE_KEY: ${{ secrets.ASC_KEY_P8_CONTENT }}π§ Advanced Usage
# Export HTML for PR artifacts
ascdoc --format html --output report.html
# Only run specific modules
ascdoc --only screenshots,localization
# Audit only changes vs. last report (defaults to report.json)
ascdoc --compare
# Audit only changes vs. a specific report
ascdoc --compare ./previous-audit.jsonπ License
MIT Β© spectreet
If ASC Doctor saved you from a rejection, consider giving it a β
