Split overview into a stretching Identity/Runtime/Network band and a
content-height Ports/Mounts/Timeline strip with timeline, mount rows,
and clearer empty states so vertical space is used without sparse panels.
Tighten container detail tabs into a fit-to-viewport layout with a richer
overview, debounced process filters, and a readable process table. Make
dashboard KPI cards navigate to resource views (with status filters that
reset on leave), and raise per-peer RPC limits so normal UI polling no
longer trips rate limiting.
Cause
navigateToView was running document.querySelectorAll('.nav-link') and clearing active on every nav link — including container detail tabs (Logs, Terminal, etc.).
That left the previous pane with .show.active while its tab button no longer had .active. Bootstrap’s Tab.show() then couldn’t find/hide the previous pane, so opening Overview (or another tab) stacked both.
Fix
1. Sidebar-only nav updates — only #sidebar .nav-link[data-view] get active-state changes; detail/swarm/settings tabs are left alone.
2. Explicit tab reset — activateContainerDetailsTab() forces a single visible pane when opening a container (defaults to Overview).
3. Safer click wiring — sidebar navigation listeners are scoped the same way so they don’t attach to tab buttons.
Result
• Overview → Logs → other container → Overview shows only Overview
• Same for any other tab when switching containers
• Manual tab clicks continue to show only that tab’s content
Replace Bootstrap table dropdowns with a fixed body-portaled menu so
hovering other rows no longer opens their menus and the open menu no
longer expands table overflow.
Raise stacking for the open row, use Bootstrap Popper fixed strategy so
menus escape table paint order, and pause virtualization repaint while
a dropdown is open.
Probe bash/sh/ash and related shells until a container terminal works, enable Swarm APIs by default, add keyboard go-chords and appearance prefs, and point install docs at https://install.peardock.boats.
Parse Docker stats streams as NDJSON so samples actually land, ship
memory limit for accurate bars, keep CPU/Memory columns visible with a
compact stacked meter, and match stats updates to table rows reliably.
Replace exponential backoff and the 12-attempt cap with a fixed 5s
retry loop that keeps dialing after unexpected disconnects. Throttle
toasts so the UI is not spammed while the offline banner stays up.
Keep the containers table scoped to the active peer with a merge store,
restore the last active server on boot with a restoring screen, start
containers without a Docker API body (v1.24+), and stop ⋮ menus from
sticking to the viewport bottom after refreshes.
Ignore transient empty list payloads so rows never vanish, and reconcile
in place with insertBefore instead of replaceChildren (which flashed a
blank tbody). Stats and existing rows stay put until data actually changes.
Skip skeleton wipes when data already exists, fingerprint list content so
auto-refresh does not rebuild unchanged DOM, and short-circuit container
structure updates when only live stats change.
List refreshes no longer wipe the tbody (which reset CPU/memory to
zeros). Rows are patched in place, stats paint via rAF only when values
change, and known samples are re-seeded when a row is (re)created.
Use Popper fixed strategy for the actions dropdown so it escapes
table-responsive overflow, and raise z-index / open-row stacking so
the menu paints above neighboring rows.
Keep quick Add peer (and Peers shortcut) in the sidebar footer; full
saved-peer list, counts, and actions live on a new Peers view that is
reachable offline for managing keys.
Return the active tunnel for the same host:port:protocol instead of
starting a second Holesail instance; coalesce concurrent creates.
UI disables the create button and shows “already exists” feedback.
Load holesail via dynamic ESM import (no createRequire) so Pear can connect local tunnels. Route confirmations through a designed modal with icons and animations instead of native dialogs.
Close sockets on unload without forgetting saved peers, merge roster
writes so empty in-memory state cannot erase peers.json, and restyle the
minimized sidebar as a clean icon-only rail with compact peer dots.
Map Docker deploy failures to actionable how-to-fix messages, keep full
detail through RPC sanitization, and stop top-center toasts from doubling
the live job tray so operators only see one notification per action.
Ship the modern dashboard, job tray log follow, container overflow actions, stacks search, activity history, role-gated controls, invite form with copy token, first-connect checklist, and mark Track C done on the roadmap.
Add Settings UI to configure many Portainer-format template catalogs (not just one), merge them on fetch, drop duplicates by image/stack/title, and show source counts on the Deploy view.
Save configured connections to ~/.config/peardock/cache/peers.json (with localStorage migration), unwrap protomux REQUEST_ERROR causes for real messages, and quiet/dedupe background RPC failures so the notification tray is not flooded.
Add a visible toast stack, fix presentError double-notify, wire density and auto-refresh settings, gate destructive confirms, improve empty/skeleton/search on resource lists, and enable browser history plus keyboard palette navigation.
Keep peer action buttons from overflowing with stable truncation and short labels, move reset peers into Settings with an infinitely scrollable peer list, and harden waitForPeerResponse so success replies without a message (listVolumes) no longer throw.
Always store configured connections in localStorage (with invite/alias), restore and re-dial on boot, and free the sidebar so every nav item stays reachable via a scrollable nav plus an Add peer modal.
Reserve space for window controls and split the titlebar clusters so brand and chrome no longer collide. Replace the full-screen status spinner with lightweight activity jobs in the event tray.
Batch typing into short frames, send UTF-8 instead of base64 for text,
exempt stream methods from the general rate limit, and skip heavy
middleware on terminalInput/resize for lower latency.
Production-grade xterm FitAddon resize, binary-safe I/O, TTY-safe
server streams, demuxed log viewer with line buffering, and auto-dismiss
deploy job panel without the full-screen spinner.
Debounce template search, harden deploy/duplicate/template flows with
reliable RPC and better form controls (switches/sliders). Raise muted
and secondary text contrast across styles so copy stays readable.