# Bitchat Deployment Strategy: Manual Build-and-Sign Workflow for iOS/macOS

> Discover the bitchat deployment strategy: a manual build-and-sign workflow using Justfile, Xcode, and App Store Connect for iOS and macOS applications.

- Repository: [permissionlesstech/bitchat](https://github.com/permissionlesstech/bitchat)
- Tags: architecture
- Published: 2026-08-06

---

**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`](https://github.com/permissionlesstech/bitchat/blob/main/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`](https://github.com/permissionlesstech/bitchat/blob/main/Configs/Release.xcconfig)

---

## Pre-Deployment Verification

Before any build reaches Apple's distribution pipeline, maintainers follow the **[`VERIFYING-A-BUILD.md`](https://github.com/permissionlesstech/bitchat/blob/main/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)](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:

```bash

# 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:

```bash

# 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`](https://github.com/permissionlesstech/bitchat/blob/main/Justfile) | Build automation entry point; all deployment commands |
| [`Configs/Release.xcconfig`](https://github.com/permissionlesstech/bitchat/blob/main/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)](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.