Repository navigation
App Store Setup
This guide walks you through setting up OnCall Notify for distribution on the Mac App Store.
OnCall Notify supports dual distribution:
- Direct Distribution: Signed DMG files via GitHub Releases (already configured)
- Mac App Store: Distribution through the official App Store (this guide)
- Cost: $99/year
- Sign up: developer.apple.com/programs
- Required for: App Store distribution and TestFlight
- macOS 13.0+ with Xcode 15.0+
- Command Line Tools installed:
xcode-select --install - Access to App Store Connect
- Go to App Store Connect
- Click My Apps → + → New App
- Fill in the details:
- Platforms: macOS
- Name: OnCall Notify
- Primary Language: English (U.S.)
-
Bundle ID: Select
ie.unicornops.oncallnotify -
SKU:
oncallnotify-macos(or your choice) - User Access: Full Access
Navigate to your app → App Information:
- Primary: Developer Tools or Productivity
- Secondary: (optional) Business
- Size: 1024x1024 pixels
- Format: PNG or JPEG
- No alpha channel
- No rounded corners (Apple adds these)
Navigate to Pricing and Availability:
- Price: Free (or set your price)
- Availability: All countries or select specific ones
- Pre-Order: Not recommended for first release
Required for all apps:
- Create a privacy policy (can host on GitHub Pages)
- Add URL in App Store Connect
- Must include:
- What data you collect (API tokens stored locally)
- How you use it (API calls to PagerDuty, etc.)
- User rights (can delete data anytime)
Example privacy policy outline:
# Privacy Policy for OnCall Notify
## Data Collection
OnCall Notify does NOT collect, store, or transmit any user data to third parties.
## Local Storage
- API tokens are stored securely in macOS Keychain
- All data stays on your device
- No analytics or tracking
## Third-Party Services
The app connects to services you configure (e.g., PagerDuty) using API tokens you provide.
These connections follow the privacy policies of those services.
## Data Deletion
Simply delete the app to remove all stored data.You need two certificates for App Store distribution:
- Go to Apple Developer Portal
- Click + to create a new certificate
- Select Mac App Store → Mac App Store Distribution
- Follow instructions to create a Certificate Signing Request (CSR):
# Open Keychain Access # Keychain Access → Certificate Assistant → Request a Certificate from a Certificate Authority # Enter your email, select "Saved to disk"
- Upload the CSR
- Download the certificate
- Double-click to install in Keychain
- Same process as above
- Select Mac Installer Distribution
- Download and install
- Go to Profiles in Developer Portal
- Click + to create new profile
- Select Mac → Mac App Store
- Select your App ID:
ie.unicornops.oncallnotify - Select your Mac App Store Distribution certificate
- Name it:
OnCallNotify App Store - Download the
.provisionprofilefile - Double-click to install
To enable automated builds in GitHub Actions:
# Export App Store Application Certificate
security find-identity -v -p codesigning | grep "3rd Party Mac Developer Application"
# Note the certificate name
# Export to P12 format (will prompt for password - save this!)
security export -k login.keychain \
-t identities \
-f pkcs12 \
-o appstore_app.p12 \
-P "YOUR_EXPORT_PASSWORD"
# Base64 encode for GitHub Secret
base64 -i appstore_app.p12 -o appstore_app.p12.base64
# Repeat for Installer Certificate
security export -k login.keychain \
-t identities \
-f pkcs12 \
-o appstore_installer.p12 \
-P "YOUR_EXPORT_PASSWORD"
base64 -i appstore_installer.p12 -o appstore_installer.p12.base64
# Export provisioning profile
base64 -i ~/Library/MobileDevice/Provisioning\ Profiles/*.provisionprofile \
-o provisioning.base64Add these secrets to your GitHub repository:
- Go to your repo → Settings → Secrets and variables → Actions
- Add the following Repository secrets:
| Secret Name | Value | Description |
|---|---|---|
APPSTORE_CERTIFICATE_BASE64 |
Contents of appstore_app.p12.base64
|
App signing certificate |
APPSTORE_INSTALLER_CERTIFICATE_BASE64 |
Contents of appstore_installer.p12.base64
|
Installer signing certificate |
APPSTORE_CERTIFICATE_PASSWORD |
Your export password | Password used when exporting P12 |
APPSTORE_PROVISIONING_PROFILE_BASE64 |
Contents of provisioning.base64
|
Provisioning profile |
Note: You should already have these secrets from direct distribution:
-
APPLE_DEVELOPER_ID- Your Apple ID email -
APPLE_APP_PASSWORD- App-specific password -
APPLE_TEAM_ID- Your team ID (e.g., ABC123XYZ)
Using API keys is more secure than Apple ID + password:
- Go to App Store Connect
- Navigate to Users and Access → Keys → App Store Connect API
- Click + to generate a new key
- Give it a name:
GitHub Actions - OnCall Notify - Access: App Manager or Admin
- Download the
.p8file (only available once!) - Note the Key ID and Issuer ID
Add to GitHub Secrets:
| Secret Name | Value |
|---|---|
APPSTORE_API_KEY |
Contents of the .p8 file |
APPSTORE_API_KEY_ID |
Key ID from App Store Connect |
APPSTORE_API_ISSUER_ID |
Issuer ID from App Store Connect |
Update .github/workflows/appstore-release.yml to use API keys instead of Apple ID.
Required sizes (capture on different macOS displays):
- macOS: At least 3 screenshots
- Minimum size: 1280 x 800 pixels
- Maximum size: 2880 x 1800 pixels
- Format: PNG or JPEG
Tips:
- Show the app in use (menu bar popover open)
- Show settings screen
- Show alert notifications
- Use Cmd+Shift+4 for screenshots
Navigate to App Store → macOS App Store in App Store Connect:
Stay on top of your on-call alerts with real-time notifications in your menu bar.
Currently supports PagerDuty with more services coming soon.
OnCall Notify is your unified on-call status monitor for macOS. Keep track of
incidents, alerts, and on-call schedules directly from your menu bar.
FEATURES
• Real-time alert monitoring from your menu bar
• Separate counts for acknowledged and unacknowledged alerts
• Quick acknowledge incidents with one click
• Visual on-call status indicator
• See when your next shift starts
• Secure API token storage in macOS Keychain
• Auto-refresh every 60 seconds
• Native macOS UI built with SwiftUI
• Lightweight and efficient
CURRENTLY SUPPORTED SERVICES
• PagerDuty - Full support for incidents and on-call schedules
COMING SOON
• Atlassian Compass
• Atlassian Jira Service Management
• VictorOps/Splunk On-Call
• Alertmanager
• Custom webhooks
REQUIREMENTS
• macOS 13.0 (Ventura) or later
• Account with a supported service (currently PagerDuty)
PRIVACY & SECURITY
• No data collection or tracking
• API tokens stored securely in macOS Keychain
• All API requests use HTTPS
• No third-party analytics
OnCall Notify is free and open source, licensed under GPLv3.
pagerduty,oncall,alerts,monitoring,devops,sre,incidents,notifications,menu bar,status
https://github.com/unicornops/oncallnotify/issues
https://github.com/unicornops/oncallnotify
For your first release:
Initial release of OnCall Notify for macOS!
• Monitor your PagerDuty incidents in real-time
• See your on-call status at a glance
• Acknowledge incidents with one click
• Secure token storage in macOS Keychain
• Native macOS design with SwiftUI
This is the first public release. More services and features coming soon!
# Build locally using the App Store script
./build-appstore.sh 0.16.0
# The script will create:
# - build/AppStore/OnCallNotify.xcarchive
# - build/AppStore/OnCallNotify.pkg
# Validate before upload
xcrun altool --validate-app \
-f build/AppStore/OnCallNotify.pkg \
-t macos \
--apple-id "YOUR_APPLE_ID" \
--password "YOUR_APP_PASSWORD" \
--team-id "YOUR_TEAM_ID"
# Upload manually
xcrun altool --upload-app \
-f build/AppStore/OnCallNotify.pkg \
-t macos \
--apple-id "YOUR_APPLE_ID" \
--password "YOUR_APP_PASSWORD" \
--team-id "YOUR_TEAM_ID"# Trigger the App Store workflow
# Go to: Actions → App Store Release → Run workflow
# Enter version: 0.16.0
# Or use GitHub CLI
gh workflow run appstore-release.yml -f version=0.16.0- Go to App Store Connect → Your App
- Click macOS App Store → + Version or select existing version
- Under Build, click + Add Build
- Select the build you just uploaded
- Wait for processing to complete (5-30 minutes)
- Sign-in required: No (or provide test account if needed for PagerDuty)
- Contact Information: Your email and phone
- Notes: Include any setup instructions for reviewers
Example notes:
This is a menu bar app that monitors on-call alerts.
To test:
1. The app requires a PagerDuty account for full functionality
2. Test account credentials: [provide if needed]
3. The app icon appears in the menu bar at the top of the screen
4. Click the icon to see the menu
The app stores API tokens securely in macOS Keychain and makes
HTTPS requests to configured services.
- Does your app use encryption?: Yes (HTTPS)
- Does it use standard encryption?: Yes
- Usually qualifies for exemption (standard HTTPS encryption)
- Review all information
- Click Add for Review or Submit for Review
- Answer any additional questions
- Submit!
- Typical timeframe: 1-3 days
- Status tracking: App Store Connect shows current status
- Notifications: You'll receive emails about status changes
Possible outcomes:
- ✅ Approved: App goes live (or pending your release)
⚠️ Metadata Rejected: Fix descriptions/screenshots and resubmit- ❌ Rejected: Address issues and resubmit with new build if needed
Once approved, you have options:
- Automatic Release: Goes live immediately upon approval
- Manual Release: You choose when to release
- Scheduled Release: Set a future date/time
For future updates:
- Update version in Xcode project
- Build and upload new version (manually or via GitHub Actions)
- Create new version in App Store Connect
- Add "What's New" text
- Submit for review
Updates typically review faster than initial submissions.
Error: No matching provisioning profile
- Ensure provisioning profile is installed
- Check bundle ID matches exactly:
ie.unicornops.oncallnotify - Verify profile hasn't expired
Error: Code signing failed
- Check certificates are installed in Keychain
- Verify certificate names match exactly
- Try unlocking keychain:
security unlock-keychain
Error: Invalid package
- Validate first with
--validate-app - Check all entitlements are valid for App Store
- Ensure no hardened runtime flags (not needed for App Store)
Error: Authentication failed
- Verify Apple ID and app-specific password
- Check team ID is correct
- Try using API keys instead
Common rejection reasons:
- Missing privacy policy
- Incomplete app description
- Screenshots don't show app functionality
- App crashes on launch
- Requires additional entitlements not declared
App Sandbox issues:
- Test thoroughly with App Sandbox enabled
- Keychain access works differently in sandbox
- Network access requires entitlement (already added)
- Upload build to App Store Connect
- Go to TestFlight tab
- Add internal testers (up to 100)
- Distribute for testing
- Get feedback before public release
Test locally with sandbox enabled:
# Build with sandbox entitlements
xcodebuild \
-project OnCallNotify.xcodeproj \
-scheme OnCallNotify \
-configuration Release \
CODE_SIGN_ENTITLEMENTS="OnCallNotify/OnCallNotify.AppStore.entitlements"
# Test the built app thoroughly
# Verify API calls work
# Verify Keychain access works
# Check all features function correctlyBefore submitting to App Store:
- Apple Developer Program membership active
- App created in App Store Connect
- Certificates created and installed
- Provisioning profile created and installed
- GitHub secrets configured
- Privacy policy published
- App description written
- Screenshots prepared (at least 3)
- Keywords chosen
- Support URL set
- App tested with sandbox entitlements
- Build uploaded successfully
- Build processing completed
- All App Store Connect fields completed
- Export compliance answered
- Review notes written (if needed)
- App Store Connect
- Apple Developer Portal
- App Store Review Guidelines
- macOS App Distribution Guide
- Notarization for macOS
If you encounter issues:
- Check the App Store Connect Help
- Review the Apple Developer Forums
- Open an issue in the GitHub repository
Note: This guide is current as of January 2025. App Store Connect's interface and requirements may change over time.