Releases: devnullvoid/pvetui
v1.3.2
🚀 Release v1.3.2
Added
- Ansible Ad-Hoc Tasks: Expanded the
ansibleplugin beyond the ping preset so the toolkit can run structured ad-hoc Ansible module invocations against generated inventory, using module/module-args plus the existing scope, limit, target, and timeout controls. - CLI:
nodes shellandguests shell: New interactive shell subcommands that open a terminal session directly from the CLI, matching the TUI'sSshortcut behaviour.pvetui nodes shell <node>— SSHes to a Proxmox node.pvetui guests shell <vmid>— enters an LXC container viapct enter(orpct execfor NixOS containers) over SSH to the host node, or connects directly to a QEMU VM via SSH using the VM's IP address. Respectsvm_ssh_user/vm_ssh_keyfilefor QEMU VMs.- Authentication follows the standard priority: SSH agent → configured keyfile →
~/.sshdefaults. - Unlike the TUI, no "Press Enter to return to TUI" prompt is shown on exit.
- CLI: Tab completion for nodes and guests: All CLI subcommands that accept a
<node>or<vmid>argument now provide dynamic tab completion by querying the Proxmox API. VM completions include the guest name and type as a description (visible in zsh and fish). Requires shell completions to be active (pvetui completion <shell>).
v1.3.1
🚀 Release v1.3.1
Added
- Shell Completions:
pvetui completionnow generates shell completion scripts for bash, zsh, fish, and PowerShell via Cobra's built-in completion support. Runpvetui completion <shell> --helpfor installation instructions. - SSH Key Configuration: Added
ssh_keyfileandvm_ssh_keyfileper-profile config fields (and corresponding--ssh-keyfile/--vm-ssh-keyfileCLI flags andPVETUI_SSH_KEYFILE/PVETUI_VM_SSH_KEYFILEenv vars) for specifying SSH private key paths explicitly. When no keyfile is configured, pvetui now also consults the running SSH agent (SSH_AUTH_SOCK) before falling back to standard key paths (~/.ssh/id_ed25519,id_rsa,id_ecdsa).
Fixed
- gRPC Security Update: Upgraded indirect dependency
google.golang.org/grpcfromv1.79.1tov1.79.3to address CVE-2026-33186, an authorization bypass in HTTP/2:pathpseudo-header validation.
v1.3.0
🚀 Release v1.3.0
Added
-
Command Runner: Custom Commands: The Command Runner plugin now exposes a "Custom Command..." entry at the top of the command menu for all target types (host, LXC container, QEMU VM). Users can type any non-interactive command and execute it directly without it needing to be on the whitelist. After a successful run, pressing
won the result screen promotes the command into the session whitelist and inserts it at the top of the command list immediately — no close/reopen required. Commands run without a PTY;sudorequiring a password will fail fast with a clear error, as will interactive programs. -
CLI Subcommands:
pvetuican now be used as a non-interactive CLI tool in addition to launching the TUI. Running any subcommand bypasses the TUI entirely, makingpvetuicomposable in scripts and AI agent workflows.pvetui nodes list— list all cluster nodes with status and resource metrics.pvetui nodes show <node>— detailed view of a single node.pvetui guests list— list all VMs and LXC containers with optional--node,--status, and--typefilters.pvetui guests show <vmid>— detailed view of a single guest.pvetui guests start|stop|shutdown|restart <vmid>— lifecycle operations returning a UPID.pvetui guests exec <vmid> <command>— execute a shell command inside a running guest. QEMU VMs use the guest agent (no SSH to the guest required), with automatic PowerShell wrapping on Windows. LXC containers usepct execover SSH to the Proxmox node (ssh_usermust be configured). Supports--timeout.pvetui tasks list— list recent cluster tasks with--recent N(default 20).--output/-opersistent flag selectsjson(default, structured stdout) ortable(human-readable).- All subcommands respect
--profileand work transparently with aggregate group profiles (fan-out queries across all member nodes). - No TUI startup banners are emitted when a subcommand is active.
- Errors are written as JSON to stderr; the process exits non-zero on failure.
v1.2.1
🚀 Release v1.2.1
Fixed
- Community Scripts Metadata Source: Switched the Community Scripts plugin from the stale archive fallback to the newly exposed public PocketBase metadata API at
db.community-scripts.org, restoring up-to-date script listings while keeping install script execution oncommunity-scripts/ProxmoxVE. - Community Scripts Development Script Labeling: Community Scripts entries now indicate when a script is in development and sourced from the
community-scripts/ProxmoxVEDdev repository.
v1.2.0
🚀 Release v1.2.0
Added
- Storage Browser Navigation: Added a first-class Storage page with its own configurable shortcut (
Alt+4by default), footer/help integration, node-scoped storage browsing, content filtering, and storage refresh controls. - Storage Content Acquisition: Added storage-level download actions for URL-based ISO/template/import downloads and OCI image pulls from the Storage page.
- Guest Creation Flows: Added initial node/global creation flows for VMs and LXCs, including VM creation from ISO-based installers and LXC creation from templates.
Fixed
- Storage Browser Actions: Added storage-content context actions for deleting ISO/template/snippet/backup entries and restoring backups directly from the Storage page, while removing the redundant Storage Browser entry from the Global menu.
- Community Scripts Metadata Source: Temporarily restored Community Scripts plugin metadata loading by switching from the removed upstream frontend JSON path to the archived
community-scripts/ProxmoxVE-Frontend-Archivemetadata source while upstream stabilizes a replacement for the new website architecture.
v1.1.0
🚀 Release v1.1.0
Added
- Ansible Toolkit Plugin: Added a new opt-in
ansibleplugin with integrated toolkit workflows for generating inventory from loaded Proxmox nodes/guests (YAML or INI, compact/expanded styles, optional custominventory_vars), previewing/saving inventory, runningansible -m ping, executingansible-playbookwith reusable form state, and providing an SSH setup guide. Includes plugin settings for default user/password/key path, limit behavior, and default Ansible extra arguments.
Fixed
- Startup Profile Chooser Default Handling: When
default_profileis unset, startup now correctly prompts for profile/group selection even if a profile is literally nameddefault, and non-interactive launches now return a clear error instead of exiting successfully without starting the app. - Template Guest Handling: Template VMs/CTs are now labeled as templates in the guest list and Guest Details, no longer appear as ordinary stopped guests for lifecycle UX, and are excluded from start-oriented context-menu and batch-action flows.
v1.0.20
🚀 Release v1.0.20
Added
- Guest Network Config Editor: Added an “Edit Network Interfaces” action in guest configuration with a dedicated interface editor (bridge/VLAN/rate/firewall plus VM/CT-specific fields), including LXC DHCP/Static IP assignment toggle and LXC nameserver/searchdomain fields, writing back to Proxmox
netXconfig entries on save. - Cluster Group Mode (HA Failover): Added per-group
group_settingswithmode: clusterso a group can connect through one active profile and automatically fail over to the next healthy candidate. - Group Mode Controls in Profiles UI: Added a mode selector to the Edit Group dialog and a cluster mode marker in the Connection Profiles list.
Fixed
-
Guest Details Description Consistency: The Description row now always appears in Guest Details and shows
N/Awhen a guest description is empty; for stopped guests, details now hydrate description from config when available. -
Running Guest CPU Metric Stability: Running guests now display
0.0%CPU instead of transientN/Awhen APIs briefly return invalid non-finite CPU values after restart. -
Guest Selection Snap-Back After Config Save Refresh: Preserved any user-initiated list selection changes made during in-flight refreshes so completion no longer forces selection back to the pre-refresh guest/node.
-
Transient CPU N/A After Guest Restart: Sanitized non-finite numeric values from API responses during single-guest refreshes so running guests no longer briefly show CPU as
N/Awhen metrics momentarily returnNaN/Infafter restart. -
Tasks Panel Focus Freeze: Fixed an immediate freeze when tabbing from Task History to Active Operations by keeping task table cells selectable and avoiding a tview table selection loop.
-
Cluster Failover Refresh Re-entrancy: Triggered failover refresh asynchronously to avoid nested
QueueUpdateDrawcallback paths. -
Single Guest Refresh IP Staleness: Fixed per-guest refresh so running guests (including LXC containers after network/VLAN changes) update IP information without requiring a full cluster refresh.
v1.0.19
🚀 Release v1.0.19
Added
- Vim-Style List Navigation: Added
gg(top) andG(bottom) navigation in focused Nodes, Guests, and Tasks lists/tables. - Guest Multi-Select + Batch Actions: Added
Space-based guest multi-selection and batch context-menu actions so you can queue operations across multiple selected guests. - Task Queue Throughput Control: Added a global in-progress concurrency limit so queued operations are processed without overloading the API/task polling path.
- Queued Task Cancellation: Added support for canceling queued tasks before they enter the running state.
- Advanced Guest Filter Modal: Added a Guests-page advanced filter modal (default
Ctrl+f, configurable viakey_bindings.advanced_guest_filter) with structured criteria for status, type, node, and tag matching, while preserving combined text-search + advanced filtering across refreshes.
Fixed
- Release Workflow Social Announcements: Prevented Mastodon announcement failures from breaking GoReleaser runs by handling social posting in the non-blocking release announcement script step.
- Community Script Install on Fish Shells: Forced remote script installer commands to execute under
/bin/bash -lcso node accounts usingfishas default shell can install community scripts without shell syntax errors. - Task Panel Focus Stability: Prevented a Tasks-page freeze when tabbing between Task History and Active Operations by avoiding layout rebuilds during active task refreshes and tightening pane focus switching logic.
- Latest golangci-lint Compatibility: Updated affected code paths to satisfy current gosec/staticcheck rules (log taint handling, URL validation hardening for community script metadata fetches, and
fmt.Fprintfformatting fixes), keeping local and CI lint runs aligned. - Global Menu Defaults:
Escis now the primary global menu key by default, whileglobal_menuremains configurable as an optional additional shortcut. - Global Menu Unbind Support:
key_bindings.global_menu: ""now correctly disables the additional global-menu shortcut instead of silently reverting to the default. - Task Keybind Configurability:
toggle_task_panelandtask_stop_cancelcan now be customized like other key bindings. - Help Modal Keybinding Layout: Reorganized help sections so task controls and page-specific actions are grouped more clearly.
- Back Navigation Consistency: Standardized back/close handling so Backspace works alongside Escape in Command Runner, Snapshot Manager, and Backup Manager flows.
- Context Menu Placement: Node/Guest context menus are now anchored near the focused list selection instead of always centered, keeping details panes visible while menus are open.
v1.0.18
🚀 Release v1.0.18
Added
- Async Task Queue System: Introduced a queued background task system for VM operations with task panel visibility controls, UPID tracking, improved keyboard/focus behavior, and safer non-blocking UI execution flow.
- Profile/Group CLI Listing: Added
--list-profilesto print configured connection profiles and aggregate groups (including key connection details and memberships) and exit, making it easier to pair with--profilefor direct startup selection. - QEMU Guest Agent Toggle in VM Config Editor: Added a checkbox to VM Edit Configuration so the QEMU guest agent can be enabled/disabled directly from the TUI.
Changed
- Nix Flake Source Handling:
flake.nixnow usessrc = selfforbuildGoModuleto reduce repeated source copying and improve localnix build/nix runperformance.
Fixed
- Guest Insights Plugin ID Compatibility: Renamed the plugin identifier to
guest-insightswhile keepingdemo-guest-listas a backward-compatible alias so existing configs continue to load without changes. - Form Label Readability: Standardized form field labels to use
HeaderTextcolor across VM/task/wizard dialogs for improved readability in terminal themes where default secondary text appears too dim.
v1.0.17
🚀 Release v1.0.17
Added
- Node Disk SMART Information: Node details now display disk health status and SMART data for all attached disks, including disk type (SSD/HDD), size, model, and health status (PASSED/FAILED).
- System Update Notifications: Node details now show available system package updates with version information, displaying up to 5 pending updates with a count of any additional updates.
- Icon Toggle: Added multiple ways to control icons/emojis throughout the UI. Icons are enabled by default. To disable: use
--show-icons=falseCLI flag,PVETUI_SHOW_ICONS=falseenvironment variable, orshow_icons: falsein YAML config. (#75) - Guest Tags: Added editable tag list for VM/LXC configuration, using a semicolon-separated tag field in the Edit Configuration form. (#76)
- SSH Jump Host Support: Added SSH jump host (bastion host) configuration for accessing Proxmox environments through an intermediate SSH server. Configure via config wizard, CLI flags (
--ssh-jumphost-addr,--ssh-jumphost-user,--ssh-jumphost-keyfile,--ssh-jumphost-port), environment variables (PVETUI_SSH_JUMPHOST_ADDR,PVETUI_SSH_JUMPHOST_USER,PVETUI_SSH_JUMPHOST_KEYFILE,PVETUI_SSH_JUMPHOST_PORT), or YAML config (ssh_jump_hostsection). Per-profile configuration supported. - Release Announcements: GoReleaser now posts release announcements to Mastodon and Bluesky when the required secrets are configured.
Changed
- Release Pipeline: Simplified GitHub token configuration by removing duplicate secret names (
HOMEBREW_TAP_TOKEN,SCOOP_BUCKET_TOKEN) in favor of consistent_GITHUB_TOKENnaming. - Makefile Build:
make buildnow uses the build cache by default; setREBUILD=1to force a full toolchain rebuild. - Local Dev Workflow: Added
build-fastandtest-quicktargets and cached package lists for faster local builds/tests; optionalTRIMPATH=0disables trimpath in local builds. - Nix Flake: Automated vendorHash updates with dependency changes to prevent hash mismatches on Nix installations. (#80, #81)
Fixed
- UI Deadlocks: Eliminated nested QueueUpdateDraw deadlocks that occurred when displaying error messages from menu handlers by switching to direct SetFocus calls. This fixes deadlocks in various scenarios including interacting with offline nodes and group connection handling.
- Group Connection Handling: Improved connection handling during bootstrap and resource fetching in aggregate groups to prevent UI freezes.
- Group Mode Filter Persistence: Fixed active search filters being lost during manual refresh (Ctrl+R) and after VM operations in aggregate group mode. Filters now persist correctly across all refresh operations.
- Group Mode VM Details Refresh: Fixed VM details panel not updating after operations (reboot, start, stop, etc.) in group mode by ensuring the correct profile-specific client is used to fetch fresh VM data.
- Group Mode Source Profile Preservation: Fixed VMs losing their cluster association after operations in group mode, which caused "source profile not set" errors. The SourceProfile field is now preserved when refreshing individual VM data.
- Group Mode Initial Loading Feedback: Added header loading message "Loading guest agent data" during initial startup in group mode. Previously, profile names would appear in the UI without warning after a silent enrichment process.
- CI Cache Noise: Removed redundant Go module cache restore in CI to prevent tar "File exists" errors during lint/test/build jobs.
- Group Mode Config Polling: Avoided cross-profile cluster resource polling when only tags change, reducing delays after saving guest configuration.
- Header Loading Animation: Prevented overlapping loading spinners that made the header animation appear overly fast during concurrent updates.