# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html) for the plugin version (independent of the bundled Podman/upstream package versions, see [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md#52-build-strategie)). ## [Unreleased] ### Fixed - `podman-verify-packages.sh`/`podman-update-packages.sh` reported every single package as "not installed" right after a genuinely successful install (confirmed live on a real v0.1.5 install: `/var/log/packages/` had the correct records the whole time). Root cause: `/var/log/packages` is itself a symlink on Unraid (`-> ../lib/pkgtools/packages`), and GNU `find`'s default `-P` mode doesn't descend into a symlinked starting path at all without `-L` — it just returns the symlink itself and nothing below it. Fixed via a new shared `podman_find_installed_package_record()` helper in `podman-common.sh`, which also fixes a second bug found while testing the first fix: "podman"'s own glob also matched podman-compose's file (a literal prefix collision), and `find`'s unsorted output let podman-compose's record silently win podman's own check on the same real host. ## [0.1.5] - 2026-07-13 ### Added - Containers panel: folders to group containers (name + optional icon URL), purely cosmetic organizational metadata stored in the plugin's own `folders.json` — podman itself has no such concept, same as Unraid's own Docker page's folders. "+ New Folder", a "Move to Folder" submenu on each container's row menu, and per-folder rename/delete (deleting a folder only ungroups its containers, never touches them). A folder with nothing assigned yet still shows up (so there's somewhere to move a container into); one that's merely hidden by the current search/filter does not. A folder's header always shows an icon+name+status chip per member — collapsed or expanded, matching how Unraid's own Docker page folders behave — rather than hiding everything behind a bare count; clicking a chip opens the same row menu the "⋮" button does (Details is now a menu item there too, alongside Pause/Kill/Rename/Edit/Remove) rather than jumping straight to the detail modal. "Move to Folder" only shows for a container that isn't grouped yet — once it's in one, that item becomes a direct "Remove from Folder" instead, since "move to a folder" reads as "add" and is ambiguous/redundant once it's already in one. Containers can also carry an icon URL (settable in the create/edit form, auto-filled when creating from a template) shown in the table instead of the 2-letter initials avatar. - Containers can now carry a WebUI URL too (create/edit form, preserved through Update/Update All the same way the icon URL is), shown as a small open-in-new-tab button next to the name in the Containers table when set. Both this and the icon are stored as the plugin's own container labels (`podman-webui.weburl`/`.icon`), read straight off the already-fetched container list — no extra per-container calls. - Container detail modal: 5 new tabs (Resources, Logs, Console, Events, Healthcheck), rounding it out from 6 to 11 of prompt.md's 12 requested tabs (Volumes was left merged into the existing Mounts tab — same underlying source/destination data, a separate tab would just repeat it). Resources shows live CPU/memory alongside configured limits (memory/swap/CPU/PIDs/block-I/O — a `0` in podman's own HostConfig means "unlimited", not zero). Logs reuses the existing per-container logs endpoint. Console opens a real ttyd/podman-exec session scoped to the modal, cleaned up (killing the ttyd process server-side) on every way of leaving — switching tabs, Close, backdrop click, or Escape — not just on an explicit Disconnect, so peeking at a console doesn't leak an orphaned ttyd process. Events and Healthcheck are both one-shot historical queries (libpod's `/events?stream=false` for the last 7 days, and inspect's own `State.Health.Log`) rather than a live stream, which stays out of scope (see dashboard.js's own note on why). - A real toast notification system (success/warning/error/info, auto- dismissing, stacked bottom-right, dismissible early) replacing every `alert()` used for one-way feedback across Containers, Images, Volumes, Networks, Pods, Templates, Compose, and Settings — confirmations stay native `confirm()` (a decision, not a notice), and long command output (`podman compose up/down`, previously also an `alert()`) now goes to the existing scrolling log-modal instead, which fits it better than a toast ever could. - Dashboard reworked: a clean 6-tile row of plain counts (Running, Stopped, Pods, Images, Volumes, Networks — colored green/red on Running/Stopped so fleet health reads at a glance), a single "Resource Usage" card with aligned CPU/Memory/Swap/Storage meter rows (bars shift to warn/bad colors above 75%/90% instead of staying accent-colored at any value), and an "Autostart Queue" table (reusing `podman-autostart.sh`'s own per-container failure counters, so it shows exactly what that script would decide, not a second tracked history). Bar-and-percentage metrics were kept out of the plain-count tile grid entirely after an earlier attempt at combining them (a tile spanning multiple grid columns) left dead, empty cells in the layout. - Dashboard and Containers now auto-refresh every ~2s (paused while the tab is hidden or a modal is open) instead of requiring a manual Refresh click to see current state. - Settings: an "Add container" dropdown + button above the Autostart order table — previously that table could only reorder/remove containers already in the chain, with no way to add one in the first place. - Containers: "Update All" now also removes the old, now-unused image version each updated container leaves behind (only when at least one container actually updated), instead of leaving stale images to pile up on disk after every update run. ### Fixed - Dashboard memory usage was calculated from libpod's raw `memFree` (which excludes reclaimable buffers/cache), showing usage far higher than reality — e.g. 67% "used" where `free -h` reported 19%. Now reads `/proc/meminfo`'s `MemAvailable` directly, matching what `free -h` and most monitoring tools show. - Dashboard CPU usage never changed — libpod's own `/info` computes `cpuUtilization` once and never resamples it (confirmed live: three calls seconds apart returned byte-identical numbers). Now computed from `/proc/stat` deltas between successive requests, the same technique `top`/`htop` use, which auto-refresh's ~2s cadence fits naturally. - Context menus (a container's "⋮", a folder's "⋮") always dropped down from the anchor at a fixed position — opened from a row near the bottom of the viewport, the menu ran off-screen with its last items unreachable. Now measures its own actual rendered size (which varies with item count) after appending and flips above the anchor instead when there isn't enough room below, clamped horizontally too. - Expanding/collapsing a folder shifted every column (including the header text) in the Containers table — its default `table-layout: auto` sizes each column from the widest content among only the currently-visible rows, so adding/removing a folder's rows changed what counted as "widest" on every toggle. Columns now use explicit fixed widths that don't depend on row content at all. - The Name column's content (icon + name + WebUI button) was misaligned with its own header, drifting further off with every row — putting `display:flex` directly on the `