Open Net Worth
Open Net Worth is an open-source personal AI wealth assistant you run yourself: one ledger for your whole financial life, worked by an AI agent you control.
翻訳待ち
Modern plain text accounting. Beancount compatible.
翻訳待ち
Loading the full README. The saved excerpt is shown below.
Parse and validate your ledger faster than Python beancount. [README 설치·사용 부분 발췌] InstallRead the full README ↗
A blazing-fast Rust implementation of Beancount
Parse and validate your ledger faster than Python beancount.
| 10-30x faster | Parse and validate large ledgers in milliseconds (see benchmarks) |
| No dependencies | No Python runtime, no libraries to install |
| Drop-in replacement | Compatible bean-* CLI commands for easy migration |
| Full compatibility | Parses any valid beancount file |
| Editor support | LSP server for VS Code, Neovim, Helix, and more |
| AI-ready | MCP server for AI assistants, plus ag-rledger — an agent-native CLI with JSON envelopes |
| Runs anywhere | WebAssembly support for browser and Node.js |
| Better errors | Detailed error messages with source locations |
| 33 built-in plugins | Plus Python plugin compatibility via WASI sandbox |
| Bank import | CSV/OFX import with auto-detection, dedup, and categorization |
| Investment returns | Money-weighted (XIRR) and time-weighted returns, robust over imperfect ledgers: a built-in beangrow replacement |
| Budgeting | Budgeted vs actual spending from Fava-compatible custom "budget" directives, calendar-accurate pro-rating |
| Capital gains | Realized gains per tax lot, short vs long term, with exact @@ proceeds, calendar-correct holding periods, and optional per-lot annualized return (--irr) |
| Feature | rustledger | Python beancount | hledger | ledger-cli |
|---|---|---|---|---|
| Language | Rust | Python | Haskell | C++ |
| Speed | Very fast | Slow | Fast | Fast |
| Beancount syntax | Native | Native | Via conversion | No |
| Query language | BQL (100% compat) | BQL | Custom | Custom |
| LSP server | Built-in | No | Via plugin | No |
| WASM support | Yes | No | Partial | No |
| Plugin system | Native + Python | Python | Haskell | Custom |
| Active development | Yes | Maintenance | Yes | Limited |
When to use rustledger:
When to use Python beancount:
When to use hledger:
| Platform | Command |
|---|---|
| macOS | brew install rustledger |
| Linux | brew install rustledger |
| Arch Linux | yay -S rustledger-bin |
| Fedora/RHEL | sudo dnf copr enable robcohen/rustledger && sudo dnf install rustledger |
| Windows | scoop bucket add rustledger https://github.com/rustledger/scoop-rustledger && scoop install rustledger |
| Cargo | cargo binstall rustledger or cargo install rustledger |
| Nix | nix run github:rustledger/rustledger |
| Docker | docker run --rm -v "$PWD:/data" ghcr.io/rustledger/rustledger /data/ledger.beancount |
| Binaries | GitHub Releases |
| npm (WASM) | npm install @rustledger/wasm |
| npm (MCP) | npx @rustledger/mcp-server (Model Context Protocol server) |
Missing your platform? Open an issue to request it.
Coming from Python beancount? See the Migration Guide for command equivalents and plugin mapping.
Two complementary ways to drive rustledger from AI tools:
MCP server — npx @rustledger/mcp-server exposes rustledger to AI assistants (Claude, Cursor, …) over the Model Context Protocol. Best for interactive assistants that call tools mid-conversation.
ag-rledger — an agent-native CLI that mirrors every rledger command but emits a single structured JSON envelope per call instead of human-readable text, so coding agents and scripts parse results directly (no output scraping). Each envelope carries ok, a typed exit_code, the command's output under result, and a HATEOAS next_action hint; pass the inner command's --json to get fully structured result.data. Best for headless agents and shell pipelines. It ships beside rledger in the release archives (or build it with cargo build -p rustledger --bin ag-rledger --no-default-features --features ag-rledger):
$ ag-rledger check --json ledger.beancount
{"ok":true,"exit_code":0,"result":{"data":{"error_count":0}},"next_action":"…"}
Same subcommands as rledger (check, query, format, report, extract, …) — only the I/O is JSON.
rledger check ledger.beancount
rledger query ledger.beancount "SELECT account, SUM(position) GROUP BY account"
This is the beginning of the README. Read the rest at the original. Read the full README ↗