Split costs with friends. Free forever, private, no accounts.
Views -> Stores (Observable) -> Repository -> SwiftData <-> Sync (CKSyncEngine)
|
+-> SpltCore (pure logic, no UI, no storage)
+-> Intelligence (on-device models)
A Swift package with no dependencies. It holds:
Money and currency minor-unit rulesSwiftData is the local source of truth. A repository protocol hides it from the views so tests can use an in-memory store.
Sync is built on CKSyncEngine.
CKShare. Accepted groups appear in the shared database.Splt/Data/Sync holds the data side of sync: change tracking, the merge policy and the payloads. Splt/Sync holds the transport: the engine, CloudKit and sharing.
Sync sits behind a protocol. Builds without the iCloud entitlement use a no-op engine, so the app runs fully offline in the simulator and in CI.
Backup lives in Splt/Data/Backup and Splt/Features/Settings. It writes everything to one file and restores it later. Spending lives in Splt/Features/Spending. It charts your share over the last 12 months, and a group has its own Spending tab.
Everything runs on the device.
| Feature | Framework |
|---|---|
| Quick add (“dinner 60 with Sam and Priya”) | Foundation Models |
| Receipt scanning and line items | VisionKit and Vision |
| Category suggestions | Foundation Models, Natural Language |
| Voice entry | Speech |
| Siri and Shortcuts | App Intents |
| Search in Spotlight | Core Spotlight |
| Comment translation | Translation |
Each feature degrades quietly when the model is unavailable.
Fetched from the free ECB-backed Frankfurter API, cached on the device, and always optional. A group can pin a fixed rate for a trip, typed in by hand, and a pinned rate always wins.
| Target | Role |
|---|---|
Splt |
iOS app |
SpltTests |
Unit tests |
SpltUITests |
UI tests |
SpltKit/SpltCore |
Shared logic package |
Widgets and share extensions are not built yet. Siri and Shortcuts work through App Intents inside the app target.