59 KiB
% Plain Text Accounting portal
<style> body { } .columns { margin-left:0 !important; margin-right:4%; } h1 { text-align:center; margin-top:10%; margin-bottom:5%; } h2 { } h3 { font-weight:normal; } h4 { } h5 { font-size:1.2em; } li { margin:revert; } .faq h5 { /* questions */ font-weight:bold; margin-bottom:0; } #intro { font-size:1.2em; } #sitemapheading { font-size:2rem; font-weight:bold; } </style>plain text accounting
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.
This site together with wiki.plaintextaccounting.org is an entry point to the PTA community's tools, docs and practices. It is maintained by Simon Michael (hledger project leader, Ledger contributor, PTA fan) and contributors like you. To give feedback or chat, join us in #plaintextaccounting:libera.chat or #plaintextaccounting:matrix.org or send an edit.
Overview
FAQ
... What and Why
... Objections and Concerns
... Getting started, Practicalities
News/discussion
Tools
... PTA apps
... Editor support
... Data import/conversion tools
... Price fetching
... Data generation
... Reports
... Time logging
... UI, console
... UI, curses
... UI, GUI
... UI, web
... UI, mobile
... API
Docs
... General accounting
... Plain text accounting
... App comparisons
... Presentations
Videos
Articles & blog posts
Common tasks
... Choosing accounts
... Choosing cash vs accrual
... Entering data
... Importing
... Reconciling
... Reporting
... Budgeting
... Forecasting
... Invoicing
... Multiple currencies
... Trip expenses
... Shared expenses
... Taxes
... Time tracking
... Inventory tracking
... Non-profit accounting
... Exporting
... Customising
... API access
News/discussion
Chat
Matrix or
IRC (bridged),
app-specific chats
Mail lists
app-specific mail lists
Twitter
#plaintextaccounting,
#ledgercli,
#hledger,
#beancount,
@LedgerTips
Reddit
/r/plaintextaccounting
Hacker News
stories,
comments
Stack Exchange
[ledger-cli],
"ledger-cli",
[hledger](https://money.stackexchange.com/questions/tagged/hledger?tab=newest),
"hledger"
Tools
PTA apps
To do Plain Text Accounting, you can choose from three popular and long-lived apps, or the many smaller ones:
| Project | Start | Last release | Code | Committers | Stars | Mail list, ~size | Chat, ~size |
|---|---|---|---|---|---|---|---|
| Ledger | 2003 | 2021-05 | C++ | 176 | 4.2k | ledger ~900 | irc 60 |
| hledger | 2007 | 2022-06 | haskell | 148 | 2k | hledger ~200 | matrix/irc 120 |
| Beancount | 2008 | 2020-06 | python | 59 | 1.8k | beancount ~500 | irc 20, fava gitter/matrix 40 |
| Abandon | 2013 | 2019-09 | scala | 11 | 156 | gitter/matrix | |
| Transity | 2018 | 2019-05 | purescript | 7 | 472 | gitter/matrix | |
| Ledger in Go | 2013 | 2019-11 | go | 6 | 221 | ||
| cl-ledger | 2007 | common lisp | 4 | 66 | |||
| rust_ledger | 2019 | 2020-09 | rust | 2 | 18 | ||
| .Net Ledger | 2017 | 2018-08 | C# | 1 | 67 | gitter/matrix | |
| goledger | 2019 | go | 1 | 13 | |||
| monescript | 2017 | 2018-01 | javascript | 1 | 12 | ||
| blossom | 2020 | F# | 1 | 12 | |||
| Tackler | 2017 | 2021-01 | scala | 1 | 6 | gitter/matrix | |
| acc | 2020 | rust | 1 | 1 | |||
| bankroll | 2020 | 2020-08 | rust | 2 | 1 | ||
| ledg | 2021 | 2021-04 | javascript | 1 | |||
| pta | 2020 | 2020-09 | perl | 1 | |||
| Prudent | 2018 | js (closed; addons) | 1 | @PrudentLedger | |||
| knut | 2020 | go | 1 | ||||
| Inactive: | |||||||
| beans | 2019 | 2019 | haskell | ||||
| uledger | 2015 | python | |||||
| pacioli | 2013 | python | |||||
| ledger.pl | 2013 | perl | |||||
| Penny | 2012 | 2014 | haskell | ||||
| UMM | 2009 | 2010 | haskell | ||||
| sm-Ledger | 2007 | squeak smalltalk |
Editor plugins
Helpers which make your text editor or IDE more aware of PTA apps and file formats. These often also work well for PTA apps other than the one they are named for.
Atom
language-ledger,
ledger
Emacs
beancount-mode,
hledger-mode,
ledger-mode
IntelliJ
Ledger Plugin
Nano
scopatz/nanorc
Sublime
sublime-ledger-syntax
TextMate
Ledger.tmbundle
VIM
vim-ledger,
vim-beancount,
hledger-vim
VS Code
hledger-vscode,
ledger,
vscode-beancount
Data import/conversion tools
Additional helper tools complementing the PTA apps, by category.
- 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 You Need A Budget to beancount converter
- buchhaltung CSV/FinTS/HBCI/OFX to *ledger conversion/deduplication (haskell)
- csv2beancount CSV to beancount converter (clojure)
- CSV2Ledger CSV to *ledger converter (perl)
- 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
- 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)
- 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).
- 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
- Costflow convert one line message to beancount/*ledger format
- Go Ledger parser a parser and ledgerfmt, ledger2json, json2ledger tools (go)
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)
- update-hledger-market-prices.hs download market prices (haskell)
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)
Reports
- 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-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)
- ludget generate charts from Ledger (python)
- 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)
- 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)
- 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)
- node-ledger-web web UI for ledger browsing (javascript)
- WealthPulse web UI for ledger browsing, price fetching (F#)
UI, mobile
- beancount-mobile data entry app for beancount (Android, javascript)
- 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)
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)
Docs
General accounting
- hledger: Accounting
- Accounting for Dragons
- Beancount: The Double-Entry Counting Method
- Accounting for Computer Scientists
Plain text accounting
- Ledger manuals
- Ledger wiki
- Ledger CLI cheatsheet
- hledger docs
- Beancount docs / (google) / (sphinx)
- Beancount: Command-line Accounting in Context
- Beancount: Syntax Cheatsheet
- Getting Started With Ledger
- Plain Text Accounting Workshop
- Program your Finances: Command-line Accounting
- Don’t Sink Your First Attempts at Plaintext Accounting
- Syntax Quick Reference for the Ledger-Likes
App comparisons
- Matthias Kauer: Command Line Accounting – A look at the various ledger ports 2015
- Another Ledger user's perspective 2015
- Beancount: A Comparison of Beancount and Ledger 2014
- ledger vs hledger vs beancount or how to choose the right cli client 2014
- hledger: hledger & Ledger 2014, 2019
- Omari Norman: Why Penny 2013
Presentations
- Simon Michael: Inside hledger: an architectural tour and how-to 2021
- Michael Lynch 2021
- Andreas Pauley: Purely Functional Personal Finance 2018
- Ledger CLI Accounting for Geeks 2014
- Hacking Your Finances for Fun and Profit 2013
- Ledger and Text based Accounting 2009
Videos
- Simon Michael: Inside hledger: an architectural tour and how-to 2021
- hledger fan youtube channel (short lessons) 2019
- Quiliro Ordóñez: ledger-mode lightning talk 2019
- Colin Dean: Plaintext Accounting with the ledger ecosystem 2017
- Colin Dean: Plain Text Accounting 2017
- Simon Michael: Hands-on with hledger 2016
- Austin Walker: Conquering Your Finances with Emacs and Ledger 2016
- FLOSS Weekly 375: hledger (youtube, 3m overview) 2016
- Evolution of ledger 2015
- Evolution of hledger 2015
- FLOSS Weekly 150: Ledger (youtube) 2011
- Accounting course by Prof. Krug 2011
- Khan Academy: Accounting and financial statements
- David Mitchell: Personal Debts
Articles & blog posts
In 2021
- Arsen Arsenović: Keeping track of finances from many places
- Zoran Zaric: Budgeting for annual expenses with Hledger
- Samuel Walladge: Tracking capital gains with hledger
- Duarte O.Carmo: Hacking on my finances (Part 2: Beancount on Beanstalk)
In 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
In 2019
- Lee Yingtong Li: FIFO inventory with ledger-cli
- Justin Kaipada: Managing Ledger for Humans
- 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
In 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
In 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
- Brady Trainor: Hledger web
In 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
- Karan Ahuja: Hledger Improvements Wishlist.
- Alex Johnstone: Managing my personal finances with beancount
In 2015
- Pete Keen: Program Your Finances: Algorithmic Savings
- Pete Keen: Program Your Finances: Envelope Budgeting
- Stefano Rodighiero: hledger-dupes
In 2014
In 2013
In 2012
- Joey Hess: hledger
- Gene Goykhman: An Alternative to QuickBooks
- LWN: The accounting quest: Ledger
- Pete Keen: A Robust Reporting System for Ledger
In 2011
- Pete Keen: Program your Finances: Automated Transactions
- Sascha Welter: Doing my own accounting
- Clint Adams: Accounting at SFLC
- Pete Keen: Program your Finances: Vacation Tracking
- Pete Keen: Program your Finances: Reporting for Fun and Profit
In 2010
In 2009
In 2006
Common tasks
Practical tips and how-tos. See also the examples on wiki.plaintextaccounting.org.
Choosing accounts
- sample chart of accounts for a freelancer
- Beancount Cookbook: Account Naming Conventions
- Mint: Ways to Categorize Your Spending
- Simplified version of double-entry bookkeeping for personal and business finance?
Choosing cash vs accrual
Entering data
- hledger Basics tutorial: Record a transaction with “hledger add”
- ledger-mode:
C-c C-aadd a transaction,
C-c C-bamount calculator,
C-c C-c/C-c C-etoggle cleared - Beancount: Command Line Accounting Cookbook
- Accounting bookkeeping entries
- ledger-envelope-generator.rb
- Ledger Practices: Separate Your Journals
- UI tools
Importing
- Ledger: The convert command
- hledger: CSV format
- hledger: Convert CSV files
- Beancount: Importing External Data in Beancount
- Beancount: Prices in Beancount
- Payment matching done right
- "Full-fledged hledger" tutorial
- "Hledger Flow" tutorial/slideshow
- import tools
Reconciling
- ledger-mode:
C-c C-r - How to use ledger(1) to reconcile your chequebook with your bank statement
- How to use ledger(1) to reconcile your payments with your payment processor
Reporting
- example queries for Beancount
- hledger Cookbook: Rewrite account names
- Report Scripts for Ledger CLI with Gnuplot
- Full-fledged hledger tutorial
- Ledger Practices: Reporting Special Events Separately From Regular Spending
- Program your Finances: Reporting for Fun and Profit
- Pete Keen: A Robust Reporting System for Ledger 2012
Budgeting
The purpose of a budget is to help thy purse to fatten. It is to assist thee to have thy necessities, and insofar as attainable, thy other desires. It is to enable thee to realise thy most cherished desires, by defending them from thy casual wishes. Like a bright light in a dark cave, thy budget shows up the leaks from thy purse, and enables thee to stop them and control thy expenditures for definite and gratifying purposes. -- The Richest Man in Babylon
Periodic budgeting: setting per-period goals
- Ledger: Budgeting
- hledger: Budget report
- reddit: simple yearly budget example
- hledger: Budgeting and forecasting: Periodic budget
- budget_report budget reporting with beancount
Envelope budgeting: pre-allocating funds
- Jeremy Bush: hledger-envelope-budget (discussion)
- reddit: New blogpost: Budgeting for annual expenses with Hledger
- Michael Walker: Personal Finance
- Simon Michael: envelope budgeting example
- hledger: Budgeting and forecasting: Envelope budget
- hledger envelope budgeting
Envelope budgeting with auto postings
- fransiska: Budgeting with ledger-cli while tracking used points
- Mykola Orliuk: Budgeting with hledger
- bsilvereagle: Envelope Budgeting with ledger
- Marcin Borkowski: Ledger – virtual postings aka envelopes
- Pete Keen: Program Your Finances: Envelope Budgeting
Envelope budgeting with auto postings, org-mode and babel
- Org tutorials: Weaving a budget with Org & ledger
- Alan Schmitt: Using Org for Ledger Reports and Budget
More
Forecasting
Invoicing
Multiple currencies
- Peter Selinger: Tutorial on multiple currency accounting
- ledger-currencies tutorial
- Understanding the valuation function and the market function
Trip expenses
Shared expenses
- Beancount: Sharing Expenses in Beancount
- Keeping (financial) score with Ledger
- Program Your Finances: Automated Transactions
- How to keep control of shared expenses inside marriage?
- How to use ledger(1) to split shared expenses
- Ledger Practices: Tracking Accounts Jointly and Separately
Taxes
Time tracking
- Ledger: Time Keeping
- hledger: Timeclock format
- hledger: Timedot format
- Timetracking and billing with (h)ledger
- hledger: Time planning
- time tracking tools
- reddit: Ledger CLI time tracking and transaction account linking
- arbeitszeit.py
Inventory tracking
Investing
Non-profit accounting
Exporting
Customising
API access
- Ledger: Extending with Python
- Ledger Python 3 Support Python
- ledgerhelpers Python
- hledger-lib, hledger, an example
- hledger-web: JSON API
- node-hledger JavaScript
\(c) 2016-2022 [Simon Michael](http://joyful.com) & contributors | Send updates via [github](https://github.com/plaintextaccounting/plaintextaccounting) ([latest changes](https://github.com/plaintextaccounting/plaintextaccounting/commits/master))