hledger
plain text accounting.
hledger is friendly, fast, and dependable accounting software, for both simple and complex finances. It tracks money, investments, cryptocurrencies, time, or any countable commodity, using human-readable plain text data that you control.
You can enter data with your favorite text editor or a UI, or import data from banks and other places. You can use just hledger and nothing else, or combine it with other tools, like version control, scripts, and LLMs.
hledger is Free Software created by Simon Michael and contributors, supported and improving continuously since its first release in 2007. You can read more about it at Why hledger ? and FAQ.
A quick example
Transactions are recorded in a plain text file. This simple format, invented by the Ledger project, is the key to understanding Plain Text Accounting and Double Entry Bookkeeping:
; ~/.hledger.journal (or $LEDGER_FILE)
2025-12-01 set up starting balances
equity $-1000 ; $1000 moves from the "equity" account (- means from)
assets:checking $1000 ; to the "assets:checking" account (+ means to)
assets:cash $0
2025-12-01 cash gift received
income:gifts $-50 ; $50 from the "income:gifts" account
assets:wallet $50 ; to the "assets:wallet" account
2025-12-02 rent paid
assets:checking ; a missing amount is inferred ($-800 here)
expenses:rent $800
2025-12-03 Grocery store
assets:checking ; ($-64.50 here)
expenses:groceries $54.50
expenses:home care $7
expenses:snacks $3
2025-12-04 Client payment received
income:consulting
assets:checking $1500
This file is all you need. From it, hledger generates precise reports:
$ hledger aregister checking
Transactions in assets:checking and subaccounts:
2025-12-01 set up starting b.. equity, as:cash $1000.00 $1000.00
2025-12-02 rent paid ex:rent $-800.00 $200.00
2025-12-03 Grocery store ex:groceries, ex:h.. $-64.50 $135.50
2025-12-04 Client payment re.. in:consulting $1500.00 $1635.50
$ hledger bs
Balance Sheet 2025-12-04
|| 2025-12-04
=================++============
Assets ||
-----------------++------------
assets:checking || $1635.50
assets:wallet || $50.00
-----------------++------------
|| $1685.50
=================++============
Liabilities ||
-----------------++------------
-----------------++------------
|| 0
=================++============
Net: || $1685.50
$ hledger is --pretty --tree --daily --row-total --average --sort-amount
Daily Income Statement 2025-12-01..2025-12-04
┌──────────────╥────────────┬────────────┬────────────┬────────────┬──────────┬─────────┐
│ ║ 2025-12-01 │ 2025-12-02 │ 2025-12-03 │ 2025-12-04 │ Total │ Average │
╞══════════════╬════════════╪════════════╪════════════╪════════════╪══════════╪═════════╡
│ Revenues ║ │ │ │ │ │ │
├──────────────╫────────────┼────────────┼────────────┼────────────┼──────────┼─────────┤
│ income ║ $50.00 │ 0 │ 0 │ $1500.00 │ $1550.00 │ $387.50 │
│ consulting ║ 0 │ 0 │ 0 │ $1500.00 │ $1500.00 │ $375.00 │
│ gifts ║ $50.00 │ 0 │ 0 │ 0 │ $50.00 │ $12.50 │
├──────────────╫────────────┼────────────┼────────────┼────────────┼──────────┼─────────┤
│ ║ $50.00 │ 0 │ 0 │ $1500.00 │ $1550.00 │ $387.50 │
╞══════════════╬════════════╪════════════╪════════════╪════════════╪══════════╪═════════╡
│ Expenses ║ │ │ │ │ │ │
├──────────────╫────────────┼────────────┼────────────┼────────────┼──────────┼─────────┤
│ expenses ║ 0 │ $800.00 │ $64.50 │ 0 │ $864.50 │ $216.12 │
│ rent ║ 0 │ $800.00 │ 0 │ 0 │ $800.00 │ $200.00 │
│ groceries ║ 0 │ 0 │ $54.50 │ 0 │ $54.50 │ $13.62 │
│ home care ║ 0 │ 0 │ $7.00 │ 0 │ $7.00 │ $1.75 │
│ snacks ║ 0 │ 0 │ $3.00 │ 0 │ $3.00 │ $0.75 │
├──────────────╫────────────┼────────────┼────────────┼────────────┼──────────┼─────────┤
│ ║ 0 │ $800.00 │ $64.50 │ 0 │ $864.50 │ $216.12 │
╞══════════════╬════════════╪════════════╪════════════╪════════════╪══════════╪═════════╡
│ Net: ║ $50.00 │ $-800.00 │ $-64.50 │ $1500.00 │ $685.50 │ $171.38 │
└──────────────╨────────────┴────────────┴────────────┴────────────┴──────────┴─────────┘
$ hledger is -tDTAS -o foo.html
Daily Income Statement 2025-12-01..2025-12-04 | ||||||
|---|---|---|---|---|---|---|
| 2025-12-01 | 2025-12-02 | 2025-12-03 | 2025-12-04 | Total | Average | |
| Revenues | ||||||
| income | $50.00 | 0 | 0 | $1500.00 | $1550.00 | $387.50 |
| consulting | 0 | 0 | 0 | $1500.00 | $1500.00 | $375.00 |
| gifts | $50.00 | 0 | 0 | 0 | $50.00 | $12.50 |
| Total: | $50.00 | 0 | 0 | $1500.00 | $1550.00 | $387.50 |
| Expenses | ||||||
| expenses | 0 | $800.00 | $64.50 | 0 | $864.50 | $216.12 |
| rent | 0 | $800.00 | 0 | 0 | $800.00 | $200.00 |
| groceries | 0 | 0 | $54.50 | 0 | $54.50 | $13.62 |
| home care | 0 | 0 | $7.00 | 0 | $7.00 | $1.75 |
| snacks | 0 | 0 | $3.00 | 0 | $3.00 | $0.75 |
| Total: | 0 | $800.00 | $64.50 | 0 | $864.50 | $216.12 |
| Net: | $50.00 | $-800.00 | $-64.50 | $1500.00 | $685.50 | $171.38 |
It can check for many kinds of error:
$ hledger check --strict
hledger: Error: /Users/simon/.hledger.journal:4:
| 2025-12-01 set up starting balances
4 | equity $-1000 ; $1000 moves from the "equity" account (- means from)
| ^^^^^^
| assets:checking $1000 ; to the "assets:checking" account (+ means to)
| assets:cash $0
Strict commodity checking is enabled, and
commodity "$" has not been declared.
Consider adding a commodity directive. Examples:
commodity $1000.00
commodity 1.000,00 $
The add command walks you through adding a transaction:
$ hledger add
Adding transactions to journal file /Users/simon/.hledger.journal
...
Date [2025-12-13]:
Description: groceries
Using this similar transaction for defaults:
2025-12-02 Grocery store
assets:checking $-64.50 ; a missing amount is inferred ($-64.50 here)
expenses:groceries $54.50
expenses:home care $7
expenses:snacks $3
Account 1 [assets:checking]:
Amount 1 [$-64.50]: $-85
Account 2 [expenses:groceries]:
Amount 2 [$85]: $75.10
Account 3 [expenses:home care]: expenses:misc
Amount 3 [$9.90]:
Account 4 (or . to finish this transaction) [expenses:snacks]: .
2025-12-13 groceries
assets:checking $-85
expenses:groceries $75.10
expenses:misc $9.90
Save this transaction to the journal ? [y]:
The get and import commands, with a little configuration, simplify importing from financial institutions.
$ hledger import --get
no /Users/simon/data/getdata script, skipping data fetch
no /Users/simon/prices/getprices script, skipping prices fetch
hledger: Error: please specify one or more data files to import from,
or add .rules files in a rules/ directory next to the journal.
$ hledger import --get
cd /Users/simon/finance/2026/data && getdata
getprices USD EUR 2026-01-01 2026-08-09 >/Users/simon/finance/2026/prices/EUR.prices
..
getprices USD VCEB 2026-01-01 2026-08-09 >/Users/simon/finance/2026/prices/VCEB.prices
...
running: simplefincsv ../data/simplefin.json 'chase bank'
running: paypalcsv ../data/paypal.json
archiving /Users/simon/finance/2026/data/archive/paypal.2026-08-09.csv
running: simplefincsv ../data/simplefin.json 'wells fargo.*business checking'
archiving /Users/simon/finance/2026/data/archive/wf-bchecking.2026-08-09.csv
running: simplefincsv ../data/simplefin.json 'wells fargo.*everyday checking'
archiving /Users/simon/finance/2026/data/archive/wf-pchecking.2026-08-09.csv
imported 8 new transactions from boi-ichecking.rules, chase.rules, paypal.rules, vanguard.rules, wf-bchecking.rules, wf-pchecking.rules to /Users/simon/finance/2026/2026.journal
hledger ui is a terminal UI, so you don’t have to type commands:
$ hledger ui --help
hledger-ui [OPTIONS] [--cash|--bs|--is|--all|--register=ACCT] [QUERY]
browse accounts, postings and entries in a full-window TUI
...
hledger web is a web UI, so you don’t have to use the terminal. You can see a read-only instance with more complex data here: demo.hledger.org.
$ hledger web
...
Serving web UI and json API at IP address 127.0.0.1 (local access), port 5000
with base url http://127.0.0.1:5000
This server will exit after 2m with no browser windows open (or press ctrl-c)
Opening web browser...
The help command is a quick way to view docs.
$ hledger help impor
"impor" matches several manual sections; please be more specific:
Deduplicating, importing
import
Default import sources
Import dry run
First import
Importing balance assignments
Import and commodity styles
Import archiving
Import special cases
Import configurations to avoid
$ hledger help examples import
Import new transactions from one or more data files to the main journal.
More information: <https://hledger.org/hledger.html#import>.
Import new transactions from `bank.csv`, using `bank.csv.rules` to convert:
hledger import path/to/bank.csv
Show what would be imported from these two files, without doing anything:
hledger import path/to/bank1.csv path/to/bank2.csv --dry-run
...
Get started
Try it for yourself:
- Install - quickly get hledger installed. Here are release notes.
- Docs - many learning resources. hledger by example is another good place to start.
- Support - ask questions or share feedback.
Get involved
Would you like to help ?
- Star us on Github to help make us a notable Haskell app.
- Sponsor hledger to help sustain this work. Here’s more about Finance.
- Contributor Quick Start and Developer docs.
- CREDITS shows many of the people who have contributed code over the years.
Site tips
-
Toggle the useful navigation sidebar, with the three-lines button at top of page, or the s access key.
-
Access keys available: 1 home, 2 changes, s sidebar, t theme, f find, p print, r repo, e edit.
You can also press the left or right arrow keys to step through pages. -
For quicker browsing, configure these bookmark keywords in your browser.
Show:
- h PAGE ->
https://hledger.org/PAGE.html - hm TOPIC ->
https://hledger.org/hledger.html#TOPIC - hs TOPIC ->
https://hledger.org/?search=TOPIC - hi NUM ->
https://github.com/simonmichael/hledger/issues/NUM - hinew ->
https://github.com/simonmichael/hledger/issues/new
- h PAGE ->


