macOS and Linux VMs on Apple Silicon to use in CI and other automations
Go to file
Tor Arne Vestbø 2e63759c1b
Don't run the AppKit run loop nested in Swift's async main (#1260)
When built against the macOS 27 (Xcode 27, Swift 6.4) SDK, "tart run"
brings up the VM window but the guest never boots.

Swift's asynchronous main() entry point implicitly starts an executor
that owns the main thread, and as of Swift 6.4 that executor is no
longer backed by the Dispatch main queue. Running an AppKit/SwiftUI
run loop nested inside it via MainApp.main() leaves the main run loop
unable to drain Swift tasks or DispatchQueue.main, so the task that
starts the VM is never scheduled, even though the window itself
(driven directly by AppKit during launch) still appears.

We now keep Root.main() synchronous, so that a command driving a run
loop can own the main thread at the top level, exactly like a plain
SwiftUI app. With AppKit owning the loop again, MainActor tasks and
the Dispatch main queue drain as before. Such commands opt in through
a new MainThreadCommand protocol; everything else keeps running
asynchronously via a detached task and dispatchMain().

Verified that the guest boots again, and that Ctrl+C still stops the
VM gracefully.
2026-06-09 09:53:06 -07: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 Update docs after OpenAI move (#1240) 2026-06-05 17:05:23 -07:00
Sources/tart Don't run the AppKit run loop nested in Swift's async main (#1260) 2026-06-09 09:53:06 -07:00
Tests/TartTests Move brew completions to post_install (#1227) 2026-04-11 22:26:52 -04:00
benchmark Mention macOS Tahoe everywhere instead of macOS Sequoia (#1208) 2026-03-02 08:50:29 -05:00
docs Update docs after OpenAI move (#1240) 2026-06-05 17:05:23 -07: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 Update docs after OpenAI move (#1240) 2026-06-05 17:05:23 -07:00
LICENSE Relicense under FSL-1.1-ALv2 (#1238) 2026-06-05 15:37:02 -07: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.md 2026-06-05 17:07:07 -07: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 Update docs after OpenAI move (#1240) 2026-06-05 17:05:23 -07: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.

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.