GitHub Actions
Prepares ephemeral macOS runners through the agent, verifies the runner toolchain and cleans idle VMs after jobs finish.
Headless, API-first macOS virtual machine management for Apple Silicon. Create, install, start and automate fresh macOS 26.0+ VMs through one agent and one REST API.
JeballtoAgent runs as a menu bar app on Apple Silicon and exposes the full VM lifecycle through one REST API. CI integrations and the CLI are clients of that surface, not separate systems.
One local endpoint. Every VM operation behind it.
The agent owns VM lifecycle, networking, images, automation and persistence so every client can stay small. Start with curl, use the CLI for local operations, then connect CI controllers or your own orchestrator when you need job automation.
It stays close to the platform with Apple Virtualization, restart-safe state and a small dependency surface. The interface stays the same whether you are booting one VM by hand or wiring it into CI.
The core surface stays compact, but it covers the full path from blank disk to reusable image and repeatable automation.
Create, start, stop, pause, resume, clone, snapshot and delete VMs through explicit HTTP endpoints, including disposable CI workflows.
Pull, push and reuse full macOS images through ECR, ACR, Artifact Registry or any OCI-compatible registry.
Forward terminal and graphical access automatically, then execute commands inside the guest, capture screenshots or inject keystrokes.
Run up to two virtual machines in parallel on one host, with graceful restart support for stateful machines when the agent comes back.
Describe provisioning in YAML or JSON, then let the agent run install, wait, execute and keystroke steps in order.
Download the latest IPSW from Apple or supply your own source, then automate Setup Assistant before SSH is ready.
Install the menu bar agent, copy its bearer token and your first macOS VM is only a few API calls away.
# Grab the latest release $ curl -LO github.com/jeballto/jeballto/releases/latest/download/JeballtoAgent.zip # Unpack and install the app bundle $ unzip JeballtoAgent.zip $ mv JeballtoAgent.app /Applications/ # Launch the menu bar agent $ open /Applications/JeballtoAgent.app # Copy the bearer token from the menu bar $ export TOKEN=your-token # Create your first VM $ curl -X POST \ http://agent-host:8011/v1/vms \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{"name":"dev-vm"}'
Grab the signed ZIP from GitHub Releases. Each release expands to a single JeballtoAgent.app bundle.
Move JeballtoAgent.app into /Applications, launch it and let it sit in your menu bar.
Use the menu bar item to copy the bearer token or read it from ~/Library/Application Support/Jeballto/config.json. From there, your first POST /vms is one request away.
Same REST surface supports manual calls, CLI convenience and CI automation. Tabs below show the smallest useful path from VM definition to desktop access.
# Create a VM with 4 cores, 8 GB RAM and 64 GB disk curl -s -X POST http://agent-host:8011/v1/vms \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "dev-vm", "resources": { "cpuCount": 4, "memorySize": "8GB", "diskSize": "64GB" } }'
# Install macOS. Auto-downloads the latest IPSW from Apple. curl -s -X POST http://agent-host:8011/v1/vms/$VM_ID/install \ -H "Authorization: Bearer $TOKEN" # Or specify an IPSW of your choice curl -s -X POST http://agent-host:8011/v1/vms/$VM_ID/install \ -H "Authorization: Bearer $TOKEN" \ -d '{ "ipsw": "https://.../macOS-26.1.ipsw" }'
# Start the VM curl -s -X POST http://agent-host:8011/v1/vms/$VM_ID/start \ -H "Authorization: Bearer $TOKEN" # State is saved across graceful agent restarts. # SSH and VNC forwarding happens automatically.
# Open a graphical window curl -s -X POST http://agent-host:8011/v1/vms/$VM_ID/gui \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" # Or capture a screenshot instead curl -s http://agent-host:8011/v1/vms/$VM_ID/screenshot \ -H "Authorization: Bearer $TOKEN" -o shot.png
Official adapters connect CI platforms to JeballtoAgent. Each one handles platform setup, labels and cleanup while the agent owns VM lifecycle.
Prepares ephemeral macOS runners through the agent, verifies the runner toolchain and cleans idle VMs after jobs finish.
Maps GitLab lifecycle hooks to VM create, prepare, run and cleanup calls against JeballtoAgent.
Provisions labeled macOS workers, applies capacity rules and shields jobs from host-level VM details.
Use the Python CLI for day-to-day agent operations: create VMs, pull images, run Jeballtofiles and inspect state from a shell.
Stable entry points for every public component. Start with release notes, then move into deployed documentation or source code.
Menu bar app, REST API, VM lifecycle, images, GUI, SSH and VNC.
Ephemeral runner controller for GitHub Actions jobs.
Custom executor that provisions one macOS VM per CI job.
Cloud plugin for labels, templates, capacity and provisioning.
Operator tool for VMs, images and Jeballtofile automation.
Keep the agent, CI adapters and CLI on the same release line unless release notes say otherwise.
Use matched beta versions unless release notes say otherwise.
| JeballtoAgent | GitHub | GitLab | Jenkins | CLI |
|---|---|---|---|---|
1.0.0-beta.1 |
1.0.0-beta.1 |
1.0.0-beta.1 |
1.0.0-beta.1 |
1.0.0b1 |
Official public components use Mozilla Public License 2.0.
JeballtoAgent, the official CI integrations and the Python CLI are published under MPL 2.0. Each source repository includes its own license file and notices.
Whether you are evaluating the agent, wiring it into CI or debugging a specific workflow, the best route depends on whether you need support, want to report a bug or want to talk implementation details.
Download the menu bar app, copy the bearer token and bring up a fresh macOS VM through one clean endpoint.
Public beta software. APIs and behavior may change before the stable release.