Your privacy, your choice. Choose whether TheChosenVictor.com may use optional Google Ads measurement or keep advertising storage limited. This website setting does not change the privacy practices of any app.
Small command-line tools I built for my own releases, published because the problem was not mine alone.
Packages
3
License
MIT
Also GitHub Actions
2 of 3
Each of these started as a step I kept getting wrong by hand across twelve apps. They are checklists wearing a command line: they run locally, they exit non-zero, and they are meant to fail your build before Apple or a reader fails it for you.
What they do not do
No telemetry, no accounts, no network calls except the one Gemini request voice-rewriter exists to make. The two App Store linters run fully offline.
How to try one
Every command below runs without installing anything. Point it at a real folder and read what it says before you change a file.
metaproof
Lint App Store metadata before you submit
Scans a fastlane deliver metadata folder and checks every localized field against App Store Connect limits and a set of ASO keyword rules. It runs offline and exits non-zero, so it can gate CI instead of failing late in an upload.
Per-locale, Unicode-correct counting: user-perceived characters for text fields, UTF-8 bytes for the keyword budget.
Field-length checks for every App Store text field, including the two-character minimum on App Name.
A keyword linter for wasted separator spaces, duplicates, stop words, cross-field duplication, and unused budget.
A --fix mode that applies the safe keyword cleanups in place.
Lint App Store screenshots and app previews before you submit
Checks a fastlane deliver screenshots tree against Apple's published rules: exact dimensions, format validity, video codec and container compatibility, duration, file size, and per-localization counts. The visual-asset half of the same submission preflight.
Exact-size validation against Apple's current specification table, with the nearest valid size suggested for every rejected image.
Device-class detection by pixel resolution, including the iPad 12.9"/13" and Apple TV/Vision Pro shared-resolution cases.
Per-locale checks for over-limit counts, Apple Watch size consistency, empty locale folders, typo locale names, and stray files.
App-preview checks for container structure, H.264 or ProRes 422 HQ, the 500 MB ceiling, and the 15-to-30-second duration window.
Rewrite a post in a supplied voice, and fail closed on drift
Rewrites an original social post or a reply in a user-supplied voice with the Gemini API, checks exact factual anchors locally, and runs a separate semantic audit before returning text. It does not research facts: give it source-backed facts and it fails closed when the audit finds an added, removed, or contradicted claim.
Fixes the model to gemini-flash-latest at HIGH reasoning, so a run is reproducible.
Checks exact factual anchors locally before the model output is trusted.
Runs a separate semantic audit and fails closed on factual or meaning drift.
Adds no persistence, logging, or telemetry of its own.