Estou construindo um app de menu bar para macOS. Funciona perfeitamente no meu Mac. Agora preciso saber se funciona num macOS limpo: sem minhas configurações, sem minhas permissões, sem meus dados. Um usuário que o instale do zero.

Como você testa isso? Precisa de uma máquina virtual.

“Fácil”, pensei. “Tenho o UTM instalado. Abro o wizard, crio uma VM macOS, e rodo.”

Não ia ser tão fácil.

UTM: bonito mas indomável

UTM é uma aplicação excelente. Interface cuidada, suporte para macOS como guest no Apple Silicon, tela cheia, clipboard compartilhado. Para usar manualmente é ótimo.

O problema aparece quando tenta automatizá-lo.

UTM tem uma CLI chamada utmctl. Pode listar VMs, iniciá-las, pará-las, cloná-las. O que não consegue fazer é criar uma VM. E para macOS guest, nem mesmo o AppleScript do UTM permite criá-las — o campo do sistema operacional está hardcoded para Linux.

Em linguagem simples: se você quer uma VM macOS no UTM, você a cria manualmente pelo wizard. Toda vez. Com seus cliques, seu download do IPSW (a imagem de instalação do macOS para Apple Silicon — o equivalente a um ISO tradicional, mas empacotado pela Apple), sua espera de instalação.

Para um dev que precisa subir e destruir VMs como parte de um fluxo de QA, isso é um saco.

Tart: VMs macOS for the rest of us

Tart é o que acontece quando alguém projeta uma ferramenta de virtualização pensando em desenvolvedores em vez de usuários finais.

Usa exatamente o mesmo Virtualization.framework da Apple que o UTM. Mesma tecnologia, mesma performance, mesma velocidade nativa. A diferença é a interface: Tart é CLI-first.

1
brew install cirruslabs/cli/tart

Já está. Não há GUI de configuração, não há wizard. Um binário no seu PATH.

Um comando para governar todos eles

Criar uma VM macOS com a última versão disponível:

1
tart create minha-vm --from-ipsw latest

Isso é tudo. latest diz ao Tart “me dê a última versão do macOS que este Mac suporta”. Tart consulta a API da Apple, baixa o IPSW (~15 GB — sim, macOS é pesado), cria o disco virtual, instala o sistema operacional e deixa a VM pronta para iniciar. Vá tomar um café, porque demora um tempo — mas você não precisa tocar em nada.

Iniciar a VM:

1
tart run minha-vm

Abre uma janela com o desktop do macOS. Mouse, teclado, tela. Exatamente igual ao UTM, mas lançado de um tart run.

Pasta compartilhada: o detalhe que faz a diferença

Aqui é onde o Tart me conquistou. Preciso copiar meu app do Mac host para a VM. No UTM você tem que configurar VirtioFS manualmente, montá-lo do terminal do guest, e rezar para que o config.plist não corrompa (há bugs conhecidos).

No Tart:

1
tart run minha-vm --dir=shared:~/code/tokamak/build

Dentro da VM, a pasta aparece em /Volumes/My Shared Files/shared. Você arrasta o app para /Applications e pronto. Sem configurar nada, sem montar nada.

Meu fluxo de QA real

Isto é o que faço para testar meu app num macOS limpo:

1
2
3
4
5
6
7
8
# Criar a VM (só na primeira vez)
tart create tokamak-qa --from-ipsw latest --disk-size 50

# Compilar o app
cd ~/code/tokamak && make build

# Iniciar a VM com o build compartilhado
tart run tokamak-qa --dir=build:~/code/tokamak/build/Build/Products/Debug

Dentro da VM:

  1. Abro /Volumes/My Shared Files/build/
  2. Arrasto Tokamak.app para /Applications/
  3. Executo e verifico: login, permissões, sandbox, menu bar, notificações

Se preciso começar do zero (testar a first launch experience):

1
2
tart delete tokamak-qa
tart create tokamak-qa --from-ipsw latest --disk-size 50

Destruir e recriar. Sem perguntas, sem confirmações, sem wizard.

Configurar recursos

Por padrão o Tart atribui recursos razoáveis, mas você pode ajustá-los:

1
2
3
4
5
# 4 cores, 8 GB RAM
tart set minha-vm --cpu 4 --memory 8192

# Redimensionar disco
tart set minha-vm --disk-size 80

O que o Tart não tem (e por que não importa)

Não tem uma GUI de gerenciamento com thumbnails de cada VM. Não tem drag and drop para ISOs. Não tem um botão bonito de “Nova VM”.

Se o que você precisa é um app de desktop para gerenciar VMs, use o UTM. É fantástico para isso.

Mas se o que você precisa é testar seu app num macOS limpo, destruir a VM, recriar, compartilhar uma pasta, e fazer tudo isso de um script ou Makefile… UTM não consegue. Tart sim.

A receita completa

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# Instalar
brew install cirruslabs/cli/tart

# Criar VM macOS (baixa ~15 GB, demora ~20 min)
tart create test-vm --from-ipsw latest --disk-size 50

# Iniciar com pasta compartilhada
tart run test-vm --dir=app:~/meu-projeto/build

# Outros comandos úteis
tart list                    # VMs existentes
tart stop test-vm            # Parar
tart clone test-vm copia-vm  # Clonar (rápido)
tart delete test-vm          # Eliminar
tart ip test-vm              # IP para SSH

A documentação cabe num README. A curva de aprendizado cabe num café. Se você desenvolve para macOS e não está usando Tart, está fazendo as coisas mais difíceis do que o necessário.