No description
  • Python 63.2%
  • QML 35.5%
  • JavaScript 0.8%
  • Shell 0.5%
Find a file
ergosum 19a5aa1c50 ops: build and releases (#4)
Reviewed-on: #4
Co-authored-by: ergosum <ergosum@localhost>
Co-committed-by: ergosum <ergosum@localhost>
2026-06-16 14:42:36 +03:00
.forgejo/workflows ops: build and releases (#4) 2026-06-16 14:42:36 +03:00
ci ops: build and releases (#4) 2026-06-16 14:42:36 +03:00
resources feat (balance): profiles can be disabled 2026-06-15 18:29:04 +03:00
tests feat (balance): profiles 2026-06-15 16:54:19 +03:00
.env.example ops: build and releases (#4) 2026-06-16 14:42:36 +03:00
.gitignore ops: build and releases (#4) 2026-06-16 14:42:36 +03:00
AGENTS.md ops: build and releases (#4) 2026-06-16 14:42:36 +03:00
app_controller.py feat (balance): profiles can be disabled 2026-06-15 18:29:04 +03:00
app_state.py feat (balance): profiles can be disabled 2026-06-15 18:29:04 +03:00
hledger.py refactor (model): filter model (HledgerParam) is cleaned up and used everywhere possible 2026-06-15 12:38:53 +03:00
LICENSE ops: build and releases (#4) 2026-06-16 14:42:36 +03:00
main.py refactor: new component - balance table 2026-06-15 11:28:57 +03:00
main.spec ops: build and releases (#4) 2026-06-16 14:42:36 +03:00
models.py feat (balance): profiles 2026-06-15 16:54:19 +03:00
profile_manager.py feat (balance): profiles 2026-06-15 16:54:19 +03:00
pyproject.toml refactor: new component - balance table 2026-06-15 11:28:57 +03:00
README.md ops: build and releases (#4) 2026-06-16 14:42:36 +03:00
runtime_hook.py ops: build and releases (#4) 2026-06-16 14:42:36 +03:00
state.py refactor (model): filter model (HledgerParam) is cleaned up and used everywhere possible 2026-06-15 12:38:53 +03:00
table_controller.py refactor: new component - balance table 2026-06-15 11:28:57 +03:00
translations.py refactor (model): filter model (HledgerParam) is cleaned up and used everywhere possible 2026-06-15 12:38:53 +03:00

hledger-gui

A native desktop GUI for the hledger accounting tool, built with Python and PySide6 QML.

Requirements

  • Python 3.10+
  • hledger CLI installed

Setup

pip install -e ".[dev]"

Run

python main.py

Run Tests

pytest

Build Executable

pip install pyinstaller
pyinstaller main.spec

Output is in dist/ — a single-file binary.

CI/CD: Automated Builds

Binaries are built via Forgejo Actions on tag push (v*):

  • qt-hledger-<tag>.bin — Linux (xcb/X11 bundled, no extra deps needed)
  • qt-hledger-<tag>.exe — Windows (via Wine cross-compile)

See ci/README.md for runner setup, image building, and workflow documentation.

Tech Stack

  • Language: Python 3.14
  • GUI Framework: PySide6 6.11 (pure QML, no QtWidgets)
  • Data Source: hledger CLI with CSV output
  • Styling: QML (no QSS)
  • Persistence: QSettings

Features

  • Balance report with pinned account column
  • Pinned Average and Row Total columns (togglable)
  • Period options: daily, weekly, monthly, quarterly, yearly
  • Configurable account depth
  • Accumulation modes: per period (default), cumulative, historical
  • Empty accounts, sorting by amount, percentages, invert sign, posting count modes
  • Account name text filters (include/exclude)
  • Account type filters (assets, liabilities, revenue, expenses, …)
  • Filter profiles — save/load/rename/delete named sets of all filter settings
  • Russian and English localization
  • Persistent window state and settings
  • Dark/light/system theme

Filter Profiles

Profiles save and restore the complete filter state — period, grouping, accumulation mode, columns (Average/Row Total), display toggles (empty, sort, percent, invert, count), account type filters, and text filters.

Profiles are disabled by default. Enable them in Settings → Enable filter profiles. Once enabled, they appear in the Balance → Profile submenu and the Profiles sidebar section.

Profile Controls

Action Description
Save Save current filter state under the active profile name
Load Switch to a saved profile (prompts if there are unsaved changes)
Save As… Create a new profile with a custom name
Rename Rename the active profile
Delete Delete the active profile (not allowed when only one profile remains)
Dirty indicator A * appears next to the profile name when filters differ from the saved state

Profile Storage

Profiles are stored in ~/.qt-hledger/profiles.json as a JSON file. Each profile holds a snapshot of all filter parameters (see HledgerParams in state.py).

Roadmap

  • more filtering options
  • sorting
  • loading spinner
  • enable selection and copying
  • filter profiles
  • enable deselect
  • command palette
  • check if hledger installed on start
  • copy hledger command
  • export (as csv, excel, clipboard, etc)
  • disable setting dialog resizing
  • style filters
  • style table
  • tooltips on numbers in table with corresponding transactions
  • tree mode (--tree)