- Python 63.2%
- QML 35.5%
- JavaScript 0.8%
- Shell 0.5%
Reviewed-on: #4 Co-authored-by: ergosum <ergosum@localhost> Co-committed-by: ergosum <ergosum@localhost> |
||
|---|---|---|
| .forgejo/workflows | ||
| ci | ||
| resources | ||
| tests | ||
| .env.example | ||
| .gitignore | ||
| AGENTS.md | ||
| app_controller.py | ||
| app_state.py | ||
| hledger.py | ||
| LICENSE | ||
| main.py | ||
| main.spec | ||
| models.py | ||
| profile_manager.py | ||
| pyproject.toml | ||
| README.md | ||
| runtime_hook.py | ||
| state.py | ||
| table_controller.py | ||
| translations.py | ||
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)