Privacy-first personal finance for iPhone, iPad, and Mac. Track your money without a Cairn-operated backend.
Swift
2
195 commits
updated Sep 23, 2026

Cairn is a privacy-first personal finance app for iPhone, iPad, and Mac, for people who want to see their whole financial picture without a Cairn-operated backend. It reads the bank accounts you authorize through SimpleFIN ($1.5/month or $15/year) and Apple Wallet, enriches everything on your device, and — if you choose — syncs between your devices through your own private iCloud database. There is no Cairn backend. Ever.
Cairn is in public beta on TestFlight, heading toward 1.0 on the App Store. It is usable today for read-only tracking of real accounts; there are no budgets, reports, or exchange rates yet.
@Attribute(.allowsCloudEncryption), so CloudKit encrypts them
end-to-end with keys from your iCloud Keychain, independent of Advanced Data
Protection. Structural metadata is not encrypted — for example, which
category a transaction is linked to, category icons, status flags such as
pending or transfer, and sync timestamps.See docs/threat-model.md and
docs/privacy-policy.md. The app's public
Privacy Policy and
Support pages are hosted
on GitHub Pages.
brew install xcodegen)# Generate the Xcode project from project.yml
xcodegen generate
# Run the core test suite
swift test
# Build the app (macOS)
xcodebuild -project Cairn.xcodeproj -scheme Cairn -destination 'platform=macOS' build
# Build the app (iOS simulator)
xcodebuild -project Cairn.xcodeproj -scheme Cairn \
-destination 'platform=iOS Simulator,name=iPhone 17 Pro' build
The Xcode project is generated and not checked in. Edit project.yml, not the
.xcodeproj.
The simulator needs no signing setup. To build for a device or enable iCloud sync, put your own team and bundle identifier in a git-ignored local file:
cp Config/Signing.example.xcconfig Config/Signing.local.xcconfig
# edit DEVELOPMENT_TEAM and PRODUCT_BUNDLE_IDENTIFIER, then:
xcodegen generate
Config/Signing.xcconfig holds safe defaults and pulls in that local file via
#include?. ICLOUD_CONTAINER_ID names the CloudKit container and defaults to
iCloud.<bundle id>, so no shared container is baked into the repo. Every
configuration ships the same entitlements, so CloudKit and iCloud Keychain work
in Debug as well as Release; whether iCloud is used is decided at runtime
(ubiquityIdentityToken), with local-only fallback when there is no account.
See docs/releasing.md for the details.
Debug builds accept --cairn-sample-data, which loads demo accounts and
transactions so you can explore the UI:
xcodebuild ... -scheme Cairn build
xcrun simctl launch <device> <your.bundle.id> --cairn-sample-data
CairnCore is a local Swift package holding all logic — models, the SimpleFIN client, the sync engine, security, enrichment, and export — so it can be tested without a simulator. The app target is a thin SwiftUI layer.
See docs/architecture.md for the full picture.
Releases are cut from main by pushing a vX.Y.Z tag. CI runs the tests,
uploads iOS and macOS builds to TestFlight, and publishes a GitHub Release with
generated notes and dSYMs:
Scripts/release.sh patch # or minor / major
See docs/releasing.md for the versioning scheme, the
required repository secrets, the CloudKit schema-promotion step, and the hotfix
flow.
Contributions are welcome — please read CONTRIBUTING.md and
the CODE_OF_CONDUCT.md. Security issues: see
SECURITY.md.
Apache-2.0. See LICENSE and NOTICE.
Cairn is not affiliated with SimpleFIN or any financial institution.
195 commits
Swift
98.6%
Shell
1.4%
Privacy-first personal finance for iPhone, iPad, and Mac. Track your money without a Cairn-operated backend.
Swift
2
195 commits
updated Sep 23, 2026

Cairn is a privacy-first personal finance app for iPhone, iPad, and Mac, for people who want to see their whole financial picture without a Cairn-operated backend. It reads the bank accounts you authorize through SimpleFIN ($1.5/month or $15/year) and Apple Wallet, enriches everything on your device, and — if you choose — syncs between your devices through your own private iCloud database. There is no Cairn backend. Ever.
Cairn is in public beta on TestFlight, heading toward 1.0 on the App Store. It is usable today for read-only tracking of real accounts; there are no budgets, reports, or exchange rates yet.
@Attribute(.allowsCloudEncryption), so CloudKit encrypts them
end-to-end with keys from your iCloud Keychain, independent of Advanced Data
Protection. Structural metadata is not encrypted — for example, which
category a transaction is linked to, category icons, status flags such as
pending or transfer, and sync timestamps.See docs/threat-model.md and
docs/privacy-policy.md. The app's public
Privacy Policy and
Support pages are hosted
on GitHub Pages.
brew install xcodegen)# Generate the Xcode project from project.yml
xcodegen generate
# Run the core test suite
swift test
# Build the app (macOS)
xcodebuild -project Cairn.xcodeproj -scheme Cairn -destination 'platform=macOS' build
# Build the app (iOS simulator)
xcodebuild -project Cairn.xcodeproj -scheme Cairn \
-destination 'platform=iOS Simulator,name=iPhone 17 Pro' build
The Xcode project is generated and not checked in. Edit project.yml, not the
.xcodeproj.
The simulator needs no signing setup. To build for a device or enable iCloud sync, put your own team and bundle identifier in a git-ignored local file:
cp Config/Signing.example.xcconfig Config/Signing.local.xcconfig
# edit DEVELOPMENT_TEAM and PRODUCT_BUNDLE_IDENTIFIER, then:
xcodegen generate
Config/Signing.xcconfig holds safe defaults and pulls in that local file via
#include?. ICLOUD_CONTAINER_ID names the CloudKit container and defaults to
iCloud.<bundle id>, so no shared container is baked into the repo. Every
configuration ships the same entitlements, so CloudKit and iCloud Keychain work
in Debug as well as Release; whether iCloud is used is decided at runtime
(ubiquityIdentityToken), with local-only fallback when there is no account.
See docs/releasing.md for the details.
Debug builds accept --cairn-sample-data, which loads demo accounts and
transactions so you can explore the UI:
xcodebuild ... -scheme Cairn build
xcrun simctl launch <device> <your.bundle.id> --cairn-sample-data
CairnCore is a local Swift package holding all logic — models, the SimpleFIN client, the sync engine, security, enrichment, and export — so it can be tested without a simulator. The app target is a thin SwiftUI layer.
See docs/architecture.md for the full picture.
Releases are cut from main by pushing a vX.Y.Z tag. CI runs the tests,
uploads iOS and macOS builds to TestFlight, and publishes a GitHub Release with
generated notes and dSYMs:
Scripts/release.sh patch # or minor / major
See docs/releasing.md for the versioning scheme, the
required repository secrets, the CloudKit schema-promotion step, and the hotfix
flow.
Contributions are welcome — please read CONTRIBUTING.md and
the CODE_OF_CONDUCT.md. Security issues: see
SECURITY.md.
Apache-2.0. See LICENSE and NOTICE.
Cairn is not affiliated with SimpleFIN or any financial institution.
195 commits
Swift
98.6%
Shell
1.4%