Thanks for your interest in contributing.
- For small fixes (typos, obvious bugs), open a PR directly.
- For new features or larger changes, open an issue first so we can align on scope.
- Security issues — see SECURITY.md, do not file public issues.
- Translating OmniTAK into your language? No coding needed — see TRANSLATING.md.
- Install Xcode 15.4 or later
git clone https://github.com/engindearing-projects/OmniTAK-iOS.gitopen OmniTAKMobile.xcodeproj- Set your Apple Developer Team and Bundle Identifier in Signing & Capabilities
- Swift 5.9, SwiftUI-first for new views
- Follow existing module structure under
OmniTAKMobile/Features/<FeatureName>/ - Public APIs get doc comments (
///), internal helpers usually don't - No force-unwraps in production code; use
guardor optional chaining - Prefer
async/awaitover completion handlers in new code
xcodebuild test \
-project OmniTAKMobile.xcodeproj \
-scheme OmniTAKMobile \
-destination 'platform=iOS Simulator,name=iPhone 15'Tests live in OmniTAKMobileTests/ (unit) and OmniTAKMobileUITests/ (UI / screenshots). New networking or CoT-parsing code needs a unit test.
- One logical change per commit
- Imperative subject line, ≤ 72 chars
- Body explains the why, not the what
Example:
Fix TLS 1.3 handshake hang on TAK Server 5.5
When the server presents a certificate chain longer than 4 entries,
NWConnection's challenge block was being invoked before our identity
was loaded. Loading the keychain identity synchronously on the
connection queue removes the race.
- Builds clean (
xcodebuild build) - Tests pass
- No new warnings introduced
- No secrets or hardcoded URLs added
- If touching
Info.plistorPrivacyInfo.xcprivacy, explain why in the PR - If adding a dependency, note the license in the PR
By submitting a contribution, you agree that your work is licensed under the Apache License 2.0 (see LICENSE).
Be respectful. Disagree on technical merits, not on people. Harassment, discrimination, or personal attacks will result in removal from the project.