Building Keyty

September 6, 2026 ยท View on GitHub

Requirements

  • macOS 11.0 or later
  • Xcode 16 or later
  • Swift 5.0
  • Tuist 4.x

Cloning

git clone https://github.com/keytyapp/Keyty.git
cd Keyty

Dependencies

Dependencies are managed via Swift Package Manager and resolved automatically by Xcode on first open or build. No manual installation is required.

PackageVersion
AppMovera578bf4
ShortcutRecorder3.4.0
Sparkle2.9.4

Project Generation

Install Tuist, then generate the Xcode project from the checked-in manifest:

brew install tuist
cd Apps/Keyty
tuist generate

Building in Xcode

  1. cd Apps/Keyty
  2. Run tuist generate.
  3. Open Keyty.xcodeproj in Xcode.
  4. Select the Keyty scheme from the scheme picker.
  5. Choose your target destination (My Mac).
  6. Press Cmd+B to build, or Cmd+R to build and run.

Building from the Command Line

Debug build

cd Apps/Keyty
tuist generate
xcodebuild build \
  -project Keyty.xcodeproj \
  -scheme Keyty \
  -configuration Debug

Release build

cd Apps/Keyty
tuist generate
xcodebuild build \
  -project Keyty.xcodeproj \
  -scheme Keyty \
  -configuration Release

App Store build

The Keyty AppStore scheme uses the separate AppStore configuration and enables the App Sandbox. It is intentionally separate from Release, which continues to produce the Developer ID build for direct distribution.

cd Apps/Keyty
tuist generate
xcodebuild build \
  -project Keyty.xcodeproj \
  -scheme 'Keyty AppStore' \
  -configuration AppStore

Use the App Store distribution option in Xcode Organizer to archive and upload an AppStore build once the App Store-specific feature and signing work is complete.

Archive (for distribution)

cd Apps/Keyty
tuist generate
xcodebuild archive \
  -project Keyty.xcodeproj \
  -scheme Keyty \
  -configuration Release \
  -archivePath build/Keyty.xcarchive

Packaging

The drag-to-Applications DMG is a release artifact, not part of routine debug or CI builds. Install the pinned release packaging dependencies for the CI-compatible branded DMG backend:

python3 -m venv .venv-release
.venv-release/bin/python -m pip install --upgrade pip
.venv-release/bin/python -m pip install -r requirements-release.txt
export KEYTY_DMG_PYTHON="$PWD/.venv-release/bin/python"

Build it from a signed release app bundle with:

scripts/build-dmg.sh \
  --app build/release/Keyty.app \
  --output dist/Keyty.dmg

The packaging script uses dmgbuild when it is installed. If dmgbuild is not available locally, it falls back to the older Finder AppleScript backend. CI requires dmgbuild so packaging does not depend on an interactive Finder session.

For the full signed, notarized release flow, including the Sparkle zip and GitHub release artifacts, use the release automation documented in RELEASING.md.

Running Tests

cd Apps/Keyty
tuist generate
xcodebuild test \
  -project Keyty.xcodeproj \
  -scheme Keyty \
  -destination 'platform=macOS'

Code Signing

Keyty observes input through macOS Accessibility APIs, so local builds should use a stable Apple Development signature. Avoid adding CODE_SIGNING_ALLOWED=NO to local builds: ad-hoc code signatures can change between builds, and macOS may silently drop the app's Accessibility grant.

The checked-in project settings use the maintainer team NEVA4MAZBL. To build and run locally with your own signing identity, sign in to Xcode with your Apple ID and change the team in Signing & Capabilities after generating the project.

Unsigned builds are only for non-interactive CI jobs that do not need a stable Accessibility permission grant. The CI-only unsigned flags live in .github/workflows/build.yml.