Open-source financial engine

Salli computes. Your AI explains.

The auditable engine for household finance under an adviser’s AI, or a product’s: balanced books, exact figures, cited rules.

  • Double-entry ledger
  • Exact decimals
  • MCP for your AI
  • npm i -g @leafmonkeylabs/salli
A question, computed Test data
  1. The question

    “A 5,000.00 bonus: pay off the 4.5% loan, or invest it?”

  2. Your AI asks Salli

    compare_options Invest Pay down

  3. Salli computes
    Salli’s figures
    Net worth in 10 years, at a 4% real return EUR
    Invest+2,404.72
    Pay down+2,558.51
    Break-even return4.51%

    Assumptions, versions and a hash recorded with every result

  4. Your AI explains

    “Below a 4.51% real return, paying off the loan ends ahead; from 4.51%, investing does. Which return to expect is your call.”

Numbers from Salli, words from the AI. Figures from salli-core’s golden test household, not anyone’s money.

The console

Your books, as pages.

The household’s pages in a browser, served by your own Salli at /console, with the same figures as the CLI.

Demo data from salli-core’s golden test household. The console computes nothing: every figure is the server’s (the console’s design).

The ledger

Every entry balances. Nothing is overwritten.

Exact decimals at each currency’s precision, and a reversal for every correction.

How Salli keeps the books

Entries, as posted Demo data
Four journal entries, each with its debit equal to its credit. The rent entry is corrected by a reversal, a new entry with the same amounts and the directions flipped; the original stays, marked reversed.
Account Debit (USD) Credit (USD)
000000c9 Oct 1, 2026 October salary Posted
Checking 5,000.00
Salary 5,000.00
000000ca Oct 3, 2026 Rent for October Reversed
Rent 1,800.00
Checking 1,800.00
000000cb Oct 5, 2026 Weekly groceries Posted
Groceries 412.35
Credit Card 412.35
00000bb8 Oct 3, 2026 REVERSAL: Rent for October Reversal
Checking 1,800.00
Rent 1,800.00
Reverses 000000ca: the same date and amounts, each line’s side flipped. The original stays.
Demo data: salli-core’s CLI test ledger, in USD, and the reversal salli entries reverse makes in that test.

From every side

One engine, from every side.

Documents for options and rules, tools for agents, and a command line, all real Salli.

salli.scenario/1 A scenario document
{
  "schema": "salli.scenario/1",
  "label": "Car on finance",
  "as_of": "2026-10-11",
  "horizon_years": 20,
  "changes": [
    { "type": "one_off", "date": "2026-12-01",
      "amount": "-18000.00", "label": "The car" },
    { "type": "loan", "principal": "18000.00",
      "annual_rate": "0.069", "term_months": 48,
      "start": "2026-12-01", "label": "Car loan" }
  ]
}
From docs/scenarios.md
salli compare Comparing two options from the command line
$ salli compare cash.json instalments.json
Comparing 2 options as of Oct 11, 2026, in EUR, over 20 years

                                 BASELINE      PAY CASH   INSTALMENTS
Lowest cash                     13,998.91     11,598.91     13,821.01
Net worth in 5 years           485,551.81    483,151.81    482,585.47
Interest on debts                2,009.25      2,009.25      2,099.93
Financially independent          May 2042      Jun 2042      Jul 2042
From the CLI’s scenarios test
MCP · start_decision An MCP tool call and Salli’s answer

Your AI calls a tool

{
  "method": "tools/call",
  "params": {
    "name": "start_decision",
    "arguments": {
      "template": "emergency-fund",
      "answers": {
        "target_months": "9",
        "set_aside": ["200.00", "500.00"]
      }
    }
  }
}

Salli answers, in part

"cover": {
  "monthly_spending": "1898.32",
  "target": "17084.88",
  "now": "8.32",
  "options": [
    { "option": "As things are", "month": null },
    { "option": "Set aside 200.00 a month", "month": "2027-05" },
    { "option": "Set aside 500.00 a month", "month": "2027-01" }
  ]
}
From the golden template test
salli tax rules activate Activating a tax rule set at a terminal
$ salli tax rules activate "XA 2031"
Activate XA 2031, version 2?
Salli would compute your XA 2031 tax with version 2 instead of version 1 (active since Feb 2, 2031).

Written by  an agent (Claude)
Why         Allowance raised to 12,500 by the 2031 budget

Changed figures (1)
  ~ blocks[key=allowance].amount  12000 → 12500
      source: Budget Statement 2031 — https://example.org/xa/budget-2031, retrieved 2031-03-02

Worked examples (2 of 2 pass)
  ✓ Salary of 30,000
  ✓ Salary of 60,000

Type 2 to activate version 2 of XA 2031, or anything else to cancel
# a person types 2; an agent can't, and there is no --yes
✓ XA 2031, version 2, is active: Salli computes your XA 2031 tax with it.
From the CLI’s tax rules test

Build or start from Salli

The money layer under your AI is the hard part.

Number Built in-house With Salli underneath
01 A model does the arithmetic. Engines compute; the model only explains Salli’s figures.
02 Figures arrive without their sources. Every result records its assumptions, versions and a hash.
03 Records are edited in place. Postings are permanent. A correction is a reversal.
04 Tax rules hide in code. Tax rules are cited data, activated only by a person.
05 The same review is rebuilt each time. Same inputs, same figures, every time.

Trust

Trust you can check.

Every claim links to the code that proves it. No certifications yet.

Everything you can check, and what isn’t there yet

What Salli records Demo data
Time Record What Outcome
09:41:02 audit_log post_journal_entry {"description": "Weekly groceries", "amount": "412.35", "currency": "USD"} approved
09:41:02 journal_entry 000000cb posted: Dr Groceries 412.35, Cr Credit Card 412.35
09:44:17 journal_entry 00000bb8 posted: REVERSAL: Rent for October, reverses 000000ca
09:52:40 audit_log activate_tax_rule_set {"version": 2, "content_hash": "b2b2b2b2b2b2…"} approved
10:03:11 decision recorded: chosen "Keep as is", hash sha256:… verified
Demo data: each line is one of Salli’s real record types with its real field names; the times are made up.

Self-host

Your own books, on your own server.

Three steps, with Docker. Nothing is sent to us.

  1. Step 1: Start Salli and Postgres

    curl -fsSLO https://raw.githubusercontent.com/leafmonkeylabs/salli-core/main/compose.yaml
    docker compose up -d
  2. Step 2: Set up your account

    docker compose exec salli salli-server setup
  3. Step 3: Install the CLI and sign in

    npm install --global @leafmonkeylabs/salli
    salli login
You need Docker, with Compose Node.js 22.12 or later, for the CLI The self-host guide

Design partners

Become a design partner.

A paid pilot of four to six weeks on your own client cases, run alongside the way you work today.

By email to hello@salli.money. No form, no tracking.