hledger
plain text accounting software
hledger is...
- free GPL-licensed accounting software that runs on unix, mac, windows, and the web
- based on readable, version-controllable, future-proof plain text files
- good for tracking money, investments, time, or any countable commodity
- good for learning more about double entry accounting
- shipped with web, terminal, command line, JSON and Haskell interfaces
- the most user friendly plain text accounting app
- comparable to Ledger and Beancount
- built with the powerful Haskell language
- fast, lightweight, reliable (we pay $50 for regression reports or fixes)
- free from vendor lock-in
- local, not cloud-based; your private financial data remains under your control
- scripting-friendly and automatable
- comfortable for technical users, but also usable by others. Knowing about command lines, text editors and version control is helpful, but not required (much)
- good at importing CSV from banks and other financial institutions
- actively developed and supported by Simon Michael and contributors since 2007
- strengthened by your feedback, work and funding. 🙏🏻
Here's more about the Features. Don't hesitate to join the chat and ask questions.
Quick start
Welcome! This plain text accounting stuff is useful and more fun than it sounds - care to give it a try ?
Install, then see Get Started, or the Examples below,
or run hledger
to see help and demos.
Full documentation is ready when you need it, in the sidebar to the left.
(If not visible, click/tap the horizontal-lines icon at top left.)
Examples
Here are three transactions in journal format,
recorded in the journal file ($LEDGER_FILE
or ~/.hledger.journal
)
by hledger add
or other method.
The account names and amounts are separated by at least two spaces;
a positive amount means "added to this account", negative means "removed from this account".
hledger will check that each transaction's amounts sum to zero; one of them may be omitted for convenience.
2023-01-01 opening balances ; <- First transaction sets starting balances.
assets:bank:checking $1000 ; <- Account names can be anything.
assets:bank:savings $2000 ; <- Colons indicate subaccounts.
assets:cash $100 ; <- 2+ spaces are required before the amount.
liabilities:credit card $-50 ; <- A debt; these are negative.
equity:opening/closing $-3050 ; <- Starting balances come from equity.
; Equity is also usually negative.
; (Reports can show as positive when needed.)
2023-02-01 GOODWORKS CORP ; <- Date order is recommended but optional.
assets:bank:checking $1000
income:salary ; <- $-1000 is inferred here to balance the txn.
; Income amounts are negative.
2023-02-15 market
expenses:food $50
assets:cash ; <- $-50 is inferred here.
You can run reports like so:
$ hledger bs
Balance Sheet 2023-02-15
|| 2023-02-15
=========================++============
Assets ||
-------------------------++------------
assets:bank:checking || $2000
assets:bank:savings || $2000
assets:cash || $50
-------------------------++------------
|| $4050
=========================++============
Liabilities ||
-------------------------++------------
liabilities:credit card || $50
-------------------------++------------
|| $50
=========================++============
Net: || $4000
$ hledger is -MTA
Income Statement 2023-01-01..2023-02-28
|| Jan Feb Total Average
===============++==============================
Revenues ||
---------------++------------------------------
income:salary || 0 $1000 $1000 $500
---------------++------------------------------
|| 0 $1000 $1000 $500
===============++==============================
Expenses ||
---------------++------------------------------
expenses:food || 0 $50 $50 $25
---------------++------------------------------
|| 0 $50 $50 $25
===============++==============================
Net: || 0 $950 $950 $475
$ hledger aregister checking
Transactions in assets:bank:checking and subaccounts:
2023-01-01 opening balances as:ba:savings, as:.. $1000 $1000
2023-02-01 GOODWORKS CORP in:salary $1000 $2000
Declarations
If you use other account names, it's useful to declare their account types:
account actifs ; type:Asset, 2+ spaces required before the ;
account actifs:banque:compte courant ; type:Cash
account actifs:banque:compte d'épargne ; type:Cash
account actifs:espèces ; type:Cash
account passifs ; type:Liability
account capitaux propres ; type:Equity
account revenus ; type:Revenue
account dépenses ; type:Expense
Or declare all accounts, currencies and tags, if you want strict error checking:
account assets ; type:A, 2+ spaces required before the ;
account assets:bank ; type:C
account assets:bank:checking
account assets:bank:savings
account assets:cash ; type:C
account liabilities ; type:L
account liabilities:credit card
account equity ; type:E
account equity:opening/closing
account income ; type:R
account income:salary
account income:gifts
account expenses ; type:X
account expenses:rent
account expenses:food
account expenses:gifts
commodity $1000.00
tag type
$ hledger check --strict
$
Declaring accounts also helps set their preferred display order:
$ hledger accounts -t
assets
bank
checking
savings
cash
liabilities
credit card
equity
opening/closing
income
salary
gifts
expenses
rent
food
gifts
You can declare account aliases to save typing:
alias chk = assets:bank:checking
alias cash = assets:cash
alias card = liabilities:creditcard
alias food = expenses:food
...
2023-02-15 market
food $50
cash
Other UIs
Instead of using the command line, you could run hledger-ui
or hledger-web
.
Here are the command line, terminal, and web interfaces, with more complex data:
Time tracking
hledger can also read time logs in timeclock format:
i 2023/03/27 09:00:00 projects:a
o 2023/03/27 17:00:34
i 2023/03/31 22:21:45 personal:reading:online
o 2023/04/01 02:00:34
$ hledger -f 2023.timeclock register -D
2023-03-27 projects:a 8.01h 8.01h
2023-03-31 personal:reading:online 1.64h 9.65h
2023-04-01 personal:reading:online 2.01h 11.66h
Or in timedot format:
2023/2/1
biz:research .... ..
fos:hledger .... .... ....
2023/2/2
fos:ledger 0.25
fos:haskell .5
biz:client1 .... ....
$ hledger -f 2023.timedot balance -tDTA # tree, Daily, Total, Average
Balance changes in 2023-02-01..2023-02-02:
|| 2023-02-01 2023-02-02 Total Average
============++==========================================
biz || 1.50 2.00 3.50 1.75
client1 || 0 2.00 2.00 1.00
research || 1.50 0 1.50 0.75
fos || 3.00 0.75 3.75 1.88
haskell || 0 0.50 0.50 0.25
hledger || 3.00 0 3.00 1.50
ledger || 0 0.25 0.25 0.12
------------++------------------------------------------
|| 4.50 2.75 7.25 3.62
CSV import
hledger can read CSV (or SSV, TSV, or other character-separated) files representing transactions:
"Date","Notes","Amount"
"2023/2/22","DEPOSIT","50.00"
"2023/2/23","TRANSFER TO SAVINGS","-10.00"
# bank.csv.rules # this rules file tells hledger how to read bank.csv
skip 1
fields date, description, amount
currency $
account1 assets:bank:checking
if WHOLE FOODS
account2 expenses:food
if (TO|FROM) SAVINGS
account2 assets:bank:savings
$ hledger -f bank.csv print
2023-02-22 DEPOSIT
assets:bank:checking $50.00
income:unknown $-50.00
2023-02-23 TRANSFER TO SAVINGS
assets:bank:checking $-10.00
assets:bank:savings $10.00
The import command detects and adds just new transactions to the journal (works with most CSVs):
$ hledger import bank.csv
imported 2 new transactions from bank.csv
$ hledger import bank.csv
no new transactions found in bank.csv
$ hledger aregister checking
2023-01-01 opening balances as:ba:savings, as:.. $1000.00 $1000.00
2023-02-01 GOODWORKS CORP in:salary $1000.00 $2000.00
2023-02-22 DEPOSIT in:unknown $50.00 $2050.00
2023-02-23 TRANSFER TO SAVINGS as:ba:savings $-10.00 $2040.00
More examples...
- Charts and Graphs
- Workflows
- HTML reports
- Importing CSV data
- Interop with other software
- Mobile apps
- Scripts and Scripting
- Track investments (2017) and Track investments (2020)
- hledger Cookbook
- PTA Cookbook
See also
Site tips
- Use the horizontal lines icon at top left to toggle the sidebar.
- Use the paintbrush icon to change theme.
- Use the magnifying-glass icon to search.
- Access keys are also available:
s
toggle sidebar,t
theme,/
search,
1
home page,2
recent changes,<
previous page,>
next page.