---
Alias: ["Personal Accounting"]
Tag: ["🤖", "💲", "💻", "📲"]
Date: 2021-08-19
DocType: "Confidential"
Hierarchy: "Root2"
TimeStamp: 2021-08-19
location: [51.514678599999996, -0.18378583926867909]
CollapseMetaTable: true
---
Parent:: [[@Finances]]
---
^Top
 
```button
name Save
type command
action Save current file
id Save
```
^button-hLedgerSave
 
# hLedger
 
```ad-abstract
title: Summary
collapse: open
This note describes the workings of plain text accounting through hLedger
```
 
```toc
style: number
```
 
---
 
### Documentation
 
[Plain text Accounting ](https://plaintextaccounting.org/ )
[hledger ](https://hledger.org/create-a-journal.html )
[Ledger manual ](https://www.ledger-cli.org/3.0/doc/ledger3.html#index-account_002c-alias )
[Ledger helpers ](https://github.com/ledger/ledger/wiki/Entering-transactions-with-ledgerhelpers-GUI-apps )
[Ledger help ](https://github.com/ledger/ledger/wiki/Entering-data )
 
---
 
### hLedger
 
Plain Text Accounting is accessible through command-line clients like hledger.
Installation is simple:
```ad-command
~~~bash
brew install hledger
~~~
```
Some extensions may be required for certain functionalities to work and will be documented accordingly.
 
#### Structure
The structure of the tool and resulting file is rather simple. The tool offers two main functionalities:
1. **Import data**
hLedger allows for direct links to your bank or manual entries into the ledger.
2. **Reports on aggregated data**
A suite of reports is available to visualise financial data
The underlying database is a (collection of) file(s) readable through classic text editors with a list of the transactions made during the period.
 
#### Initialisation
At start of the year/period in any given file, a certain number of initialisations need to be made:
1. **Initialise top-level accounts**
```ad-code
~~~
account 'name of account'
~~~
```
2. **Currencies used**
```ad-code
~~~
commodity 'layout + number format'
~~~
```
2. **Opening balances**
```ad-code
~~~
'Date' set initial 'account name' account balance
'account name'(+optional nesting -> :'sub-account') {+ 2 spaces min} 'amount'
equity:opening balances
~~~
```
 
#### Accounts
1. **Aliasing**
Aliases can be defined for simplifying writing/reading accounts.
```ad-code
~~~bash
alias a=assets
alias c=a:Cash
~~~
```
Flags can be used in reports:
> [!command]
> —recursive-aliases – > expand recursive aliases
> —no-aliases – > does not expand aliases
 
#### Transactions
[[#^Top|TOP]]
hLedger allows for three methods for entering transactions:
1. **Through command-line**
This method is well-guided with hLedger:
```ad-command
~~~bash
hledger add -f 'journalname'
~~~
```
The function will then prompt the user for appropriate entries.
2. **Manually into the .journal file**
Open the .journal file and manually enter transactions with the following format:
```ad-code
~~~
(date) 'transaction name'
'account 1' {2+ spaces} (amount)
'account 2' {2+ spaces} !(amount)
~~~
```
3. **Import**
```ad-command
title: Import from Note
~~~bash
hledger import -f 'journalname' 'filename'
~~~
```
```ad-note
title: CSV Import
hLedger requires a certain level of customisation to import .csv.
Instructions can be found [here ](https://hledger.org/import-csv.html )
```
4. **Recurring transactions**
[Recurring transactions ](https://hledger.org/hledger.html#periodic-transactions ) do not really form part of hledger or plaintextaccounting per se. The below code helps to understand how recurring budgets can be declared:
```ad-code
~~~
~ monthly (or other periodicity) (optional 'from')
(account 1):(sub-account 1) {2+ spaces} (amount)
(account 2):(sub-account 2)
~~~
```
In order to create recurring transactions, scripts need to be written and cronjobs set. Find below an outline of the process.
 
Create a `.sh` file with the below code:
```ad-code
~~~sh
#!/bin/sh
LEDGER_RECURRING='/Volumes/Computer Vault/Wealth/Compta/.journal.ledger'
cat >> $LEDGER_RECURRING < < EOF
$(date +%Y/%m/%d) $3
$2:CHF $1
assets:Cash:CHF
EOF
~~~
```
 
Make sure that the file is executable:
`chmod a+wrx (filepath & name)`
 
Fill the cron job:
`crontab -e`
and then:
`0 0 28 * * $HOME/(script & arguments)`
 
#### Investments
[[#^Top|TOP]]
```ad-info
title: Documentation
The documentation can be found [here ](https://hledger.org/investments.html )
```
1. **Adding an Investment**
Using a strict and clear nomenclature, an initial investment is inputed manually using the following block:
```ad-code
~~~
(Investment date)
Investment:(sub-account):(asset-account) (units) (internal stock mnemonic)
equity:conversion -(units) (internal mnemonic)
equity:conversion (monetary amount)
funding account -(monetary amount)
~~~
```
2. **Price file**
A price file can be created separately to manage asset prices and actual transactions in separate docs. To this effect, both files are required to be in the same folder and the main journal carries the following command:
```ad-code
~~~
include (filename).prices
~~~
```
Prices are inputed as follows:
```ad-code
~~~
P (date) (asset1) (asset2)(conversion value)
~~~
```
3. **Re-pricing Investment**
Re-pricing happens through the price file by simply adding a 'P' command with a new date in the .prices file.
4. **Selling an investment**
To respect the coherence of the Accounting Equation, sales will follow the same nomenclature as purchases, with an explicit declaration of realised p& l:
```ad-code
~~~
(Investment date)
Investment:(sub-account):(asset-account) -(units) (internal stock mnemonic)
equity:conversion (units) (internal mnemonic)
equity:conversion -(monetary amount @ purchase)
revenues:capital gain -(p& l)
receiving account (monetary amount)
~~~
```
This flexibility enables to implement FIFO/LIFO as per prevailing fiscal rules.
 
#### Closing books
[[#^Top|TOP]]
In order to close books, revenues/expenses need to amount to 0 and only show Asset, Liability and Equity. The below is a growing mapping of revenues and expenses lines:
```ad-code
~~~
(Closing date)
revenues:Salary (outstanding balance) = 0
revenues:investment income (outstanding balance) = 0
revenues:capital gains (outstanding balance) = 0
equity:retained earnings -(resulting amount)
~~~
```
```ad-code
~~~
(Closing date)
expenses (outstanding balance) = 0
equity:running costs -(resulting amount)
~~~
```
 
#### Reports
[[#^Top|TOP]]
```ad-info
title: Documentation
Simple reports can be found [here ](https://hledger.org/quickstart.html#run-reports )
```
**Income statement report**
```ad-command
~~~bash
hledger -f 'filename' is -Y (period argument) -3 (depth argument) -S (sorting by amount argument) -o (output file argument)
~~~
```
**Balance sheet report**
```ad-command
~~~bash
hledger -f 'filename' bs -Y (period argument) -V (optional price basis: end of year each year, local ccy; --value=end,(ccy) for forcing GBP/EUR) (optional --infer-value) -o (output file argument)
~~~
```
'bs' can be replaced by 'bse' to show the Equity block.
**ROI report**
```ad-command
~~~bash
hledger -f 'filename' roi --investment (investment account) -Y (period argument) --value=then,"(ccy)" --infer-market-price --pnl "unrealized"
~~~
```
**Arguments**
`--no-elide` : explicitly print all values
 
#### Tools
 
#### Useful commands
1. < mark class = "green" > stats</ mark > : account stats (number of transactions, ccy, exchange rates, etc...)
2. < mark class = "green" > print</ mark > : transaction history
3. < mark class = "green" > aregister</ mark > : transaction history in a particular account
4. < mark class = "green" > cashflow</ mark > : summary of cashflows per asset account & ccy
5. < mark class = "green" > balance</ mark > : show account balances
 
#### Other commands
```ad-example
title: Specific tasks
[Error checking ](https://hledger.org/checking-for-errors.html )
[Mac environment variables ](https://hledger.org/hledger-web.html )
```
 
### Tasks & Further steps
 
```ad-question
title: To explore
- [!] Tax
- [!] Financial forecasting
```
- [x] [[hLedger]]: Tax for Investments ✅ 2022-01-22
- [x] [[hLedger]]: Financial forecasting ✅ 2022-01-22
- [ ] :heavy_dollar_sign: [[hLedger]]: Update Price file %%done_del%% 🔁 every 3 months on the 1st Friday 📅 2025-01-03
- [x] :heavy_dollar_sign: [[hLedger]]: Update Price file %%done_del%% 🔁 every 3 months on the 1st Friday 📅 2024-10-04 ✅ 2024-10-04
- [x] :heavy_dollar_sign: [[hLedger]]: Update Price file %%done_del%% 🔁 every 3 months on the 1st Friday 📅 2024-07-05 ✅ 2024-07-05
- [x] :heavy_dollar_sign: [[hLedger]]: Update Price file %%done_del%% 🔁 every 3 months on the 1st Friday 📅 2024-04-05 ✅ 2024-04-05
- [x] :heavy_dollar_sign: [[hLedger]]: Update Price file %%done_del%% 🔁 every 3 months on the 1st Friday 📅 2024-01-05 ✅ 2024-01-05
- [x] :heavy_dollar_sign: [[hLedger]]: Update Price file %%done_del%% 🔁 every 3 months on the 1st Friday 📅 2023-10-06 ✅ 2023-10-06
- [x] :heavy_dollar_sign: [[hLedger]]: Update Price file %%done_del%% 🔁 every 3 months on the 1st Friday 📅 2023-07-07 ✅ 2023-07-07
- [x] :heavy_dollar_sign: [[hLedger]]: Update Price file %%done_del%% 🔁 every 3 months on the 1st Friday 📅 2023-04-07 ✅ 2023-04-07
- [ ] :heavy_dollar_sign: [[hLedger]]: Update current ledger %%done_del%% 🔁 every 3 months on the 1st Friday 📅 2025-01-03
- [x] :heavy_dollar_sign: [[hLedger]]: Update current ledger %%done_del%% 🔁 every 3 months on the 1st Friday 📅 2024-10-04 ✅ 2024-10-04
- [x] :heavy_dollar_sign: [[hLedger]]: Update current ledger %%done_del%% 🔁 every 3 months on the 1st Friday 📅 2024-07-05 ✅ 2024-07-05
- [x] :heavy_dollar_sign: [[hLedger]]: Update current ledger %%done_del%% 🔁 every 3 months on the 1st Friday 📅 2024-04-05 ✅ 2024-04-05
- [x] :heavy_dollar_sign: [[hLedger]]: Update current ledger %%done_del%% 🔁 every 3 months on the 1st Friday 📅 2024-01-05 ✅ 2024-01-05
- [x] :heavy_dollar_sign: [[hLedger]]: Update current ledger %%done_del%% 🔁 every 3 months on the 1st Friday 📅 2023-10-06 ✅ 2023-10-06
- [x] :heavy_dollar_sign: [[hLedger]]: Update current ledger %%done_del%% 🔁 every 3 months on the 1st Friday 📅 2023-07-07 ✅ 2023-07-14
- [x] :heavy_dollar_sign: [[hLedger]]: Update current ledger %%done_del%% 🔁 every 3 months on the 1st Friday 📅 2023-04-07 ✅ 2023-04-07