A beautiful terminal dashboard for hledger π°
570
stars
463
commits
Go
primary language
Mar 11, 2026
updated
Terminal dashboard to manage personal finances. Built with hledger and bubbletea.
2026-02-17 Update: The work on v3 is paused due to personal reasons. v3 is stable but does not have all the features from v2. It looks better than v2 in my opinion! Contributions are welcome.
A new version of Puffin is under development. This version completely revamps the UI and gives you a far better overview of your finances. Some features have been implemented, while others are still being built.
To try V3, you can update to the latest version and run
./puffin -v3
Please note, v3 uses a simple config file with only the journalFile field. So if you are using a config file with v2 then it won't be used with v3. However, you can modify the journal file to be used with v3.



All hledger reports are viewable using Puffin. Some of them are natively supported, others are displayed in a simple scrollable view.
Puffin supports the following reports natively:
The following reports are also easily viewable:
The data can be filtered by:
brew install siddhantac/puffin/puffin
If you just want to use it, you can download the binary from here.
make build. This creates the binary puffin.make debugmake startor
make build && ./puffinIt uses your hledger setup as it is. So there is no need to setup journal files if you are already using hledger.
Puffin can use a config file written in json. It is not required though. Without a config file Puffin will use sane defaults.
The default config:
"reports": [
{
"name": "register",
"cmd": "hledger register"
},
{
"name": "expenses",
"cmd": "hledger balance type:x"
},
{
"name": "assets",
"cmd": "hledger balance type:a"
},
{
"name": "revenue",
"cmd": "hledger balance type:r"
},
{
"name": "liabilities",
"cmd": "hledger balance type:l"
},
{
"name": "income statement",
"cmd": "hledger incomestatement"
},
{
"name": "balance sheet",
"cmd": "hledger balancesheet"
},
{
"name": "accounts",
"cmd": "hledger accounts --tree",
"locked": true,
}
]
name represents the name of the report, as displayed in the left sidebarcmd is the hledger command to be runlocked: if true, filters will not be applied to the reportNote about locked reports
A report is considered "locked" if the locked field is set to true. A locked report remains unaffected by the filters. This means that they cannot be filtered by date, period, account name etc.
Locked reports are useful for 2 purposes
See config.debug.json for more ideas.
Show this help with ?

463 commits
Go
99.4%
A beautiful terminal dashboard for hledger π°
570
stars
463
commits
Go
primary language
Mar 11, 2026
updated
Terminal dashboard to manage personal finances. Built with hledger and bubbletea.
2026-02-17 Update: The work on v3 is paused due to personal reasons. v3 is stable but does not have all the features from v2. It looks better than v2 in my opinion! Contributions are welcome.
A new version of Puffin is under development. This version completely revamps the UI and gives you a far better overview of your finances. Some features have been implemented, while others are still being built.
To try V3, you can update to the latest version and run
./puffin -v3
Please note, v3 uses a simple config file with only the journalFile field. So if you are using a config file with v2 then it won't be used with v3. However, you can modify the journal file to be used with v3.



All hledger reports are viewable using Puffin. Some of them are natively supported, others are displayed in a simple scrollable view.
Puffin supports the following reports natively:
The following reports are also easily viewable:
The data can be filtered by:
brew install siddhantac/puffin/puffin
If you just want to use it, you can download the binary from here.
make build. This creates the binary puffin.make debugmake startor
make build && ./puffinIt uses your hledger setup as it is. So there is no need to setup journal files if you are already using hledger.
Puffin can use a config file written in json. It is not required though. Without a config file Puffin will use sane defaults.
The default config:
"reports": [
{
"name": "register",
"cmd": "hledger register"
},
{
"name": "expenses",
"cmd": "hledger balance type:x"
},
{
"name": "assets",
"cmd": "hledger balance type:a"
},
{
"name": "revenue",
"cmd": "hledger balance type:r"
},
{
"name": "liabilities",
"cmd": "hledger balance type:l"
},
{
"name": "income statement",
"cmd": "hledger incomestatement"
},
{
"name": "balance sheet",
"cmd": "hledger balancesheet"
},
{
"name": "accounts",
"cmd": "hledger accounts --tree",
"locked": true,
}
]
name represents the name of the report, as displayed in the left sidebarcmd is the hledger command to be runlocked: if true, filters will not be applied to the reportNote about locked reports
A report is considered "locked" if the locked field is set to true. A locked report remains unaffected by the filters. This means that they cannot be filtered by date, period, account name etc.
Locked reports are useful for 2 purposes
See config.debug.json for more ideas.
Show this help with ?

463 commits
Go
99.4%