All notable changes to winget-tui are documented here.
The format follows Keep a Changelog.
Versions match the v<major>.<minor>.<patch> tags in git.
default_pin_filterconfiguration for choosing the startup pinned-package filter.- Mouse support for sorting by clicking the Name, ID, or Version table headers.
- Upgrades view now shows the correct empty-state message when hiding pinned packages leaves no visible upgrade rows.
- Faster local debug builds by compiling dependencies with
opt-level = 1.
- CI now runs cargo check, test, and clippy with
--lockedfor reproducible dependency resolution. - Updated
serde_jsonand GitHub Actions workflow dependencies.
- Display the app version in the TUI header and help overlay.
default_sortconfiguration for choosing the startup sort order.- Help overlay scrolling with Up/Down, PgUp/PgDn, Home, and End.
- Keyboard navigation while editing the Installed/Upgrades local filter.
- Upgrading a package whose ID is truncated by winget now falls back to an exact package-name upgrade instead of blocking the operation.
- Package-list viewport state is resynchronized when filtering shrinks the list, keeping the selected row visible.
- Help text now includes the missing
skeybinding.
- Replaced package deduplication's linear scan with a HashMap.
- Skipped idle renders when no event, message, or load is in flight.
- Added changelog and Cargo package metadata.
- Expanded unit-test coverage for sorting, selection, filtering, scrollbars, operation messages, word wrapping, keybindings, and parser edge cases.
- Updated CI, release, and agentic workflow dependencies.
- Package list viewport row math: visible-row count is now derived from the rendered table area, so the selection always scrolls into view when you move past the bottom row.
- Pinned packages now appear in the Upgrades view. winget's second pin-summary table is parsed so blocking-pinned packages still show up and respond to the pinned filter.
- Detail pane now shows the installed version instead of the manifest (latest)
version returned by
winget show. ensure_selection_visibleis called after cursor restore on refresh and after scrollbar click/drag so the viewport always follows the selection.- PgUp/PgDn docs updated from "20 items" to "one page" to match the actual viewport-based behaviour.
- Internal:
truncate()now usesCow<str>to avoid allocating when the string is already short enough.
- Expanded unit-test coverage across the core state machine.
- Pinned-package summary table no longer leaks into the installed-package list.
- Added missing help-overlay entries for
P(cycle pin filter) andc(open changelog). - Bumped CI action versions.
- Real-time local filter — press
/orsin Installed or Upgrades to filter the visible list instantly as you type. - CSV export — press
eto save the currently visible package list to a CSV file.
- Pin compatibility and status-feedback messages corrected.
- Optimised version sorting to use numeric component comparison.
- Reduced per-frame UI render allocations.
- Pin management —
ppins or unpins the selected installed package (blocks it from being auto-upgraded).Pcycles the pin filter: All → Pinned only → Hide pinned.
- Regression in Installed view that hid some pinned packages.
- Improved package-detail fallbacks when manifest metadata is sparse.
- Version sort now uses proper numeric-component comparison so
10.0sorts after9.0. - Corrected mouse-wheel scroll direction and package-row click hit-testing.
PageUp/PageDownnow jump by the actual viewport height instead of a hard-coded 20 rows.is_truncated()now detects both the Unicode…and ASCII...forms of truncated package IDs.- Status message shown when homepage or changelog URL is unavailable.
- Parser robustness improvements for unusual winget output layouts.
apply_filtersorts Name and ID columns withsort_by_cached_keyto avoid repeated string allocations.
- Sortable columns —
Scycles: Name↑ → Name↓ → ID↑ → ID↓ → Version↑ → Version↓ → off. - Version-specific install —
Iprompts for a version string before installing. - Independently scrollable detail pane —
Tab/Shift+Tabmoves keyboard focus between the package list and the detail panel; the detail panel has its own scroll position. - Startup configuration — optional
config.tomlsetsdefault_viewanddefault_sourceat launch. - Release notes —
copens the package's changelog URL in your browser. - Winget-not-found detection — a clear error is shown before entering the
TUI if
wingetis absent or not onPATH.
- Selection preserved across view refreshes: switching tabs no longer resets the highlighted package.
sanitize_texthas a fast path that skips allocation for clean input.- Avoid heap allocations in
find_column_ciandnormalize_show_key. parse_show_outputuses aPeekableiterator, removing a temporaryVec.
- Release binary now built with full LTO, single codegen unit, and symbol stripping for a smaller, faster executable.
- UX overhaul — winget-inspired colour theme, improved layout, and accessibility improvements (contributed by @niels9001).
SourceFilter::as_arg()helper to centralise source-argument construction.
- Unicode display widths used in
truncate()for correct CJK rendering. - Detail-loading guard prevents loading details for truncated package IDs.
- Install/uninstall/upgrade blocked for truncated IDs.
PackageDetail::merge_overhelper eliminates verbose field-by-field merges.- Available version shown in the detail panel for upgradeable packages.
- Column index pre-computed once per table scan;
Vec<char>removed from hot path. detail_loadingflag reset when switching tabs.
- Command injection in
open_urlfixed — onlyhttp://andhttps://URLs are forwarded to the shell. - Terminal control-character sanitisation added to all winget output.
- CI script injection risks eliminated; third-party actions pinned to SHAs.
- Key-hint clipping in narrow terminals.
- Detail loading for packages whose names contain non-ASCII characters.
- Multi-select batch upgrade in the Upgrades view:
Spacetoggles a package,aselects/deselects all,Uupgrades all selected packages.
- Mouse tab-click uses calculated positions instead of hard-coded offsets.
- Detail-panel race condition when scrolling quickly.
- Search cursor handling for non-ASCII input.
- Source filter applied correctly on the Upgrades tab.
- Parser hardened: filter instead of take_while, ID validation, truncated-ID handling.
- Mouse click selects the correct package after the list has scrolled.
- Upgrade label, keyboard nav, and 7-Zip parsing edge cases.
- Non-English locale support in winget output parsing.
- Initial release: search, install, uninstall, upgrade, mouse support, and animated UI.