Orchard v2.3.3
Installation
- Download the DMG file below
- Open the DMG and drag Orchard.app to your Applications folder
- Launch Orchard from Applications
Changes
Fixed
- Local-model detection no longer probes every 5 seconds when nothing is listening. Each probe of the four conventional ports (11434, 1234, 8080, 8000) with no server behind them produced a connection-refused URLSession task, and CFNetwork logs every one - dozens of
NSURLErrorDomain -1004console lines per minute on an idle machine. The background tick now backs off to 30s while no provider is detected; while one is detected, the 5s cadence stays so a stopped server disappears promptly, and opening the Models tab or the run form's model bridge still probes immediately. - Editing a container no longer silently strips its labels. The edit sheet's prefill omitted labels entirely, so the recreation that applies an edit dropped every label on the container, including Orchard's own sandbox markers (a sandbox stopped being recognised as one after any edit). Labels now carry through: internal ones untouched, the rest editable in the new labels editor.
- Running a locally built image no longer fails with a 401 from Docker Hub. The Run Container sheet canonicalised every image reference before running, so a local tag like
mono2was rewritten todocker.io/library/mono2and the backend tried to pull a repository that doesn't exist on the registry (Hub answers 401 for unknown repositories). The reference now resolves against the local image store first - a match runs under the exact reference the store knows (including the implied:latest), and only unmatched references canonicalise into pullable registry form. The "Local image available" hint and the actual run decision now agree.
Added
- Labels can be set when running a container: the Run/Edit form's Advanced tab gains a key/value labels editor (matching the environment-variables editor), and the containers list can group by any of those keys. Internal
com.apple.container.*andcom.orchard.*labels are managed by the runtime/Orchard and don't appear as editable rows. - A Builds sidebar tab (Resources section,
orchard://builds) tracks every image build Orchard has started, and the records survive relaunches (stored as versioned JSON in Application Support, with each log's last 1000 lines). The list shows status, start time, and duration per build, searchable by image name; the detail pane shows the build's request (Dockerfile, platform) and its log - complete while the app runs, trimmed to the last 1000 lines for records restored after a relaunch - live while building and reviewable after, with Cancel Build for in-flight builds and a context-menu Remove Record for finished ones. Once a build's image exists, the detail also mirrors the image view's affordances: a "Launch image" button opening the run-container sheet pre-filled with the built reference, a "Containers using this image" list that jumps to each container, and a confirmed Delete that removes both the build record and the built image (disabled while containers use the image; if the image delete fails, the record is kept). Builds and images cross-reference: the build detail's "View Image" jumps to the built image, and an image produced by an Orchard build gains a "View Build" button jumping to the newest successful build of that reference. Builds run concurrently and survive closing the Build Image sheet; a build still running when the app quits is marked "interrupted" on the next launch, since the CLI process was orphaned and its outcome never observed (the image may still have been built). The registry only lists builds Orchard itself started: apple/container's builder shim exposes just info() and a build stream over its gRPC surface, so BuildKit's own history is not reachable from the host. - Deep links: Orchard registers the
orchard://URL scheme.orchard://<tab>opens any sidebar tab (e.g.orchard://dashboard), andorchard://container/<id>,orchard://image/<reference>,orchard://mount/<id>,orchard://machine/<id>,orchard://dns/<domain>, andorchard://network/<id>jump straight to a resource, reusing the same navigation path as the command palette and menu bar (so a target in a still-loading list is selected once it appears). A resource noun without an identifier falls back to its tab, and image references keep their interior slashes. - Containers can be grouped by label: the containers sort menu gains a "Group by Label" submenu listing every label key present on current containers (internal
com.apple.container.*bookkeeping labels excluded). With a key selected, the list renders one collapsible section per label value - click a header to fold it - with a count badge, a "No label" bucket for containers missing the key, and a per-group actions menu to start or stop everything in the group. The choice persists, and search/running filters apply within the groups. - Containers can be exported as tar archives (container 1.2+ API). An "Export…" button in the container detail header and an "Export Filesystem…" context-menu item in the containers list prompt for a destination, stream the filesystem through the API client (written to a scratch directory first, so a failed export never leaves a partial file at the chosen path), show an "Exporting…" state while in flight, and reveal the archive in Finder when done.
- Image pulls now show real progress: a determinate bar with downloaded/total bytes and blob counts (e.g. "256 MB / 512 MB · 3/8 blobs") instead of an indeterminate spinner, updating live from the registry client's progress events (throttled to ~10 Hz so per-chunk byte updates don't churn the UI). The bar stays indeterminate until the total size is known, and the phase label ("Fetching image") replaces the static "Pulling image..." message.
- Build images from a Dockerfile. The Images tab gains a hammer button (and the command palette a "Build an Image..." action) opening a Build Image sheet: pick the Dockerfile through a file panel so non-default names like
Dockerfile.devare discoverable (the build context auto-fills to the Dockerfile's folder), name the image, choose the target platform (Apple silicon linux/arm64 or Intel linux/amd64, defaulting to the host), and optionally build without cache. The build shells out tocontainer build, which starts the BuildKit builder on demand, and the build log streams live into the sheet through the ANSI console; closing the sheet leaves the build running, and a Cancel Build button terminates it. Successful builds refresh the image list automatically. - Log views now render ANSI colours and support selection across lines. Container and machine logs were previously drawn as one SwiftUI
Textper line, which printed colour escape codes as literal garbage and scoped text selection to a single line. Both the detail Logs tab and the log viewer window now share a singleNSTextView-backed console: SGR styles (16-colour, bright, 256-colour, truecolour, bold/italic/underline) are rendered, other escape sequences are stripped, carriage-return progress lines show their final state, and click-drag or Cmd+A/Cmd+C works across the whole log. Filtering now matches the escape-stripped text, so a filter term can no longer hit or miss because of bytes inside a colour code, and the console follows the tail only while scrolled to the bottom (scrolling up to read no longer fights the 2s refresh, which previously only auto-scrolled on first load).
Checksums
- SHA256: See the
.sha256file for verification
System Requirements
- macOS 26 (Tahoe)
- Apple Container installed