This document covers building and releasing CF Cache Status for distribution.
-
Apple Developer Account ($99/year) with:
- Developer ID Application certificate (for direct distribution)
- Apple Distribution certificate (for App Store)
-
Environment variables in
.env:cp .env.example .env
Variable Description APPLE_IDYour Apple ID email APPLE_TEAM_ID10-character Team ID from developer.apple.com APPLE_APP_PASSWORDApp-specific password from appleid.apple.com -
Xcode configured with your signing certificates
There are two separate release pipelines:
| Channel | Certificate | Output | Use Case |
|---|---|---|---|
| Direct | Developer ID Application | Notarized .zip |
GitHub releases, website |
| App Store | Apple Distribution | .pkg upload |
Mac App Store |
Both can be built for the same version — they're stored in separate directories.
For distributing outside the App Store. Requires notarization for Gatekeeper.
just release v0.0.6This runs: archive → submit → wait → staple
# 1. Build and sign with Developer ID
just archive v0.0.6
# 2. Submit for notarization
just submit
# 3. Check status (optional, non-blocking)
just status
# 4. Wait for Apple to process (can take minutes to hours)
just wait
# 5. Staple notarization ticket and create final zip
just staple
# 6. Create DMG installer (optional, requires: brew install create-dmg)
just dmg v0.0.6build/
└── v0.0.6/
├── CacheStatus.xcarchive # Xcode archive
├── CF Cache Status.app # Signed app
├── CF.Cache.Status.v0.0.6.zip # Final notarized release (for GitHub)
├── CacheStatus-v0.0.6.dmg # DMG installer (optional)
└── .submission_id # Notarization tracking
just history # Show notarization history
just log <id> # Get notarization log for a submission
just builds # List available buildsFor publishing on the Mac App Store.
just release-appstore v0.0.6This creates an Xcode archive ready for manual upload.
- Open the archive:
open build/v0.0.6-appstore/CacheStatus.xcarchive - In Xcode Organizer: Click Distribute App → App Store Connect
- Follow the prompts to upload
- Submit for review in App Store Connect
build/
└── v0.0.6-appstore/
└── CacheStatus.xcarchive # Xcode archive
In App Store Connect, configure:
| Field | Value |
|---|---|
| Privacy Policy URL | https://elephant.house/apps/safari-cache-status/privacy/ |
| Support URL | https://elephant.house/apps/safari-cache-status/ |
| Marketing URL | https://elephant.house/apps/safari-cache-status/ |
| Category | Developer Tools |
| Price | Free |
Content for description, keywords, and review notes is in assets/app_store.md.
Required sizes (at least one):
| Size | Resolution | Display |
|---|---|---|
| Small | 1280 × 800 | MacBook Air 13" |
| Medium | 1440 × 900 | MacBook Pro 13" |
| Large | 2560 × 1600 | MacBook Pro 14" Retina |
| XL | 2880 × 1800 | MacBook Pro 16" Retina |
Format: PNG or JPEG, RGB, no alpha, no rounded corners
What to capture:
- Safari with popup open showing HIT status
- Popup showing MISS with performance metrics
- Dark mode variant
How to capture:
# Screenshot a window
screencapture -w screenshot.png
# Resize to App Store dimensions
sips -z 1600 2560 screenshot.png --out screenshot-2560x1600.png| Question | Answer |
|---|---|
| Unrestricted Web Access | Yes |
| Everything else | None |
Result: Rated 4+
Uses encryption? No (HTTPS is exempt)
You can build both versions for the same release:
# Direct distribution (for GitHub)
just release v0.0.6
just dmg v0.0.6
# App Store (for Mac App Store)
just release-appstore v0.0.6They don't conflict — outputs go to separate directories:
build/v0.0.6/— Developer ID build (.zipand.dmg)build/v0.0.6-appstore/— App Store build (.pkg)
Apple's notarization service can sometimes take hours. Check status with:
just status
just historyGet the detailed log:
just log <submission-id>Common issues:
- Missing entitlements
- Hardened runtime not enabled
- Unsigned frameworks/binaries
Common issues when uploading via Xcode Organizer:
- Missing provisioning profile
- Bundle ID mismatch
- Version/build number conflicts
- manifest.json description > 112 characters (Safari extensions)
Verify your certificates in Keychain Access:
- Developer ID Application — for direct distribution
- Apple Distribution — for App Store
Both require the private key to be present.
Before releasing a new version:
- Update
CHANGELOG.md - Create git tag:
git tag v0.0.X - Push tag:
git push origin v0.0.X - Build releases:
-
just release v0.0.X(direct distribution) -
just dmg v0.0.X(optional DMG installer) -
just release-appstore v0.0.X(App Store archive)
-
- Create GitHub release with
.zipand.dmg - Upload App Store build via Xcode Organizer
- Submit for review in App Store Connect
Note: Version and build number are automatically set from the git tag.
v0.0.8→ MARKETING_VERSION=0.0.8, BUILD=(commit count)