All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- CLI output defaults: Added
cli.default_outputandPVETUI_CLI_DEFAULT_OUTPUTso users can make CLI subcommands default totableoutput while preservingjsonas the built-in automation-safe default. The--outputflag still takes precedence per command. - Community Scripts sudo guidance: Documented the sudoers rule needed for non-root SSH users running unattended Community Scripts installs, and made non-interactive installs use
sudo -nso missing passwordless sudo fails instead of waiting for a password prompt. - Community Scripts IP guard: Initialized the upstream
IPvariable for CLI and TUI Community Scripts installs so scripts that fail to populate it do not roll back otherwise successful containers during their final access-URL message. - Community Scripts guest add-ons: Added CLI and TUI support for installing
tools/addonscripts inside existing LXC containers, exposed derived script target metadata, sanitized HTML tags from upstream script descriptions, and limited guest-launched TUI selection to applicable tool scripts with the sameishortcut used by node installs. - CLI emergency recovery paths: Added node-local guest listing with
guests list --node <node> --node-local, direct lifecycle targeting with--node/--typeon start/stop/shutdown/restart, LXC-compatibleguests migrate --target-storage, and configurable migration task waits via--wait-timeout.
- CLI Community Scripts: Added
pvetui community-scriptscommands for enabled Community Scripts plugin users to search available scripts, show script details, preview install plans, and install/deploy a selected script on a chosen Proxmox node over SSH. Deployments support validated Community Scriptsvar_*overrides plus--yesnon-interactive mode for agent-friendly provisioning; unattended LXC deploys with explicit template/rootfs storage overrides avoid upstream first-run storage prompts and restore any existing Community Scripts defaults afterward. Successful installs refresh guest inventory cache so newly created guests are visible to follow-up CLI commands.
- Cloudsmith Linux package repository: Added release publishing for DEB/RPM packages to the public Cloudsmith OSS repository, plus README install instructions and OSS hosting attribution.
- Ansible community Proxmox inventory: The Ansible plugin can now use a generated
community.proxmox.proxmoxdynamic inventory source viaplugins.ansible.inventory_source: community_proxmox, deriving non-secret connection fields plus secret environment variables from the active pvetui profile so saved inventory files can be reused without writing Proxmox secrets into them. - Ansible bootstrap UID: Bootstrap Access can now create or update the managed Ansible user with a configured numeric UID via
plugins.ansible.bootstrap.uid. - Application settings dialog: Added in-app editing for icon display, debug logging, cache/age directories, theme configuration, and key bindings, plus SSH key path fields in profile editing.
- Mock-backed media generation:
make screenshots,make demo, and the mock VHS E2E runner now launch pvetui against the bundled Proxmox mock API with a generated config and media fixture, making screenshot and demo regeneration reproducible without a real cluster.
- Settings persistence: TUI configuration saves now preserve
show_iconsand apply settings/profile actions to the active custom config path when one is in use. - Icon toggle coverage: Startup progress, onboarding, and snapshot/backup message emoji prefixes now respect
show_icons, while operational status indicators and spinners remain visible. - Active profile SSH settings: Changes to an active profile's SSH users, key files, and jump host now apply to new SSH/plugin operations immediately without requiring profile reactivation.
-
CLI:
guests create vm/guests create lxc: Create QEMU VMs and LXC containers from the CLI with the same field coverage as the TUI forms. Supports memory, cores, disk storage, ISO attachment, network bridge, start-after-create, and auto-assigned VMIDs (viaGetNextID). For LXC, accepts a package name (e.g.debian-12-standard) and resolves it to the latest full template filename via the aplinfo catalog. Commands block until the Proxmox task completes by default;--no-waitreturns the task UPID immediately. -
CLI:
guests migrate <vmid> <target-node>: Migrate a guest to another node. Mode is selected automatically (QEMU running → online, QEMU stopped → offline, LXC → restart) matching TUI behaviour;--online/--offlineoverride for QEMU.--no-waitsupported. -
CLI:
guests delete <vmid>: Delete a VM or LXC container from the CLI. Supports--purge(remove all associated storage volumes) and--force(delete even if the guest is running). Blocks until the Proxmox task completes by default;--no-waitreturns the task UPID immediately. -
CLI:
storagecommand group: New top-level command group for storage and content management:storage list [--node]— list all storages across the cluster; shows per-node rows for shared storages.storage show <node> <storage>— show details for a specific storage.storage content list <node> <storage> [--type]— list content items with optional type filter.storage content delete <node> <storage> <volid> [--no-wait]— delete a content item.storage download url <node> <storage> <url> [--filename] [--content-type] [--no-wait]— download from a URL; content type inferred from extension (.iso→iso,.tar.*→vztmpl,.img→import).storage download template <node> <storage> <template> [--section] [--no-wait]— download an appliance template; accepts full filename or package name with auto-resolution.storage download oci <node> <storage> <reference> [--no-wait]— pull an OCI image.storage restore <node> <storage> <volid> <vmid> [--confirm] [--type] [--no-wait]— restore a guest from a vzdump backup. Prints a dry-run summary without--confirm; guest type inferred from volid prefix.- Tab completions for
<node>,<storage>, and<template>positional arguments.
- LXC/VM create: moved to node context menu: "Create VM" and "Create LXC" are no longer in the global menu. They are now only accessible from the node context menu, where the target node is already in scope.
- LXC Edit Configuration: Swap field: New "Swap (MB)" input in the Edit Configuration modal for LXC containers, positioned below Memory. Setting swap to
0is now correctly sent to the API (disabling swap), which the previous save path silently skipped. - LXC create: Nesting toggle: New "Nesting" checkbox in the LXC creation form (enabled by default) that sets
features=nesting=1on the container, allowing Docker and nested containers. - Storage: Template Catalog download: New "Template Catalog" option in the storage Download Content menu (available when the storage supports
vztmpl). Fetches the Proxmox appliance template list (pveam available) and lets you pick a template by section (All / system / mail / turnkeylinux) and download it directly to the selected storage — equivalent topveam download <storage> <template>. - Ansible plugin:
envsetting: Newplugins.ansible.envconfig map for passing arbitrary environment variables (e.g.ANSIBLE_CONFIG,ANSIBLE_ROLES_PATH,ANSIBLE_HOST_KEY_CHECKING) to all ansible and ansible-playbook invocations. Configurable via General Settings in the toolkit or directly in config YAML.
- LXC Edit Configuration: false-positive
*marker on network modal: Opening and closing the "Edit Network Interfaces" sub-form without making any changes no longer marks the parent form title with*. The comparison baseline is now normalized through the same parse→rebuild round-trip used when saving, eliminating spurious change detection caused by key-order differences in the raw API strings. - LXC create: privileged container creation: The
unprivilegedfield was being sent as a JSON boolean (false), which Proxmox does not reliably accept. It is now sent as an integer (0/1) consistent with how Proxmox represents boolean-like fields internally. This fixes creation of privileged containers. - LXC/VM create: rootfs storage dropdown shows storages from other cluster nodes:
GetNodeStoragesnow filters out storages not active on the queried node. Proxmox returns all cluster-configured storages from/nodes/{node}/storagebut marks inaccessible ones withactive=0; previously non-shared local storages from other nodes were shown in the rootfs dropdown. - Edit Configuration: network changes now prompt to Save: After applying changes in the "Edit Network Interfaces" sub-form, the header shows "Network settings updated — press Save to apply" and the parent form title gains a
*marker as a persistent reminder that the changes are staged in memory and require pressing Save to persist to Proxmox. go installversion info: Build date and commit hash now show correctly in the About modal when installed viago install. Release constants are embedded ininternal/version/release.goand updated automatically by the release script, serving as a fallback when ldflags and VCS metadata are unavailable.- Release script:
make releaseprompt ordering: The confirmation block now renders before they/Nprompt when running undermake. Previously stdout buffering caused the prompt to appear ahead of the confirmation text. - Release script: master sync before merge:
make releasenow fast-forwards local master toorigin/masterbefore merging develop, preventing push rejection when CI has auto-committed to master (e.g. Nix vendorHash update) since the previous release.
- 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>).
- 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).
- 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.
-
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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
-
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.
- 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.
- 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.
- 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.
- Nix Flake Source Handling:
flake.nixnow usessrc = selfforbuildGoModuleto reduce repeated source copying and improve localnix build/nix runperformance.
- 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.
- 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.
- 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)
- 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.
- Age Key Directory Override: Allow specifying where
.age-identityand.age-recipientare stored viaage_dir,--age-dir, orPVETUI_AGE_DIRfor shared config setups. (#72) - Tilde Expansion for Paths:
~now expands inage_dirandcache_dirvalues from config, flags, and environment variables.
- Config Wizard Auth Validation: Read live form values at save time and validate the profile being edited to avoid stale auth errors across platforms. (#69, #70)
- Config Wizard Token Validation: Warn when only one of token ID/secret is provided so partial token input isn't silently discarded.
- Config Wizard Defaults: When launched via
--config-wizardwithout an existing config, the wizard now seeds from the default template to match onboarding behavior. (#69, #70) - Windows Config Path Handling: Default to the standard config path when launching the wizard without an existing config, and also probe XDG locations so legacy
~/.config/pvetuisetups are discovered. (#69, #70)
- Backup Management: Comprehensive backup functionality for VMs and containers with visual task indicators and auto-refresh capabilities.
- Backup Performance: Optimized backup retrieval with caching and parallel storage scanning for faster loading.
- Backup UX: Added visual indicators for running backup tasks and auto-refresh when operations complete.
- Backup Navigation: Added 'Refresh' action (Ctrl+R) to Backup Manager for manual updates.
- Command Runner Descriptions: Display user-friendly descriptions for all commands to help users understand purpose before execution.
- Default Startup Group:
default_profilecan now be set to an aggregate group name so pvetui starts directly in the combined group view.
- Backup Storage Listing: Fixed backup creation form and list by implementing proper
GetNodeStoragesAPI endpoint for accurate storage retrieval. - Backup Keyboard Handling: Whitelisted backup pages in keyboard handler to prevent global hotkey conflicts with form input.
- SOPS Group Management: Prevent unwanted re-encryption of already-encrypted configs during group operations.
- Profile Template Cleanup: Removed obsolete "work" profile from default configuration template to prevent confusion.
- Wizard Back-Tab Navigation: Restored Shift+Tab (back-tab) focus navigation in the Profile Editor and Config Wizard, including button rows.
- UI Deadlocks: Fixed deadlock issues in "Add Group" dialog and other UI components.
- Focus Management: Resolved focus loss in "Add Group" workflow and other form interactions.
- Profile/Group Name Conflicts: Startup validation now directs users to repair existing configs instead of offering to overwrite them, and UI entry points block creating groups or profiles with conflicting names.
- Config Repair Targeting: When a profile/group name conflict is detected on startup, the editor now opens the conflicting profile so it can be renamed.
- Onboarding Messaging: Startup guidance now distinguishes first-run setup from fixing an existing configuration.
- Footer Key Hints: Global menu and context menu shortcuts are now listed separately, with Esc shown for the global menu.
- Key Normalization: Ctrl+Shift+Tab normalization now preserves the Ctrl modifier across tcell versions.
- Task Polling Architecture: Decoupled task polling from App component for better separation of concerns.
-
Aggregate Cluster Support: Introduced the ability to define and manage multiple Proxmox VE clusters as a single, aggregated view. Users can now:
- Configure aggregate groups within
config.ymlto combine multiple Proxmox profiles. - Switch between individual profiles and aggregate groups via the profile picker in the UI.
- Launch the application directly into an aggregate group using the
--profile="group-name"CLI flag. - View aggregated CPU, memory, storage, and task information across all connected clusters.
- Perform VM operations (start, stop, migration, etc.) on individual VMs within the aggregate view, with operations correctly routed to the respective source cluster.
- Utilize VNC and SSH shell access for VMs and nodes across aggregated clusters.
- Configure aggregate groups within
-
API spec generation: New
gen-openapiMake target andpve-openapi-gentool generate an OpenAPI 3 spec fromdocs/local/apidoc.js, making Proxmox endpoints easier to consume and keep in sync.
- About dialog metadata: Widened the About modal so GitHub links no longer wrap/break and backfilled commit/build date when ldflags aren't provided (e.g.,
go install). - Plugin manager modal: Expanded the manage-plugins dialog further (wider center column) so long plugin descriptions stay visible.
- LXC shell via root SSH: Skip
sudowhen the profilessh_userisroot, preventing failures on Proxmox hosts without sudo and eliminating unnecessary elevation. - Community scripts navigation: Restored visible selection highlighting in the script/category lists.
- Community scripts install: Show script page link and explicit curl/bash command; installations no longer require sudo when connecting as root (fall back to
su). - Command runner SSH target: Use node IPs instead of hostnames for SSH, reducing DNS reliance.
- SSH debug visibility: Added debug logs for all SSH invocations (node/VM shells, command runner, community scripts) including user/host/command, and centralized logging to the single cache log file.
- IP address debugging (issue #56): Added comprehensive debug logging at cluster parsing, node lookup, and shell invocation stages to track IP addresses through the entire flow. Logs include string length, byte representation, and raw JSON values to help diagnose potential IP corruption issues.
- Hotkey override hook: UI components can now register a hotkey override instead of being added to the growing modal whitelist, reducing global shortcut conflicts.
- Profile add cancel: Cancelling “Add New Profile” no longer leaves a phantom
new_profileentry in the manager list. - Community scripts fetch: Script metadata now fetched concurrently (worker pool) to speed up inventory loading while respecting caching.
- Enhanced Guest Search: Guest search now includes IP addresses and tags in addition to name, ID, type, status, and node name for more comprehensive filtering
- noVNC Assets with go install: Fixed missing noVNC vendor files (pako compression library) when installing via
go installby renamingvendor/tolib/(Go's embed package excludes directories named 'vendor' by design). Theprune_novnc.shscript now automatically handles this transformation after updating the noVNC subtree from upstream. - Release packaging: Updated noVNC pako license paths in GoReleaser, RPM/DEB, and Docker release artifacts after moving
vendor/pakotolib/pako, restoring successful binary publishing. - Selection Visibility on Windows: Added reverse video attribute to selected items for better visibility on Windows Terminal with black backgrounds (Vintage, Campbell, IBM 5153 color schemes). Selected nodes/VMs now use inverted colors that work regardless of theme or terminal settings.
- Command Runner Plugin: Standardized the Linux host/container/guest command sets and added richer troubleshooting helpers (process sorters,
ip route/link show, resolver dumps, etc.) plus expanded Windows networking/DNS commands so you can capture CPU, memory, and connectivity data from the same menu. - VM SSH User Override: New
vm_ssh_userconfig/flag/env option lets you specify a different SSH username for QEMU VM shells while keepingssh_userfor node/LXC access (falls back automatically when omitted).
- Command Runner Plugin: After closing the command output modal you now land back in the command list, making it much faster to run multiple commands back-to-back.
- VM Migration Polling: Fixed migration operations to properly wait for Proxmox task completion via UPID before attempting to poll the target node, eliminating "Configuration file does not exist" errors during active migrations
- Task Completion Detection: Improved task completion detection to use the
EndTimefield instead of status string matching, ensuring all task failures (including "migration problems" and other non-standard error messages) are properly caught - Post-Operation Refresh Blocking: Fixed "Cannot refresh data while there are pending operations in progress" message appearing after successful VM operations by clearing pending state immediately after operation completion for all VM lifecycle actions (start, stop, shutdown, restart, reset, delete, and migrate)
- Guest Insights plugin now uses the full main panel dimensions so its table matches other plugin experiences.
- Tasks page table now expands to the full page width so its columns no longer appear cramped on larger terminals.
- Startup auto-encryption now runs only when plain-text secrets are actually detected, eliminating the repeating “Encrypted sensitive fields” banner and unnecessary config rewrites.
- Non-SOPS config saves no longer duplicate the active connection at the bottom of
config.yml; sensitive-field encryption now keeps values inside their profile only.
- Plaintext
password/token_secretvalues in non-SOPS configs are now auto-encrypted on startup, so sensitive fields never linger in cleartext on disk once you've successfully connected.
- Replaced the demo-oriented guest list plugin with a "Guest Insights" experience featuring a sortable/filterable table, jump-to-guest navigation, and on-demand metric refreshes so node actions are actually useful during day-to-day ops.
- Cluster status view now recognizes single-node installs, showing a sane 1/1 node count and a "Quorate: N/A" message instead of a scary "No" status.
-
Command Runner Plugin - QEMU VM Support: Execute whitelisted commands on QEMU VMs via guest agent
- Commands execute via
/nodes/{node}/qemu/{vmid}/agent/execand/agent/exec-statusendpoints - Support for templated commands with parameters (e.g.,
systemctl status {service}) - 'C' keyboard shortcut on VMs with guest agent enabled and running
- Expanded VM command whitelist:
uptime,df -h,free -h,systemctl status,journalctl,ps aux,ip addr show - Polling logic to wait for command completion with proper timeout handling
- API client adapter to bridge plugin VM struct with full API client types
- Commands wrapped in
["/bin/sh", "-c", "command"]for shell feature support
- Commands execute via
-
Command Runner Plugin - OS-Aware VM Commands: Detect QEMU guest operating systems and show Linux shell or Windows PowerShell command lists automatically.
-
Command Runner Plugin - Expanded Linux/LXC Utilities: Added
journalctl -n 50,systemctl list-units --type=service --state=running,systemctl list-unit-files --state=enabled,who, andlast -n 20to the default Linux VM and LXC whitelists for faster troubleshooting.
- Guest Agent Response Parsing: Fixed critical bug where Proxmox returns
exitedfield as integer (0/1) but code attempted to parse as boolean, causing infinite polling loop and "Invalid parameter 'pid'" errors on second poll - Version Detection:
go installbuilds now report the correct semantic version by usingdebug.ReadBuildInfo()to extract module metadata instead of hard-coding "vdev".
- Switched noVNC integration from a git submodule to a git subtree rooted at internal/vnc/novnc, ensuring full compatibility with
go installand other Go tooling. - All noVNC assets are now tracked directly in the repository. The update process is now documented in the README, and updating to new versions uses
git subtree pull.
- Pluggable feature architecture for UI contributions with runtime registration and lifecycle management.
- Community Scripts functionality extracted into the
community-scriptsplugin; enable it via theplugins.enabledsetting. - Demo "guest list" plugin that adds a node action presenting running guests in a modal.
- LRU (Least Recently Used) cache eviction with configurable size limits to prevent unbounded memory growth.
- Configurable API retry count via
DefaultRetryCountconstant for easier tuning. - Manage Plugins dialog in the global menu to toggle plugins, persist configuration changes, and flag the required restart.
- Plugins are now disabled by default; update configuration to opt into optional features such as community scripts.
- Configuration files now honour the
plugins.enabledlist instead of falling back to legacy defaults. - Cache implementation now uses
json.RawMessageto eliminate double JSON marshaling/unmarshaling overhead. - FileCache now implements LRU eviction with doubly-linked list for efficient cache management.
- Manage Plugins dialog list now supports Vim-style
j/knavigation keys for faster keyboard control.
- Allow post-operation refreshes to run by clearing VM pending state before triggering automatic data reloads after lifecycle actions.
- Removed potential password exposure from authentication debug logs.
- Fixed race condition in
AuthManager.GetValidToken()method with improved locking pattern. - Added HTTP request timeouts to all API methods (30-second default) to prevent indefinite hangs.
- BadgerDB goroutine leak fixed with proper cleanup channel for background garbage collection.
- Badger cache close routine is now idempotent to avoid
close of closed channelpanics during integration tests. - Lock file handling vulnerability fixed with proper PID validation to prevent cache corruption.
- File permissions in test files changed from 0o644 to 0o600 for better security.
- VM Action Protection System: Comprehensive protection mechanism to prevent VM actions while operations are pending
- Context Menu Protection: Lifecycle actions (start, stop, restart, delete, migrate) are hidden when VMs have pending operations
- Keyboard Shortcut Protection: Shell, VNC, and context menu shortcuts are blocked for VMs with pending operations
- Visual Indicators: Pending VMs show dimmed status with special indicators
- Menu Title Updates: Context menu titles show current pending operation status (e.g., "Guest Actions (Starting)")
- Snapshot Protection: Create, delete, and rollback snapshot operations are blocked while VMs have pending operations
- Configuration Protection: VM config editing and storage resizing are blocked during pending operations
- Migration Protection: Migration dialog is blocked for VMs with pending operations
- Refresh Protection: Individual VM refresh and global refresh are blocked while operations are pending
- Auto-Refresh Protection: Auto-refresh cannot be enabled while there are pending operations
- Helper Functions: Added
CanVMPerformActions()andGetVMPendingOperation()for easier pending state checking - Thread-Safe Operations: All pending state operations use proper mutex protection for concurrent access
- VM Pending State Timing: Fixed visual glitch where deleted VMs would briefly return to "normal" state before being removed
- Delete Operations: VMs now stay in pending state until refresh completes and they're removed from the UI
- Migration Operations: VMs stay in pending state until refresh shows them in their new location
- Consistent Behavior: All operations now maintain pending state until refresh operations complete
- Better User Experience: Users can see VMs remain in pending state until operations truly complete
- Core Dependencies: Updated key dependencies to latest versions
- github.com/stretchr/testify: bumped from 1.10.0 to 1.11.1
- github.com/rivo/tview: bumped to 0.42.0
- github.com/spf13/cobra: bumped from 1.9.1 to 1.10.1
- golang.org/x/term: bumped from 0.34.0 to 0.35.0
- github.com/gdamore/tcell/v2: bumped from 2.8.1 to 2.9.0
- Build Dependencies: Updated build and CI dependencies
- golang: bumped from 1.24.5-alpine to 1.25.1-alpine
- actions/setup-go: bumped from 5 to 6
- actions/checkout: bumped from 4 to 5
- VM Migration Code Organization: Moved migration-specific functions to dedicated file
- New File:
vm_migration.gocreated to house all VM migration functionality - Moved Functions:
showMigrationDialog()andperformMigrationOperation()relocated fromdialogs.go - Clean Separation: Migration logic now properly separated from general dialog functions
- Better Maintainability: Migration features can now be developed and maintained independently
- New File:
- Project Renamed to pvetui
-
Rename was necessary in order to remain compliant with Proxmox trademark
-
Old paths referencing
proxmox-tuimust be renamed topvetui. For example:mv ~/.config/proxmox-tui ~/.config/pvetui -
Additional migration steps:
- Update any shell aliases or scripts referencing the old binary name
- Update any systemd service files or cron jobs
- Update any documentation or bookmarks referencing the old project name
- Environment Variables: Change prefix from
PROXMOX_toPVETUI_(e.g.,PROXMOX_HOST→PVETUI_HOST)
-
Impact: This change affects configuration paths, binary names, environment variables, and all project references
-
- Multi-platform Package Distribution: Added comprehensive support for distributing pvetui through multiple package managers
- 32-bit builds: Add official 32-bit binaries by request in #25
-
Linux:
linux/386 -
Windows:
windows/386 -
Included in GoReleaser config and local Makefile release target
-
AUR Support: Complete Arch User Repository integration with automated PKGBUILD generation and management
-
Homebrew Tap: macOS and Linux distribution via Homebrew with automated formula updates
-
Scoop Bucket: Windows distribution via Scoop with automated manifest management
-
DEB/RPM Packages: Traditional Linux package formats automatically generated by GoReleaser
-
Docker Images: Multi-platform container images published to GitHub Container Registry
-
Orchestration Scripts: Unified management of all package managers through a single command interface
-
Automated Updates: Scripts to automatically update package definitions with new versions and checksums
-
Local Testing: Built-in testing and validation for all package formats before publishing
-
Makefile Integration: New targets for package manager operations (setup, update, status, clean)
-
Comprehensive Documentation: Complete guide covering setup, maintenance, and troubleshooting for all platforms
-
- README Updates: Fixed CLI argument conventions and improved documentation
- Updated all CLI examples to use correct double-dash format (
--configinstead of-config) - Added comprehensive CLI reference table with all available flags and short versions
- Fixed broken anchor links in navigation for better user experience
- Replaced problematic emojis with compatible ones for consistent anchor generation
- Updated project title to 'TUI for Proxmox Virtual Environment' for trademark compliance
- Added trademark disclaimer to clarify non-affiliation with Proxmox Server Solutions GmbH
- Enhanced demo section with both GIF (GitHub compatible) and WebM (high quality) options
- Fixed CLI examples throughout all documentation files for consistency
- Updated all CLI examples to use correct double-dash format (
- Guest name editing: Added ability to change QEMU VM names and LXC container hostnames from the config page
- QEMU VMs: Edit the "name" field which updates the VM display name
- LXC containers: Edit the "hostname" field which updates the container hostname
- Real-time title updates show the new name as you type
- Changes are saved to Proxmox and reflected immediately in the UI
- Input validation prevents invalid hostname characters (underscores, spaces, special chars)
- Validates hostname format (no leading/trailing hyphens, proper length limits)
- Fixed UI refresh issue with professional polling approach that verifies API changes before refreshing
- Added loading indicators during API propagation delay for better user experience
- Enhanced header component with ShowWarning method for better user feedback
- Refactored polling functionality into dedicated function for improved maintainability
- Fixed race condition by polling both config and cluster resources endpoints to ensure complete propagation
- Cross-platform config and cache paths: Added native support for Windows config/cache directories
- Windows: Config in
%APPDATA%/pvetui, Cache in%LOCALAPPDATA%/pvetui - macOS: Uses XDG-style paths (
~/.config/pvetui,~/.cache/pvetui) for consistency with other TUI applications - Linux: Maintains existing XDG support (
~/.config/pvetui,~/.cache/pvetui) - Maintains backward compatibility with existing XDG functions
- Environment variables still override platform defaults when set
- Windows: Config in
- Windows users only: Existing config files in XDG-style paths need to be moved to new platform-specific locations
- Windows: Move from
~/.config/pvetui/to%APPDATA%/pvetui/ - macOS/Linux: No changes required - existing paths continue to work
- The application will automatically use the new paths on first run after this update
- Windows: Move from
- Community Scripts: returning from installation no longer blanks the screen. The selector now closes before refresh and a brief post-resume delay ensures stable UI restore.
- Data Refresh: new containers/VMs created by community scripts are shown immediately without restarting. After install we trigger a hard refresh (cache cleared) and the manual refresh rebuilds the guest list from fresh cluster data.
- Header: eliminated brief spinner flash that could reappear after success/error messages.
- Manual Refresh stability: VM list now rebuilt strictly from cluster resources; filtering preserved across consecutive refreshes; removed VM details flicker and selection jump by stabilizing selection and suppressing programmatic callbacks during list rebuild.
- VM delete selection fallback: after deleting a VM, selection now moves to the first remaining VM and the details panel updates accordingly; clears details when the list becomes empty.
- Manual Refresh optimization: refactored complex refresh logic into separate functions for better maintainability; reduced UI update calls and improved incremental node enrichment; fixed regression where VM list would become empty after refresh due to enriched nodes not preserving VM data from original cluster resources.
- Guest power actions: Added Shutdown (graceful), Stop (force), and Reset (hard, QEMU-only) alongside Restart/Start in the guest context menu, with clear confirmations and shortcuts.
- Windows: Saving profiles could fail with "The system cannot find the path specified"
- Ensure config directory creation uses OS-agnostic path handling when saving from the config/profile wizards and menu actions.
- Fixes saving when adding/editing profiles and when setting default profile on Windows.
- Windows: Locally built binaries sometimes failed to start
- Align local Windows builds with release artifacts by disabling CGO and using baseline CPU target.
- Scoped compatibility flags to Windows/amd64 only to avoid affecting other platforms.
- UI: Reduce noisy page removal errors in logs
- Remove pages only when present to avoid benign "Failed to remove … page" errors.
- Profile Switching: Separate Active vs Default profile
- Introduced a non-persisted runtime
ActiveProfiledistinct from the persisteddefault_profilein config. - Switching profiles in the UI now updates only the active profile; the default indicator and config file are not overwritten.
- UI header shows the active profile, while the profiles menu star correctly marks the persisted default.
- Validation prefers the active profile when set, falling back to the default profile.
- Introduced a non-persisted runtime
- VNC Profile Switching: Fixed VNC sessions not updating when switching connection profiles
- VNC service now properly closes all existing sessions when switching profiles
- Ensures new VNC connections use the updated client connection
- Prevents VNC sessions from trying to connect to old servers after profile changes
- Maintains session management integrity across profile switches
- VNC Browser Opening on Linux: Fixed VNC connection issues when xdg-open is not available
- Added detection for missing xdg-open command before attempting to open browser
- Shows helpful error dialog with shortened VNC URL when browser cannot be opened automatically
- Implements URL forwarding system: shortened URLs (e.g.,
http://localhost:45167/vnc-forward) automatically redirect to full VNC sessions - Uses scrollable text area for long VNC URLs to prevent UI overflow and improve readability
- Improved dialog positioning and width to properly display long URLs without truncation
- Enhanced button focus and keyboard handling (Enter/Escape) for proper dialog dismissal
- Clarifies that the VNC server is still running and ready for connection
- Prevents confusing situation where VNC server starts but browser doesn't open
- Provides clear instructions for manual connection with the VNC URL
- Especially important for WSL and minimal Linux distributions that don't include xdg-open
- Config Wizard Theme Integration: Fixed config wizard to use the same theme colors as the main application
- Config wizard now applies custom theme configuration before setting tview styles
- Ensures consistent visual appearance between main app and config wizard
- Fixed input field colors to match the default theme (black instead of blue)
- Applied to both standalone config wizard and embedded profile wizard
- Config Wizard Loading Issues: Fixed config wizard to properly load existing configuration files
- Fixed config wizard to load from default locations (
~/.config/pvetui/config.yml) - Added profile resolution and application logic to config wizard flow
- Ensured both
--config-wizardflag andconfig-wizardsubcommand work consistently - Fixed issue where config wizard wouldn't load existing profiles when no config file specified
- Fixed config wizard to load from default locations (
- Profile Wizard Validation: Fixed profile wizard to properly recognize filled authentication fields
- Fixed profile wizard to create profile entries in memory for new profiles
- Ensured form fields and validation logic work with the same data structure
- Fixed validation to properly detect when password or token authentication is provided
- Resolved issue where profile wizard wouldn't recognize filled authentication information
- Profile Deletion Deadlock: Fixed deadlock when deleting connection profiles
- Removed nested
QueueUpdateDrawcalls that caused deadlocks - Fixed profile deletion modal to close properly after operation completion
- Used direct UI updates instead of queued updates to prevent deadlocks
- Ensured proper focus restoration after profile deletion operations
- Removed nested
- Shell Connection Deadlock: Fixed deadlock when opening shell to VM without IP address
- Added
showMessageSafefunction that doesn't useQueueUpdateDrawto avoid deadlocks - Updated shell functions to use
CreateErrorDialogfor errors andshowMessageSafefor info messages - Fixed issue where screen would flash without showing error message to user
- Provide clear error message explaining why connection failed and how to fix it
- Follow same pattern as VNC functions to ensure consistency and prevent deadlocks
- Added
- noVNC Extra Keys Display: Fixed broken 'extra keys' image display in embedded noVNC client
- Updated noVNC submodule from v1.6.0 to v1.6.0-11-g4cb5aa4 (11 commits ahead)
- Includes upstream fix for extra keys image display bug
- Resolves issue where extra keys button images would not display correctly
- Guest List Search Selection Mismatch: Fixed issue where selected item's details didn't match the selected item when searching/filtering
- Fixed programmatic selection not triggering VM/node changed callbacks
- Ensures details panel always shows correct information for selected item
- Applied to search filtering, selection restoration, and VM operations
- Resolves issue where details panel would show stale information after filtering
- showMessage Deadlock Prevention: Updated showMessage calls to use showMessageSafe to prevent deadlocks
- Fixed showMessage calls in button handlers, event callbacks, and goroutines
- Applied to VM config forms, snapshot operations, script selector, and connection profiles
- Prevents UI deadlocks when showing error messages from async operations
- Ensures consistent user experience without blocking the interface
- Cobra CLI Framework: Migrated from Go's standard flag package to cobra for enhanced CLI experience
- Much better help text formatting with proper descriptions and organization
- Environment variable support with automatic binding to
PROXMOX_*variables - Subcommand architecture for future extensibility (config-wizard subcommand)
- Professional CLI interface with improved error handling and validation
- Maintains 100% backward compatibility with existing functionality
- Task List Refresh: Automatically refresh tasks list when VM operations complete
- Ensures tasks created by VM operations are immediately visible
- Provides better visibility into operation progress and completion
- Applied to start/stop/restart operations
- Delete and migration operations already refresh tasks via manualRefresh()
- Data Refresh Issues: Improved data refresh after volume resize and snapshot rollback operations
- Volume resize now shows updated volume size immediately and displays the resize task
- Snapshot rollback now shows updated VM status and displays the rollback task
- Especially important for LXC containers that get shut down after rollback
- Extracted reusable
refreshVMDataAndTasksfunction for consistent behavior - Added 2-second delay to allow Proxmox API to update config data before refresh
- Prevents UI lockup by using non-blocking goroutine for delay
- VM Selection Preservation: Fixed selection jumping during pending operations
- Preserve selected VM by ID and node instead of index position
- Fixes issue where selected guest would change during pending status
- Ensures consistent user experience during long-running operations
- Applied to VM operations (start/stop/restart) and migration operations
- Makefile Cross-Platform Build: Fixed hardcoded GOOS/GOARCH in build target (#19)
- Now builds for host platform by default instead of forcing Linux/amd64
- Allows environment variable override for cross-compilation
- Enables native development on macOS, Windows, and other platforms
- Thanks to @unclesp1d3r for the detailed report and solution
- Go Install Documentation: Fixed incorrect installation instructions and improved macOS guidance (#20)
- Removed non-functional
go install @latestcommand (git submodule limitation) - Renamed misleading
install-remoteMakefile target toinstall-gofor clarity - Added macOS Gatekeeper warning in README with direct link to troubleshooting guide
- Updated troubleshooting documentation with correct installation methods
- Thanks to @unclesp1d3r for reporting macOS Gatekeeper issues
- Removed non-functional
- First-Run Configuration Issues: Fixed app failing to launch without config file (#21)
- Fixed bootstrap flow to handle config wizard before profile resolution
- Fixed profile resolution to not assume 'default' profile when no profiles exist
- Improved onboarding flow with clear user guidance after config creation
- Ensured --config-wizard flag and config-wizard subcommand work without existing config
- Maintained full SOPS functionality for encrypted configuration support
- Thanks to @BenRachmiel for the detailed bug report and reproduction steps
- Snapshot Management: Added comprehensive snapshot management for VMs and containers
- Full CRUD operations: create, delete, and rollback snapshots
- Proper API integration with Proxmox snapshot endpoints
- QEMU vs LXC support with VM state handling (QEMU only)
- Theme-consistent UI with proper keyboard navigation
- Escape key support for all dialogs and forms
- Proper handling of 'current' state display as 'NOW'
- Comprehensive error handling and user feedback
- Connection Profile Management: Added comprehensive profile management system for multiple Proxmox connections
- Profile switching, editing, and persistence with validation
- Automatic migration from legacy single-connection config
- Global Menu: Added comprehensive global menu with intuitive letter-based shortcuts
- Quit Confirmation: Added consistent quit confirmation dialog for both hotkey and menu with VNC session awareness
- Flexible Theming System: Added comprehensive theming support with automatic terminal emulator adaptation
- Semantic Color Constants: Centralized color management with semantic meaning across themes
- Terminal Theme Adaptation: Automatic adaptation to popular terminal themes (Dracula, Nord, Solarized, etc.)
- Configuration Options: Theme settings in config file with
use_terminal_colorsandcolor_schemeoptions - Documentation: Comprehensive theming guide with setup instructions for popular terminal emulators
- Zero Configuration: Works out of the box with most terminal emulators while maintaining semantic consistency
- Display Node Storage Pools: Added node storage pools to node details panel
- Added comprehensive custom theming support:
- Users can override all semantic UI colors via the config file (
theme.colors). - Supports hex codes, ANSI color names, and the special value
default. - All themeable color keys are documented in docs/THEMING.md.
use_terminal_colorsconfig option controls whether to use terminal palette or custom colors.- See docs/THEMING.md for full details and configuration examples.
- Users can override all semantic UI colors via the config file (
- Built-in themes: default, dracula, catppuccin-mocha, gruvbox, nord, rose-pine, tokyonight, solarized, kanagawa, everforest. Users can select a built-in theme with theme.name in the config and override any color.
- Interactive Config Wizard and Editor:
- Added a full-screen, interactive TUI wizard for creating and editing the main config file.
- Automatically launches on first run if no config is found, or can be invoked at any time with
--config-wizard. - Pre-fills fields from existing config, validates input, and provides clear error/success feedback.
- Supports both password and token authentication, and SOPS/age-encrypted configs with opt-in re-encryption.
- All onboarding and config editing flows now use consistent, user-friendly modals and prompts.
- Major Code Refactoring: Comprehensive refactoring to improve code organization and maintainability
- Split large UI component files into focused, single-responsibility modules
- Improved separation of concerns across all UI components
- Enhanced maintainability and testability while preserving all functionality
- Logger Architecture Improvements: Enhanced logging system with better error handling and circular import resolution
- Configuration Package Split: Modularized configuration management with separate profile and file operation modules
- UI Simplification: Removed redundant Global menu hotkey from footer display since Esc opens the global menu
- Node details panel and API now support displaying multiple storage pools per node, instead of only one. All storage pools are shown with usage stats and theming.
- FormButton Theming: Fixed FormButton styling to use proper theme colors instead of hardcoded tview.Styles colors, ensuring consistent appearance with other UI elements
- FormButton Refactoring: Refactored FormButton to embed a real tview.Button, providing proper button styling, behavior, and theme consistency
- FormButton Sizing: Fixed FormButton to properly size and center the button instead of taking up the entire width
- FormButton Alignment: Added configurable positioning options (center, left, right, custom) for FormButton alignment within forms
- GolangCI-Lint Configuration: Updated golangci-lint configuration to be compatible with newer versions, fixed GitHub Actions CI failures, and implemented conservative linting with zero errors while maintaining essential code quality checks
- Major Refactor: Split context menu, VM operations, and refresh logic into separate files for improved maintainability and DRYness.
- Improved form and modal UX, including better keyboard navigation and consistent input handling.
- Async feedback and pending state for all VM operations, including migration, with robust UI refresh and error handling.
- Robust selection restoration for both node and VM lists after refresh (fixes selection jump issues).
- Fixed linter/code-quality issues and removed duplicate or unused code.
- Updated and consolidated helpers for refresh and selection logic.
- All changes maintain code quality and pass all tests.
- Guest configuration editor: Edit CPU, memory, and description for both QEMU and LXC guests.
- Storage volume resize: Resize disks from the config editor, with robust filtering for resizable volumes only.
- Interactive First-Run Setup: Added user-friendly configuration wizard for new users
- Automatically detects when configuration is missing or incomplete
- Prompts users to create a default configuration file in the XDG config directory
- Embeds the configuration template directly in the binary for offline setup
- Provides clear, friendly messaging with proper spacing and visual indicators
- Supports both
.ymland.yamlfile extensions for configuration discovery - Eliminates the need for users to manually create configuration files or read documentation first
- Startup Connectivity Verification: Added comprehensive startup sequence with real-time feedback
- Tests network connectivity and authentication before loading the main interface
- Clear console progress messages showing each startup step (config loading, client initialization, connection testing, authentication verification)
- Intelligent error categorization with specific suggestions for different failure types
- Prevents users from waiting at "Loading..." screens when configuration issues exist
- Helpful error messages pointing users to the exact config file and suggesting fixes for connection or authentication problems
- Added a reusable custom FormItem (FormButton) for use in forms.
- VNC Connectivity: Fixed issue where VNC failed to connect when using SSH port forwarding (e.g., in VS Code). The noVNC client now uses a relative URL, allowing it to connect correctly through forwarded ports.
- Fixed: Auto-refresh countdown and periodic refresh now work correctly after a manual refresh or config edit. Enabling auto-refresh after a manual refresh no longer leaves the UI stuck in 'Refreshing...' state.
- Cleaned up auto-refresh logic: startAutoRefresh only starts ticker/goroutines if not already running, and toggleAutoRefresh only calls stopAutoRefresh when disabling.
- Fixed: Node details (kernel version, CPU model, load average, version) are now preserved after a manual refresh, matching auto-refresh behavior. Previously, these fields would disappear after manual refresh.
- Docker Image: Added
openssh-clientto support the shell feature.
- Configuration: The application now automatically discovers and loads the default configuration file (
config.ymlorconfig.yaml) from the XDG config directory (~/.config/pvetui/) without requiring the--configflag. - Search: Pressing
ESCin the search bar now clears the filter text in addition to closing the bar, providing a more intuitive, VIM-like experience.
- Docker: The Docker instructions have been completely revamped for clarity and correctness, now recommending
docker compose run --rm pvetuifor an improved user experience. - Robust selection restoration for both VM and Node lists after per-item and global refreshes. Selection is now always restored by name, not index, fixing issues with selection jumping to the top after refreshes.
- Configurable Key Bindings: Added support for customizing all major actions via the
key_bindingssection in the config file. - View Switching with Brackets: Changed default view switching keys to
](forward) and[(reverse) for better reliability across terminals. - Support for SOPS/age encrypted configuration files with automatic key lookup
.sops.yamlfor convenient encryption of config files with SOPS- Log message when encrypted config is decrypted
- NixOS LXC Container Support: Added automatic detection and proper shell access for NixOS containers
- Detects NixOS containers based on
OSTypeconfiguration ("nixos" or "nix") - Uses
pct execwith environment setup for NixOS containers instead of standardpct enter - Automatically sources
/etc/set-environmentif present for proper NixOS environment initialization - Maintains backward compatibility with standard LXC containers
- Enhanced user feedback showing "NixOS LXC container" vs "LXC container" during connection
- Comprehensive test coverage for all container types
- Detects NixOS containers based on
- Keybinding Reliability: Overhauled the keybinding system to correctly handle modifier keys (
Ctrl,Alt,Shift), fixing numerous issues with custom shortcuts. - Shell Connection Issues: Fixed VM shell connections that were failing due to broken QEMU guest agent approach.
- GitHub Workflow Fixes: Added
submodules: recursiveto all GitHub Actions checkout steps to properly handle noVNC submodule during builds. - Windows ARM64 Support: Added Windows ARM64 build target to both Makefile and GitHub release workflow.
- VM/Container Restart: Fixed 500 error when restarting VMs and containers by using correct
/status/rebootendpoint (both QEMU and LXC use this endpoint, not/status/restart) - CI Linting: Fixed golangci-lint configuration compatibility issues by migrating to v2 format
- Code Quality: Fixed variable shadowing issues in app initialization and cache tests
- Refresh VNC session
LastUsedtimestamp on all WebSocket proxy traffic to prevent unexpected timeouts
- Code Quality Workflow: Added
go vetto CI pipeline and development workflow for enhanced static analysis- New
make vettarget for running Go's built-in static analyzer - New
make code-qualitytarget combininggo vetandgolangci-lintfor comprehensive checks - CI now runs
go vetbeforegolangci-lintto catch additional issues early
- New
- noVNC Files Embedding: Fixed noVNC files to be properly embedded in compiled binary using Go's
//go:embeddirective instead of runtime filesystem access - Windows URL Truncation: Fixed VNC URLs being truncated in Windows browser address bar by replacing
cmd /c startwithrundll32 url.dll,FileProtocolHandlerto avoid command line length limitations
- VM/Container Migration: Added comprehensive migration functionality
- Context Menu Integration: Added "Migrate" option to VM context menu (accessible via 'M' key)
- Simplified Migration Dialog: Streamlined dialog matching Proxmox UI design
- Target node selection (shows only online nodes excluding current host)
- Smart migration mode defaults: "restart" for LXC, "online/offline" for QEMU based on VM status
- Clean confirmation dialog with migration summary
- Removed complex advanced options in favor of sensible defaults
- Enhanced API Implementation: Full migration API support with improved error handling
- POST to
/nodes/{node}/{vmtype}/{vmid}/migratewith detailed response logging - Support for both QEMU and LXC migration with type-specific parameters
- Smart defaults: online migration for running VMs, offline for stopped VMs
- LXC containers use "restart" migration parameter (restart=1) instead of online parameter
- Fixed LXC migration API compatibility by removing unsupported migration_type parameter
- Fixed LXC migration errors by using correct restart parameter for LXC containers
- Comprehensive error feedback with detailed API response logging
- Automatic validation of target node availability
- POST to
- Improved User Experience: Better feedback and error handling
- Detailed error messages with migration context (VM name, target, mode)
- API response logging for troubleshooting migration issues
- Asynchronous operation with progress feedback
- Automatic refresh after migration to show updated VM location and tasks
- Migration dialog with minimum height for better visibility on smaller terminals
- Consistent 2-second refresh delay matching other VM operations
- Manual refresh (R key) now properly refreshes tasks in addition to nodes/VMs
- Migration status visible in Tasks tab for monitoring progress
- Help documentation updated to include migration information
- Search Filter Persistence: Fixed issue where search/filtered lists would reset to unfiltered state during auto-refresh and after guest agent data loading
- Search filters now properly preserved across all refresh operations (manual, auto-refresh, and guest agent enrichment)
- Fixed key mismatch between search state storage and retrieval (was using lowercase strings instead of proper page constants)
- Initial data loading now respects existing search filters instead of always showing unfiltered data
- VM enrichment callback now preserves active search filters when updating with guest agent data
- Automated release script with full workflow automation
- Makefile integration for release commands
- VM/Container Deletion: Added delete option to VM/LXC context menu with confirmation
- Delete option available for all VMs and containers regardless of state
- Comprehensive confirmation dialog warns about irreversible data destruction
- Uses DELETE method on
/nodes/{node}/{type}/{vmid}endpoint as specified - Smart Running VM Handling: Detects running VMs and offers direct force deletion
- Simplified Approach: Uses force deletion directly for running VMs (no stop-and-delete)
- Force Delete Options: Supports force deletion with
force,destroy-unreferenced-disks, andpurgeparameters - Cache Invalidation: Clears API cache after deletion to ensure VM is removed from list immediately
- Delayed Refresh: Waits 3 seconds after deletion before refreshing to allow server processing
- Proper error handling and success feedback with status messages
- Automatic VM list refresh after successful deletion
- Specialized delete operation handler that refreshes entire VM list instead of trying to refresh deleted VM
- Enhanced VM Operations: Improved all VM operations (start/stop/restart) with auto-refresh
- Cache Invalidation: Clears API cache after each operation for fresh state data
- Delayed Refresh: Waits 2 seconds after operations before refreshing VM data
- DRY Implementation: Unified approach across all VM operations for consistency
- Targeted Refresh: Uses VM-specific refresh to preserve selection and context
- Immediate success feedback with automatic state updates
- Cluster Tasks Page: New dedicated page for viewing recent cluster tasks
- Access via Tab navigation or F3 key
- Shows task history with timestamps, status, duration, and details
- Automatic sorting by newest tasks first
- Colored status indicators (green for OK, red for errors, yellow for running)
- Friendly task type formatting (e.g., "VM Start" instead of "qmstart")
- Auto-refresh integration when tasks page is active
- Comprehensive task type support for VMs, containers, backups, and system operations
- VM Operations: Start, Stop, Restart, Shutdown, Reset, Reboot, Create, Delete, Clone, Migrate, Restore, Template
- Container Operations: PCT and LXC variants (Start, Stop, Create, Delete, etc.)
- System Operations: APT Update/Upgrade, Service management, Image operations, File transfers
- Legacy LXC: vzcreate, vzstart, vzstop, vzdestroy and other vz* operations
- Search Filtering: Full search support with
/key activation- Real-time filtering across task ID, node, type, status, user, and UPID
- Search state preservation during auto-refresh operations
- Integrated with existing search system used by Nodes and Guests pages
- TUI Suspend/Resume Issue: Fixed critical issue where users couldn't return to TUI after script installation or SSH sessions
- Added
app.Sync()calls afterapp.Suspend()to properly restore terminal state - Resolves the problem where "Press Enter to return to the TUI..." would not work
- Applied fix to both script installation and SSH shell functionality
- Based on known tview issue where terminal state doesn't restore properly after suspension
- Users can now successfully return to the application after all suspend operations
- Added
- Unified Logging System: Fixed all packages to use unified log file instead of separate log files
- Implemented global logger system that all packages (scripts, VNC services, etc.) now use
- All components now log to the same
pvetui.logfile in the configured cache directory - Eliminated multiple log files being created in current directory (scripts, VNC components)
- Proper cache directory initialization ensures consistent logging location across all packages
- Press Enter to Return: Re-implemented "Press Enter to return to TUI" functionality for both script installation and SSH sessions
- Users can now see complete script output and error messages before returning to the application
- Status messages show success (✅) or failure (❌) with clear feedback
- Applied to all SSH session types: node shells, LXC containers, QEMU VMs, and guest agent shells
- Maintains the working suspend/resume pattern while providing better user control
- Allows users to troubleshoot issues or verify successful installations before continuing
- Community Script Selector UI: Converted from modal to full-page view for better usability
- Provides more screen real estate for script browsing and selection
- Improved responsive layout that adapts to terminal size
- Better integration with the overall application navigation flow
- Community Script Search: Added search functionality to the script selector
- Real-time search filtering as you type in the search input field
- Searches across script names, descriptions, and types (container/VM)
- Press
/orTabto activate search mode from the script list - Press
Escapeto clear search and return to full script list - Press
EnterorTabto move from search field back to script list - Maintains all existing navigation (hjkl, arrows, backspace to go back)
- Filtered results update instantly and preserve selection behavior
- Backspace now closes the script details page in the script selector (same as Escape) for faster navigation.
- Release process now fully automated from changelog to GitHub release
- Guest data loading indicator on app startup
- Enhanced VM details panel with network interface and storage configuration
- Quit confirmation for active VNC sessions
- Auto-refresh functionality with 'A' hotkey toggle (10-second interval)
- Always-visible status indicators in footer (VNC sessions and auto-refresh status)
- Workflow testing integration in Makefile with targets for local CI testing
- Build tags for examples to prevent linting conflicts
- VM selection and search filter preservation during operations and refreshes
- VM operations (start/stop/restart) now preserve selected VM position even when status changes
- Search filters remain active after VM operations and manual refreshes
- Startup enrichment process preserves user's VM selection if they navigate during loading
- Selection tracking by VM ID and node instead of list position prevents losing selection when VMs move due to status sorting
- Auto-refresh cache bypass for real-time performance data updates
- Node list ordering consistency during auto-refresh operations
- Manual refresh (R hotkey) VM selection preservation using correct sorted slice
- Logger test panic with nil pointer dereference handling
- Config integration tests with proper environment variable isolation
- Boolean field merging logic in configuration file processing
- Container runtime prioritization (Podman first, Docker fallback)
- Network interface display layout in VM details
- Storage configuration display layout
- Footer layout with right-aligned status indicators
- Consistent node list sorting (alphabetical by name)
- Test infrastructure with comprehensive fixes and improvements
- Concurrent VNC Sessions: Support for multiple simultaneous VNC connections
- Session management system allows connecting to multiple VMs and nodes simultaneously
- Each VNC session runs on its own dedicated port with independent WebSocket proxy
- Automatic session tracking with unique identifiers and metadata
- Real-time session count display in footer (e.g., "VNC:3" for 3 active sessions)
- Smart session reuse - connecting to the same target returns existing session
- Automatic cleanup of inactive sessions after 24 hours of inactivity
- Session lifecycle management with proper resource cleanup on application exit
- Backward compatibility maintained with existing VNC functionality
- noVNC Git Submodule Integration: Replaced manual noVNC file copying with git submodules
- noVNC client now managed as a git submodule from official repository (v1.6.0)
- Easy updates to new noVNC versions with standard git commands
- Improved maintainability and version tracking
- Added comprehensive documentation for submodule management
- Requires
git clone --recurse-submodulesfor new installations - Migrated from embedded filesystem to direct filesystem serving for better flexibility
- VNC Session Auto-Disconnect: Removed automatic 30-minute session timeout
- VNC sessions now remain active for 24 hours instead of 30 minutes
- Cleanup process runs every 30 minutes instead of every 5 minutes for efficiency
- Sessions are only cleaned up when truly inactive for extended periods
- Prevents unexpected disconnections during long VNC sessions
- VNC Session Count Update Delay: Implemented real-time session count updates
- Added callback system for immediate UI updates when sessions are created or removed
- Session count now updates instantly when browser tabs are closed (within 5 seconds)
- Reduced polling interval from 30 seconds to 5 seconds as backup mechanism
- UI footer now reflects accurate session count without delays
- Improved user experience with responsive session management
- VNC Session Timeouts: Fixed VNC connections disconnecting after 20-30 seconds
- Increased WebSocket proxy timeout from 30 seconds to 30 minutes for long-lived VNC sessions
- Removed HTTP server read/write timeouts that were terminating WebSocket connections
- Added WebSocket ping/pong keepalive mechanism with 30-second intervals
- Enhanced connection stability with proper deadline management and error handling
- VNC sessions now remain active during periods of user inactivity
- Improved logging for connection lifecycle and timeout debugging
- VNC Session Management: Enhanced session lifecycle and client disconnect detection
- Added real-time client connection/disconnection tracking for accurate session state
- Implemented immediate session cleanup when browser tabs are closed
- Fixed session reuse issues where reconnecting after browser close would fail
- Added session state management (Active, Connected, Disconnected, Closed)
- Sessions now properly detect and handle client disconnections
- Improved session reuse logic to prevent "connection is closed" errors
- Added 5-second grace period for reconnections to prevent premature cleanup
- Fixed session count accuracy: Disconnected sessions are now properly removed after grace period
- Fixed stale VNC ticket reuse: Sessions are completely removed instead of reused with expired tickets
- Reduced excessive logging: VNC session monitoring reduced from 2-second to 30-second intervals
- Improved logging efficiency: Session count only logged when it changes, not continuously
- Unified Logging System: Fixed all packages to use unified log file instead of separate log files
- Implemented global logger system that all packages (scripts, VNC services, etc.) now use
- All components now log to the same
pvetui.logfile in the configured cache directory - Eliminated multiple log files being created in current directory (scripts, VNC components)
- Proper cache directory initialization ensures consistent logging location across all packages
- Eliminates confusion from multiple log files and significantly improves debugging experience
- Embedded noVNC Client: Revolutionary VNC console access without requiring Proxmox web UI login
- Self-contained noVNC client embedded directly in the application
- Automatic authentication handling for both API token and password authentication
- WebSocket reverse proxy bridges noVNC client to Proxmox VNC websocket endpoints
- One-time password generation and automatic connection establishment
- Local HTTP server hosts noVNC client on dynamically allocated ports
- Supports QEMU VMs, LXC containers, and node shell sessions
- No browser session management or manual authentication required
- Enhanced security with automatic session cleanup and timeout handling
- Implementation inspired by community solution from Proxmox Forum discussion
- Authentication Handling: Improved VNC authentication to work correctly with both QEMU VMs and LXC containers
- VNC User Experience: Removed outdated VNC warning modal since embedded client no longer requires Proxmox web UI login
- Comprehensive VNC Logging: Added detailed logging throughout VNC components for better debugging and monitoring
- API call logging with request/response details and authentication methods
- WebSocket proxy logging with connection status, message counts, and error tracking
- HTTP server logging with port allocation, startup/shutdown, and file serving
- Service-level logging with connection attempts, status checks, and browser launching
- Proxy configuration logging with authentication token types and endpoint details
- Message-level debugging for WebSocket communication (configurable verbosity)
- Configuration Realm Handling: Fixed critical bug where config file realm setting was ignored
- Configuration files now properly merge the
realmfield from YAML config - API authentication now uses correct realm (e.g., 'pve' instead of defaulting to 'pam')
- Resolves authentication failures when using non-PAM realms with API tokens
- Ensures proper authentication for all Proxmox API operations
- Configuration files now properly merge the
- Node VNC Shell Access: Resolved node VNC shell functionality by removing unsupported generate-password parameter
- Node shells now properly authenticate using VNC ticket as password
- Fixed API compatibility issues specific to node shell VNC endpoints
- Improved error handling and user feedback for node VNC operations
- VI-like Navigation: Added comprehensive hjkl key support throughout the interface
h= left/go back,j= down,k= up,l= right
- Node Storage Display: Fixed node details showing "0.00 GB" for storage values
- Resolved inconsistent storage units between cluster and individual node data
- Node storage values now consistently stored in GB (converted from bytes)
- Storage percentages now display with correct used/total GB values
- Maintains consistency with cluster resource processing
- Internal alpha version with basic functionality.