This is a TUI for hledger to show a nice dashboard https://flutter-explained.dev
  • Rust 98.9%
  • Nix 0.7%
  • Shell 0.4%
Find a file
Max Weber ad6f68a184
All checks were successful
CI / Lint (push) Successful in 2m6s
Release / Build aarch64-apple-darwin (push) Successful in 9m56s
Release / Build aarch64-unknown-linux-gnu (push) Successful in 6m45s
Release / Build x86_64-apple-darwin (push) Successful in 6m53s
Release / Build x86_64-unknown-linux-gnu (push) Successful in 4m32s
CI / Build & Test (push) Successful in 4m36s
Release / Create Release (push) Successful in 26s
fix(clippy): use strip_prefix instead of manual starts_with + slice
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-10 13:45:29 +02:00
.cursor Global search with drill option is implemented 2026-06-09 17:15:08 +02:00
.forgejo/workflows chore(release): close v1.0 release blockers 2026-04-23 09:04:43 +02:00
examples fix: parse prefixed commodity amounts and mirror notation in UI 2026-06-10 13:45:29 +02:00
man chore(release): close v1.0 release blockers 2026-04-23 09:04:43 +02:00
packaging/aur chore(release): close v1.0 release blockers 2026-04-23 09:04:43 +02:00
screenshots chore(release): bump version to v1.1.0 2026-04-28 19:53:58 +02:00
src fix(clippy): use strip_prefix instead of manual starts_with + slice 2026-06-10 13:45:29 +02:00
tests chore(release): bump version to v1.1.0 2026-04-28 19:53:58 +02:00
.gitignore feat: add config file support and expense drill-down 2026-04-17 08:56:40 +02:00
Cargo.lock fix: parse prefixed commodity amounts and mirror notation in UI 2026-06-10 13:45:29 +02:00
Cargo.toml fix: parse prefixed commodity amounts and mirror notation in UI 2026-06-10 13:45:29 +02:00
CHANGELOG.md fix: parse prefixed commodity amounts and mirror notation in UI 2026-06-10 13:45:29 +02:00
flake.nix chore(release): close v1.0 release blockers 2026-04-23 09:04:43 +02:00
LICENSE chore: prepare crates.io release packaging 2026-04-22 08:23:54 +02:00
README.md feat: persist journal switch to config via Ctrl-S 2026-05-22 14:59:31 +02:00
strategy.md chore: release v1.3.0 2026-06-09 21:27:51 +02:00

⬡ ldash — HLedger Dashboard TUI

A terminal dashboard for hledger that gives you a real-time overview of your finances — crypto portfolio, net worth, and monthly income/expenses — all without leaving the terminal.

Built with Ratatui and Rust.

Screenshots

Portfolio Accounts Monthly
Portfolio tab Accounts tab Monthly tab

Features

  • Crypto Portfolio — Holdings table with price, value, allocation %, and P/L tracking (invested vs price gain vs staking rewards)
  • Portfolio Chart — Per-coin analysis with two modes: stacked (invested / purchased value / total value) or unstacked (invested / price gain / staking gain). Toggle with s.
  • Net Worth History — Interactive chart with selectable time ranges (YTD / 1Y / 2Y / 5Y / All)
  • Account Balances — All asset accounts with EUR valuations and visual bar indicators; stacked asset breakdown chart (toggle with s)
  • Account Drill-Down — Select any account and view its recent transactions
  • Monthly Income & Expenses — Bar chart overview with per-category breakdown, savings rate gauge, and year-over-year comparison
  • Cash Flow Forecast — Projected income/expenses for future months via hledger --forecast, overlaid on the monthly chart
  • Recurring Expense Detection — Automatically identifies subscription and recurring charges in your expense history
  • Budget Tracking — Set monthly limits per expense category; see progress bars inline and warnings when over budget
  • Savings Goals — Define target amounts for account prefixes; progress bars shown on the Accounts tab
  • Background Refresh — Non-blocking data loading with parallel hledger calls
  • Auto-Refresh — Detects journal file changes and reloads automatically
  • Lazy Tab Loading — Only loads data for the active tab on first visit

Requirements

  • Rust (1.70+)
  • hledger installed and available in $PATH
  • An hledger journal file with a companion prices.journal for crypto price history

Installation

Homebrew (macOS / Linux)

brew tap md-weber/ldash
brew install ldash

From source

git clone https://codeberg.org/md-weber/ldash.git
cd ldash
cargo install --path .

Usage

# Pass journal path directly
ldash -f /path/to/all.journal

# Or set the environment variable
export LEDGER_FILE=/path/to/all.journal
ldash

# Or run from a directory containing all.journal
cd ~/Finance && ldash

Keybindings

Key Action
1 / 2 / 3 Switch tab
Tab / Shift-Tab Next / previous tab
k / j Scroll / select
PgUp / PgDn Page up / down
Home / End Jump to first / last row
h / l Month navigation (Monthly) / net worth range (Accounts/Portfolio)
y / Y Previous / next year (Monthly tab)
G Jump to latest month (Monthly tab)
i Toggle income / expense focus (Monthly tab)
Enter Drill into account / expense category
s Toggle chart mode (stacked / unstacked)
c Toggle expense category colors
/ Filter accounts (Accounts tab) / search
e Export current view to file
Y Copy current view to clipboard (Portfolio / Accounts tab)
Ctrl-O Open journal-switch prompt (session only)
Ctrl-S Save typed/active journal to config (inside Ctrl-O prompt)
r Force refresh
? Toggle help overlay
Esc Back / close
q Quit

Configuration

On first launch, ldash creates a config file at ~/.config/ldash/config.toml with all options commented out. Edit it to customize behavior.

# Path to hledger journal (overrides $LEDGER_FILE and CLI arg)
# journal = "/path/to/all.journal"

# Auto-refresh interval in seconds (default: 300)
# refresh_interval = 300

# Default tab on startup: "portfolio", "accounts", "monthly"
# default_tab = "portfolio"

# Number format: "eu" (1.000,00) or "us" (1,000.00)
# number_format = "eu"

# Currency symbol shown in UI
# currency_symbol = "€"

# Portfolio chart mode: "stacked" or "unstacked" (default: "stacked")
# chart_mode = "stacked"

# Price alert threshold in percent (default: 2.0)
# Popup shows only coins with day-over-day move >= threshold.
# Set 0.0 to show all daily moves.
# price_alert_threshold_pct = 2.0

# Quick-switch journal list — cycle through with ↑/↓ inside the Ctrl-O prompt.
# journals = [
#   "/path/to/personal.journal",
#   "/path/to/work.journal",
# ]

# Expense category color overrides
# Colors: red, green, blue, yellow, cyan, magenta, white, darkgray,
#         or RGB hex like "#B48CFF"
# [colors.expenses]
# Wohnen = "blue"
# Essen = "yellow"

# Monthly budget limits per expense category
# Matched against your hledger expense accounts (case-insensitive).
# Shows a progress bar in the expense table and warns when over budget.
[budgets]
# "expenses:Essen" = 400.0
# "expenses:Freizeit" = 200.0
# "expenses:Transport" = 150.0

# Savings goals — track progress toward financial targets.
# Each goal maps a target amount to an account prefix. Shown on
# the Accounts tab as a progress bar with current/target amounts.
# [[goals]]
# name = "Emergency Fund"
# target = 15000.0
# account = "assets:bank:savings"

Missing or partially filled config is fine — defaults fill any gaps.

Theming

ldash ships three built-in presets. Set one in your config:

[theme]
preset = "dark"        # default — dark background, cyan accent
# preset = "light"    # light background, blue accent (self-contained: works on any terminal)
# preset = "solarized" # Solarized Dark palette

Every color can also be overridden individually, with or without a preset:

[theme]
preset  = "solarized"
accent  = "#ff8800"   # override just the accent color

Available color fields and their defaults (dark preset):

Field Default Role
accent cyan Borders, highlights, selected tab
positive green Income, gains, positive amounts
negative red Expenses, losses, negative amounts
muted darkgray Secondary text, axis labels
gold yellow Net worth line, titles, P/L totals
fg white Primary text
background #14141e Title bar, popup backgrounds

Color values accept named colors (red, green, blue, yellow, cyan, magenta, white, gray, darkgray) or hex codes (#RRGGBB).

Theme changes take effect immediately when the config file is saved (hot-reload — no restart needed).

Journal Structure

ldash expects a standard hledger setup:

~/Finance/
├── all.journal          # main journal (includes others)
├── prices.journal       # P directives for crypto prices
├── 2025.journal
└── 2026.journal

Crypto accounts should live under assets:crypto, and price entries in prices.journal should follow the format:

P 2026-04-14 BTC 76543,21 €
P 2026-04-14 SOL 123,45 €

License

GPL-3.0-or-later — see LICENSE for the full text.