A macOS companion app for odit.et (the Ethiopian
bank-SMS finance tracker). Reads bank SMS from ~/Library/Messages/chat.db
on Macs that have iPhone SMS forwarding enabled, uploads them to your odit
server, and shows the parsed transactions, daily charts, and an activity
heatmap.
OditBridge is essentially a thin client on top of the odit API — bring your own backend (or self-host one) to make it useful.
- macOS 14+
- iPhone signed in to the same iCloud account, with Text Message Forwarding enabled
(iPhone → Settings → Messages → Text Message Forwarding → toggle your Mac on).
This is what populates
~/Library/Messages/chat.dbon your Mac. - SMS must be stored unencrypted in iCloud. If you have iCloud's
Advanced Data Protection enabled,
Messages in iCloud is end-to-end encrypted in a way that can leave
chat.dbempty or with unreadable bodies on the Mac side. If OditBridge shows zero staged messages after Load even though your iPhone has plenty, either disable ADP for the account or accept that only newly-forwarded messages (post-setup) will land inchat.db.
You need Xcode 15+ and xcodegen
(brew install xcodegen).
xcodegen generate
open OditBridge.xcodeproj
Press ⌘B to build. By default the project signs ad-hoc (no developer
team needed) — that's enough for Xcode runs but the resulting .app will
trip Gatekeeper if you copy it elsewhere.
Create Configs/Local.xcconfig (gitignored) with your values:
CODE_SIGN_IDENTITY = Apple Development: Your Name (XXXXXXXXXX)
DEVELOPMENT_TEAM = XXXXXXXXXX
Re-run xcodegen generate and you'll get proper signing. The same cert
across rebuilds means Full Disk Access grants persist between builds.
To iterate with Full Disk Access on /Applications/OditBridge.app:
tools/install-local.sh
Builds Debug, verifies the signature on the build output, then dittos the
bundle to /Applications/OditBridge.app and re-verifies. Re-run after any
code change.
This used to live as a post-build script in project.yml but Xcode's late
build phases (specifically RegisterWithLaunchServices) intermittently
strip the embedded signature off the installed copy on macOS 14+, leaving
you with an unlaunchable bundle. Doing the install as a separate step
sidesteps the issue.
If someone hands you a pre-built .app (e.g., GitHub Release):
- Drag
OditBridge.appto/Applications/. - macOS will refuse to open it because it's not notarized. In Finder:
right-click → Open → Open Anyway. (Or, in Terminal:
xattr -dr com.apple.quarantine /Applications/OditBridge.app.) - Open the app once so macOS registers the bundle.
- System Settings → Privacy & Security → Full Disk Access → add OditBridge.app and enable it.
- In the app: Settings → Server → set your API base URL.
- Copy your Device ID from Settings (or the link banner) and paste it into the odit web app's Devices → Link a Mac dialog while signed in.
- Switch to the Staged tab → Load now → review → Sync now.
The app's own Help → Getting Started menu walks through the same steps with copy buttons.
com.robi.OditBridge. Change in project.yml if you want a separate
identity; remember that Full Disk Access keys grants by bundle ID + code
signature, so changing the ID is the same as installing a fresh app from
TCC's perspective.
MIT. See LICENSE.