macOS and Linux VMs on Apple Silicon to use in CI and other automations
Go to file
Dal Rupnik 0cc0969652 feat: show drop destination in toast and unblock guest agent on dev builds
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.*`.
2026-05-20 10:15:08 +02:00
.ci Fixed plist file in version update (#927) 2024-10-29 13:01:47 +04:00
.github Add build workflow for testing (#1180) 2026-01-23 09:41:13 -05:00
Resources Add Liquid Glass icon and sign the whole app bundle (#1216) 2026-03-20 23:19:21 +01:00
Sources/tart feat: show drop destination in toast and unblock guest agent on dev builds 2026-05-20 10:15:08 +02:00
Tests/TartTests feat: scaffold guest-side drop synthesis (host plumbing only) 2026-05-20 10:15:08 +02:00
benchmark Mention macOS Tahoe everywhere instead of macOS Sequoia (#1208) 2026-03-02 08:50:29 -05:00
docs docs: clarify that nested virtualization is only for Linux VMs for now (#1233) 2026-05-12 21:45:18 +00:00
integration-tests docs: clarify that nested virtualization is only for Linux VMs for now (#1233) 2026-05-12 21:45:18 +00:00
scripts Add Liquid Glass icon and sign the whole app bundle (#1216) 2026-03-20 23:19:21 +01:00
.cirrus.yml Skip integration test gate for release (#1229) 2026-04-11 22:33:36 -04:00
.editorconfig Switch to OpenTelemetry (#1179) 2026-01-23 12:04:21 +01:00
.gitignore feat: Add disk image format selection with ASIF support (#1094) 2025-06-19 18:27:30 +04:00
.goreleaser.yml Move brew completions to post_install (#1227) 2026-04-11 22:26:52 -04:00
.swiftformat Reformat code idents and introduce the SwiftFormat linter (#339) 2022-11-29 15:56:13 +00:00
CONTRIBUTING.md feat: prioritize pruning of old SHA when pulling updated tags (#1102) 2025-07-07 08:52:05 +00:00
LICENSE Relicensed under Fair Source License (#415) 2023-02-28 12:22:25 -05:00
PROFILING.md Mention macOS Tahoe everywhere instead of macOS Sequoia (#1208) 2026-03-02 08:50:29 -05:00
Package.resolved Switch back to github.com/open-telemetry/opentelemetry-swift upstream (#1189) 2026-02-02 19:40:24 +01:00
Package.swift Switch back to github.com/open-telemetry/opentelemetry-swift upstream (#1189) 2026-02-02 19:40:24 +01:00
README.md Update README example to use macOS Tahoe (#1101) 2025-07-07 13:50:16 +04:00
actool.sh Add Liquid Glass icon and sign the whole app bundle (#1216) 2026-03-20 23:19:21 +01:00
gon.hcl Add Liquid Glass icon and sign the whole app bundle (#1216) 2026-03-20 23:19:21 +01:00
mkdocs.yml docs: migrate "Managing VMs" section to "Quick Start" (#1196) 2026-02-13 05:18:14 -05:00

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.Framework for 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.