Thank you for your interest in contributing. This document covers how to get started, the development workflow, and guidelines for contributions.
- Read the README for architecture and setup
- Check open issues and PRs to avoid duplicating work
- For significant changes, open an issue first to discuss your approach
- Xcode 16+
- iOS 17+ / macOS 14+ deployment targets
- Apple Developer account (free tier works for simulator builds)
- Clone the repo
- Open
Axon.xcodeproj(not.xcworkspace— this project uses SPM) - Xcode will resolve SPM packages automatically on first open
- Set your Development Team in Signing & Capabilities for all targets
- Build with
Cmd+B
Axon depends on a local Swift package (Axon-Artifacts) that is being prepared for public release as a separate repository. Check the Issues page for the tracking issue and setup instructions.
Cloud features are optional. To use them:
- Copy
Axon/Config/PublicConfig.example.plisttoAxon/Config/PublicConfig.local.plist - Fill in your Firebase API key and App ID
- Never commit
PublicConfig.local.plist
The entitlements contain identifiers tied to the original developer's Apple account. When building locally you must:
- Set your own Team ID in Signing & Capabilities
- Change the iCloud container identifier (
iCloud.NeurXAxon) to one registered under your team - Change the app group identifier (
group.com.e2a0f78c018434b3.Axon) to one registered under your team
These values appear in the following files:
Axon/Services/Sync/CloudKitSyncService.swiftAxon/Services/Sync/AudioSyncService.swiftAxon/Services/Sync/UserDataZoneService.swiftAxon/Services/Persistence/CoreDataCloudKitStack.swiftAxon/Views/Components/WidgetConversationSnapshot.swiftAxonLiveActivity/WidgetSharedModels.swift
A future improvement will centralize these identifiers into a single config file.
To use Kokoro on-device TTS, generate the voice data:
python3 create_voices_builtin.py- Swift 6 strict concurrency —
StrictConcurrencyis enabled. Follow existing actor isolation patterns. - Logging — Use
debugLog(.category, "message")for all new logging. Do not use bareprint(). Bareprint()calls are silenced in release builds. - File headers — Follow the existing pattern:
// [Filename].swift / Axon - MARK comments — Use
// MARK: -to organize sections within files
- Fork the repo and create a branch from
main - Make your changes with focused, descriptive commits
- Ensure the project builds without errors or warnings
- Open a PR against
mainusing the PR template - Fill out the template completely
- API keys, Firebase credentials, or personal data in commits
- Changes to entitlement identifiers (they vary per developer account)
GoogleService-Info.plistor other secrets- Bare
print()calls in new code (usedebugLog())
By contributing, you agree that your contributions are licensed under the project's MIT License.