Skip to content

v1.2.4.1-beta

Pre-release
Pre-release

Choose a tag to compare

@MacRimi MacRimi released this 17 Aug 10:02
· 5 commits to main since this release

ProxMenux logo ProxMenux v1.2.4.1-beta

A wide beta cycle. The ProxMenux Monitor now speaks eight languages, the NVIDIA driver installer gets a full rewrite that cross-checks kernel + branch + GPU model before recommending a version, the VM & LXC modal opens instantly on any tab reopen, the Network Flow diagram renders Linux bonds with live active-slave state, VM disk usage is finally accurate on QEMU guests through the guest agent, and a new external Actions API exposes host power, safe PVE update and self-update for Home Assistant / Ansible integrations. Plus fixes for scheduled PBS backups, PVE webhook delivery from remote nodes, the vzdump 60-second cliff, SMART scheduled tests, the Log2RAM safety net, HDD standby, firewall behaviour on PVE 9 and more.

🌐 Monitor is now multilingual — 8 languages

  • The ProxMenux Monitor dashboard, modals and menus are available in English, Spanish, German, French, Italian, Portuguese, Swedish and Slovak. Language follows the browser preference by default and can be switched from Settings.
  • Huge thanks to @vaso73 for building the i18n scaffolding that made this possible — every subsequent locale was slotted on top of that structure.

🟢 NVIDIA driver installer — kernel + branch + GPU-aware version picker (#298)

  • The version picker now cross-checks three signals before offering a driver: the running kernel (existing floor by kernel major/minor), the branch classification NVIDIA itself publishes as Production Branch, New Feature Branch or Legacy GPU version on their Unix drivers page, and the PCI Device ID of every NVIDIA GPU detected on the host.
  • Branch classification is scraped from nvidia.com/en-us/drivers/unix/ (Production / New Feature / Legacy heads) into a local 24 h cache. Branches endorsed there always pass; superseded production branches still receiving bugfix releases (580, 570, 550, 535 …) are accepted when they carry at least five CDN releases, which cleanly separates them from short-lived Vulkan-beta / developer branches (590, 565, 530 … with 1-4 releases) that get dropped.
  • GPU compatibility is checked against each branch's README/supportedchips.html, cached per branch major (24 h). A host with a Kepler card only sees the 470 legacy branch; a modern Turing / Ampere / Ada / Blackwell card sees every branch NVIDIA still ships driver builds for. Every check fails open — a network hiccup never empties the picker.
  • Recommended version now follows a three-tier priority so the picker matches what the Monitor's Hardware card already promised: if a driver is installed, the highest bugfix in the same branch is the default (a 580.159.04 host installing the update lands on 580.178.04, exactly what the "v580.178.04 available" badge announced); a fresh install defaults to the Production Branch head; and the fallback is the highest numeric available. Cross-branch upgrades (e.g. 580 → 595) stay one row away in the list but never happen automatically.
  • The Hardware card also now shows the installed driver version alongside "vX available" (previously it only surfaced the available side once an update existed), so the current vs. target comparison is visible at a glance without opening the installer.
  • The legacy latest.txt ceiling that hid every version above the CDN's global latest is gone — it lagged the Production Branch head and masked the New Feature Branch head too. The four gates above already narrow the list to safe candidates without an artificial cap.

🔗 Network Flow — Linux bond support (#262)

  • The Network Flow (PoC) widget now draws a Linux bond (bond0) as an intermediate node between its physical slaves and the Proxmox host, instead of showing the NICs connected straight to the host.
  • Active/standby state is read fresh on every poll from the bond's active_slave — a failover flips the labels on the next refresh, never pinned to a specific NIC. The distinction is only shown for active-backup; in 802.3ad and the balance-* modes every slave transmits, so slaves render as equal members.
  • A slave whose per-slave MII link is down renders greyed out and distinct from a healthy standby.
  • Bond detection uses /sys/class/net/<x>/bonding rather than the bondN name, so custom-named bonds work. As part of the same pass, bridge-uplink detection for renamed NICs (e.g. nic0) and VLAN ports (bond0.10) was fixed — both previously resolved to nothing.

⚡ VM & LXC modal — no more "Loading…" between opens

  • Every tab of the VM/LXC modal (Configuration, Backups, App, Updates, Mount points) fired a fresh backend call on every open. Reopening the same guest re-paid all the latency and the tabs flashed "Loading…" every time. The problem grew with each new tab that landed since the modal was single-purpose.
  • Backend — per-vmid TTL cache added for the four heavy endpoints: /api/vms/<vmid> (60 s), /api/vms/<vmid>/backups (30 s), /api/vms/<vmid>/apps (60 s), /api/vms/<vmid>/schedule (120 s). Cache is invalidated on write actions (create backup, control start/stop, edit description, add/edit/delete/check/dismiss apps, edit/delete schedule) so the client never sees stale data after its own action.
  • Frontend — a per-vmid ref cache seeds every reopen from the last-known payload instantly. The modal renders with real content while a fresh fetch revalidates in the background.
  • Prefetch on hover — hovering a guest card on desktop fires the fetches in the background, so by the time the user clicks the cache is already primed and the modal opens with no loading state at all.

📦 LXC Updates — full flow rollout (#281, inspired by discussion #206 from @agarmoli)

Thanks to @agarmoli for sharing the original design idea in discussion #206 — seeing at a glance which LXCs have pending updates and acting on them straight from the dashboard, without opening each guest by hand. That request seeded both the Updates tab in the VM/LXC modal and the combined "Apply OS + " button that now anchors this flow.

  • New Updates tab in the VM/LXC modal, positioned alongside Status | App | Updates | Mounts | Backups | Firewall — the flow the user actually walks, not the historical ordering. Shows OS package status, tracked-app version state and any restart-required flag for the CT in a single view.
  • Combined "Apply OS + " button — a single guided pass runs the OS package update and the application's own updater. Only surfaces when the tracked-apps list includes an app whose helper_slug matches the CT's helper and that entry has an installed_version or a resolved update_available state, so it never offers to update something the user hasn't registered. Detected-but-not-registered apps show Register/Hide in the App tab; apps registered from the catalog picker for their weblink alone (no update check has run yet) don't get a combined button either.
  • The Updates tab refreshes its state immediately after Apply, so the "Up to date" transition is visible without reopening the tab.
  • Restart-required flag persists across refreshes and reboots via installed_tools.json, so a CT waiting for a reboot after a kernel/package update no longer loses that state.
  • Community-scripts helper CTs are recognised (via HELPER_SLUG env). When the CT has no /usr/bin/update, the update runs inside the CT with pct exec + PHS_SILENT=1 and no TTY, so build.func picks the correct update_script path silently.
  • App editor gained the missing i18n strings; the Options card contrast in edit mode matches the App tab convention.

📦 VM & LXC backup — no more 60-second cliff (#295)

  • The /api/vms/<vmid>/backup endpoint (used by the "Backup" modal on both VMs and LXCs) wrapped pvesh create ... vzdump ... in subprocess.run(timeout=60). Any backup that took longer than one minute got SIGKILLed mid-write — pvesh and the child vzdump share a process group, so the whole task died. PVE logged interrupted by signal, and orphan .tar.dat files plus vzdumptmp directories accumulated in the dump storage.
  • The backend now spawns pvesh in its own session, waits up to 10 seconds for the UPID line to appear on stdout, and returns it to the frontend immediately. The vzdump continues in the background until it finishes on its own — no HTTP timeout involved, so a 30-minute PBS backup works the same as a 10-second local one. If pvesh fails fast (bad vmid, invalid storage, permission error) the real error surfaces as before.
  • If your dump storage still has .tar.dat files with no matching .tar.zst, those are the aborted runs from before this fix — safe to delete manually.

🔐 PVE webhook notifications — remote delivery now works (#294)

  • Two bugs stacked on top of each other kept every PVE webhook delivery from a remote cluster node stuck on 401, even after a clean setup. Both are fixed.
  • Secret sync: setup_pve_webhook_core wrote the secret line of /etc/pve/priv/notifications.cfg indented with 8 spaces instead of a tab. PVE parses those files tab-strict, so the line was silently ignored and PVE never sent the X-Webhook-Secret header, no matter what setup wrote to SQLite. Fixed — the priv block now uses the same \t indent as the endpoint block.
  • Timestamp header: the anti-replay Layer 3 required X-ProxMenux-Timestamp, but PVE's webhook notification target has no mechanism to inject dynamic custom headers, so remote deliveries always failed with missing_timestamp. The endpoint template registered with PVE already embeds "timestamp":"{{ timestamp }}" in the body, so the receiver now accepts the body timestamp as a fallback when the header is absent. Layer 4's replay cache still binds every accepted request to (timestamp, raw_body), so the anti-replay guarantee is unchanged.
  • The except Exception: pass that used to swallow failures writing the priv config was reporting configured: true while PVE had no valid secret — the caller now sees the actual error and can flag the setup.

🔀 Network Flow — respects the Bits/Bytes preference (#285, requested by @MrCaringi)

  • The Network Flow diagram now honors Settings → Network Units (Bytes / Bits) on every rate label — host, bonds, bridges and each VM/CT. Previously it always rendered in MB/s while every other network card and chart already respected the toggle.
  • Bits use the standard networking scale (Kb/s, Mb/s in base 10) so the reading matches how NIC link speeds and other charts are labelled.
  • Toggling the setting redraws the diagram immediately; the underlying rate thresholds that drive the pulse animation are unchanged.

🗄 Scheduled PBS backups — certificate fingerprint fallback (#263)

  • Scheduled backups to a PBS destination configured only through ProxMenux (not in /etc/pve/storage.cfg) failed on every run: without a fingerprint, proxmox-backup-client refuses the TLS handshake. The scheduled path now falls back to the ProxMenux fingerprint sidecar, and the same fallback was added for the password.
  • Adding a PBS destination from the scripts now fetches the server's certificate fingerprint automatically and asks the user to confirm it (trust-on-first-use) before saving — previously only the Monitor's web form captured it.
  • The install wizard persists PBS_FINGERPRINT in the job .env instead of discarding it, and the API resolves it automatically when the caller doesn't supply one.
  • All job .env values written from the API are now shell-quoted. An unquoted ON_CALENDAR broke on source, and — more importantly — a password containing shell metacharacters ($(...), backticks) was executed when the runner sourced the file as root.
  • proxmox-backup-client fails closed on a missing fingerprint (it does not silently auto-accept the certificate); the impact was availability, not an MITM exposure. A misleading code comment stating otherwise was corrected.

💤 Monitor no longer wakes HDDs from standby (#232)

  • The earlier fix covered the background pollers but missed the on-demand paths. The Storage view's per-disk smartctl -a — run on every /api/storage poll once its 30 s cache expired — kept re-waking parked drives whenever the dashboard was open. It now checks the drive's power mode first (a probe that does not spin the disk up) and skips the read when the disk is asleep.
  • A second, previously-unaddressed cause: the LVM tools (pvs, lvs, vgs) scan every block device by default and spin up standby HDDs. They are now scoped with --devices so they never touch a parked disk. Hosts with LVM but no sleeping disks are unaffected.
  • A parked disk shows the blue Standby badge in the Storage view and its temperature returns automatically once it wakes through normal use. Opening a disk's SMART detail still wakes it — that is intentional.

🛡 Log2RAM emergency cleanup — safer pveproxy log handling (#296)

  • The Log2RAM auto-sync script (/usr/local/bin/log2ram-check.sh) truncates pveproxy/access.log, pveproxy/error.log and pveam.log when /var/log gets close to full. The truncate now checks that each file exists first, so the cron path can never accidentally create an empty log file with root:root ownership — pveproxy runs as www-data and needs those exact files to be writable by www-data or it can't reopen them on the next restart.
  • install_log2ram_auto bumped to v1.4; the post-install update detector surfaces it so anyone with a previous version gets prompted to reapply.

🧩 Post-install update detector — Log2RAM & Network Optimization

  • Log2RAM and Network Optimization never appeared as updatable even when an older version was installed. The version parser truncated a function's body at the first } in column 0, which for these two tools fell inside an embedded logrotate heredoc — before the register_tool call — so they were never registered.
  • The parser is now heredoc-aware and detects every registered tool in both post-install scripts. Both the Monitor's update list and the bash menu (which read the same scan) now surface these updates.

🩹 Installer — typo (#264)

  • Fixed "Cloning ProxMenux repositoryy.""Cloning ProxMenux repository." in install_proxmenux.sh.

🛡 Firewall — Monitor port opened automatically, apply path fixed on PVE 9

  • Enabling the host firewall from the Monitor's Security panel now guarantees that the ProxMenux Monitor port (8008) has an ACCEPT rule in host.fw before the firewall becomes active. The rule is placed first and only then is enable: 1 written; if the rule can't be added, the enable is refused rather than proceeding. This preserves access to the UI for the very session that just activated the firewall.
  • All mutating firewall calls now actually apply on PVE 9. pve-firewall 6.x (shipped with PVE 9) removed the reload subcommand — security_manager.py used pve-firewall reload in every enable/disable/add/remove/update path, and each call silently no-op'd against the kernel ruleset. A new _pve_firewall_apply() helper tries reload first for backward compatibility with older PVE and falls back to restart when the subcommand is missing, so every rule change reaches iptables/nftables consistently across PVE 8 and PVE 9.

🩺 SMART scheduled tests — /dev/ prefix in cron entries (#267)

  • Scheduled SMART tests created from the Monitor now run on every selected disk. The cron generator emits --disks '/dev/sdb,/dev/nvme0n1' instead of bare basenames, and the runner script smart-scheduled-test.sh normalizes any legacy cron entries (--disks 'sdb') on the fly to /dev/sdb — so pre-existing broken schedules start executing on the next scheduled tick after the update without having to be recreated. Both the block-device check and the per-disk history directory now line up with the value written to cron.

⏱ Backup runner — actionable error when a lock is held

  • When the scheduled backup runner (run_scheduled_backup.sh) can't take its flock, it now writes an explanatory log entry with the lock path, the two likely causes (a run still in progress, or a stale lock from a hung run) and the commands to diagnose and clean up. The Monitor's poll picks up the log on the next tick and shows the reason in the UI, ending the previous "Waiting for runner to start…" state that persisted indefinitely when the runner exited before creating its log. Log and status files are created before the lock attempt so every failure path leaves an audit trail.

🔐 Backup runner — safe env parser instead of source (#266)

  • The runner now reads its job .env with a hardened line-by-line parser instead of source-ing it as bash. A .env is data (credentials + schedule + retention), not code — but a raw source would treat any value with whitespace as "assign the first token, then execute the rest as a command". A legacy job with ON_CALENDAR=*-*-* 01:00:00 (the canonical systemd form) hit exactly this: the runner exited with 01:00:00: command not found before any backup work started and left the Monitor UI stuck on "Waiting for runner to start…". Sourcing also failed loudly under set -u when a value contained a bare $word, and — worst case — a password with $(...) or backticks would have executed as root at source time.
  • The parser accepts every writer format currently on disk: shlex.quote()-style surrounding quotes (API), printf %q backslash escapes (CLI), and legacy unquoted values (older ProxMenux). Command substitution ($(...), backticks) is refused outright and the value is taken as a literal instead of being evaluated. Values that pass parsing land in the shell as exported variables exactly as they used to under source, so the rest of the runner didn't need to change.

💾 VM disk usage from the QEMU Guest Agent (#268)

  • The dashboard now reports real used / total disk figures for QEMU VMs by asking the guest agent (qm guest cmd <vmid> get-fsinfo) whenever one is responsive, instead of relying on the disk field of pvesh cluster resources — which reports 0 for most QEMU storage backends because PVE has no visibility into the guest filesystem.
  • The aggregator handles the awkward shapes real guests produce: read-only image roots (Home Assistant OS / on erofs, container / distroless systems on squashfs) are skipped, and the persistent data mount (/mnt/data, /volume1, C:\, …) carries the value. Bind-mounts to the same underlying device are deduplicated so a HAOS layout with a dozen bind-mounts of /mnt/data is counted once. Ram-backed pseudo-filesystems (tmpfs, devtmpfs, zram, ramfs), kernel virtual mounts (proc, sysfs, cgroup*, overlay, autofs, …), Windows System-Reserved partitions of size 0 and CD-ROM images (CDFS, iso9660, udf) are all filtered out. Multiple large writable filesystems on the same VM (Synology-style layouts with several btrfs volumes, Windows guests with C:\ + D:\) are summed. Windows partitions of size 0 that share the underlying \\.\PhysicalDrive with the real C:\ no longer suppress C:\ from the total — the deduplication key is only registered once a mount with usable size is confirmed.
  • A background daemon greenlet refreshes the values off-request every 60 s with bounded parallelism (ThreadPoolExecutor(6)), so /api/vms and the Health Monitor check only ever do a dict lookup — no qm guest cmd subprocess ever runs inside a request handler. The endpoint returns to its previous sub-millisecond latency, and a slow / broken guest agent can't stretch the response time. Cache entries older than 300 s are discarded, and entries for VMs no longer running are evicted at the next cycle. When the algorithm can't produce a value (no agent, agent unresponsive, all filesystems filtered out) the original PVE-reported value is kept — the fix is strictly additive: no VM that used to report a number will now report worse data.
  • Validated end-to-end against seven real-world profiles: Home Assistant OS (twice), a Synology-style multi-btrfs guest, Linux with and without agent, Windows 10 and Windows 11 — every case either produces an accurate number or falls back cleanly to the previous behaviour.

🚨 Low-disk-space notifications now cover QEMU VMs

  • The Health Monitor now emits vm_disk_low alerts for running QEMU VMs whose guest-reported filesystems cross the configured thresholds (defaults 85% warning / 95% critical, aligned with the existing lxc_rootfs check). Sibling of the LXC rootfs alert that ProxMenux has always had — parity closed, VMs and containers now get the same coverage.
  • Metric matches the dashboard: the check reads the same aggregate that populates the Disk column in the VMs & Containers view, so the number shown on the card is exactly the number that decides whether an alert fires. PCI-passthrough drives are included by design — a TrueNAS VM whose ZFS pool crosses 85% legitimately fires the alert even though the PVE-known virtual disk is a tiny boot volume; the metric is "how full is the guest", not "how full is the disk PVE knows about".
  • New Settings section — vm_disk — per-user thresholds via Settings → Health Thresholds, independent from the LXC counterpart so each entity can be tuned separately. Dismiss flow, per-event opt-out, notification cooldown, cache-invalidation-on-dismiss all inherited from the existing storage category.
  • VMs without a responsive agent are silently skipped — no false OK, no false alert. The check reuses the 60 s / 30 s guest-agent cache so it's essentially free when the dashboard is polling /api/vms.

🧹 Uninstall menu robust to legacy boolean registry entries (#272)

  • The Uninstall Optimizations menu now opens cleanly on hosts whose installed_tools.json still carries legacy boolean values — an entry stored as a bare false from an old ProxMenux version (or a mixed registry that grew across upgrades) used to abort the whole jq filter with Cannot index boolean with string "installed", leaving the user with an empty menu even when several tools were still installed. The filter now uses the optional accessor .installed?, so any non-object value is safely treated as "not selectable" and the rest of the registry is enumerated normally. Both the current object shape ({"installed": true, "version": "…"}) and the legacy shape (true) continue to match; anything else is skipped.

🌐 Safe update — reachability check now uses HTTPS instead of ICMP (#271)

  • The pre-flight connectivity check in update-pve-safe.sh now probes https://download.proxmox.com with curl -sfI instead of pinging it over ICMP. Hosts behind firewalls or cloud-provider security groups that filter ICMP but allow HTTPS 443 (typical corporate / enterprise setups) no longer see the update abort on a false negative — the check now measures the same transport apt-get update will use, so if the HEAD succeeds the actual update will succeed too. Two attempts one second apart absorb transient network glitches without adding perceptible latency when the network is healthy. The error message now names the URL, port and the three most likely causes to check ("Cannot reach https://download.proxmox.com (HTTPS 443). Check network, proxy or DNS."), instead of the previous opaque "Cannot reach Proxmox repositories".

🎯 Actions API — external automation catalogue (#270)

  • New official REST catalogue for the same operations the Monitor UI and shell menu already run, aimed at Home Assistant, Homepage, Ansible, custom dashboards and any other automation that needs to reach into the host over HTTP. Grouped and documented in a new System actions section of the API reference, with common response shape, curl examples and a ready-to-paste Home Assistant snippet (rest sensor + rest_command service).
  • New system-level endpoints — long-running operations that live in their own transient systemd unit, so they survive the Monitor process (critical for the self-update path where the installer restarts proxmenux-monitor mid-way). Each pairs a POST trigger with a GET .../status for polling, plus a DELETE where cancellation is meaningful:
    • POST/GET /api/system/power/reboot(/status) — host reboot.
    • POST/GET /api/system/power/shutdown(/status) — host power off. Wires cleanly to a UPS-triggered shutdown effect.
    • POST/GET/DELETE /api/system/pve-update/run(/status) — the safe PVE update flow, same script the Update Now dashboard button runs.
    • POST/GET /api/proxmenux/self-update/run(/status) — updates ProxMenux itself by piping the canonical installer.
  • Existing VM / LXC endpoints promoted to the catalogue — the actions the VM & LXC modal has always exposed are now documented as first-class integration points instead of hidden UI plumbing:
    • POST /api/vms/<vmid>/control with {"action": "start|stop|shutdown|reboot"} — VM and LXC alike.
    • POST /api/vms/<vmid>/backup with {storage, mode, compress, protected, notes, notification, pbs_change_detection} — creates a vzdump backup to any PVE storage.
    • GET /api/vms/<vmid>/backups — list previous backups.
  • Two shapes on purpose: system-level actions take minutes and follow an async pattern (POST + GET .../status + DELETE) with an in-memory last-state cache that preserves the exit code / result / timestamps of the last run even after the transient systemd unit is reclaimed. VM/LXC actions are fast (seconds) and stay with the fire-and-return sync pattern the Monitor UI already uses.
  • Authentication is unified with the rest of the API: mutating routes require a token with full_admin scope (session tokens or long-lived API tokens created from Settings → Access → API Tokens); the read-only .../status routes accept any authenticated caller. A second POST while a run is in flight correctly returns 409 Conflict, and cancelling with DELETE snapshots the state as cancelled (exit_code=15, result=signal) with timestamps preserved for the polling client.

🔐 Auth setup — re-openable after decline (#278)

  • Declining the initial "Set up authentication" prompt no longer permanently locks the setup form. The Set-up-authentication flow can be reopened at any later time from Settings.

🛡 Fail2Ban — trusted IPs / networks manageable from the UI (#279)

  • New global allowlist in Security → Fail2Ban. IPv4, IPv6 and CIDR entries can be added, edited and removed from the Monitor; the entries apply across the sshd, proxmox and proxmenux jails.
  • Managed entries persist to /etc/fail2ban/jail.d/99-proxmenux-ignore.local. Any legacy [DEFAULT] ignoreip values in /etc/fail2ban/jail.local are preserved on first use. 127.0.0.0/8 and ::1 remain protected and non-removable.
  • Input validated + normalized with Python ipaddress; invalid entries rejected before write.

🩹 Persistent NIC rules — bridges excluded (#280, contributed by @f3rs3n)

  • The generated persistent-NIC .link rules now include Kind=!bridge. A Linux bridge inheriting its uplink's MAC could otherwise match a MAC-only rule and be renamed to the physical NIC name, failing with File exists. vmbr0 now falls back cleanly to 99-default.link.
  • Post-install FUNC_VERSION bumped 1.1 → 1.2 so existing installs re-run the updated setup_persistent_network on the next post-install pass.

🌍 Slovak i18n for LXC Updates + Applications + terminal-completion fix (#282)

  • Slovak translations for the new Updates and Applications flows added by @Vaso73: update tab, app add/edit form, web links / detected ports, version tracking, OS package update status, scheduled updates and their state/error messages. Technical terms (LXC, VM, Snapshot, cron, package names, ports, storage names) kept unchanged.
  • Script terminal no longer surfaces a spurious WebSocket closed error when a script completes cleanly — the completion path now closes the socket in the right order.

📢 vzdump webhook — full body preserved for downstream parsing (#283)

  • The webhook handler no longer truncates payload["message"] to 4096 chars before the vzdump parser sees it. A long backup report (many VM/CT entries) previously got cut in the middle of a table row, and _parse_vzdump_message() reported the affected guest as failed even when the actual Proxmox backup had succeeded.
  • The full body is now kept for the parser; message splitting is left to the notification-channel layer where it belongs. Fixed by @Vaso73.

🌍 Swedish (sv) language added (#287)

  • Swedish is now supported end-to-end: lang/sv.json for the CLI, AppImage/messages/sv/common.json for the Monitor, and sv added to the auto-fill default set in the i18n workflow so future new strings are auto-translated on the next release.
  • Full review and polish of both catalogs by native speaker @yeager — every CLI and Monitor string was checked and refined against actual Swedish usage, replacing the initial machine-generated pass with proper native wording.
  • Slovak also joined the auto-fill default list; the workflow's guardrail (never overwrite a target value that differs from EN) protects the community-curated Slovak strings from being clobbered.

🔤 Translation quality pass — product names preserved verbatim

  • All 7 supported languages (ES/DE/FR/IT/PT/SK/SV) had their catalogs rebuilt from the English source, then reviewed against the brand vocabulary. Product names — ProxMenux Monitor, ProxMenux Optimizations, Secure Gateway, Tailscale, Proxmox Backup Server, Proxmox Helper-Scripts, Proxmox VE — are now preserved verbatim across every locale, replacing machine-translated variants like "Monitor ProxMenux", "puerta de enlace segura", "escala trasera", "servidor de copia de seguridad Proxmox" that had leaked in through automated translation.

🙏 Acknowledgments

  • @agarmoli (discussion #206) — original design idea that seeded the LXC Updates flow and the combined "Apply OS + " button
  • @DeXon18 (#262, #268) — Linux bond not shown in the Network Flow diagram; QEMU VM disk usage reported as 0 GB despite a working guest agent
  • @mrkaffeine92 (#263) — scheduled PBS jobs missing the certificate fingerprint
  • @Turtletrumpet and @Skynet011 (#232) — Monitor waking HDDs from standby
  • @mon5termatt (#264) — installer log typo
  • @gail7-github (#267) — scheduled SMART tests silently skipping every disk
  • @f3rs3n (#272, #280) — uninstall menu aborting on legacy boolean registry entries; persistent NIC rules renaming vmbr0 (patch contributed)
  • @bofrot0603 (#270, #271) — external Actions API for pve-update / self-update / power; pre-flight ICMP ping aborting updates on hosts that filter ICMP but allow HTTPS
  • @MrCaringi (#285) — Network Flow diagram not honoring the Bits/Bytes preference
  • @nikp79 (#266) — scheduled backup runner crashing on legacy .env values with whitespace under source
  • @ThisWasNotTaken (#298) — NVIDIA driver picker recommending a cross-branch upgrade; kernel/branch/GPU rewrite driven from this report
  • @Vaso73 (#273, #277, #281, #282, #283) — Monitor i18n foundation; Slovak dashboard, LXC Updates and Applications translations; vzdump webhook full-body fix
  • @yeager (#287) — Swedish CLI and Monitor translations reviewed and polished end-to-end by a native speaker