Skip to content

Releases: zyvorai/guestkit

v1.2.2

Choose a tag to compare

@github-actions github-actions released this 06 Sep 11:39

[1.2.2] - 2026-09-06

Added

  • Web Image Vault TUI parity — OSS deploy/ui renders inspect inventory tabs, Assurance (doctor / migration plan / passport / repair preview + gated apply), Profiles/Issues, and read-only Files browse (guestkit.explore). Docs: using-the-dashboard.md.
  • POST /api/v1/vms/:id/profile and POST /api/v1/vms/:id/explore — enqueue existing/new worker ops; repair-plan accepts dry_run query (default true).
  • OpenAPI documents profile, explore, and repair dry_run.

Changed

  • Inspect worker summary — larger package/service samples (200/100) for UI lists.

v1.0.1

Choose a tag to compare

@github-actions github-actions released this 15 Aug 13:36

[1.0.1] - 2026-08-15

Fixed

  • guestkit-worker's Docker release build failed for every release past
    the 0.x line
    crates/guestkit-worker/Cargo.toml pinned its own
    guestkit path dependency to version = "0.3.3"; the worker's
    Dockerfile never copies a Cargo.lock in, so each build freshly
    resolves dependencies and cargo enforces the version requirement even
    against a path dependency — 1.0.0 didn't satisfy ^0.3.3 and the
    Publish GHCR Release Images job in v1.0.0's release run failed.
    Dropped the version pin (path-only, matching zyvor-api and
    zyvor-guest-agent's existing pattern for the same in-workspace
    dependency).

v1.0.0

Choose a tag to compare

@github-actions github-actions released this 15 Aug 13:14

[1.0.0] - 2026-08-15

Added

  • GitHub Action for the Passport CI gate (action.yml) — reusable
    composite action wrapping doctor → migrate-plan → passport emit → passport verify as a single CI step; installs a checksum-verified
    release binary, no build step. Dogfooded against a real disk image by
    .github/workflows/passport-gate-demo.yml on every change. See
    docs/devops/01-passport-ci-gate.md.
  • Native OpenAI tool-calling for the AI copilot (src/ai/rig_tools.rs)
    — rig-core AgentBuilder/multi_turn with real JSON-schema tool
    definitions, replacing regex/JSON-scraped completion text for OpenAI.
    xAI/Anthropic/Ollama still use the original text-instructed loop.
  • Cross-run AI memory (src/ai/memory.rs) — a repeated doctor --ai/
    migrate-plan --ai run against the same VM folds a summary of prior
    findings into the query, capped at the last 20 runs.
    GUESTKIT_AI_MEMORY_DIR/GUESTKIT_AI_MEMORY=0 to relocate/disable.
  • MCP server for the AI copilot (src/ai/mcp.rs, --features mcp) —
    guestkit mcp-serve <disk> [--target <target>] exposes the same 6
    read-only evidence tools over stdio to Claude Desktop / other MCP
    hosts, independent of guestkit's own agent loop.
  • guestkit fleet wave-plan (src/fleet/wave.rs) — orders a fleet's
    disk images into dependency-aware migration waves (DB-role priority +
    NFS storage-dependency edges, Kahn's-algorithm topological sort,
    cycles reported rather than dropped or arbitrarily ordered).
  • guestkit fleet watch (src/fleet/baseline.rs) — scheduled drift
    monitoring: diffs each VM's current evidence against a stored golden
    baseline (first run establishes it), --fail-on-drift for pipeline
    gating. Includes a Kubernetes CronJob template
    (deploy/helm/zyvor/templates/fleet-drift-watch-cronjob.yaml) as the
    reference scheduled-invocation path.
  • Helm chart CIci.yml's new helm-chart job runs helm lint and
    helm template against deploy/helm/zyvor, which previously had zero
    CI coverage, across default values, every optional PVC-backed feature
    enabled at once, hostPath-backed persistence, and all three real
    deployment overlays (values-ci.yaml, values-k3s.yaml,
    values-prod.yaml).
  • Manual-dispatch workflow for NBD-dependent tests
    (self-hosted-nbd-tests.yml) — runs the full test suite with none of
    ci.yml's NBD skips, for self-hosted runners with working loop/NBD
    support. workflow_dispatch only, deliberately never wired to
    pull_request/push.

Fixed

  • k3s E2E's zyvor-api pod crash-looped on every run — the Helm chart's
    default zyvorApi.agentMtls.enabled: true requires AGENT_BOOTSTRAP_TOKEN
    (zyvor-api refuses to start otherwise: "AGENT_MTLS_BIND_ADDR is set but
    AGENT_BOOTSTRAP_TOKEN is unset"), but the Deployment template only ever
    wired that env var — and the Secret holding it — inside the
    zyvorApi.auth.enabled block. values-ci.yaml (mTLS on, full auth off)
    hit exactly that gap; values-prod.yaml masked it by having both auth and
    a token on together, and values-k3s.yaml worked around it by disabling
    mTLS outright (its own comment already described the bug). Decoupled the
    zyvor-api-auth Secret and AGENT_BOOTSTRAP_TOKEN env var from
    auth.enabled — gated only on the token itself being set, matching what
    zyvor-api's own config validation actually requires — and set a
    CI-only placeholder token in values-ci.yaml so the E2E job now exercises
    the mTLS path instead of crash-looping. ci.yml's Helm Chart job now also
    helm templates all three real overlays (values-ci.yaml,
    values-k3s.yaml, values-prod.yaml) so a rendering break here is caught
    without needing a live k3s cluster.
  • k3s E2E multi-round debugging — the job was failing on every run;
    fixing it required peeling through several layers, each masking the
    next:
    • poll_job (deploy/scripts/e2e-smoke.sh) only recognized
      "completed" as terminal, so a "failed" job status looked
      identical to "still pending" for the full 5-minute poll budget, and
      the worker's own error message (live_status.error) was never
      printed. Now treats failed/cancelled/timeout as terminal and
      prints the error immediately.
    • install-k3s-ubuntu.sh never got the loop/NBD device setup
      ci.yml needed earlier this session (guestkit-worker's pod
      bind-mounts the host's /dev, so the same root:disk-0660-node /
      EACCES-looks-like-timeout issue applies here too). Added it —
      confirmed live afterward: inspect/doctor both complete in one
      poll with a real bootability score. This specific k3s stack path
      does not hit the deeper NBD-attach limitation ci.yml's plain
      cargo test job still has to skip around.
    • curl -sf swallows the response body on any non-2xx status, so the
      next failure (provision) looked like an empty response
      (Expecting value: line 1 column 1) instead of a real API error.
      Added a curl_or_die helper (splits HTTP status from body via
      curl's -w, prints both on failure).
    • That revealed a real HTTP 500: "No operating system found in disk image" from provision (POST /vms/{id}/provision, which mounts
      the disk synchronously in zyvor-api's own process), on the same
      image doctor had just inspected successfully. Suspected (and
      partially fixed) an unawaited async migration-plan job racing
      provision's own mount via NbdDevice::find_available_device
      (src/disk/nbd.rs) — that function does check device availability
      and connect as two separate, unlocked steps with no cross-process
      coordination, a real bug now flagged with a code comment — but
      serializing migration-plan before provision did not fix it,
      disproving the race as this failure's cause.
    • provision_vm's .map_err(|e| ApiError::internal(e.to_string()))
      (crates/zyvor-api/src/routes/vms.rs) only shows anyhow's outermost
      .context() layer via plain Display. Changed to format!("{e:#}")
      (alternate Display, full chain) for provision_vm's three
      guestkit/export::kubevirt-derived map_err calls — correct and
      worth keeping, but the next run's error was still byte-identical to
      before, because there was no chain to reveal: mount_all_ro
      (src/cli/commands/mod.rs) returns Option<String>, not
      Result<String>, and .context("No operating system found in disk image") on a None (anyhow's Context impl for Option) produces
      an error with no wrapped source at all — the context message
      genuinely is the entire error. Left the other ~90
      .map_err(|e| ApiError::internal(e.to_string())) sites in the crate
      alone; most wrap simple error types (serde_json, std::io) where
      .to_string() isn't lossy.
    • The real swallowed information was one layer further down:
      mount_all_ro calls g.inspect_os().unwrap_or_default()
      inspect_os() failing for any reason (guestfs launch issue, mount
      error, permission problem) collapses to the identical empty-roots
      None as "genuinely no OS found," discarding whatever inspect_os's
      real error was before it could reach any context message. Changed to
      log the real error (log::warn!) before discarding it. Didn't widen
      mount_all_ro's Option<String> return type to Result — it's used
      across 9 files where callers only ever branch on Some/None, and
      that ripple is out of scope for this investigation. Widened the
      default EnvFilter (was "nothing enabled" without RUST_LOG set,
      now falls back to warn globally) so mount_all_ro's new
      log::warn! — and any other log::*! from guestkit's dependency
      graph — actually reaches the pod's logs. First attempt at this also
      added an explicit tracing_log::LogTracer::init() call, reasoning
      that zyvor-api only sets up a tracing subscriber and guestkit
      logs through the plain log facade — wrong, and a real
      regression
      : tracing-subscriber's "tracing-log" feature (on by
      default) already bridges log into the subscriber as part of
      .init(), so the explicit call double-registered the global log
      logger and panicked at startup with SetLoggerError, crash-looping
      zyvor-api again. Confirmed via kubectl logs from the next E2E
      run (once the "dump pod logs on failure" step below existed to
      capture it) and reproduced in an isolated 10-line binary before
      re-pushing — removed the explicit LogTracer::init() call and the
      now-unneeded direct tracing-log dependency; the isolated repro
      confirmed log::warn! still reaches the subscriber correctly
      without it.
    • Also: nothing in k3s-e2e.yml ever captured pod logs on failure —
      every fix in this list up to this point was diagnosed purely from
      HTTP response bodies, each requiring a full ~20-40min re-run just to
      test. Added a failure-only step dumping kubectl logs (all
      containers, prefixed by pod) for every deployed component, plus
      get pods -o wide and describe pods.
    • That finally showed it: no panic, no error, no mount_all_ro
      warning — inspect_os() genuinely returned an empty root list.
      validate_root_partition/validate_initrd_boot_partition
      (src/guestfs/inspect.rs) treat mount/extraction failures as
      "not a valid root" by design, not as errors — a real mount
      failure and "genuinely no OS" are indistinguishable at that layer
      on purpose (LVM volumes on read-only NBD devices can legitimately
      fail to mount for benign reasons). validate_initrd_boot_partition
      is the cirros-cloud-image path — root filesystem lives inside the
      initrd, not on a directly-mountable partition — and shells out to
      zcat <initrd> | cpio -t to look inside it.
      crates/zyvor-api/Dockerfile never installed cpio (or gzip),
      unlike crates/guestkit-worker/Dockerfile's otherwise-ident...
Read more

v0.3.20

Choose a tag to compare

@github-actions github-actions released this 07 Aug 12:47

[0.3.20] - 2026-08-07

Added

  • DevOps runbooksdocs/devops/ Passport CI gate, offline repair worker,
    air-gap packages/VirtIO, fleet analyze, cutover weekend, failure triage,
    cloud disk sources (S3/GCS/Azure), forensic IR, SBOM/inventory CI.
  • GitHub Wiki — operator cheat sheets (Passport, day-0, packages, env,
    TUI, KubeVirt/GCF/agent) linked from README / docs INDEX.
  • GUESTKIT_PACKAGE_MIRROR — HTTP fallback via curl/wget when host
    dnf/apt-get is missing or fails (comma-separated bases; optional
    {name}/{ext} templates). Helps macOS hosts stage PackageInstall.
  • Domain-leave first-boot RunOncewindows-domain-leave stages
    GuestKitDomainLeave RunOnce (Add-Computer -WorkGroupName) in addition
    to Tcpip/Winlogon markers (DC computer-account delete still needs live AD).
  • Worker performance + migration profilesguestkit.profile jobs run
    the same CLI InspectionProfile implementations as guestkit profile.
  • Offline ServiceOperation / CommandExec staging — enable/disable via
    systemd wants Symlink/FileDelete; start/restart and other commands stage
    guestkit-firstboot-live.service when chroot cannot run them.
  • UEFI-aware fix-grub --force — detects ESP under the guest root and
    runs grub-install --target=x86_64-efi|arm64-efi --efi-directory=… --no-nvram --removable (BIOS path unchanged).
  • Windows AES/RC4 SAM NT-hash writerescue -o reset-password --password
    reconstructs the SYSKEY bootkey from SYSTEM LSA class names, derives the
    hashed bootkey from SAM F, and writes an AES-128-CBC (or legacy RC4)
    encrypted NT hash into the user V blob. Falls back to SAM blank + RunOnce
    net user if SYSTEM/bootkey/crypto fails.
  • PackageInstall host fetch — with GUESTKIT_PACKAGE_FETCH=1, offline
    plan apply downloads missing .rpm/.deb on the host (dnf download /
    yumdownloader / apt-get download) into GUESTKIT_PACKAGE_CACHE or
    ~/.cache/guestkit/packages, then stages the first-boot oneshot as before.
  • Offline GRUB repair (fix-grub)rescue -o fix-grub bind-mounts
    proc/sys/dev and runs chroot grub2-mkconfig / grub-mkconfig /
    update-grub; --force also attempts grub-install onto the NBD device
    (BIOS) or EFI removable path when an ESP is present;
    if chroot mkconfig fails, stages guestkit-firstboot-grub.service.
    --export-plan writes the first-boot FileWrite/Symlink ops. check-grub
    remains diagnose-only.
  • System Reserved / ESP detection — offline Windows evidence probes
    non-OS NTFS/FAT volumes for bootmgr + BCD (legacy System Reserved) or
    EFI Microsoft Boot (ESP). Surfaces on windows.system_reserved, promotes
    bcd_store_found / bootmgr_found, fixes esp_present (no longer aliased
    to bootmgr). Boot check BOOT-014, migration MIG-W-011, Passport
    flags system_reserved_layout + bcd_store_found.
  • Windows driver/hotfix migration diagnostics — offline HotFix registry +
    $NtUninstall* / $hf_mig$ / CBS.log tail; VirtIO .sys presence on
    WindowsDriverEntry.sys_present; BCD UTF-16 probe for testsigning /
    nointegritychecks. Migration MIG-W-012 (hotfixes/servicing),
    MIG-W-013 (VirtIO files); Passport hotfix_count /
    hf_mig_present / driver_signature_enforcement. Hive paths resolve via
    guestfs mount root.
  • Offline activation / ghost-NIC depth — SOFTWARE ProductId/EditionID/
    DigitalProductId + oeminfo.iniwindows.activation (OEM/Retail/Volume);
    SYSTEM Enum\PCI remnant/problem NICs → ghost_nics; Tcpip static
    interfaces → static_nic_configs. Enriches MIG-W-006/007/008; Passport
    activation_channel, ghost_nic_count, static_nic_count.
  • Offline BitLocker / VSS enrichmentBitLockerStatus\BootStatus (On →
    hard block), FVE/$BitLocker/fvevol artifacts (offline_uncertain warning),
    VSS+swprv services + System Volume Information inference. Fills
    windows.bitlocker / windows.vss for MIG-W-005/009; Passport
    bitlocker_uncertain.
  • Day-0 plan/rescue depthwindows-dhcp / windows-dns / linux-hostname
    profiles; rescue enable-rdp / enable-winrm / set-timezone; Windows
    set-hostname applies registry day-0 plan (was Linux /etc/hostname).
  • Cutover Passport signed-enterprise workflowspassport keygen (Ed25519
    seed + pubkey); emit --issuer / --expires-hours; verify --trust-keys
    allowlist + --max-age-hours freshness gate (signing/verify need agent).
  • Production Helmvalues-prod.yaml: PVC-backed Postgres/Redis/MinIO
    (eval still emptyDir); Ingress TLS + cert-manager annotations; pinned
    GHCR v0.3.19 images; nightly image-vault backup CronJob + backup PVC.
  • Guest Control Fabric poll telemetry — airgap reconciler records per-method
    latency + transport attempts; Redis fleet rollup; GET .../guest/poll-telemetry
    (VM + fleet); guest/status exposes lastPoll / telemetryMode.
  • Fleet analyze performance — parallel --jobs / GUESTKIT_FLEET_JOBS
    (default min(4, CPUs)); evidence-cache hit skips remount.
  • Cloud disk source depth — persistent ~/.cache/guestkit/cloud pulls;
    S3 GUESTKIT_S3_ENDPOINT/AWS_ENDPOINT_URL; azure:// URIs; GCS
    gcloud storage fallback; CI recipe scripts/ci-cloud-disk-sources.sh.
  • Offline heuristic remediations + linux-grubsystemctl enable/disable
    → Symlink/FileDelete; fail2ban/auditd/chrony/apparmor/sshd enable offline;
    ufw default deny FileEdit; day-0 linux-grub (--grub-timeout /
    --grub-cmdline) for /etc/default/grub.
  • Offline PackageInstall staging — when GUESTKIT_PACKAGE_CACHE (or
    host_cache) holds matching .rpm/.deb, offline plan apply stages
    packages + a first-boot systemd oneshot instead of skipping; optional
    GUESTKIT_PACKAGE_FETCH=1 downloads missing packages on the host first;
    live install unchanged.
  • Windows offline password setrescue -o reset-password --password
    prefers AES/RC4 SAM NT-hash write via SYSKEY; falls back to SAM blank +
    HKLM RunOnce net user for first boot; omit --password to blank only.

Changed

  • Docs — Roadmap parked list cleared; CLI / quick-reference / feature guide /
    fix-plans updated for AES SAM passwords, fix-grub, and
    GUESTKIT_PACKAGE_FETCH offline staging.

v0.3.19

Choose a tag to compare

@ssahani ssahani released this 06 Aug 17:44

[0.3.19] - 2026-08-06

Added

  • Cutover Passportguestkit passport emit|verify: versioned CI-gateable
    assurance artifact (evidence digest, boot/migration scores, FixPlan digest,
    Windows BitLocker hard-block + windows_offline_ready, optional live
    attestation via agent-proxy, optional Ed25519 sign). Suite handoff points to
    HyperSDK (export) + hyper2kvm (convert/deploy). Web: POST /vms/:id/passport
    • dock download. Worker op guestkit.passport.
  • plan generate -p windows-domain-leave — offline domain→workgroup
    markers (--workgroup, default WORKGROUP).
  • plan generate -p windows-timezone — offline TimeZoneKeyName
    (--timezone).
  • plan generate -p windows-static-ip — offline static IPv4 on a known
    interface GUID (--interface-guid --ip --mask [--gateway] [--dns]).

v0.3.18

Choose a tag to compare

@github-actions github-actions released this 06 Aug 19:21

[0.3.18] - 2026-08-06

Added

  • plan generate --profile windows-hostname — offline ComputerName + Tcpip
    Hostname / NV Hostname (--hostname required). Apply with --skip-backup.
  • plan generate --profile windows-winrm — WinRM Automatic +
    WINRM-HTTP-In-TCP firewall rule. Apply with --skip-backup.
  • Symlink / FileDelete plan ops — offline guestfs ln_sf / rm
    (used by hardened linux-ssh).
  • plan generate -p linux-ssh --user + --key / --key-file — inject
    authorized_keys into the enable plan.
  • Windows rescue -o reset-password — offline SAM blank (chntpw-style)
    via registry-write / libhivex; clears password so interactive logon works.
  • rescue --export-plan PLAN.yaml — emit a reviewable FixPlan for
    enable-ssh / inject-ssh-key / set-hostname / reset-password / fix-fstab.
  • Offline DriverInject — apply uses host_dir / GUESTKIT_VIRTIO_WIN
    • inject_windows_driver_dir when built with registry-write,agent.
  • migrate-repair --virtio-win DIR — wires VirtIO host tree into
    migration repair DriverInject (same as $GUESTKIT_VIRTIO_WIN).
  • Heuristic offline remediations — firewalld enable → Symlink, ufw →
    conf edit, more sshd FileEdits; preview tags live-only ops as offline-skip.

Fixed

  • linux-ssh plan fidelity — wants enable via Symlink (not CommandExec ln), removes /etc/ssh/sshd_not_to_be_run, matches rescue enable path.
  • from_security_profile naming — plan profile/tags follow the inspect
    profile name (not hardcoded "security").
  • rescue check-grub — diagnose-only rename (fix-grub kept as alias).

v0.3.17

Choose a tag to compare

@github-actions github-actions released this 06 Aug 15:24

[0.3.17] - 2026-08-06

Added

  • plan generate --profile linux-ssh — offline Linux SSH enablement
    (systemd ssh/sshd wants symlink + /etc/ssh/sshd_config.d/99-guestkit.conf
    with PubkeyAuthentication yes). Apply with --skip-backup.
  • plan FileWrite operation — create/overwrite a guest file offline.
  • rescue inject-ssh-key--user + --key / --key-file appends to
    authorized_keys.
  • rescue set-hostname--hostname writes /etc/hostname and patches
    /etc/hosts.

Fixed

  • rescue enable-ssh — actually creates the systemd wants symlink and
    writes an sshd drop-in (previously only printed a manual systemctl note);
    write drop-in before unit enable; prefer real wants dirs / relative
    symlinks / ln -sfn when guestfs ln_sf rejects unit paths.
  • Windows guest-fsfreeze-freeze/thaw — route to VSS marker shadows
    instead of the Linux fsfreeze binary so KubeVirt quiesced snapshots work
    on Windows guests.

v0.3.15

Choose a tag to compare

@github-actions github-actions released this 29 Jul 04:19

[0.3.15] - 2026-07-29

Added

  • In-guest Windows agent, fully offline installguestkit agent-inject --windows
    provisions a Windows guest with no boot required: registers the GuestKitAgent
    service in the SYSTEM hive via hivex, and installs the virtio-serial (vioser)
    driver the QGA channel needs (driver files, DevicePath, service key, and
    CriticalDeviceDatabase entries parsed from the INF, including the KMDF binding).
  • Stock qemu-guest-agent takeover — any QEMU-GA/qemu-ga/QEMUGuestAgent
    service found during Windows injection is disabled (Start=4) so GuestKit answers
    the virtio-serial channel uncontended, while remaining QGA-compatible so
    KubeVirt/libvirt see no difference.
  • Converted-image driver fix — deletes the stale cached
    SYSTEM\...\Enum\PCI\VEN_1AF4&DEV_1043 device key on converted images (e.g.
    VirtualBox eval → qcow2) so the PCI bus re-detects the virtio-serial device and
    runs a full driver install on next boot instead of staying stuck on "no driver."
  • Generic guestkit-rpc QGA passthrough — every in-guest agent RPC method is
    now reachable through the standard QGA channel, so host automation only needs
    virsh qemu-agent-command.
  • Windows agent default channel — the Windows service now defaults to the
    virtio QGA port, matching the Linux agent's channel selection.
  • Fall back to systemctl restart when the D-Bus RestartUnit call fails.

Documentation

  • Page-by-page customer manual (docs/customer/) with per-page PDFs, linked from
    the README.
  • docs/features/guest-agent.md documents the Windows offline install path
    end-to-end, including the stock-QGA disable step.
  • README now surfaces the in-guest agent (previously undocumented at the top
    level) with a dedicated "What's New" section, plus CI/crates.io/PyPI/license
    badges.

GuestKit Agent v0.3.14 — Linux + Windows in-guest agent

Choose a tag to compare

@zyvorai zyvorai released this 19 Jul 09:44

In-guest agent for Zeus VM Tools on KubeVirt/KVM VMs — Linux and Windows. Downloadable binaries + installers for integration with Zeus OS / Veyron / Machina. The agent speaks framed JSON-RPC 2.0 over the QGA / dedicated virtio-serial channel, AF_VSOCK, a unix socket (Linux), or the named pipe \\.\pipe\guestkit-agent (Windows).

Linux

File What it is
guestkit-agent-0.3.14-linux-amd64-musl.tar.gz (8 MB) Self-contained bundle — static musl binaries + systemd units + policy + install.sh. Runs on any x86-64 Linux guest (no libc dependency). Install as root: ./install.sh.
guestkitd / guestkitctl / guestkitd-exec Raw static binaries (daemon / control CLI / privileged helper).
SHA256SUMS-linux.txt Checksums.

install.sh installs to /usr/bin, creates the zyvor-agent service user, and enables the hardened guestkit-agent.service. Self-test: guestkitd selftest /tmp/gk.json.

Windows

File What it is
guestkit-agent-0.3.14.iso (16 MB) Bootable-media CD — binaries + MSI + install.bat / selftest.bat + policy. Attach as a CD-ROM; run gk\install.bat as Administrator.
guestkit-agent-0.3.14.msi Installs to C:\Program Files\Zyvor GuestKit; registers the auto-start GuestKitAgent service (LocalSystem).
guestkitd.exe / guestkitctl.exe / guestkitd-exec.exe Raw Windows binaries (PE32+ x86-64).
SHA256SUMS.txt Checksums.

Build

Reproducible via make linux-bundle (static musl) and make windows-bundle (cross-compiled x86_64-pc-windows-gnu; MSI via msitools wixl; ISO via genisoimage). Both produce self-contained artifacts with no runtime dependencies beyond the OS.

Validation

  • Linux — static agent runs on real Linux (probes return live data); previously validated end-to-end on a real Ubuntu KVM VM over virtio-serial, including the offline↔online evidence-correlation loop.
  • Windows — booted from the bundle CD inside a real Windows Server 2022 KVM VM; all 12 probe methods returned OK (heartbeat healthy, capabilities, users, integrity, posture, packages, certificates, containers, full live evidence).
  • Test suite: 828 lib + 24 integration + 11 protocol tests pass; Linux and Windows builds clean.

v0.3.14

Choose a tag to compare

@github-actions github-actions released this 11 Jul 09:48

[0.3.14] - 2026-07-11

Added

  • Boot-score trend (guestkit-ux.js) — every boot score is recorded per disk
    in localStorage; a re-scan after a repair toasts the delta (▲ +N / ▼ −N),
    and a new 📈 Boot-score trend command renders the history as an inline SVG
    sparkline (CSP-safe, no external assets, reduced-motion aware).
  • Zyvor brand footer + logo — the web console and login page now carry the
    zyvor.dev logo (linked) and a zyvor.dev · HyperSDK · © 2026 credit line,
    matching the PacketWolf branding treatment.

Documentation

  • Default web console login documented — the seeded admin / Admin@321
    (previously only printed at install time by package-auth-bootstrap.sh) is now
    in the remote-deploy guide, getting-started, and README, each with a
    change-on-first-login warning. Also surfaced as a first-run hint on the login
    page, shown only when local login/bypass is available.
  • Run the web stack from GHCR — new deploy/docker-compose.ghcr.yml (pulls
    only the public ghcr.io/hypersdk/{zyvor-ui,zyvor-api,guestkit-worker} images)
    plus a "Published images (GHCR)" guide covering pull, Compose (eval), and Helm
    (prod), cross-linked from the README and deployment docs.