62 KiB
% Plain Text Accounting (PTA)
toc: false ...
Plain text accounting is a way of doing bookkeeping and accounting with plain text files and scriptable, command-line-friendly software, such as Ledger, hledger, or Beancount.
Welcome! This site collects the PTA community's tools, docs and practices. It is maintained by Simon Michael (hledger project leader, PTA fan) and contributors like you. We invite you to join the chat or help improve the content.
Site map:
What is Plain Text Accounting
News & discussion
Blogs & articles
Videos
Slides
Docs
- Accounting
, PTA app docs
, comparisons
, intros
, cheatsheets
, cookbooks
Cookbook - Cookbook#getting-started
, Cookbook#general-usage
, Cookbook#accounting-situations
Software - PTA apps , Editor plugins , Data import/conversion , Price fetching , Data generation , Formatting , Reporting , Time logging , UI, console , UI, curses , UI, GUI , UI, web , UI, mobile , Library , Utilities , API
News & discussion
Site news
- commits
- contributors
- issues
Chat - IRC (~50)
- matrix (~60)
- matrix space (room list)
- app-specific chats
Mail lists - app-specific mail lists
Reddit - /r/plaintextaccounting
Hacker News - stories
- comments
Mastodon - #plaintextaccounting
- #ledgercli
- #hledger
- #beancount
Twitter - #plaintextaccounting
- #ledgercli
- #hledger
- #beancount
- @LedgerTips
Stack Exchange - ledger-cli tag
- ledger-cli search
- hledger tag
- hledger search
Other
Blogs & articles
A partial list, contributions welcome
2024
- Robert Nielsen: Getting ledger-mode to work again!
- Robert Nielsen: Better Emacs = better hledger
- Serge Wroclawski: Implementing Profit First with Plain Text Accounting
- Serge Wroclawski: I use Profit First, the Theory of Constraints, and Plain Text Accounting to help my small business
2023
- Robert Nielsen: Fixing my mistake after accidentally adding pending transactions
- Robert Nielsen: A better desc(ription)
- Robert Nielsen: Upgrading to hledger 1.32, a book on graphic design, and ledger-mode-clean-buffer
- Ian Cross: Hacking on a Ledger
- Robert Nielsen: Fewer errors in reconciling
- Robert Nielsen: Using hledger for thanksgiving
- Jonathan Dowland: HLedger, regex matches and field assignments
- Robert Nielsen: Zooming out and in
- Knut Magnus Aasrud: You should track your finances in TOML
- Robert Nielsen: (Almost) everything you wanted to know about hledger transactions
- Robert Nielsen: Beginners corner: a basic hledger transaction
- Robert Nielsen: Why i created the hledger fan youtube channel
- Robert Nielsen: A not so capital idea for saving time
- Robert Nielsen: The richest hledger user in Babylon (part 3)
- Robert Nielsen: The richest hledger user in Babylon (part 2)
- Robert Nielsen: The richest hledger user in Babylon
- Robert Nielsen: Accounting before hledger
- Robert Nielsen: Atomic hledger habits
- Robert Nielsen: Hledger 1.31 now available, using “not,” awk part 2, podcast of the week
- Robert Nielsen: Trying my wings with awk
- Robert Nielsen: Making changes with and without sed
- Robert Nielsen: Three ways to make changes to an hledger data file
- Robert Nielsen: Good intentions or good results?
- Robert Nielsen: Why use hledger?
- Robert Nielsen: hledger book of the month
- Robert Nielsen: Moving forward by going backward
- Robert Nielsen: Invisible windows
- Robert Nielsen: Really review, really
- Robert Nielsen: Helping others see how useful hledger can be
- Robert Nielsen: Blog entries prior to june 2023 site update
- Beancount.io: Tracking real estate in Beancount
- Jonathan Dowland: Separate hledgers
- Josh Cunningham: Scratching an Itch: Command Line Budgeting
- Jonathan Dowland: date warping in HLedger
- Jonathan Dowland: HLedger, 1 year on
2022
2021
- Jonathan Dowland: hledger footguns
- Arsen Arsenović: Keeping track of finances from many places
- Zoran Zaric: Budgeting for annual expenses with Hledger
2020
- Duarte O.Carmo: Hacking on my finances
- Conversations in Code: Episode 3 / Introduction to Plain Text Accounting [podcast]
- Peter Hogg: Reconciling Ledger
- Peter Hogg: Receipts and Ledger
- Peter Hogg: Tracking Cash with Ledger
- Peter Hogg: Organizing Ledger
- Mari Donkers: KMyMoney to HLedger conversion
- Charles Hoffman: Plain Text Accounting
- Charles Hoffman: Fat Free Accounting: Ledger
- Lee Yingtong Li: Using selenium to scrape/import bank transactions for ledger-cli
- Lee Yingtong Li: ledger-pyreport: Formal accounting reports for ledger-cli
- Lee Yingtong Li: Incorrect accounting of unrealised gains in ledger-cli
- Christian Egli: Quick and dirty PDF reports for Plain Text Accounting
2019
- Lee Yingtong Li: FIFO inventory with ledger-cli
- Amitai Burstein: Why We Chose Plain Text Accounting with Hledger
- Budgeting with ledger-cli while tracking used points
- Pete Keen: Automatic Insurance
- Pete Keen: Automatic Investing
- Pete Keen: Automatic Cash Management
- Pete Keen: Automatic Finances
- John Sullivan: Answering questions with accounting: Reimbursements
2018
- Felix Crux: Tracking Accounts Jointly and Separately
- Pepijn Looije: Real World Ledger part 1: Weighing Eggs in Baskets
- Zoran Zaric: Depreciation in Personal Finance with Hledger
- Zoran Zaric: Tracking Investments in Lots with Hledger
- Michael Walker: Currency Conversion
- LWN: Counting beans - and more - with Beancount
- Michael Walker: Personal Finance
- Siddhant Goel: Managing Personal Finances using Python
2017
- Michael Walker: I Need A Budget
- Accounting for the simple minds with plain text accounting
- S.M. Oliva: Inventory, Part I: Will It Probate?
- S.M. Oliva: A Simple First Account
- S.M. Oliva: The Basics of hledger
- S.M. Oliva: Introduction to Command Line Probate
- LWN: Restarting the free accounting search
- Michael Walker: Visualise your finances with hledger, InfluxDB, and Grafana
2016
- Felix Crux: Accrual vs. Cash Basis Accounting
- bsilvereagle: Envelope Budgeting with ledger
- Felix Crux: Tracking Reimbursable Expenses
- Felix Crux: Separate Your Journals
- Felix Crux: Reporting Special Events Separately From Regular Spending
- Felix Crux: Create a .ledgerrc (Ledger Practices series)
- Marcin Borkowski: Ledger – virtual postings aka envelopes
2015
- Pete Keen: Program Your Finances: Algorithmic Savings
- Pete Keen: Program Your Finances: Envelope Budgeting
- Stefano Rodighiero: hledger-dupes
2014
2013
2012
- Joey Hess: hledger
- Gene Goykhman: An Alternative to QuickBooks
- LWN: The accounting quest: Ledger
- Pete Keen: A Robust Reporting System for Ledger
2011
- Pete Keen: Program your Finances: Automated Transactions
- Clint Adams: Accounting at SFLC
- Pete Keen: Program your Finances: Vacation Tracking
- Pete Keen: Program your Finances: Reporting for Fun and Profit
2010
2009
2006
Videos
- Edwin Espinoza: Ledger CLI, Personal finance in the command line 2023
- Prakash Joshi Pax: How to Use Obsidian to Track Your Expenses 2022
- Peter Berger: Plain Text Accounting: An Opinionated View 2022
- Glenn Ramsey: Plain text accounting for fun and profit 2022
- 季路LJ: Beancount |简略记账说明 2021
- Robert Nielsen: hledger fan channel short hledger beginner lessons, 2019-2021 <!-- 2019-05-27..2021-04-03
- Simon Michael: Inside hledger: an architectural tour and how-to 2021
- Brian Ryall: Managing Your Finances Using Python 2020
- Steve Anderson: Plain Text Accounting: How to do Signed Number Accounting 2019
- Quiliro Ordóñez: ledger-mode lightning talk 2019
- Dickson S. Guedes: Cuide de suas FINANÇAS pessoais ou profissionais usando TEXTO 2019
- John Nduli: Plain Text Accounting 2019
- Jean Louis: GNU Emacs database accounting and rant on text ledgers 2019
- Cindy Zimmerman: Triple Entry Accounting, Ledger-cli, The blocktree hash tree - Guld Ledger File Format 2018
- Colin Dean: Plaintext Accounting with the ledger ecosystem 2017
- Colin Dean: Plain Text Accounting 2017
- Simon Michael: Hands-on with hledger 2016
- Chris Vollick: hledger, an open source accounting tool 2016
- Austin Walker: Conquering Your Finances with Emacs and Ledger 2016
- Simon Michael, Randal Schwartz, Simon Phipps: FLOSS Weekly 375: hledger (3m overview, show notes) 2016
- John Wiegley, Randal Schwartz, Aaron Newcomb: FLOSS Weekly 150: Ledger (show notes) 2011
Slides
- Simon Michael: Inside hledger: an architectural tour and how-to 2021
- Michael Lynch 2021
- Andreas Pauley: Purely Functional Personal Finance 2018
Docs
**Accounting , PTA app docs , Comparisons , Intros , Cheatsheets , Cookbooks **
Accounting
- hledger: Accounting links
- hledger: Accounting basics
- Beancount: The Double-Entry Counting Method
- Accounting for Computer Scientists
- Accounting for Dragons
PTA app docs
Comparisons
- PTA apps project stats
- FAQ#which-pta-app-should-i-choose
- hledger and Ledger, hledger and Beancount, hledger and other software 2014, 2019, 2022, 2023..
- Matthias Kauer: Command Line Accounting – A look at the various ledger ports 2015
- beancount mail list: Another Ledger user's perspective 2015
- Beancount: A Comparison of Beancount and Ledger 2014
- ledger list: ledger vs hledger vs beancount or how to choose the right cli client 2014
Intros
- What is Plain Text Accounting
- Getting Started With Ledger
- hledger: Get Started
- Getting Started with Beancount
- Tackler: Quickstart
- Don't Sink Your First Attempts at Plaintext Accounting
- Program your Finances: Command-line Accounting
- Plain Text Accounting Workshop
- Cookbook.html#getting-started
Cheatsheets
- Syntax Quick Reference
- Ledger CLI cheatsheet
- Beancount Syntax Cheat Sheet
- Beginners corner: a basic hledger transaction
- (Almost) everything you wanted to know about hledger transactions
- hledger: Journal cheatsheet
- hledger: CSV rules cheatsheet
Cookbooks
- Cookbook the Plain Text Accounting Cookbook; more docs, FAQs, examples...
- Beancount cookbook
- hledger cookbook
- Ledger wiki
- Reddit: plaintextaccounting
Software
**PTA apps , Editor plugins , Data import/conversion , Price fetching , Data generation , Formatting , Reporting , Time logging , UI, console , UI, curses , UI, GUI , UI, web , UI, mobile , Library , Utilities , API **
PTA apps
To do Plain Text Accounting, try one (or more) of the apps below. Generally it's possible to migrate data between them.
<style> th, td { border:none; padding-top:0; padding-bottom:0; border-bottom:thin solid #ddd; white-space:nowrap; } </style>| Project | Start | Last release | Code | Committers | Stars | Mail list, size | Chat, size | Issues, % open |
|---|---|---|---|---|---|---|---|---|
| Popular | ||||||||
| Ledger | 2003 | 2023 | C++ | 226 | 4.9k | ledger ~900 | IRC ~60 | 1.5k 47% |
| hledger | 2007 | 2023 | haskell | 167 | 2.6k | hledger ~200 | matrix ~100, IRC ~70 | 1.3k 31% |
| Beancount | 2008 | 2023 | python | 84 | 3.1k | beancount ~700 | matrix ~10, matrix (fava) ~190, IRC ~30 | 0.5k 63% |
| Small userbase | ||||||||
| Ledger (Go) | 2013 | 2023 | go | 11 | 409 | |||
| Abandon | 2013 | 2020 | scala | 11 | 178 | matrix | ||
| knut | 2020 | 2022 | go | 3 | 49 | |||
| zhang | 2023 | 2023 | rust/ts | 1 | 105 | |||
| ledg | 2021 | 2021 | javascript | 1 | 37 | |||
| Goledger | 2019 | 2020 | go | 1 | 25 | |||
| blossom | 2020 | F# | 1 | 25 | ||||
| awk-pta | 2022 | awk | 1 | 15 | ||||
| Tackler | 2017 | 2022 | scala | 1 | 9 | matrix | ||
| coin | 2019 | go | 1 | 7 | ||||
| budget-cli | 2023 | 2023 | typescript | 1 | 2 | |||
| mynt | 2023 | rust | 1 | |||||
| Inactive | ||||||||
| bankroll | 2020 | 2020 | rust | 1 | 1 | |||
| pta | 2020 | 2020 | perl | 1 | ||||
| acc | 2020 | rust | 1 | 1 | ||||
| rust_ledger | 2019 | 2021 | rust | 4 | 90 | |||
| beans | 2019 | 2019 | haskell | 2 | 24 | |||
| Transity | 2018 | 2020 | purescript | 8 | 571 | matrix | ||
| Prudent | 2018 | js, addons | 1 | @PrudentLedger | ||||
| .Net Ledger | 2017 | 2021 | C# | 1 | 164 | matrix | ||
| monescript | 2017 | 2018 | javascript | 1 | 12 | |||
| Go Ledger | 2016 | go | 3 | 37 | ||||
| uledger | 2015 | python | 1 | 17 | ||||
| pacioli | 2013 | python | 1 | 31 | ||||
| ledger.pl | 2013 | perl | 1 | 6 | ||||
| Penny | 2012 | 2014 | haskell | |||||
| UMM | 2009 | 2010 | haskell | |||||
| sm-Ledger | 2007 | squeak | ||||||
| cl-ledger | 2007 | lisp | 4 | 66 |
Editor plugins
Atom
-
ledger
Emacs -
ledger-mode (good for hledger also)
IntelliJ -
Ledger CLI
Nano -
scopatz/nanorc
Sublime -
sublime-ledger-syntax
TextMate -
Ledger.tmbundle
VIM -
cmp-beancount
VS Code
Data import/conversion
- Ledger and hledger have CSV conversion built in. Also:
- bean-identify, bean-extract, bean-file - Beancount built-in tools
- banks2ledger - CSV to *ledger converter
- beancount-import web app/framework for converting various formats to beancount (python)
- beancount-ynab Import YNAB4 (legacy desktop-based version) into beancount
- beancount-ynab5 Import YNAB5 (cloud-based version) transactions into beancount
- buchhaltung CSV/FinTS/HBCI/OFX to *ledger conversion/deduplication (haskell)
- Costflow convert one line message to beancount/*ledger format
- csv2beancount CSV to beancount converter (clojure)
- CSV2Ledger CSV to *ledger converter (perl)
- double-entry-generator Rule-based double-entry bookkeeping importer (from Alipay/WeChat/Huobi etc. to Beancount)
- fints2ledger FinTS/HBCI to csv to *ledger or beancount journals (python)
- gcash2ledger.py GNUCash XML to *ledger converter (python)
- gnucash-to-beancount GNUCash sqlite to beancount converter (python)
- gnucash2ledger.py GNUCash sqlite to *ledger converter (python)
- grisbi2Ledger Grisbi to *ledger converter
- hledger-import-dsl alternate, programmable CSV converter for hledger
- hledger-to-influxdb hledger to InfluxDB converter (haskell)
- hledger2beancount hledger to beancount converter (haskell)
- homebank2ledger HomeBank to ledger and beancount converter (perl)
- icsvledger interactive CSV to *ledger converter (python)
- into-ledger CSV to *ledger converter
- invoice2data extract data from PDF invoices (python)
- jali downloader/importer to *ledger (python)
- kmymoney2hledger KMyMoney to *ledger converter (clojure)
- kmymoney2ledgers KMyMoney to *ledger/beancount converter (python)
- kmymoney2ledgers.awk KMyMoney to *ledger/beancount converter (Awk)
- ldgclip import bank transactions via the clipboard with one click (bash/awk)
- Ledger in Go has limport, a CSV to *ledger converter
- ledger-autosync OFX download, OFX to *ledger conversion, deduplication
- ledger-guesser neural network for generating entries like past ones, can be used with ledger-autosync (javascript)
- ledger-myexpenses MyExpenses android app sqlite db to *ledger conversion (python, 2017)
- ledgermyexpenses sync MyExpenses android app to/from Ledger (bash, 2023)
- ledger-to-beancount yet another simple ledger to beancount converter (python)
- ledger-tutorials convert Pete Keen's tutorials to ebook format
- ledger2beancount.py *ledger to beancount converter
- ledger2beancount/beancount2ledger the best converter between h/ledger and beancount formats (perl).
- moneymoney-ledger MoneyMoney export extension for *ledger
- outofit QuickBooks to *ledger converter
- piecash GNUCash SQL to *ledger converter (python)
- plaid2qif Download transactions from plaid as QIF or CSV files
- plaid2text Plaid API to *ledger/beancount download/conversion
- qb2ledger QuickBooks General Journal CSV to *ledger converter
- QIFtoLedger (Bank of America's) QIF to *ledger converter
- reckon smart interactive/non-interactive CSV to *ledger converter
- slc generates Ledger accounting entries, works with generic CSV files as well as the Stripe API
- smart_importer library for building smarter CSV to beancount/Fava converters
- total_recall CSV to *ledger converter
- ynab-to-ledger You Need A Budget (YNAB) to *ledger converter. Handles multiple currencies, multiple number formats, reconciliation, memos, transfers, and split transactions
- ynab_to_ledger You Need A Budget to *ledger converter
Price fetching
- bean-price Beancount's price fetching tool (python)
- hledger-stockquotes download market prices for your hledger commodities (haskell)
- ledger-get-prices download market prices (ruby)
- LedgerStockUpdate update a Ledger price database (go)
- market-prices download market prices from several sources (python)
- market-prices.hs small, easy to adapt script to scrape market data from the internet (Haskell)
- pricehist fetch and format historical price data, with support for multiple sources and output formats (python)
- the-solipsist/scripts download prices for your hledger commodities, including indian commodities (bash)
Data generation
- beancount-extract-price generate prices transactions based on your beancount ledger (python)
- DepreciateForLedger generate *ledger depreciation transactions (python)
- hledger-interest generate *ledger interest entries (haskell)
- ledgerbil schedule recurring txns, interactive reconcile, date sorting
- LedgerScheduler move entries from one file to another when they come due (python)
- lotter generate postings for capital gain/loss (go)
- recurring generate recurring *ledger entries (python)
- reorder-journal.sh sort hledger entries, preserving directives/comments at top of file (bash)
- sassetti adds lisp macros to ledger files (common lisp)
Formatting
- beancount-black opinionated beancount file formatter
- beancount-black web app opinionated beancount file formatter as a web-based app
Reporting
- budget_report budget reporting with beancount (python)
- hledger-diff report differing transactions between two journals (haskell)
- hledger-irr calculate an account's internal rate of return (superseded by roi) (haskell)
- hledger-sankey Script + HTML files to plot income next to expense money flows from an hledger ledger file (shell + javascript)
- hledger-tools generating charts from hledger (typescript)
- hledger-vega makes configurable vega-lite charts from hledger (shell)
- hreports customise hledger reports with templates and PDF output (python)
- ledger-plot interactive tool for making GNUplot charts from Ledger (python)
- ledger-plots R package & script to make charts from Ledger (R)
- r-ledger an R package for reading and reporting on ledger/hledger/beancount files (R)
- TaxingLots calculates capital gains for a ledger journal (python)
Time logging
- org2tc org to timeclock converter
- on-modify.timetrack.py taskwarrior hook for timeclock output
- t ledger timeclock shellscript
- tim time logging/reporting tool using hledger
- timekeeping-template time logging/reporting examples/how-to using hledger
- tito time logging bash scripts that avoid double clock-in
UI, console
- bean-add interactive transaction entry tool (python)
- hledger add interactive transaction entry tool (builtin command)
- ladd create and edit a new *ledger transaction by fuzzy-matching past descriptions
- ldgr command line tool to add/sort/tag ledger files (ruby)
- ledger xact history-aware transaction generator (builtin command)
UI, curses
- hledger-iadd TUI for *ledger transaction entry (haskell)
- hledger-ui TUI for *ledger browsing (haskell, video)
- ledger-add TUI for *ledger transaction entry (python)
- puffin TUI for hledger browsing (go)
- regdel TUI for browsing Ledger files (python)
UI, GUI
- ledgerble reporting GUI with charts & adjustable reports (Javascript)
- ledgerhelpers misc. GUI tools + helper library (Python, GTK)
- Prudent integrated journal editing/importing/reporting GUI for Ledger (Javascript, mac only, closed source)
UI, web
- fava web UI for beancount browsing (python, demo)
- hledger-web web UI for *ledger browsing, data entry (haskell, demo, Sandstorm app)
- Paisa web UI or desktop app for ledger, hledger and beancount (go, javascript, demo)
- Ledger in Go web UI for browsing ledger transactions, reports, and porfolios
- Ledger Web ledger HTML reporting system (ruby, postgres)
- Ledger Web web UI/API for ledger browsing, data entry (python)
- ledger-analytics web UI for ledger data analytics (javascript)
- ledger-dashboard web UI for ledger browsing, data entry (python)
- ledger-pyreport web UI for standard accounting statements and unrealised gains (python)
- ledgeraccounting web UI for hledger: data entry, basic reports and budgets (javascript)
- ledgible web UI for ledger browsing, data entry (python)
- n4s danish-language ERP system (php)
- node-ledger-web web UI for ledger browsing (javascript)
- WealthPulse web UI for ledger browsing, price fetching (F#)
- BeanHub web UI for beancount browsing, data entry with a Git repository (proprietary SaaS; some components open source)
UI, mobile
- Beancount mobile app (Android, IOS)
- beancount-mobile data entry app (Android)
- NanoLedger data entry app supporting the ledger and hledger syntax (Android)
- cashier mobile or desktop client for ledger and hledger-web (Android/Desktop, javascript, app)
- cone data entry app for the h/ledger format (Android, dart)
- MoLe mobile client for hledger-web (Android, java)
- hledger.org: Mobile apps
Library
- beancount-parser standalone Lark-based beancount syntax parser (not relying on the beancount library)
- beancount-parser a Beancount parser in Rust using nom
- beancount-parser-lima another Beancount parser in Rust using Logos and Chumsky
- beanhub-forms a library provides data types and processors of custom beancount forms for inputting repeating similar entries easily
- beanhub-web-react react components for beancount entry input forms and beanhub-forms
- magicbeans Beancount extensions for cryptocurrency tax tracking and reporting
Utilities
- beanhub-cli beancount command line tools come with features like formatter and a beanhub-forms web app
API
- gledger Go package to interface with Ledger (go)
- hledger-lib library for parsing and generating reports from *ledger files (haskell)
- hledger-web the web app includes a JSON API server for *ledger files (haskell)
- ledgerhelpers extends Ledger's python library (python)
- node-hledger Node.js API for *ledger files (javascript)
- BeanHub API proprietary SaaS API for operating on hosted beancount repositories and beanhub-forms