After a host→guest drop completes, the toast now updates from "Done" to "Copied to <Folder>" (e.g. "Desktop", "Documents") once the guest agent has finished relocating the file out of the share. When the agent isn't reachable, the toast falls back to "Copied to Shared Files" so the user always sees a sensible destination. Three things had to come together: 1. Toast surfaces the destination `GuestDropSynthesis.perform` now returns a `GuestDropOutcome` carrying the basename of the destination folder (the in-guest script appends a `tartdrop-dest=<basename>` line after `mv`). The relocation runs as a fire-and-forget Task off the copy queue and patches the toast via a new `setFinalDestination` method — which uses a shared `pendingFinalText` slot so a fast relocation result doesn't get clobbered by the delayed "Done" placeholder. 2. gRPC timeout shortened so failures fit in the toast window The exec-call timeout drops from 8 s to 5 s. Steady-state calls finish in well under 500 ms; 5 s leaves headroom for a first-run osascript blocked on a Finder Automation TCC prompt inside the guest. The baseline hide on success grows to 2 s so the destination update has a chance to land before the panel disappears. 3. Dev builds of tart can now host the guest agent `CI.version` returns `"SNAPSHOT"` for non-tagged builds, which gave the VM a console port named `tart-version-SNAPSHOT`. The guest agent parses that suffix as a semver and falls back to `unix.Kill(getppid, SIGTERM)` when it can't — which fails with EPERM against launchd and prints "operation not permitted" every 10 s forever. A new `CI.deviceVersion` always emits a valid semver with major ≥ 2 (`"99.0.0"` for SNAPSHOT) and VM.swift uses it for the port name. `99.0.0` without a `-prerelease` suffix is required because macOS's BSD tty layer rejects the dotted+hyphenated form and refuses to expose the device under `/dev/cu.*`. |
||
|---|---|---|
| .ci | ||
| .github | ||
| Resources | ||
| Sources/tart | ||
| Tests/TartTests | ||
| benchmark | ||
| docs | ||
| integration-tests | ||
| scripts | ||
| .cirrus.yml | ||
| .editorconfig | ||
| .gitignore | ||
| .goreleaser.yml | ||
| .swiftformat | ||
| CONTRIBUTING.md | ||
| LICENSE | ||
| PROFILING.md | ||
| Package.resolved | ||
| Package.swift | ||
| README.md | ||
| actool.sh | ||
| gon.hcl | ||
| mkdocs.yml | ||
README.md
Tart is a virtualization toolset to build, run and manage macOS and Linux virtual machines (VMs) on Apple Silicon. Built by CI engineers for your automation needs. Here are some highlights of Tart:
- Tart uses Apple's own
Virtualization.Frameworkfor near-native performance. - Push/Pull virtual machines from any OCI-compatible container registry.
- Use Tart Packer Plugin to automate VM creation.
- Easily integrates with any CI system.
Tart powers Cirrus Runners service — a drop-in replacement for the standard GitHub-hosted runners, offering 2-3 times better performance for a fraction of the price.
Many companies are using Tart in their internal setups. Here are just a few of them:
Note: If your company or project is using Tart please consider sharing with the community.
Usage
Try running a Tart VM on your Apple Silicon device running macOS 13.0 (Ventura) or later (will download a 25 GB image):
brew install cirruslabs/cli/tart
tart clone ghcr.io/cirruslabs/macos-tahoe-base:latest tahoe-base
tart run tahoe-base
Please check the official documentation for more information and/or feel free to use discussions for remaining questions.