What's Changed
This release removes two rarely used System page features and reorganizes the code behind the daemon connection. There are no new features, and nothing else you use should change.
Removed
- Set Kernel. Berthly already installs the default kernel the first time it starts the daemon, so the sheet only mattered if you wanted a different kernel. To switch kernels, run
container system kernel set. The System page still shows the current kernel (#255). - Local DNS domains. Registering a domain under
/etc/resolveris a one-time setup step: runsudo container system dns create <domain>instead. Domains you already created keep working. This was the only feature where Berthly ran thecontainerCLI as root, so that code and its safety checks are gone too (#256). Container DNS settings are unchanged: the Run sheet's DNS fields, network DNS aliases, and thecontainer.dns.*defaults.
PARITY.md lists both under "Deliberate gaps", and the README no longer claims Berthly covers the whole CLI.
Under the hood
LiveContainerService.swift, the 3,500-line file that most bug fixes landed in, is split into twelve files by area (build, run, machines, images, registries and so on). Nothing behaves differently, and all 30 real-daemon end-to-end tests pass on the split (#259).- If a service method is ever left unimplemented, debug builds and tests now stop with an assertion instead of silently doing nothing, and a test checks that they do (#257, #260).
- Removed a version check on running-container export that could no longer fail, since Berthly already requires container 1.7.1 (#254), and a macOS 14 code path that can't run on macOS 26 (#252).
- The comment on
PushStallGuard, the timeout that stops a push from hanging in a registry sign-in loop, now matches containerization 0.54.0. Pushes without credentials to ghcr.io, Docker Hub and Quay now fail within seconds, but the guard stays because the upstream retry loop still has no limit (#253, #258).
Testing
This release shipped only after its gate run passed on the release commit:
- 608 unit tests passed — 87% line coverage of the pure
logic layer (Berthly/Coremodels, mapping, and planning; 57%
including the daemon/terminal I/O plumbing, which the end-to-end suite
exercises against a real daemon instead). - 84 UI tests (deterministic mock-daemon XCUITest) and
30 real-daemon end-to-end journeys guard the UI wiring and the
daemon integration. SwiftUI view bodies are covered by these suites, not
unit tests, by design.
Full Changelog: v1.7.1...v1.7.2