Ralvafi · personal finance, self-hosted

Know your money to the cent. Keep it on your own server.

A dashboard and ledger for net worth, cashflow, loans and investments, in every currency you hold. It runs on your server; only people you invite can sign in.

  • Invite-only
  • Passkeys and two-factor
  • Installable on your phone
ralvafi · running balancesample entries
  1. Mar 01Opening balance12,400.00
  2. Mar 01Salary+3,200.0015,600.00
  3. Mar 02Rent−850.0014,750.00
  4. Mar 04Groceries−84.1014,665.90
  5. Mar 05Ana repays+250.0014,915.90
  6. Mar 05Internet−60.0014,855.90
  7. Mar 09Dividends+42.7514,898.65
  8. Mar 11Dining−38.2014,860.45
  9. TOTAL14,860.45

Running balance, 11 MarchEight sample entries, one number. Every line you enter ends here, to the cent.

14,860.45

The real dashboard. Your numbers would be the only ones on it.

This is Ralvafi itself, captured on its built-in demo data, not a drawing of it. The bracket is the same mark as the logo: it selects what matters.

The Ralvafi dashboard on demo data: net worth card, four monthly figures, the balance chart and the coming-up listThe Ralvafi dashboard on demo data: net worth card, four monthly figures, the balance chart and the coming-up list
The net worth card of the Ralvafi dashboard on demo data, showing $41.68KThe net worth card of the Ralvafi dashboard on demo data, showing $41.68K
Captured from the running app on made-up demo data, both themes from one seeded run, so they show the same figures.overview-dark.webp · overview-light.webp
  1. 01

    One figure first

    Net worth as of today: cash and investments, plus what you are owed, minus what you owe.

  2. 02

    The month at a glance

    Net this month, year to date, what is due soon and your savings rate.

  3. 03

    Every chart has a table

    Net worth, cash, candles and cashflow, by day, week, month, quarter or year.

The tour · four panels

Read it top to bottom, the way you would open it.

  1. One number for what you own and owe

    Cash and investments, plus money owed to you, minus money you owe, as of any day. It is the composition report, and it sits first because it is the figure you open the app for.

    Detail of the dashboard: one number for what you own and owe (dark capture)Detail of the dashboard: one number for what you own and owe (light capture)
  2. This month, in four figures

    Net this month, year to date, what is due in the next seven days and your savings rate. Each one opens the view behind it.

    Detail of the dashboard: this month, in four figures (dark capture)Detail of the dashboard: this month, in four figures (light capture)
  3. Charts that answer a question

    Net worth, cash, OHLC candles and cashflow, by day, week, month, quarter or year, with a range brush under the chart.

    Detail of the dashboard: charts that answer a question (dark capture)Detail of the dashboard: charts that answer a question (light capture)
  4. What is coming up

    Loan instalments and fixed expenses due in the next 7 or 14 days. Reminders are off until you turn them on; then they can reach you as a push notification or an email before a payment is late.

    Detail of the dashboard: what is coming up (dark capture)Detail of the dashboard: what is coming up (light capture)

Three currencies, three totals, no blend.

A trip abroad never muddles your home figures. Each currency keeps its own running balance, and one report returns them side by side, your main currency first.

  1. USD24,318.40dominant: sales, loans, fixed expenses and investments count here
  2. EUR3,912.75its own running balance
  3. GBP640.10its own running balance

sample figures. The same three appear in the agent's answer further down, read from get_report with "report": "composition", whose currencies list carries every currency the profile holds.

Your spreadsheet row becomes a ledger row. You see the difference first.

Keep the workbook you already have. An agent compares it with the app using diff_rows, which only reads, then writes what you approve with apply_rows.

  1. diff_rows sorts every row into new, changed, matching, or only in the app.
  2. apply_rows creates the new rows and updates the changed ones, after you confirm.
  3. A row that exists only in the app is left alone here. An Excel import with ralvafi sync would delete it, which is why the diff comes first.

Press “Run diff_rows”. Nothing is written until you confirm.

budget-2026.xlsx · Movementssource
RowABCDEFdiff_rows result
1dateamounttypecurrencydescriptioncategory
22026-10-013200.00active_incomeUSDSalaryWork
32026-10-02850.00operating_expensesUSDRentHome
42026-10-0484.10operating_expensesUSDGroceriesFood
52026-10-0942.75passive_incomeUSDDividendsInvesting
Ralvafi · profile Personal · movementsapp
  1. 2026-10-01Salary Work3,200.00
  2. 2026-10-02Rent Housing850.00
  3. 2026-10-06Internet Utilities60.00

sample rows. The field names (date, amount, type, currency, description, category), the type values and the four result groups are the real ones from the reconcile tools.

Ask your ledger. It answers from the same report the dashboard reads.

Ralvafi ships an MCP server with 44 tools, so an agent can read reports, find movements and propose changes. 20 of them only read; 15 are marked destructive, and the server tells the agent to ask you before it uses one.

You

“What am I worth today, per currency?”

Agent

About $24,318.40 in dollars, €3,912.75 in euros and £640.10 in pounds. I kept them apart; Ralvafi does not add currencies together.

get_report · read-onlycall
{
  "report": "composition",
  "as_of": "2026-11-04"
}
resultsample values
{
  "currency": "USD",
  "as_of": "2026-11-04",
  "cash": "9120.40",
  "investments": { … },
  "owed_to_you": "1450.00",
  "you_owe": "3200.00",
  "net_worth": "24318.40",
  "currencies": [
    { "currency": "USD", "net_worth": "24318.40", … },
    { "currency": "EUR", "net_worth": "3912.75", … },
    { "currency": "GBP", "net_worth": "640.10", … }
  ]
}

Tool, report and field names are real (get_report, composition, as_of, currencies); the values are sample. With no profile_id, the call reads the profile active in the session.

The trade-off

Nobody else holds a copy. That is the point, and the price.

Ralvafi runs on your server, so your numbers never sit in someone else’s database. It also means updates and backups are yours to run.

You get

  • Only the people you inviteNobody signs up. You create accounts; sign-in offers a passkey or a two-factor code.
  • One binary with the web app insideThe Go server embeds the dashboard and serves both from one process.
  • Your spreadsheet, keptImport a workbook as a profile or keep syncing it with ralvafi sync.

You accept

  • Running PostgresThe compose file runs timescale/timescaledb-ha:pg18.6-ts2.31.0: TimescaleDB on Postgres 18.
  • Your own backupstask backup:run dumps the database; task backup:verify restores the newest dump into a throwaway container and prints row counts.
  • Your own updatesA new version is a new image you pull. Nobody patches it for you.

Questions

The short answers.

Can someone sign up on their own?

No. It is invite-only: accounts are created by you, and an invitation is how anyone else gets in.

Can an agent change my data?

Through the MCP tools only. 20 of 44 only read; 15 are marked destructive (deleting, and apply_rows), and the server's instructions tell the agent to ask you first and to run diff_rows before apply_rows. Creating and updating a movement are writes that are not marked destructive.

Does it work on my phone?

Yes. The web app is installable. Reminders for what is due are off until you turn them on, then they can arrive as a push notification.

Will it mix my currencies?

No. Each currency is totalled on its own. Sales, loans, fixed expenses and investments count in your main (dominant) currency.

Look around first. The demo needs no account.

It is the real dashboard on made-up data. Change anything; a reload puts it back.