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 configuration
  • just test – Executes the full test suite in bitchatTests/
  • just release – Generates a signed Release archive using Release.xcconfig
  • just archive – Produces the final .xcarchive bundle 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:

  1. Full test suite passage with just test
  2. Code signature validation via codesign -d --entitlements
  3. Bundle identifier confirmation against bitchat/Info.plist
  4. 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.xcconfig enables secure credential management without repository bloat
  • Mandatory verification – Documented checklist ensures build integrity before distribution
  • Apple-native distribution – Standard TestFlight → App Store workflow via xcodebuild and altool

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:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →