Skip to content

Gimbal Local 0.2.0

Choose a tag to compare

@nebuk89 nebuk89 released this 13 Aug 12:59
· 11 commits to main since this release
04c91b7

⚠️ Superseded by 0.2.1 — please take that instead

This build reaches for a cloud control plane on first launch, which a
download has no way to provide. It shows a Cloud section that can only ever
say offline and polls an endpoint that will always refuse. Nothing left your
machine — the default URL is loopback and the binary holds no remote endpoint
— but it is the wrong shape, and 0.2.1 fixes it.

Gimbal Local 0.2.0 — Cloud Hypervisor snapshots, rehydrated on Apple silicon.

A vanilla Cloud Hypervisor arm64 snapshot captured on a Linux/KVM host — no
fork, no patches, no flags — resumes on Apple Hypervisor.framework and comes
back to a live shell. Or cold-boot a stock kernel with no snapshot at all.

What you need

  • An Apple silicon Mac (M1 or later) running macOS 14 or newer.

What you do not need

Worth saying plainly, because every comparable tool asks for at least one:

  • No Linux host and no KVM machine. The Mac is the hypervisor.
  • No control plane, no account, no network. Everything runs locally.
  • No Rust toolchain, no Xcode, no source checkout. chm ships inside the app.

The app is signed with a Developer ID certificate and notarized by Apple, so it
opens without a Gatekeeper warning and its ticket verifies offline.

Install

  1. Download GimbalLocal-0.2.0.zip below.
  2. Double-click it in Finder to unpack. Do not use unzip.
  3. Move Gimbal Local.app to /Applications.
  4. Open it. The engine starts itself.

⚠️ unzip breaks this app

unzip does not understand the extended attributes the archive carries and
writes them into the bundle as stray ._* files. Those are not covered by the
code signature, so the seal breaks and macOS refuses to launch it — usually as
"Gimbal Local is damaged and can't be opened", which is misleading: the
download is fine, the unpacking was not. Delete it and unpack again with
Finder.

From a terminal, use ditto:

ditto -x -k GimbalLocal-0.2.0.zip .
mv GimbalLocal.app /Applications/

Measured on this published artifact, not assumed.

chm ships inside the app. To use it from a terminal:

/Applications/GimbalLocal.app/Contents/MacOS/chm --help

Before it can start anything

The app creates ~/gimbal-snapshots and ~/gimbal-images on first launch,
and both are empty — it does not ship a guest. You need one of:

  • a Cloud Hypervisor arm64 snapshot (state.json + snapshot/memory-ranges,
    from ch-remote … snapshot on a Linux host) to rehydrate; or
  • a directory holding an uncompressed arm64 kernel Image to cold-boot; or
  • nothing but a container reference — chm image build alpine:3.20 builds a
    bootable image from Docker Hub on this Mac.

Known limits

  • One guest at a time. hv_vm_create is process-global on macOS.
  • A guest resumed from a snapshot inherits the capture host's CPU feature
    view. On Graviton that means CTR_EL0.DIC disagrees with this Mac, which
    breaks JIT-heavy workloads such as npm. Cold-booted guests are immune by
    construction, because their kernel reads this Mac's own CTR_EL0.
  • arm64 guests only. A sandbox.json asking for x86_64, and an
    amd64-only container image, are both refused by name up front. An x86_64
    snapshot is not recognised as such and will fail less clearly.