Open source · Local-first · Self-hostable

Personal finance that stays on your phone.

Saldo tracks spending period by period, with budgets, goals and a forecast. It works offline, with no account. When you want sync, it uses a server you run.

No telemetryNo bank connectionAndroid and iOS, built from source

What it is

A finance app that needs nobody’s cloud.

Local-first

Everything lives in a database on your phone. Saldo opens offline, and nothing waits for a network.

Your server, if you want one

Sign in with a passkey to a Saldo server you run. Every device on the account converges, offline edits included.

Nothing reported

No telemetry, no analytics, no crash reporting. The code is MIT licensed, and all of it is on GitHub.

Features

Budgets, goals and a forecast. Built in, not upsold.

Every feature works on the phone alone. Nothing sits behind a subscription.

Budgets that know the pace

A tick on each bar marks where today falls in the period. Ahead of it, the bar turns dark, and Saldo says what you can still spend each day.

Groceries17 days left
€195.60of €420.00
Transport17 days left
€117.80of €250.00
Restaurants17 days left
€57.20of €200.00

Goals inside your accounts

Set money aside towards a figure and, if you like, a date.

New laptop€960.00 of €1,600.00 · 60%
by Dec 20

Set aside €200.00 a month to get there. You're €136.24 ahead.

A forecast you can check

Three periods ahead, from your recurring entries and the median of the last six.

By December 31, 2026, about€2,955.00
IncomeExpensesMin–max

Recurring, done properly

Change one occurrence, this one and the following, or all of them.

Car insuranceEvery month · Sep 18
−€78.00

This entry is recurring

Only this one
This and the following ones
All occurrences

Periods you choose

A calendar month, a week, a pay cycle from payday, a year, or a range you pick.

Calendar monthWeekPay cycleYearCustom period

Your month runs from Sep 27 to Oct 26
From a day you choose to the day before, next month

Bring your Spendee history

Import the CSV that Spendee exports. Saldo detects the format, shows a preview, and skips the rows it already has. Other apps work with a column mapping.

Import CSVSpendee format · 1,248 rows
DateDate
WalletAccount
Category nameCategory
LabelsTags

1,236 to import · 12 duplicates · 0 errors

Leave whenever you want

Export everything, any time. Restore a backup onto a phone.

Full backup (JSON)Everything: accounts, categories, transactions, budgets.
Full backup with attachments (ZIP)Everything, plus the photos and PDFs on this phone.
All transactions (CSV)

Screens

Every screen, as the app draws it.

Sample data for one September. Swipe or use the arrows.

HomeWhat is left to spend this period, what is coming up, and how each budget is doing.
TransactionsThe period’s list, with search, filter chips and day totals.
New transactionExpense, income or transfer: the amount, the account, the date and the categories you use most.
StatisticsCashflow for the last periods and three ahead, then where the money went.
BudgetsOne card per budget: what you spent, the pace and the days left.
GoalsMoney set aside inside an account, towards a figure and, if you like, a date.
AccountsNet worth, the spendable total, and savings and investments kept apart.
Credit cardWhat you owe, the statement so far, and when the next charge comes.
RecurringRent, salary and subscriptions, and what they cost per month.
Period recapWhen a period ends: the net, the categories and how each budget closed.
01 / 10Home

On the web and in your AI client

Web appThe same data in a browser on your own server: the list, with the detail beside it.
terminal
$ claude mcp add --transport http saldo \
  https://saldo.example.com/mcp
MCPClaude Code, Cursor or any MCP client: you sign in with your passkey and choose what it may do.

Self-hosting

Run the server. Keep the keys.

The Saldo server is a web app and a Postgres database, in Docker. It adds sync between your devices, a web app for the big screen, and an MCP endpoint for your AI client.

  • Passkeys, no passwords. The client never receives your passkey.
  • Invite-only. After the first account, nobody gets in without a single-use code.
  • MCP for Claude Code, Cursor and others. Read only, or read and write. Revoke it from Profile.
~/saldo
# from docs/self-hosting.md
$ git clone https://github.com/saliougaye/saldo.git
$ cd saldo
$ export PUBLIC_URL=https://saldo.example.com
$ export WEBAUTHN_RP_ID=saldo.example.com
$ export JWT_SECRET="$(openssl rand -base64 48)"
$ export SETTINGS_ENCRYPTION_KEY="$(openssl rand -base64 32)"
$ export POSTGRES_PASSWORD="$(openssl rand -base64 24)"
$ docker compose -f apps/web/docker/docker-compose.yml \
  up -d --build
  1. Start it with DockerOne compose file runs the server and Postgres. Put Caddy in front for HTTPS.
  2. Open /setupThe first account becomes the admin. After that, registration needs an invite code.
  3. Connect the phoneChoose “With your Saldo server” on the first screen, or later from Profile → Server and sync.

FAQ

Questions, before you build it.

Do I need a server?

No. Choose “Only on this phone” on the first screen: no account, nothing to set up. You can connect a server later from Profile, without losing anything.

Can I bring my Spendee history?

Yes. Export your transactions from Spendee as CSV and import the file. Saldo detects the Spendee format, shows a preview, and skips the rows it already has.

Is there an App Store or Play Store build?

Not yet. You build the app and sideload it, with the guides for Android and iOS. On iOS with a free Apple ID, the app stops opening after seven days until you install it again.

Does it connect to my bank?

No. You enter transactions, or you import them from a CSV.

What happens when my server is down?

The app keeps working on the phone. It syncs again when the server answers. Edits made offline merge, and the last write wins.

What does it send home?

Nothing. There is no telemetry, no analytics and no crash reporting. Your server talks only to your devices.

Keep your spending history where you can see it.

Saldo is free and open source. Read the code, build the app, and add a server when you need one.