The Basics/Network/Volumes/Security/Review steps never advanced and only cluttered Container Configuration. Drop the strip, related CSS, and the structure test id.
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.
Use fixed table layout, cell ellipsis, and progressive column hiding
on narrower widths so containers/images/networks tables stay within
the content pane instead of growing a horizontal scrollbar.
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.
dockerode/modem (and Bare HTTP shims) can still emit a non-empty start
body, which Engine API ≥1.24 rejects. Start/pause/unpause now write a
minimal HTTP request on the docker.sock with Content-Length: 0.
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.
bare-pipe sockets lack TCP setKeepAlive; bare-http1 Agent calls it when
recycling connections and crashed peardock-server after Docker connected.
No-op keep-alive/unref on IPC sockets and safe-keepSocketAlive on Agent.
createRequire(import.meta.url) could not resolve holesail inside the
packed app bundle even though holesail was embedded. Import holesail
statically so Bare resolution works; surface loadError in status banner.
bare-http1 ignores socketPath and always dials TCP localhost:80, so
dockerode got HTTP 301→HTTPS and TLS errors. Patch the Bare http Agent
to connect via bare-net IPC when socketPath is set, matching Node.
Create the docker group when missing, usermod -aG with verification,
align socket group/mode when needed, and set systemd Group and
SupplementaryGroups so the service can access the Docker socket.
docker-modem calls url.resolve/parse/format, which bare-url does not
implement. Map bare url imports to build/shims/node-url.cjs so the
standalone peardock-server can talk to the Docker socket again.
scripts/install.sh auto-detects OS/arch, prompts for server vs client
(or both), installs peardock-server under /opt with a systemd unit, and
installs the desktop client for Linux/macOS from the rolling release.
apple-codesign 0.29 rejects --ad-hoc. Generate a self-signed P12 and
sign darwin .app bundles with --p12-file so Linux CI produces a sealed
signature instead of failing postPackage.
rebuildConfig:false still ran @electron/rebuild (spread of false is a
no-op), which can stall for many minutes when packaging arm64 on x64 CI
under "Finalizing package". Use onlyModules:[] to truly skip rebuilds,
pre-download Electron zips with timeouts before forge package, point
packager at electronZipDir, and kill any single host package after 8m.
Rolling release runners stall or fail fetching apple-codesign releases.
Ship linux-x64 and linux-arm64 binaries under tools/rcodesign/ and install
from the checkout so the ad-hoc macOS signing step is offline and fast.
Only ship native prebuilds for the target platform/arch (~80MB instead
of ~500MB of multi-arch blobs), skip redundant GUI rebundles, cache
Electron downloads across hosts, and strip more packaging-only deps so
"Finalizing package" no longer crawls multi-hundred-MB asars six times.
apple-codesign binaries moved from indygreg/apple-codesign to
indygreg/apple-platform-rs with tags apple-codesign/<version>, which
caused a 404 in the rolling release workflow.
Electron postinstall and ssh2/cpu-features node-gyp run silently after
deprecation warnings and often hang forever on Gitea runners. Install
with --ignore-scripts, then only run esbuild's installer; forge still
downloads per-target Electron during package.
Copy runtime logos/favicons into assets/ and package icons into build/, then use them for the titlebar, favicons, dock/window icons, and docs so packaging and the UI no longer rely on placeholder marks.