iOS client for Actual Budget
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
A native iOS companion app for Actual Budget.
Budget, log transactions, and check balances from your iPhone or iPad — offline, on your own server.
Actuali talks directly to your self-hosted Actual server using the same CRDT sync protocol as Actual's own clients. Every budget lives locally in SQLite, so the app works fully offline and merges cleanly with edits made on desktop or web. Your rules run on transactions you log from the phone, your reports dashboard renders with real data, and Siri/Shortcuts can log a purchase without you opening the app.查看完整 README ↗A native iOS companion app for Actual Budget.
Budget, log transactions, and check balances from your iPhone or iPad — offline, on your own server.
Actuali talks directly to your self-hosted Actual server using the same CRDT sync protocol as Actual's own clients. Every budget lives locally in SQLite, so the app works fully offline and merges cleanly with edits made on desktop or web. Your rules run on transactions you log from the phone, your reports dashboard renders with real data, and Siri/Shortcuts can log a purchase without you opening the app.
There's no cloud in the middle: no accounts, no analytics, no third-party SDKs. The app only ever talks to the server you point it at. A built-in demo budget lets you try everything with sample data before connecting anything.
This is an unofficial community project. It is not affiliated with or endorsed by the Actual Budget team.
Accounts & transactions
+ − × ÷) right on the amount keypadBudgeting
zero_budgets) and tracking (reflect_budgets) budgets are both supportedReports
Automation
Smart payees
Setup, sync & privacy
You'll need Xcode with the iOS 26 SDK. Dependencies (GRDB.swift, SwiftProtobuf, ZIPFoundation) are managed by Xcode's Swift Package Manager and resolve on first build.
# Open in Xcode
open Actuali/Actuali.xcodeproj
# Or build from the command line
xcodebuild -project Actuali/Actuali.xcodeproj -scheme Actuali -sdk iphonesimulator build
# Regenerate protobuf code (only if sync.proto changes)
protoc --swift_out=Actuali/Actuali/Generated/ Actuali/Actuali/Resources/sync.proto
Build numbers are stamped automatically at build time from the git commit count, so pull requests never need to touch them.
UI (SwiftUI Views)
↓
BudgetStore (@MainActor, ObservableObject)
↓
Services Layer
├── BudgetDatabase (GRDB) → SQLite
├── SyncClient (actor) → CRDT sync engine
└── ActualServerClient (actor) → Network
The sync engine (Actuali/Actuali/Services/Sync/) implements Actual's CRDT protocol: a hybrid logical clock for causality ordering, a Merkle tree for efficient diffing, field-level CRDT messages, and protobuf encoding. Writes go to local SQLite first, generate CRDT messages, and sync to the server with a short debounce; reads are plain SQLite queries. Alongside it live Swift ports of Actual's rules engine, schedule recurrence, and report widget logic.
Actuali is a companion client, not a fork or replacement. It requires an Actual server and stores nothing anywhere else. The sync engine is a Swift port of Actual's CRDT implementation (packages/crdt and packages/loot-core in the upstream repo), which is MIT-licensed — see LICENSE for the attribution notice. For development, the upstream repo can be cloned into actual/ (gitignored) as a reference implementation.
See CONTRIBUTING.md. Bug reports and feature requests are welcome as GitHub issues, or come talk it through on Discord.
The app icon was designed and contributed by u/bdownz. Masters live in assets/icons/.
MIT — see LICENSE. Portions ported from Actual Budget (MIT, copyright James Long).