Skip to content

Releases: gimbal-dev/gimbal-local

Gimbal Local 0.2.2

Choose a tag to compare

@nebuk89 nebuk89 released this 13 Aug 15:26
ee3e6dd

Gimbal Local 0.2.2 — 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 or account. Guest execution is local and can run offline;
    pulling an image from a container registry requires network access.
  • 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.

The accompanying GimbalLocal-0.2.2.release-metadata provenance asset
records the source commit, ZIP SHA-256, arm64 architecture, and signing identity
verified before this release was created.

Install

  1. Download GimbalLocal-0.2.2.zip below.
  2. Double-click it in Finder to unpack, then move GimbalLocal.app to
    /Applications. Finder shows it as Gimbal Local.
  3. Open it. The engine starts itself.

If you unpack from a terminal, use ditto, not unzip:

ditto -x -k GimbalLocal-0.2.2.zip .

unzip does not understand the extended attributes this archive carries, and
writes them into the app bundle as stray ._* files. They are not covered by
the code signature, so macOS refuses to run the result. Finder and ditto both
unpack it correctly.

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
  • a container reference plus an arm64 kernel — for example,
    chm image build alpine:3.20 --kernel /path/to/Image. The image may also
    need the matching module tree via --modules. Registry pulls use the
    network.

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.

Gimbal Local 0.2.1

Choose a tag to compare

@nebuk89 nebuk89 released this 13 Aug 14:03
7330fc7

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

What changed since 0.2.0

Local-only is now on by default. 0.2.0 shipped reaching for a cloud
control plane on first launch — a download has no control plane and no way to
get one, so it showed a Cloud section that could only ever say offline while
polling an endpoint that would always refuse. Nothing ever left the machine
(the default URL is loopback and the binary contains no remote endpoint), but
it was the wrong shape for a local product. If you have 0.2.0, take this
one.

Also in this build: a coding agent has now been proven working inside a
rehydrated cloud snapshot
— it wrote code, the guest was suspended and
resumed twice, and the agent read back its own file and carried on
(#286). That is the
whole product claim, end to end.

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.1.zip below.
  2. Double-click it in Finder to unpack, then move GimbalLocal.app to
    /Applications. Finder shows it as Gimbal Local.
  3. Open it. The engine starts itself.

If you unpack from a terminal, use ditto, not unzip:

ditto -x -k GimbalLocal-0.2.1.zip .

unzip does not understand the extended attributes this archive carries, and
writes them into the app bundle as stray ._* files. They are not covered by
the code signature, so macOS refuses to run the result. Finder and ditto both
unpack it correctly.

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 can
    break JIT-heavy workloads; NODE_OPTIONS=--jitless is the workaround for
    Node. It is workload-dependent rather than universal — measured 2026-08-13,
    the Copilot CLI's native binary ran clean without it. Cold-booted guests are
    immune by construction, because their kernel reads this Mac's own CTR_EL0.
  • Setting up the credential proxy by hand has sharp edges: a workspace mints
    its own CA (#315),
    the CA install script is larger than chm exec can carry and there is no
    chm cp (#316), and
    chm proxy check --workspace returns a wrong verdict
    (#317). The app's
    Install CA in guest button does it for you;
    docs/credential-proxy.md
    now documents the CLI path.
  • 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.

Gimbal Local 0.2.0

Choose a tag to compare

@nebuk89 nebuk89 released this 13 Aug 12:59
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.

Gimbal Local 0.1.1

Choose a tag to compare

@nebuk89 nebuk89 released this 06 Aug 14:22
461c874

Superseded. Use the latest release instead. This page is kept for history.

Gimbal Local 0.1.1 — 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.1.1.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.1.1.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.

Gimbal Local 0.1.0

Choose a tag to compare

@nebuk89 nebuk89 released this 06 Aug 14:05
b2d5137

Superseded. Use the latest release instead. This page is kept for history.

Gimbal Local 0.1.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.1.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.1.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.