Vista

#Architecture

#Processes

                    ┌──────────────┐        ┌────────────────┐
  you ─────────────▶│ vista        │        │ vistamcp       │◀──── agent (stdio)
                    │ window, menu │        │ MCP server     │
                    │ bar, jobs    │        │ + `job <id>`   │
                    └──────┬───────┘        └───────┬────────┘
                           │  JSON lines over       │
                           │  /tmp/vista<uid>/*.sock│
               ┌───────────┴───────────┬────────────┴─────────┐
               ▼                       ▼                      ▼
        ┌──────────────┐        ┌──────────────┐       ┌──────────────┐
        │ vistamachine │        │ vistamachine │  …    │ vistamachine │
        │ one machine, │        │              │       │              │
        │ its window   │        │              │       │              │
        └──────┬───────┘        └──────────────┘       └──────────────┘
               │ virtio-vsock :7000
               ▼
        ┌──────────────┐
        │ vistatools   │  inside the guest
        └──────────────┘

Nothing is a daemon. A machine's process exists while the machine runs; everything else exists while someone has it open.

#Crates

DirectoryPackageWhat it is
crates/kitvista-kitEverything every process agrees on: the machine model, bundles and snapshots, the asynchronous SQLite library, the installer catalog and resolver, downloads, creation jobs, Windows install media, launching machines, the control protocol and its client and server. No AppKit, no gpui.
crates/guestvista-guestThe Vista Tools protocol, on its own so vistatools builds without SQLite or TLS.
crates/vzvista-vzThe bridge to Apple's Virtualization framework through objc2: a bundle to a VZVirtualMachineConfiguration, macOS installation, and the macOS 26/27 additions (Secure Boot, guest provisioning) reached by selector after checking the host answers.
crates/machinevista-machinevistamachine.
crates/mcpvista-mcpvistamcp.
crates/toolsvista-toolsvistatools, built as a static musl binary for Linux and a native one for macOS guests.
crates/appvista-appvista, in gpui with guise components.

#Inside vistamachine

The machine, its view and every framework callback live on the main thread, where the machine was created. The control socket is served by a tokio runtime on a background thread; a request that touches the machine hops to the main queue, and the answer comes back over a oneshot channel.

#Inside vista

#The machine bundle

A machine is a folder ending in .vista:

Ubuntu Dev.vista/
  config.json          the machine's hardware — the source of truth
  disk.img             the system disk: a sparse raw image
  nvram                UEFI variables (Linux, BSD, Windows)
  auxiliary            boot storage (macOS)
  hardwaremodel        the Mac hardware model macOS was installed for
  machineid            the platform's machine identifier
  suspended.vzvmsave   memory, while suspended
  install.img          the Windows install disk, while installing
  machine.log          the machine process's log
  serial.log           the serial console (Linux, BSD)
  snapshots/<id>/      copy-on-write clones of the above + snapshot.json

config.json carries everything needed to rebuild the hardware: id, name, OS and family, processors, memory (MiB), disks, display, network mode and MAC address, shared folders, sound, microphone, Rosetta, clipboard, Secure Boot, nested virtualization, autostart, agent control, and the installer media still attached. It has a format number; a Vista that finds a newer format refuses to open the machine rather than misread it.

#The library database

~/Library/Application Support/Vista/vista.db, SQLite through a dedicated tokio-rusqlite worker connection:

TableHolds
machinesWhere each bundle is, its name, OS and family (for drawing the sidebar without opening every bundle), sidebar order, last run.
settingsOne row per preference, values as JSON, so a newer Vista can add a setting without a migration.
imagesDownloaded installers kept for reuse: catalog entry, version, URL, path, size, SHA-256.

The database is an index, not the truth: a bundle copied in from another Mac is a whole machine, and bundles found in the machines location are added at launch. Schema steps are embedded in the binary and applied in order, tracked by SQLite's user_version.

#Creation jobs

A job is a JSON file in ~/Library/Application Support/Vista/jobs/, rewritten as it moves through its phases (queued, resolving, downloading, verifying, preparing, creating, starting, then done, failed or cancelled). The app and vistamcp run jobs with the same code and read the same files, which is how a job an agent started shows in the sidebar. Cancelling writes a marker file next to the job; the worker notices within a second.

#Starting a machine

kit::launch::start finds vistamachine — $VISTA_MACHINE, then next to the current executable, then ../Helpers/VistaMachine.app inside the app bundle — and spawns it detached (setsid), with output appended to the machine's machine.log. --hidden starts it without a window.

Edit this page on GitHub