25 KiB
Plain Text Accounting
accounting
accounting is tracking the flow of valuable commodities, such as money or time. It clarifies activity, priorities, obligations, opportunities. It can reduce stress and even be enjoyable.
double-entry bookkeeping is a process for doing this reliably. For every movement of value (a transaction), both the source and destination are recorded. Simple arithmetic invariants help prevent errors.
In traditional double-entry bookkeeping, value at any point in time is tracked in various accounts, classified as asset (owned), liability (owed) or equity (invested). Two more classifications track changes during some period: revenues (inflows) and expenses (outflows).
Transactions consist of debits (increases to asset or expense accounts, or decreases to liability or equity accounts) or credits (decreases to asset or expense accounts, or increases to liability or equity accounts).
… with text
In 2003, John Wiegley invented Ledger: a plain text data format and command-line reporting tool for efficient double-entry-style accounting. This idea went viral among software developers and technical folk, and we now have 5+ actively-developed Ledger-likes such as hledger and Beancount, with 40+ add-on tools and an active community. This site was created in 2016 to introduce our tools, documentation, and practices.
Accounting data is valuable; we want to know that it will be accessible for ever - even without software. We want to know when it changes, and revision-control it. We want to search and manipulate it efficiently. So, we store it as human-readable plain text.
We simplify debits and credits by using signed numbers instead - positive for inflows to an account, negative for outflows from an account.
We define arbitrary account hierarchy to suit our needs. This scales smoothly from simple to complex scenarios, and from high-level overview to fine detail.
Ledger-likes are, at least in part, command-line tools. This makes them efficient to use and very scriptable and flexible.
Ledger-likes also, at their core, tend towards functional operation: they read the input data without changing it, and output a report. This simple model makes them easy to understand and rely on.
questions ?
who is this for ?
Techies, power users, and do-it-yourself-ers, for now.
If you need a complete GUI providing lots of guidance, you may prefer to use something else.
must I edit text and type cryptic commands ?
Not entirely!
"Plain Text Accounting" is a broad description, referring mainly to the data format.
We don't object to additional GUIs, and they are coming.
who is using it, and how ?
See Who's using Ledger? for some stories.
what are the alternatives ?
FOSS tools like GNUCash, Grisbi, KMyMoney.
Proprietary tools like Quicken/Quickbooks, You Need A Budget.
Online tools like Xero, FreeAgent.
(There are many).
Spreadsheets.
Paper accounting.
A bookkeeper.
why is this better than QuickBooks ?
Your data remains accessible.
No yearly fees.
Free software you can fix and port.
Cross platform.
Scriptable.
Efficient.
how do I communicate with my accountant ?
Clean up text reports by hand,
print them as PDF,
export CSV reports to a spreadsheet..
what if my accountant only uses QuickBooks ?
You'll need a new accountant,
or a duplicate set of books in QuickBooks,
or to pioneer *ledger -> QuickBooks exporting.
can I use this to do my taxes ?
You can use this to track and report the data needed for tax reporting.
Fill out and submit tax forms with another tool, or by hand.
Ledger-likes
| Project, start date | Code, committers | Mail list, size | IRC, size |
| Ledger 2003 |
C++ 101 | ledger-cli 650 | #ledger 75 |
| hledger 2007 |
Haskell 30 | hledger 75 | #hledger 25 |
| Beancount 2008 |
Python 8 | beancount 70 | #beancount 5 |
| Abandon 2013 |
Scala 5 | ||
| Ledger in Go 2013 |
Go 2 |
| Inactive: | |
|---|---|
| uledger 2015 |
Python |
| ledger.pl 2013 |
Perl |
| Penny 2012 |
Haskell |
| UMM 2009 |
Haskell |
| cl-ledger 2007 |
Common Lisp |
| sm-Ledger 2007 |
Squeak Smalltalk |
related tools
- hledger-diff report differing transactions between two journals
- hledger-interest generate *ledger interest transactions
- hledger-irr calculate an account's internal rate of return over time
- ledger-get-prices download market prices
- ledger-tutorials convert Pete Keen's tutorials to ebook format
data import
- bean-identify, bean-extract, bean-file - Beancount built-in tools
- beancount-import CSV to beancount converter (curses)
- gnucash2ledger.py GNUCash to *ledger conversion
- icsvledger CSV to *ledger converter
- ledger-autosync OFX download, OFX to *ledger conversion, deduplication
- ledgerhub fetch prices, extract entries, convert various formats to beancount (? deprecated)
- qb2ledger QuickBooks General Journal CSV to *ledger converter
- reckon smart interactive/non-interactive CSV to *ledger converter
- total_recall CSV to *ledger converter
editor support
- beancount-mode for Emacs
- hledger-mode for Emacs
- ledger-mode for Emacs (also works for hledger, beancount etc.)
- vim-beancount for VIM
- vim-ledger for VIM
- language-ledger for Atom
- ledger for Atom
- sublime-ledger-syntax for Sublime Text/TextMate
- Ledger.tmbundle for TextMate
time tracking
- org2tc org to timeclock converter
- on-modify.timetrack.py taskwarrior hook for timeclock output
- tim time tracking tool using hledger for reporting
UI, console
- bean-add interactive transaction entry
- hledger add interactive transaction entry (built-in command)
- ledger-add interactive transaction entry
- ledger-plot interactive helper for making charts with GNUplot
- ledger xact history-aware transaction generator (built-in command)
UI, curses
- hledger-iadd curses UI for transaction entry
- hledger-ui curses UI for browsing (demo)
UI, GUI
- ledgerhelpers GTK GUI tools + python library for driving Ledger
UI, web
- fava web UI for browsing (Python, beancount)
- hledger-web web UI for browsing, data entry (Haskell, demo)
- hledger-web on Sandstorm free web instances in a few clicks
- Ledger Web web-based, postgres-backed reporting system
- ledger-dashboard web UI for browsing, data entry (Python)
- ledger-web web UI for browsing (JavaScript)
- WealthPulse web UI for browsing, price fetching (F#, Ledger)
API
- hledger-api JSON API + static file server (Haskell)
- node-hledger Node.js API (JavaScript)
discussion
docs
- Ledger manuals
- Ledger wiki
- The Great Cheatsheet for Ledger CLI
- hledger docs
- Beancount docs
- Beancount Syntax Cheatsheet
concepts
comparisons
- Matthias Kauer: Command Line Accounting – A look at the various ledger ports 2015
- Another Ledger user's perspective on Beancount 2015
- Martin Blais: A Comparison of Beancount and Ledger 2014
- ledger vs hledger vs beancount or how to choose the right cli client 2014
- Simon Michael: hledger & Ledger 2014
- Omari Norman: Why Penny 2013
- Fabrice Niessen: Why Ledger? 2010
online books
presentations
- Ledger CLI Accounting for Geeks 2014
- Hacking Your Finances for Fun and Profit 2013
- Ledger and Text based Accounting 2009
videos
- 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
articles
- Pete Keen's Program your Finances tutorials 2012
- An Alternative to QuickBooks 2012
- The accounting quest: Ledger 2012
- Ledger, the bran muffin of accounting tools 2006
blog posts
- Finding duplicate accounts in Hledger journals 2015
- Matthew Turland: Ledger basics and habits 2014
- Simon Michael: What is hledger ? 2013
- Simon Michael: More on ledger 2013
- Simon Michael: Introducing hledger! 2013
- Joey Hess: hledger 2012
- Sascha Welter: Doing my own accounting 2011
- Clint Adams: Accounting at SFLC 2011
- Christine Spang: [h]ledger rocks my world 2010
common tasks
choosing accounts
- sample chart of accounts (freelancer)
- Beancount Cookbook: Account Naming Conventions
- Mint: Ways to Categorize Your Spending
entering data
- hledger step by step: basic data entry
- 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
- UI tools
importing
- Ledger: The convert command
- hledger: CSV files
- hledger: How to read CSV files
- Fetching Prices in Beancount
- import tools
reconciling
- ledger-mode:
C-c C-r
reporting
budgeting
- Ledger: Budgeting
- Weaving a budget with Org & ledger
- Using Org for Ledger Reports and Budget
- envelope budgeting example
forecasting
- Ledger: Forecasting
- Notes on Installing and Using ledger on NetBSD and forecasting
invoicing
multiple currencies
shared expenses
- Sharing Expenses in Beancount and others
- Keeping (financial) score with Ledger
- Program Your Finances: Automated Transactions for tracking reimbursables
- How to keep control of shared expenses inside marriage ?
taxes
- Another Ledger user's perspective some tax discussion
- hledger: How to use account aliases for tax reporting
time tracking
- Ledger: Time Keeping
- hledger: Timeclock files
- hledger: Timedot files
- Timetracking and billing with (h)ledger
- time tracking tools
non-profit accounting
exporting
API access
-
Ledger Python 3 Support Python
-
ledgerhelpers Python
-
hledger-lib, hledger, example Haskell
-
hledger-api, examples JSON
-
node-hledger JavaScript
Send updates via the [github repo](https://github.com/simonmichael/plaintextaccounting) or [etherpad](https://oasis.sandstorm.io/shared/UAYLwagGI0a2pIMg9Hhv74K04nbuxanXiS5ZtBV6NF-)