-
Notifications
You must be signed in to change notification settings - Fork 0
Building
github-actions[bot] edited this page Mar 1, 2026
·
2 revisions
This guide covers building for development and creating distribution builds.
Always regenerate after modifying project.yml:
xcodegen generate# Build
just build-mac
# Build and run
just run-mac# Simulator
just build-sim
# Physical device (set XCODE_DEVICE_ID and DEVICECTL_ID in .env)
just build-ios
just run-iosThe iOS app is distributed via App Store Connect:
# Archive and upload to App Store Connect
just release-iosThis creates an archive and uploads to App Store Connect. Then:
- Go to App Store Connect
- Select the build for TestFlight or App Review
The Mac app is distributed as a signed and notarized DMG.
-
Create Developer ID Certificate
- Go to Apple Developer Portal
- Create "Developer ID Application" certificate
- Download and install in Keychain
-
Create App-Specific Password
- Go to appleid.apple.com
- Security → App-Specific Passwords → Generate
-
Store Notarization Credentials
just setup-notary # Enter your Apple ID and app-specific password
# Verify signing setup
just check-signing
# Full release: build, sign, notarize, create DMG
just release-macThe pipeline:
- Build Release configuration with Hardened Runtime
- Create DMG with app
- Sign DMG with Developer ID
- Submit to Apple for notarization
- Staple notarization ticket to DMG
Output: ./build/ClickerRemoteReceiver-{version}.dmg
just dmg # Create unsigned DMG
just sign-dmg # Sign DMG
just notarize # Submit for notarization
just verify-signing # Verify app signature
just verify-notarization # Verify DMG is notarized
just notary-log # Show notarization historygh release create v1.0 \
./build/ClickerRemoteReceiver-1.0.dmg \
--title 'Clicker v1.0' \
--notes 'Release notes here'The Homebrew cask is hosted in the douinc/homebrew-tap repository.
After creating a GitHub release, trigger the automated tap update:
just update-tapThis triggers a GitHub Action in douinc/homebrew-tap that automatically downloads the DMG, calculates SHA256, updates the Cask formula, and pushes.
brew tap douinc/tap
brew install --cask clicker-remote-receivertargets:
ClickerMac:
settings:
base:
ENABLE_HARDENED_RUNTIME: YES
configs:
Release:
CODE_SIGN_STYLE: Manual
CODE_SIGN_IDENTITY: "Developer ID Application"
CODE_SIGN_INJECT_BASE_ENTITLEMENTS: NO
OTHER_CODE_SIGN_FLAGS: "--timestamp"| Setting | Purpose |
|---|---|
ENABLE_HARDENED_RUNTIME |
Required for notarization |
CODE_SIGN_IDENTITY |
Use Developer ID (not Apple Distribution) |
CODE_SIGN_INJECT_BASE_ENTITLEMENTS |
Prevent debug entitlements |
--timestamp |
Required for notarization verification |
just # Show all commands
# Development
just generate # Generate Xcode project
just build-mac # Build Mac (debug)
just build-ios # Build iOS for device
just build-sim # Build iOS for simulator
just run-mac # Build and run Mac
just run-ios # Build, install, launch iOS on device
just deploy # Deploy iPhone + Watch to device
# Mac Distribution
just check-signing # Verify Developer ID cert
just setup-notary # Store notarization creds
just release-mac # Full release pipeline
just dmg # Create DMG only
just sign-dmg # Sign DMG
just notarize # Notarize DMG
just verify-signing # Verify signature
just verify-notarization # Verify notarization
# iOS Distribution
just release-ios # Archive and upload to ASC