Changelog
Added
- Notification Center: a right-side panel opened from a bell in the footer, with a notifications history and a filterable Activity log of engine API and CLI interactions (friendly labels, status, duration, copy-as-cURL/command). In-memory only.
- Find in the current view with Ctrl+F / Cmd+F — a themed find widget (match counter, previous/next, case-sensitive) that highlights matches on container logs, inspect, processes and other detail and list views. JSON/YAML editors keep their built-in find, and list screens focus their existing filter box.
- Configurable monospace font in Settings (family, size and weight): choose any font installed on your system, or reset to the bundled font in one click.
- Testing foundation for the connection layer: a headless harness that runs the engine clients under Node, hermetic contract tests over the full engine × host matrix (Podman/Docker across native, WSL, LIMA, podman-machine and SSH) and the exact per-OS command/argv each transport builds, plus an SSH pre-flight diagnostic. A new CIPipeline workflow type-checks, lints, unit-tests and production-builds every PR, and runs the Go relay tests on both Linux and Windows and the Python tooling tests.
- Configurable live connectivity suite (
yarn test:live) that exercises the real connection matrix against your own machines — Podman/Docker over native sockets, SSH remotes and WSL/LIMA/vendor scopes — declared in a gitignored targets file (template:src/__tests__/live/targets.example.env) and selected withCONTAINER_DESKTOP_TEST_TARGETS. Excluded from the hermetic/CI run; unconfigured combos are skipped, never silently passed.
Changed
- Container logs now use a live stream for running containers instead of polling full log snapshots, and stopped containers load logs once until manually refreshed.
- The embedded terminal no longer recreates itself on every log update, preventing flicker and duplicate output.
- Build output is now version-scoped under
build/<version>/with stable target filenames. - Trimmed unused direct dependencies and removed the dead ncc single-file post-build step; ssh-related modules continue to be bundled by the Vite/Rolldown build.
- Resource detail and inspect views (containers, images, pods, volumes, networks, secrets) now refresh from engine events instead of a 2-second poll, and polling pauses while the window is in the background; the remaining polled views (stats, processes, machines) only refresh while visible.
- Container statistics are only polled while the container is running.
- The container logs view shows a live status pill (LIVE / CONNECTING / ENDED / SNAPSHOT) overlaid on the terminal in place of the status bar, and coalesces streamed output per animation frame to stay smooth under heavy logging.
- Bundled JetBrains Mono as the default monospace font for logs, terminals and data views, for consistent, readable rendering across platforms (overridable in Settings).
- WSL connections now use a lightweight stdio relay instead of running an SSH server inside the distribution; the injected helper is integrity-checked (SHA-256) before it runs. Podman Machine and Docker Desktop still connect directly through their host pipe.
Fixed
- Container logs now decode Docker multiplexed stdout/stderr frames before writing to the terminal.
- The development watcher no longer deletes
preload.cjsafter the preload build completes. - Monaco is bundled locally instead of being loaded from a CDN.
- Remote SSH on Linux and macOS now verifies host keys instead of disabling the check, preventing man-in-the-middle attacks.
- Remote SSH connections no longer hang indefinitely on "Please wait": the control connection is bounded (non-interactive, with a connect timeout) and a non-default SSH port is no longer dropped. When a connection fails, the app now reports the specific cause — missing ssh client, identity file not found, key permissions too open, host unreachable, or remote engine not running — instead of failing silently with no reason. The cause is shown in the Settings connection list, on the connection's Connect button and in the startup notification, naming the exact step that failed. (#171, #186)