Bitchat Deployment Strategy: Manual Build-and-Sign Workflow for iOS/macOS
Bitchat uses a developer-driven deployment strategy that combines a Justfile-based build system with Xcode's native archive workflow and manual App Store Connect uploads.
The open-source Bitchat project—an Apple-platform messaging app built with Swift 5—implements an explicit, reproducible deployment pipeline centered on local build automation rather than cloud CI/CD. This approach prioritates cryptographic verifiability and maintainer control, reflecting the project's permissionless ethos.
Build Automation with Just
All deployment steps are codified in the Justfile at the repository root. This command runner—similar to Make but simpler—defines targets for every stage of the release process.
The core deployment targets include:
just build– Compiles the project in debug configurationjust test– Executes the full test suite inbitchatTests/just release– Generates a signed Release archive usingRelease.xcconfigjust archive– Produces the final.xcarchivebundle ready for distribution
These commands invoke xcodebuild with deterministic parameters, ensuring that any developer can reproduce an identical build artifact given the same source commit and signing credentials.
Source: Justfile
Configuration Management for Release Signing
Release-specific build settings are externalized to keep the repository portable while allowing secure credential injection.
Configs/Release.xcconfig contains:
- Compiler optimization flags (
SWIFT_OPTIMIZATION_LEVEL = -O) - Code signing identities for distribution
- Provisioning profile specifications
Developers create a local, untracked Local.xcconfig (copied from Local.xcconfig.example) to store their Apple Developer Team ID and profile identifiers. The Justfile automatically overlays these values during release builds.
Source: Configs/Release.xcconfig
Pre-Deployment Verification
Before any build reaches Apple's distribution pipeline, maintainers follow the VERIFYING-A-BUILD.md checklist. This document mandates:
- Full test suite passage with
just test - Code signature validation via
codesign -d --entitlements - Bundle identifier confirmation against
bitchat/Info.plist - Archive integrity inspection
This verification step ensures that only clean, fully-tested builds proceed to App Store Connect, reducing the risk of distributing compromised or defective binaries.
Source: [docs/VERIFYING-A-BUILD.md](https://github.com/permissionlesstech/bitchat/blob/main/docs/VERIFYING-A-BUILD.md)
Distribution to App Store Connect
The final deployment stage leverages Apple's native toolchain. After just release produces build/Bitchat.xcarchive, maintainers export and upload through either Xcode's GUI or command-line tools:
# Export the signed .ipa from the archive
xcodebuild -exportArchive \
-archivePath build/Bitchat.xcarchive \
-exportOptionsPlist ExportOptions.plist \
-exportPath build/
# Upload via altool (alternative to Xcode GUI)
xcrun altool --upload-app \
--type ios \
--file "build/Bitchat.ipa" \
--apiKey "$APP_STORE_CONNECT_KEY_ID" \
--apiIssuer "$APP_STORE_CONNECT_ISSUER_ID"
The build then enters Apple's standard pipeline: TestFlight for internal beta testing, followed by App Store review for public release. No server-side infrastructure or container orchestration is required, as Bitchat is a pure native client application.
Complete Deployment Workflow
Execute the full Bitchat deployment strategy with these commands:
# Install prerequisites
brew install just
# Verify environment and run tests
just test
# Create release archive with proper signing
just release
# Export for App Store distribution
xcodebuild -exportArchive \
-archivePath build/Bitchat.xcarchive \
-exportOptionsPlist ExportOptions.plist \
-exportPath build/
# Upload manually via Xcode or altool as shown above
Key Deployment Files
| Path | Purpose |
|---|---|
Justfile |
Build automation entry point; all deployment commands |
Configs/Release.xcconfig |
Release build settings and signing configuration |
[docs/VERIFYING-A-BUILD.md](https://github.com/permissionlesstech/bitchat/blob/main/docs/VERIFYING-A-BUILD.md) |
Pre-deployment verification checklist |
bitchat/Info.plist |
Bundle identifiers and version metadata |
ExportOptions.plist |
App Store export provisioning (created per-developer) |
Summary
- No CI/CD pipeline – Bitchat deployment is fully developer-driven through local automation
- Justfile orchestration – Single source of truth for build, test, and archive commands
- Configuration layering –
Release.xcconfig+Local.xcconfigenables secure credential management without repository bloat - Mandatory verification – Documented checklist ensures build integrity before distribution
- Apple-native distribution – Standard TestFlight → App Store workflow via
xcodebuildandaltool
Frequently Asked Questions
Does Bitchat use GitHub Actions or another CI service for deployment?
No. According to the Bitchat source code, the project intentionally avoids cloud CI/CD in favor of local, reproducible builds through the Justfile. This design choice prioritizes cryptographic verifiability—maintainers control the entire signing chain without trusting third-party infrastructure.
What tools do I need to deploy Bitchat myself?
You need Xcode, the Just command runner (brew install just), and valid Apple Developer credentials. The Justfile handles all xcodebuild invocation; manual steps are limited to creating your Local.xcconfig and uploading the finished archive through Xcode or altool.
How does Bitchat manage code signing certificates without exposing secrets?
The repository stores only template configurations (Local.xcconfig.example). Developers copy this to an untracked Local.xcconfig and populate their Team ID and provisioning profile identifiers. The Justfile automatically includes this file during release builds, keeping actual credentials out of version control.
Can Bitchat be distributed outside the App Store?
The current deployment strategy targets App Store Connect exclusively. The xcodebuild -exportArchive workflow produces signed IPAs suitable for TestFlight and App Store distribution. Enterprise or ad-hoc distribution would require modifying ExportOptions.plist and using alternate provisioning profiles, but these paths are not documented in the repository.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →