<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>ZTD — Zero Trust Dev</title><link>https://ztd-98a2ef.gitlab.io/</link><description>Recent content on ZTD — Zero Trust Dev</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sun, 14 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://ztd-98a2ef.gitlab.io/index.xml" rel="self" type="application/rss+xml"/><item><title>Let the agent go YOLO: introducing ZTD</title><link>https://ztd-98a2ef.gitlab.io/blog/introducing-ztd/</link><pubDate>Sun, 14 Jun 2026 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/blog/introducing-ztd/</guid><description>&lt;h2 id="let-the-agent-go-yolo-introducing-ztd"&gt;Let the agent go YOLO: introducing ZTD&lt;a class="anchor" href="#let-the-agent-go-yolo-introducing-ztd"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s a moment, a few hours into pairing with a coding agent, when you realize
you&amp;rsquo;ve stopped reading the permission prompts. &lt;em&gt;Allow &lt;code&gt;rm&lt;/code&gt;? Allow &lt;code&gt;curl | sh&lt;/code&gt;?
Allow writing outside the repo?&lt;/em&gt; Yes, yes, yes. The dialog that was supposed to
keep you safe has become muscle memory — which means it keeps you safe in exactly
the way a seatbelt you&amp;rsquo;ve unbuckled does.&lt;/p&gt;</description></item><item><title>An autonomous agent run</title><link>https://ztd-98a2ef.gitlab.io/examples/agent-run/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/examples/agent-run/</guid><description>&lt;h2 id="an-autonomous-agent-run"&gt;An autonomous agent run&lt;a class="anchor" href="#an-autonomous-agent-run"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This walkthrough shows the end-to-end shape of ZTD: you initiate, the agent runs
unattended in isolation, and the only thing that leaves the VM is a git branch you
can review. Every step below is implemented today — &lt;code&gt;ztd cattle&lt;/code&gt; composes the whole
sequence into one command.&lt;/p&gt;
&lt;h3 id="the-scenario"&gt;The scenario&lt;a class="anchor" href="#the-scenario"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;You want an agent to attempt a change on &lt;code&gt;myapp&lt;/code&gt; without babysitting approval
prompts and without any risk to your host.&lt;/p&gt;</description></item><item><title>Commands</title><link>https://ztd-98a2ef.gitlab.io/reference/commands/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/reference/commands/</guid><description>&lt;h2 id="commands"&gt;Commands&lt;a class="anchor" href="#commands"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Everything is driven through &lt;code&gt;ztd &amp;lt;verb&amp;gt;&lt;/code&gt;. &lt;code&gt;ztd&lt;/code&gt; is a &lt;strong&gt;Go (Cobra) binary&lt;/strong&gt; with its
runtime assets embedded, so an installed copy needs no source checkout — see
&lt;a href="https://ztd-98a2ef.gitlab.io/how-to/install/"&gt;Install&lt;/a&gt;. The tables below spell it &lt;code&gt;./ztd&lt;/code&gt;,
which is the shim in a source checkout: it builds the binary and execs it, pointing
it at the live tree so script edits take effect without a rebuild. &lt;strong&gt;If you
installed &lt;code&gt;ztd&lt;/code&gt;, drop the &lt;code&gt;./&lt;/code&gt; — nothing else differs.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>The zero-trust model</title><link>https://ztd-98a2ef.gitlab.io/explanation/zero-trust-model/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/explanation/zero-trust-model/</guid><description>&lt;h2 id="the-zero-trust-model"&gt;The zero-trust model&lt;a class="anchor" href="#the-zero-trust-model"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ZTD&amp;rsquo;s name is its thesis: &lt;strong&gt;the host never implicitly trusts the guest.&lt;/strong&gt; The
guest is treated as compromised-by-default, and ZTD&amp;rsquo;s job is to guarantee the
blast radius of anything that happens inside ends at the VM.&lt;/p&gt;
&lt;p&gt;This is what makes it safe to run an agent in &amp;ldquo;YOLO&amp;rdquo; mode — no per-action
approval prompts. The guardrail is a machine boundary, not a dialog box you&amp;rsquo;d
eventually click through anyway.&lt;/p&gt;</description></item><item><title>Use the Proxmox backend</title><link>https://ztd-98a2ef.gitlab.io/how-to/proxmox-backend/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/how-to/proxmox-backend/</guid><description>&lt;h2 id="use-the-proxmox-backend"&gt;Use the Proxmox backend&lt;a class="anchor" href="#use-the-proxmox-backend"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Run the same VM on a remote Proxmox node. The interface is identical to the local
backend — only &lt;code&gt;TARGET&lt;/code&gt; changes — and your host needs &lt;strong&gt;only Docker&lt;/strong&gt; (no
libvirt/qemu).&lt;/p&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;Validated end-to-end against a real PVE 8 node (boot → SSH → guest Docker +
Claude Code). Attribute names track &lt;code&gt;bpg/proxmox&lt;/code&gt;; if your provider version
differs, expect to adjust a name or two.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;You need three things from your Proxmox node: an &lt;strong&gt;API token&lt;/strong&gt;, the &lt;strong&gt;names&lt;/strong&gt; of
the node/datastores/bridge ztd should use, and &lt;strong&gt;snippets enabled&lt;/strong&gt; on a
datastore. This guide walks through each.&lt;/p&gt;</description></item><item><title>vz — macOS backend (lima)</title><link>https://ztd-98a2ef.gitlab.io/plans/vz-macos-backend/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/plans/vz-macos-backend/</guid><description>&lt;h2 id="plan--the-vz-macos-local-backend-lima"&gt;Plan — the &lt;code&gt;vz&lt;/code&gt; macOS local backend (lima)&lt;a class="anchor" href="#plan--the-vz-macos-local-backend-lima"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This plan delivers &lt;strong&gt;&lt;code&gt;vz&lt;/code&gt;&lt;/strong&gt;, ZTD&amp;rsquo;s fourth backend and its first for macOS
operators: a disposable, isolated Linux guest running locally on
Apple&amp;rsquo;s Virtualization.framework, driven by &lt;a href="https://lima-vm.io"&gt;&lt;code&gt;lima&lt;/code&gt;&lt;/a&gt;. It is
the headline item of Phase 3 (&lt;a href="https://ztd-98a2ef.gitlab.io/explanation/roadmap/"&gt;roadmap&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;It is delivered as a sequence of &lt;strong&gt;phases&lt;/strong&gt;, each executed as one
Opus-orchestrated &lt;strong&gt;red/green/verify&lt;/strong&gt; cycle — see the &lt;code&gt;red-green-verify&lt;/code&gt; skill.
Do not attempt the whole backend in one pass; lock one behavioral contract per
phase.&lt;/p&gt;</description></item><item><title>Your first ZTD VM</title><link>https://ztd-98a2ef.gitlab.io/tutorials/first-vm/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/tutorials/first-vm/</guid><description>&lt;h2 id="your-first-ztd-vm"&gt;Your first ZTD VM&lt;a class="anchor" href="#your-first-ztd-vm"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;By the end of this tutorial you will have booted an isolated Debian VM with its
own Docker daemon, opened a shell inside it, reached a service running in it from
your host, and destroyed it cleanly — all driven through the single &lt;code&gt;./ztd&lt;/code&gt;
interface. Allow about 15 minutes the first time (provider downloads and the base
image are cached afterward).&lt;/p&gt;
&lt;h3 id="before-you-start"&gt;Before you start&lt;a class="anchor" href="#before-you-start"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;You need a Linux host with:&lt;/p&gt;</description></item><item><title>Architecture</title><link>https://ztd-98a2ef.gitlab.io/explanation/architecture/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/explanation/architecture/</guid><description>&lt;h2 id="architecture"&gt;Architecture&lt;a class="anchor" href="#architecture"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Two principles shape ZTD: &lt;strong&gt;one interface across every backend&lt;/strong&gt;, and &lt;strong&gt;all
orchestration tooling in Docker&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="one-interface-many-backends"&gt;One interface, many backends&lt;a class="anchor" href="#one-interface-many-backends"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; ztd CLI (Go / Cobra) ← the single binary; assets embedded
 │
 ├── host lane ─────────────────────────► vz (macOS)
 │ (bash, on the host) lima / Virtualization.framework
 │
 └── container lane
 │ Taskfile → Terraform root ← runs inside the toolbox container
 │ selects ONE backend module by TARGET
 ┌─────────────┼───────────────────────┐
 kvm-local proxmox ec2
 (libvirt) (bpg/proxmox) (aws provider)
 └─────────────┴───────────────────────┘
 │ all four consume the SAME
 cloud-init (Docker + Node + agent + creds)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The CLI routes each verb down one of two lanes. Most dispatch into the toolbox
container, which runs Task and Terraform; the host lane runs bash directly on the
host for the verbs that inspect or mutate host state (&lt;code&gt;check&lt;/code&gt;, &lt;code&gt;setup&lt;/code&gt;, the agent
workflow) and for the whole &lt;code&gt;vz&lt;/code&gt; backend, which has no usable Terraform provider
and drives Apple&amp;rsquo;s hypervisor from the host.&lt;/p&gt;</description></item><item><title>Configuration</title><link>https://ztd-98a2ef.gitlab.io/reference/configuration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/reference/configuration/</guid><description>&lt;h2 id="configuration"&gt;Configuration&lt;a class="anchor" href="#configuration"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;.ztd/ztd.toml&lt;/code&gt; is the ONE file you edit.&lt;/strong&gt; Every dependency&amp;rsquo;s config — Terraform
variables, the lima instance YAML, cloud-init, the compose env — is generated
inside the &lt;code&gt;ztd&lt;/code&gt; binary from &lt;code&gt;ztd.toml&lt;/code&gt; + built-in defaults. There is no
&lt;code&gt;terraform.tfvars&lt;/code&gt;, no lima/cloud-init/compose file you ever touch directly.
Secrets live separately in &lt;code&gt;.ztd/secrets/*.env&lt;/code&gt; (gitignored) — never in &lt;code&gt;ztd.toml&lt;/code&gt;,
which is meant to be committed.&lt;/p&gt;
&lt;p&gt;Scaffold it with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ztd init&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This writes &lt;code&gt;.ztd/ztd.toml&lt;/code&gt; with every key commented out — an all-defaults project
boots as-is; uncomment only what you want to change.&lt;/p&gt;</description></item><item><title>Forward a port from the VM</title><link>https://ztd-98a2ef.gitlab.io/how-to/forward-ports/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/how-to/forward-ports/</guid><description>&lt;h2 id="forward-a-port-from-the-vm"&gt;Forward a port from the VM&lt;a class="anchor" href="#forward-a-port-from-the-vm"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Reach a service running inside the guest from your host&amp;rsquo;s &lt;code&gt;localhost&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./ztd tunnel -- &lt;span style="color:#ae81ff"&gt;8080&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This opens an SSH tunnel (&lt;code&gt;-N -L 8080:localhost:8080&lt;/code&gt;) to the VM using its
ephemeral key. Open &lt;a href="http://localhost:8080"&gt;http://localhost:8080&lt;/a&gt; to hit the guest service. Stop the
tunnel with &lt;code&gt;Ctrl-C&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="a-different-port"&gt;A different port&lt;a class="anchor" href="#a-different-port"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The port comes after &lt;code&gt;--&lt;/code&gt; (that&amp;rsquo;s how Task forwards CLI arguments):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./ztd tunnel -- &lt;span style="color:#ae81ff"&gt;5432&lt;/span&gt; &lt;span style="color:#75715e"&gt;# e.g. a Postgres running in the VM&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="multiple-ports-at-once"&gt;Multiple ports at once&lt;a class="anchor" href="#multiple-ports-at-once"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Run one tunnel per port in separate terminals, or open them in the background:&lt;/p&gt;</description></item><item><title>Standalone CLI (install + run anywhere)</title><link>https://ztd-98a2ef.gitlab.io/plans/standalone-cli/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/plans/standalone-cli/</guid><description>&lt;h2 id="plan--the-standalone-installable-ztd-cli"&gt;Plan — the standalone, installable &lt;code&gt;ztd&lt;/code&gt; CLI&lt;a class="anchor" href="#plan--the-standalone-installable-ztd-cli"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Turn &lt;code&gt;ztd&lt;/code&gt; from &amp;ldquo;a binary that must run inside a checkout of this repo&amp;rdquo; into a
&lt;strong&gt;self-contained CLI&lt;/strong&gt; you install (Homebrew on macOS, a downloaded binary on
Linux) and run from &lt;em&gt;any&lt;/em&gt; project directory: &lt;code&gt;brew install ztd&lt;/code&gt; → &lt;code&gt;cd my-project&lt;/code&gt;
→ &lt;code&gt;ztd init&lt;/code&gt; → &lt;code&gt;ztd up&lt;/code&gt;. The binary carries everything it needs; the only config a
user ever touches is a single &lt;strong&gt;&lt;code&gt;ztd.toml&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Backend cohesion &amp; parity</title><link>https://ztd-98a2ef.gitlab.io/plans/backend-cohesion/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/plans/backend-cohesion/</guid><description>&lt;h2 id="plan--backend-cohesion--parity"&gt;Plan — backend cohesion &amp;amp; parity&lt;a class="anchor" href="#plan--backend-cohesion--parity"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Keep the backends (&lt;code&gt;kvm&lt;/code&gt;, &lt;code&gt;proxmox&lt;/code&gt;, &lt;code&gt;ec2&lt;/code&gt;, &lt;code&gt;vz&lt;/code&gt;) sharing one pipeline, branching
&lt;strong&gt;only where the mechanism genuinely differs&lt;/strong&gt; — so functionality and testing stay
in parity as the set grows. Delivered as red/green/verify phases with an
independent review, like the &lt;a href="https://ztd-98a2ef.gitlab.io/plans/vz-macos-backend/"&gt;vz backend&lt;/a&gt;
and &lt;a href="https://ztd-98a2ef.gitlab.io/plans/standalone-cli/"&gt;standalone CLI&lt;/a&gt; plans.&lt;/p&gt;
&lt;h3 id="the-decision-centralize-at-the-contract-not-at-terraform"&gt;The decision: centralize at the contract, NOT at Terraform&lt;a class="anchor" href="#the-decision-centralize-at-the-contract-not-at-terraform"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A tempting way to &amp;ldquo;unify&amp;rdquo; would be to route &lt;code&gt;vz&lt;/code&gt; through Terraform too. &lt;strong&gt;Rejected&lt;/strong&gt;,
because it &lt;em&gt;adds&lt;/em&gt; branching rather than removing it:&lt;/p&gt;</description></item><item><title>Backends</title><link>https://ztd-98a2ef.gitlab.io/reference/backends/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/reference/backends/</guid><description>&lt;h2 id="backends"&gt;Backends&lt;a class="anchor" href="#backends"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A backend is a stable contract — inputs (name, size, image, cloud-init, repo-sync
mode, ports) and outputs (a reachable SSH endpoint, instance id). Most backends
implement it as a Terraform module; the macOS &lt;code&gt;vz&lt;/code&gt; backend implements it host-side
with &lt;code&gt;lima&lt;/code&gt; instead (no usable Terraform provider, and it drives
Virtualization.framework on the host). The same interface drives every backend;
only &lt;code&gt;TARGET&lt;/code&gt; changes.&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Backend&lt;/th&gt;
					&lt;th&gt;Status&lt;/th&gt;
					&lt;th&gt;Notes&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;kvm&lt;/code&gt; (libvirt)&lt;/td&gt;
					&lt;td&gt;available&lt;/td&gt;
					&lt;td&gt;Local Linux host. &lt;code&gt;dmacvicar/libvirt&lt;/code&gt; 0.9.x; repo live-mounted over virtiofs.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;proxmox&lt;/code&gt; (bpg)&lt;/td&gt;
					&lt;td&gt;validated&lt;/td&gt;
					&lt;td&gt;Remote node; cloud-init uploaded as a snippet.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;ec2&lt;/code&gt; (aws)&lt;/td&gt;
					&lt;td&gt;validated&lt;/td&gt;
					&lt;td&gt;AWS instance; Debian AMI auto-looked-up; public IP is a real Terraform output. See the &lt;a href="https://ztd-98a2ef.gitlab.io/how-to/ec2-backend/"&gt;EC2 how-to&lt;/a&gt;.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;vz&lt;/code&gt; (Apple Virtualization)&lt;/td&gt;
					&lt;td&gt;available&lt;/td&gt;
					&lt;td&gt;macOS local via &lt;code&gt;lima&lt;/code&gt; — host-side (not Terraform); reached over lima&amp;rsquo;s forwarded SSH port. See the &lt;a href="https://ztd-98a2ef.gitlab.io/how-to/vz-backend/"&gt;vz how-to&lt;/a&gt;.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;hetzner&lt;/code&gt; / &lt;code&gt;digitalocean&lt;/code&gt; / &lt;code&gt;vultr&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;planned&lt;/td&gt;
					&lt;td&gt;Same contract.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;verda&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;planned&lt;/td&gt;
					&lt;td&gt;GPU cloud, for GPU agent workloads.&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="libvirt-version-pin"&gt;libvirt version pin&lt;a class="anchor" href="#libvirt-version-pin"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;kvm&lt;/code&gt; backend pins &lt;code&gt;dmacvicar/libvirt&lt;/code&gt; to &lt;code&gt;~&amp;gt; 0.9.8&lt;/code&gt; — the raw-XML schema
(&lt;code&gt;devices&lt;/code&gt;, &lt;code&gt;os&lt;/code&gt;, &lt;code&gt;memory_backing&lt;/code&gt; as attributes), which the module needs for
native virtiofs. Note 0.9.x exposes no computed guest IP, so ztd reads it from the
libvirt DHCP lease via &lt;code&gt;virsh&lt;/code&gt; rather than a Terraform output.&lt;/p&gt;</description></item><item><title>Cattle, not pets</title><link>https://ztd-98a2ef.gitlab.io/explanation/cattle-not-pets/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/explanation/cattle-not-pets/</guid><description>&lt;h2 id="cattle-not-pets"&gt;Cattle, not pets&lt;a class="anchor" href="#cattle-not-pets"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A ZTD VM is &lt;strong&gt;cattle&lt;/strong&gt;: created for a task, run unattended, and destroyed. It is
never a &lt;strong&gt;pet&lt;/strong&gt; — a long-lived box you nurture, patch, and fear losing.&lt;/p&gt;
&lt;h3 id="the-lifecycle"&gt;The lifecycle&lt;a class="anchor" href="#the-lifecycle"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;up ─▶ provision ─▶ inject ephemeral key + synced secrets ─▶ sync/clone repo
 ─▶ launch agent (YOLO) ─▶ agent works autonomously
 ─▶ push result branch [+ open MR] ─▶ export audit ─▶ down (manual, v1)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The operator initiates; the run is autonomous. Results are durable because they
land in &lt;strong&gt;git&lt;/strong&gt; — a branch or merge request. The VM itself holds nothing of
value, so destroying it costs nothing.&lt;/p&gt;</description></item><item><title>Publish the agent's results</title><link>https://ztd-98a2ef.gitlab.io/how-to/scoped-git-token/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/how-to/scoped-git-token/</guid><description>&lt;h2 id="publish-the-agents-results-git-runs-on-the-host"&gt;Publish the agent&amp;rsquo;s results (git runs on the host)&lt;a class="anchor" href="#publish-the-agents-results-git-runs-on-the-host"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The agent works inside an &lt;strong&gt;untrusted&lt;/strong&gt; VM, so the VM never holds forge
credentials and never contacts a forge — &lt;strong&gt;all forge git is a host operation.&lt;/strong&gt;
Code goes &lt;em&gt;in&lt;/em&gt; via the repo sync; results come &lt;em&gt;out&lt;/em&gt; through the host.&lt;/p&gt;
&lt;h3 id="why-not-push-from-the-vm"&gt;Why not push from the VM?&lt;a class="anchor" href="#why-not-push-from-the-vm"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A push from the guest would need a forge credential &lt;em&gt;in&lt;/em&gt; the guest. Even a
short-lived, repo-scoped token is still a credential sitting in an
assumed-compromised box — one more thing to leak. Keeping every clone/push on the
trusted host removes that surface entirely. The only credential the guest ever
holds is the per-VM ephemeral SSH key, which grants nothing on your forge. See
&lt;a href="https://ztd-98a2ef.gitlab.io/explanation/zero-trust-model/#credentials"&gt;The zero-trust model&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Use the vz (macOS) backend</title><link>https://ztd-98a2ef.gitlab.io/how-to/vz-backend/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/how-to/vz-backend/</guid><description>&lt;h2 id="use-the-vz-macos-backend"&gt;Use the vz (macOS) backend&lt;a class="anchor" href="#use-the-vz-macos-backend"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Run a disposable ZTD guest &lt;strong&gt;locally on macOS&lt;/strong&gt; — on Apple&amp;rsquo;s
Virtualization.framework via &lt;a href="https://lima-vm.io"&gt;&lt;code&gt;lima&lt;/code&gt;&lt;/a&gt;, instead of KVM (which
macOS doesn&amp;rsquo;t have). This is the &lt;code&gt;vz&lt;/code&gt; backend.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;vz&lt;/code&gt; is the native &lt;em&gt;local&lt;/em&gt; backend on macOS, the way &lt;code&gt;kvm&lt;/code&gt; is on Linux&lt;/strong&gt; — so on
a Mac, &lt;code&gt;local&lt;/code&gt; resolves to &lt;code&gt;vz&lt;/code&gt; automatically and a bare &lt;code&gt;./ztd up&lt;/code&gt; (no &lt;code&gt;TARGET&lt;/code&gt;)
does the right thing. &lt;code&gt;TARGET=vz&lt;/code&gt; is just the explicit form; the examples below
spell it out for clarity, but you can drop it on macOS.&lt;/p&gt;</description></item><item><title>Host prerequisites</title><link>https://ztd-98a2ef.gitlab.io/reference/host-prerequisites/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/reference/host-prerequisites/</guid><description>&lt;h2 id="host-prerequisites"&gt;Host prerequisites&lt;a class="anchor" href="#host-prerequisites"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ZTD keeps the host footprint minimal: all orchestration tooling (Terraform,
providers, Task) runs in the toolbox container. The only thing that can&amp;rsquo;t be
containerized is a hypervisor for a &lt;em&gt;local&lt;/em&gt; VM — and that is &amp;ldquo;the VM&amp;rdquo; itself.&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Backend&lt;/th&gt;
					&lt;th&gt;Host needs&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;kvm&lt;/code&gt; (local Linux)&lt;/td&gt;
					&lt;td&gt;Docker + libvirt/qemu + &lt;code&gt;virtiofsd&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;vz&lt;/code&gt; (local macOS)&lt;/td&gt;
					&lt;td&gt;Docker + Virtualization.framework (via &lt;code&gt;lima&lt;/code&gt;)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;proxmox&lt;/code&gt; / &lt;code&gt;ec2&lt;/code&gt; (remote)&lt;/td&gt;
					&lt;td&gt;Docker only&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;virtiofsd&lt;/code&gt; relays the repo live-share into the guest (it runs as root and
reflects the guest uid to the host owner, so files created in the VM are owned by
you on the host).&lt;/p&gt;</description></item><item><title>Reset or destroy a VM</title><link>https://ztd-98a2ef.gitlab.io/how-to/reset-and-destroy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/how-to/reset-and-destroy/</guid><description>&lt;h2 id="reset-or-destroy-a-vm"&gt;Reset or destroy a VM&lt;a class="anchor" href="#reset-or-destroy-a-vm"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="destroy"&gt;Destroy&lt;a class="anchor" href="#destroy"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./ztd down&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Removes the VM and its disk. On a remote backend, prefix with the target:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;TARGET&lt;span style="color:#f92672"&gt;=&lt;/span&gt;proxmox ./ztd down&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="reset-to-a-clean-state"&gt;Reset to a clean state&lt;a class="anchor" href="#reset-to-a-clean-state"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;To throw away a VM and recreate it from clean cloud-init in one step:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./ztd reset&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is &lt;code&gt;down&lt;/code&gt; followed by &lt;code&gt;up&lt;/code&gt;. Use it when an agent run has left the VM in a
state you don&amp;rsquo;t trust and you want a known-good box again — which, given ZTD&amp;rsquo;s
&lt;a href="https://ztd-98a2ef.gitlab.io/explanation/cattle-not-pets/"&gt;cattle model&lt;/a&gt;, is the normal way
to &amp;ldquo;fix&amp;rdquo; a VM.&lt;/p&gt;</description></item><item><title>Roadmap</title><link>https://ztd-98a2ef.gitlab.io/explanation/roadmap/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/explanation/roadmap/</guid><description>&lt;h2 id="roadmap"&gt;Roadmap&lt;a class="anchor" href="#roadmap"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ZTD is pre-v1. Phases 0, 1 and 2 are complete — all four backends are validated
end to end and the Go CLI ships as an installable binary. Phase 3 is in progress.&lt;/p&gt;
&lt;h3 id="phase-0--done"&gt;Phase 0 — done&lt;a class="anchor" href="#phase-0--done"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Dockerized Terraform + Taskfile. Backends &lt;code&gt;kvm&lt;/code&gt; (local) and &lt;code&gt;proxmox&lt;/code&gt;. Shared
cloud-init. Single interface via &lt;code&gt;TARGET&lt;/code&gt;. Host needs only Docker (plus
libvirt/qemu for local).&lt;/p&gt;
&lt;h3 id="phase-1--done"&gt;Phase 1 — done&lt;a class="anchor" href="#phase-1--done"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;All three backends — &lt;code&gt;kvm&lt;/code&gt;, &lt;code&gt;proxmox&lt;/code&gt;, and &lt;code&gt;ec2&lt;/code&gt; — validated end-to-end
(&lt;code&gt;./ztd test&lt;/code&gt; green on each).&lt;/p&gt;</description></item><item><title>Use the EC2 backend</title><link>https://ztd-98a2ef.gitlab.io/how-to/ec2-backend/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/how-to/ec2-backend/</guid><description>&lt;h2 id="use-the-ec2-aws-backend"&gt;Use the EC2 (AWS) backend&lt;a class="anchor" href="#use-the-ec2-aws-backend"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;ec2&lt;/code&gt; backend runs the disposable VM as an AWS EC2 instance. It reuses the same
shared cloud-init, ephemeral SSH key, and host-side agent workflow
(&lt;code&gt;mount&lt;/code&gt;/&lt;code&gt;fetch&lt;/code&gt;/&lt;code&gt;auth&lt;/code&gt;/&lt;code&gt;run&lt;/code&gt;/&lt;code&gt;audit&lt;/code&gt;) as the other backends — only the &amp;ldquo;where the
VM lives&amp;rdquo; layer differs.&lt;/p&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;Status: validated end-to-end (&lt;code&gt;TARGET=ec2 ./ztd test&lt;/code&gt; green on a real account).
EC2 instances &lt;strong&gt;cost money per running hour&lt;/strong&gt; — &lt;code&gt;ztd down&lt;/code&gt; terminates them; don&amp;rsquo;t
leave one running.&lt;/p&gt;</description></item><item><title>Pin or override the toolbox image</title><link>https://ztd-98a2ef.gitlab.io/how-to/toolbox-image/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/how-to/toolbox-image/</guid><description>&lt;h2 id="pin-or-override-the-toolbox-image"&gt;Pin or override the toolbox image&lt;a class="anchor" href="#pin-or-override-the-toolbox-image"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;kvm&lt;/code&gt;, &lt;code&gt;proxmox&lt;/code&gt;, and &lt;code&gt;ec2&lt;/code&gt; backends provision through the &lt;strong&gt;toolbox
container&lt;/strong&gt; — Terraform, Task, the libvirt client, and the pinned Go toolchain all
live there so your host needs only Docker. (The &lt;code&gt;vz&lt;/code&gt; backend runs &lt;code&gt;limactl&lt;/code&gt; on the
host and uses no toolbox at all, so none of this applies to it.)&lt;/p&gt;
&lt;p&gt;Which image that container runs is decided by the &lt;code&gt;ztd&lt;/code&gt; binary, not by you editing
a compose file.&lt;/p&gt;</description></item><item><title>ztd</title><link>https://ztd-98a2ef.gitlab.io/reference/cli/ztd/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/reference/cli/ztd/</guid><description>&lt;h2 id="ztd"&gt;ztd&lt;a class="anchor" href="#ztd"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Zero Trust Dev — disposable isolated VMs for untrusted dev work&lt;/p&gt;
&lt;h3 id="options"&gt;Options&lt;a class="anchor" href="#options"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; -h, --help help for ztd&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="see-also"&gt;SEE ALSO&lt;a class="anchor" href="#see-also"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ztd_attach.md"&gt;ztd attach&lt;/a&gt;	 - Reattach to the guest agent&amp;rsquo;s tmux session (bash scripts/run-agent.sh attach)&lt;/li&gt;
&lt;li&gt;&lt;a href="ztd_audit.md"&gt;ztd audit&lt;/a&gt;	 - Export a run&amp;rsquo;s audit record to .ztd/runs/ (bash scripts/audit.sh)&lt;/li&gt;
&lt;li&gt;&lt;a href="ztd_auth.md"&gt;ztd auth&lt;/a&gt;	 - Sync the operator&amp;rsquo;s Claude Code login into the guest (bash scripts/auth-sync.sh)&lt;/li&gt;
&lt;li&gt;&lt;a href="ztd_cattle.md"&gt;ztd cattle&lt;/a&gt;	 - One-shot up→auth→skills→commands→run (bash scripts/cattle.sh)&lt;/li&gt;
&lt;li&gt;&lt;a href="ztd_check.md"&gt;ztd check&lt;/a&gt;	 - Run the host-side preflight (bash scripts/check-requirements.sh)&lt;/li&gt;
&lt;li&gt;&lt;a href="ztd_commands.md"&gt;ztd commands&lt;/a&gt;	 - Provision/pull the guest agent&amp;rsquo;s ~/.claude/commands (bash scripts/agent-sync.sh commands)&lt;/li&gt;
&lt;li&gt;&lt;a href="ztd_config.md"&gt;ztd config&lt;/a&gt;	 - Print the resolved ztd configuration&lt;/li&gt;
&lt;li&gt;&lt;a href="ztd_down.md"&gt;ztd down&lt;/a&gt;	 - Tear down the VM (discards the ephemeral key + transient git remote on success)&lt;/li&gt;
&lt;li&gt;&lt;a href="ztd_fetch.md"&gt;ztd fetch&lt;/a&gt;	 - Fetch the guest&amp;rsquo;s commits into the operator&amp;rsquo;s checkout (bash scripts/fetch-remote.sh)&lt;/li&gt;
&lt;li&gt;&lt;a href="ztd_init.md"&gt;ztd init&lt;/a&gt;	 - Scaffold this project&amp;rsquo;s .ztd/ztd.toml (the single config file)&lt;/li&gt;
&lt;li&gt;&lt;a href="ztd_ip.md"&gt;ztd ip&lt;/a&gt;	 - Print the VM&amp;rsquo;s IP address&lt;/li&gt;
&lt;li&gt;&lt;a href="ztd_list:orphans.md"&gt;ztd list:orphans&lt;/a&gt;	 - List orphaned VMs/resources not tracked by state&lt;/li&gt;
&lt;li&gt;&lt;a href="ztd_logs.md"&gt;ztd logs&lt;/a&gt;	 - Follow guest cloud-init/provisioning output&lt;/li&gt;
&lt;li&gt;&lt;a href="ztd_mount.md"&gt;ztd mount&lt;/a&gt;	 - SSHFS-mount a remote guest&amp;rsquo;s repo (bash scripts/mount-remote.sh mount)&lt;/li&gt;
&lt;li&gt;&lt;a href="ztd_plan.md"&gt;ztd plan&lt;/a&gt;	 - Show the Terraform plan for the VM&lt;/li&gt;
&lt;li&gt;&lt;a href="ztd_purge.md"&gt;ztd purge&lt;/a&gt;	 - Destroy all ztd-managed resources&lt;/li&gt;
&lt;li&gt;&lt;a href="ztd_reset.md"&gt;ztd reset&lt;/a&gt;	 - Recreate the VM (down+up; keeps the ephemeral key)&lt;/li&gt;
&lt;li&gt;&lt;a href="ztd_run.md"&gt;ztd run&lt;/a&gt;	 - Launch the agent in a guest tmux session (bash scripts/run-agent.sh run)&lt;/li&gt;
&lt;li&gt;&lt;a href="ztd_setup.md"&gt;ztd setup&lt;/a&gt;	 - Install the persistent Docker→libvirt forwarding fix (&amp;ndash;transient, &amp;ndash;undo)&lt;/li&gt;
&lt;li&gt;&lt;a href="ztd_skills.md"&gt;ztd skills&lt;/a&gt;	 - Provision/pull the guest agent&amp;rsquo;s ~/.claude/skills (bash scripts/agent-sync.sh skills)&lt;/li&gt;
&lt;li&gt;&lt;a href="ztd_ssh.md"&gt;ztd ssh&lt;/a&gt;	 - Shell into the VM (ephemeral key)&lt;/li&gt;
&lt;li&gt;&lt;a href="ztd_status.md"&gt;ztd status&lt;/a&gt;	 - Report the ztd VM&amp;rsquo;s status (&amp;ndash;watch for a live readiness dashboard)&lt;/li&gt;
&lt;li&gt;&lt;a href="ztd_test.md"&gt;ztd test&lt;/a&gt;	 - Run the full acceptance suite for the current backend (bash scripts/smoke-test[-proxmox|-ec2].sh)&lt;/li&gt;
&lt;li&gt;&lt;a href="ztd_test:config.md"&gt;ztd test:config&lt;/a&gt;	 - Run the VM-free config-loader unit test (bash scripts/test-config.sh)&lt;/li&gt;
&lt;li&gt;&lt;a href="ztd_tunnel.md"&gt;ztd tunnel&lt;/a&gt;	 - Forward a VM port to localhost (default 8080; e.g. ztd tunnel 8080)&lt;/li&gt;
&lt;li&gt;&lt;a href="ztd_unmount.md"&gt;ztd unmount&lt;/a&gt;	 - Unmount a remote guest&amp;rsquo;s repo (bash scripts/mount-remote.sh unmount)&lt;/li&gt;
&lt;li&gt;&lt;a href="ztd_up.md"&gt;ztd up&lt;/a&gt;	 - Boot the VM (generates the ephemeral guest key first)&lt;/li&gt;
&lt;li&gt;&lt;a href="ztd_validate.md"&gt;ztd validate&lt;/a&gt;	 - Validate the Terraform configuration&lt;/li&gt;
&lt;li&gt;&lt;a href="ztd_version.md"&gt;ztd version&lt;/a&gt;	 - Print the ztd version&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ztd attach</title><link>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_attach/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_attach/</guid><description>&lt;h2 id="ztd-attach"&gt;ztd attach&lt;a class="anchor" href="#ztd-attach"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Reattach to the guest agent&amp;rsquo;s tmux session (bash scripts/run-agent.sh attach)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ztd attach [flags]&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="options"&gt;Options&lt;a class="anchor" href="#options"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; -h, --help help for attach&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="see-also"&gt;SEE ALSO&lt;a class="anchor" href="#see-also"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ztd.md"&gt;ztd&lt;/a&gt;	 - Zero Trust Dev — disposable isolated VMs for untrusted dev work&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ztd audit</title><link>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_audit/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_audit/</guid><description>&lt;h2 id="ztd-audit"&gt;ztd audit&lt;a class="anchor" href="#ztd-audit"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Export a run&amp;rsquo;s audit record to .ztd/runs/ (bash scripts/audit.sh)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ztd audit [flags]&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="options"&gt;Options&lt;a class="anchor" href="#options"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; -h, --help help for audit&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="see-also"&gt;SEE ALSO&lt;a class="anchor" href="#see-also"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ztd.md"&gt;ztd&lt;/a&gt;	 - Zero Trust Dev — disposable isolated VMs for untrusted dev work&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ztd auth</title><link>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_auth/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_auth/</guid><description>&lt;h2 id="ztd-auth"&gt;ztd auth&lt;a class="anchor" href="#ztd-auth"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Sync the operator&amp;rsquo;s Claude Code login into the guest (bash scripts/auth-sync.sh)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ztd auth [flags]&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="options"&gt;Options&lt;a class="anchor" href="#options"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; -h, --help help for auth&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="see-also"&gt;SEE ALSO&lt;a class="anchor" href="#see-also"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ztd.md"&gt;ztd&lt;/a&gt;	 - Zero Trust Dev — disposable isolated VMs for untrusted dev work&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ztd cattle</title><link>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_cattle/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_cattle/</guid><description>&lt;h2 id="ztd-cattle"&gt;ztd cattle&lt;a class="anchor" href="#ztd-cattle"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;One-shot up→auth→skills→commands→run (bash scripts/cattle.sh)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ztd cattle [flags]&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="options"&gt;Options&lt;a class="anchor" href="#options"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; -h, --help help for cattle&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="see-also"&gt;SEE ALSO&lt;a class="anchor" href="#see-also"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ztd.md"&gt;ztd&lt;/a&gt;	 - Zero Trust Dev — disposable isolated VMs for untrusted dev work&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ztd check</title><link>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_check/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_check/</guid><description>&lt;h2 id="ztd-check"&gt;ztd check&lt;a class="anchor" href="#ztd-check"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Run the host-side preflight (bash scripts/check-requirements.sh)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ztd check [flags]&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="options"&gt;Options&lt;a class="anchor" href="#options"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; -h, --help help for check&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="see-also"&gt;SEE ALSO&lt;a class="anchor" href="#see-also"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ztd.md"&gt;ztd&lt;/a&gt;	 - Zero Trust Dev — disposable isolated VMs for untrusted dev work&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ztd commands</title><link>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_commands/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_commands/</guid><description>&lt;h2 id="ztd-commands"&gt;ztd commands&lt;a class="anchor" href="#ztd-commands"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Provision/pull the guest agent&amp;rsquo;s ~/.claude/commands (bash scripts/agent-sync.sh commands)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ztd commands [flags]&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="options"&gt;Options&lt;a class="anchor" href="#options"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; -h, --help help for commands&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="see-also"&gt;SEE ALSO&lt;a class="anchor" href="#see-also"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ztd.md"&gt;ztd&lt;/a&gt;	 - Zero Trust Dev — disposable isolated VMs for untrusted dev work&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ztd config</title><link>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_config/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_config/</guid><description>&lt;h2 id="ztd-config"&gt;ztd config&lt;a class="anchor" href="#ztd-config"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Print the resolved ztd configuration&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ztd config [flags]&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="options"&gt;Options&lt;a class="anchor" href="#options"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; -h, --help help for config&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="see-also"&gt;SEE ALSO&lt;a class="anchor" href="#see-also"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ztd.md"&gt;ztd&lt;/a&gt;	 - Zero Trust Dev — disposable isolated VMs for untrusted dev work&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ztd down</title><link>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_down/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_down/</guid><description>&lt;h2 id="ztd-down"&gt;ztd down&lt;a class="anchor" href="#ztd-down"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Tear down the VM (discards the ephemeral key + transient git remote on success)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ztd down [flags]&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="options"&gt;Options&lt;a class="anchor" href="#options"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; -h, --help help for down&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="see-also"&gt;SEE ALSO&lt;a class="anchor" href="#see-also"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ztd.md"&gt;ztd&lt;/a&gt;	 - Zero Trust Dev — disposable isolated VMs for untrusted dev work&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ztd fetch</title><link>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_fetch/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_fetch/</guid><description>&lt;h2 id="ztd-fetch"&gt;ztd fetch&lt;a class="anchor" href="#ztd-fetch"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Fetch the guest&amp;rsquo;s commits into the operator&amp;rsquo;s checkout (bash scripts/fetch-remote.sh)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ztd fetch [flags]&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="options"&gt;Options&lt;a class="anchor" href="#options"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; -h, --help help for fetch&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="see-also"&gt;SEE ALSO&lt;a class="anchor" href="#see-also"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ztd.md"&gt;ztd&lt;/a&gt;	 - Zero Trust Dev — disposable isolated VMs for untrusted dev work&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ztd init</title><link>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_init/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_init/</guid><description>&lt;h2 id="ztd-init"&gt;ztd init&lt;a class="anchor" href="#ztd-init"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Scaffold this project&amp;rsquo;s .ztd/ztd.toml (the single config file)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ztd init [flags]&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="options"&gt;Options&lt;a class="anchor" href="#options"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; -h, --help help for init&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="see-also"&gt;SEE ALSO&lt;a class="anchor" href="#see-also"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ztd.md"&gt;ztd&lt;/a&gt;	 - Zero Trust Dev — disposable isolated VMs for untrusted dev work&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ztd ip</title><link>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_ip/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_ip/</guid><description>&lt;h2 id="ztd-ip"&gt;ztd ip&lt;a class="anchor" href="#ztd-ip"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Print the VM&amp;rsquo;s IP address&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ztd ip [flags]&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="options"&gt;Options&lt;a class="anchor" href="#options"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; -h, --help help for ip&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="see-also"&gt;SEE ALSO&lt;a class="anchor" href="#see-also"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ztd.md"&gt;ztd&lt;/a&gt;	 - Zero Trust Dev — disposable isolated VMs for untrusted dev work&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ztd list:orphans</title><link>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_listorphans/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_listorphans/</guid><description>&lt;h2 id="ztd-listorphans"&gt;ztd list:orphans&lt;a class="anchor" href="#ztd-listorphans"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;List orphaned VMs/resources not tracked by state&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ztd list:orphans [flags]&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="options"&gt;Options&lt;a class="anchor" href="#options"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; -h, --help help for list:orphans&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="see-also"&gt;SEE ALSO&lt;a class="anchor" href="#see-also"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ztd.md"&gt;ztd&lt;/a&gt;	 - Zero Trust Dev — disposable isolated VMs for untrusted dev work&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ztd logs</title><link>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_logs/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_logs/</guid><description>&lt;h2 id="ztd-logs"&gt;ztd logs&lt;a class="anchor" href="#ztd-logs"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Follow guest cloud-init/provisioning output&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ztd logs [flags]&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="options"&gt;Options&lt;a class="anchor" href="#options"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; -h, --help help for logs&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="see-also"&gt;SEE ALSO&lt;a class="anchor" href="#see-also"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ztd.md"&gt;ztd&lt;/a&gt;	 - Zero Trust Dev — disposable isolated VMs for untrusted dev work&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ztd mount</title><link>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_mount/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_mount/</guid><description>&lt;h2 id="ztd-mount"&gt;ztd mount&lt;a class="anchor" href="#ztd-mount"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;SSHFS-mount a remote guest&amp;rsquo;s repo (bash scripts/mount-remote.sh mount)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ztd mount [flags]&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="options"&gt;Options&lt;a class="anchor" href="#options"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; -h, --help help for mount&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="see-also"&gt;SEE ALSO&lt;a class="anchor" href="#see-also"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ztd.md"&gt;ztd&lt;/a&gt;	 - Zero Trust Dev — disposable isolated VMs for untrusted dev work&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ztd plan</title><link>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_plan/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_plan/</guid><description>&lt;h2 id="ztd-plan"&gt;ztd plan&lt;a class="anchor" href="#ztd-plan"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Show the Terraform plan for the VM&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ztd plan [flags]&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="options"&gt;Options&lt;a class="anchor" href="#options"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; -h, --help help for plan&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="see-also"&gt;SEE ALSO&lt;a class="anchor" href="#see-also"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ztd.md"&gt;ztd&lt;/a&gt;	 - Zero Trust Dev — disposable isolated VMs for untrusted dev work&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ztd purge</title><link>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_purge/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_purge/</guid><description>&lt;h2 id="ztd-purge"&gt;ztd purge&lt;a class="anchor" href="#ztd-purge"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Destroy all ztd-managed resources&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ztd purge [flags]&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="options"&gt;Options&lt;a class="anchor" href="#options"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; -h, --help help for purge&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="see-also"&gt;SEE ALSO&lt;a class="anchor" href="#see-also"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ztd.md"&gt;ztd&lt;/a&gt;	 - Zero Trust Dev — disposable isolated VMs for untrusted dev work&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ztd reset</title><link>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_reset/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_reset/</guid><description>&lt;h2 id="ztd-reset"&gt;ztd reset&lt;a class="anchor" href="#ztd-reset"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Recreate the VM (down+up; keeps the ephemeral key)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ztd reset [flags]&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="options"&gt;Options&lt;a class="anchor" href="#options"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; -h, --help help for reset&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="see-also"&gt;SEE ALSO&lt;a class="anchor" href="#see-also"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ztd.md"&gt;ztd&lt;/a&gt;	 - Zero Trust Dev — disposable isolated VMs for untrusted dev work&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ztd run</title><link>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_run/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_run/</guid><description>&lt;h2 id="ztd-run"&gt;ztd run&lt;a class="anchor" href="#ztd-run"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Launch the agent in a guest tmux session (bash scripts/run-agent.sh run)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ztd run [flags]&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="options"&gt;Options&lt;a class="anchor" href="#options"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; -h, --help help for run&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="see-also"&gt;SEE ALSO&lt;a class="anchor" href="#see-also"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ztd.md"&gt;ztd&lt;/a&gt;	 - Zero Trust Dev — disposable isolated VMs for untrusted dev work&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ztd setup</title><link>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_setup/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_setup/</guid><description>&lt;h2 id="ztd-setup"&gt;ztd setup&lt;a class="anchor" href="#ztd-setup"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Install the persistent Docker→libvirt forwarding fix (&amp;ndash;transient, &amp;ndash;undo)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ztd setup [flags]&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="options"&gt;Options&lt;a class="anchor" href="#options"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; -h, --help help for setup&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="see-also"&gt;SEE ALSO&lt;a class="anchor" href="#see-also"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ztd.md"&gt;ztd&lt;/a&gt;	 - Zero Trust Dev — disposable isolated VMs for untrusted dev work&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ztd skills</title><link>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_skills/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_skills/</guid><description>&lt;h2 id="ztd-skills"&gt;ztd skills&lt;a class="anchor" href="#ztd-skills"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Provision/pull the guest agent&amp;rsquo;s ~/.claude/skills (bash scripts/agent-sync.sh skills)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ztd skills [flags]&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="options"&gt;Options&lt;a class="anchor" href="#options"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; -h, --help help for skills&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="see-also"&gt;SEE ALSO&lt;a class="anchor" href="#see-also"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ztd.md"&gt;ztd&lt;/a&gt;	 - Zero Trust Dev — disposable isolated VMs for untrusted dev work&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ztd ssh</title><link>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_ssh/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_ssh/</guid><description>&lt;h2 id="ztd-ssh"&gt;ztd ssh&lt;a class="anchor" href="#ztd-ssh"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Shell into the VM (ephemeral key)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ztd ssh [flags]&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="options"&gt;Options&lt;a class="anchor" href="#options"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; -h, --help help for ssh&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="see-also"&gt;SEE ALSO&lt;a class="anchor" href="#see-also"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ztd.md"&gt;ztd&lt;/a&gt;	 - Zero Trust Dev — disposable isolated VMs for untrusted dev work&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ztd status</title><link>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_status/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_status/</guid><description>&lt;h2 id="ztd-status"&gt;ztd status&lt;a class="anchor" href="#ztd-status"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Report the ztd VM&amp;rsquo;s status (&amp;ndash;watch for a live readiness dashboard)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ztd status [flags]&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="options"&gt;Options&lt;a class="anchor" href="#options"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; -h, --help help for status
 --timeout duration how long --watch waits for the guest to be fully ready before giving up (default 10m0s)
 --watch live readiness dashboard: poll the guest and watch features (SSH, cloud-init, virtiofs repo, Docker, Node, Claude) go green as they come online&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="see-also"&gt;SEE ALSO&lt;a class="anchor" href="#see-also"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ztd.md"&gt;ztd&lt;/a&gt;	 - Zero Trust Dev — disposable isolated VMs for untrusted dev work&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ztd test</title><link>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_test/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_test/</guid><description>&lt;h2 id="ztd-test"&gt;ztd test&lt;a class="anchor" href="#ztd-test"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Run the full acceptance suite for the current backend (bash scripts/smoke-test[-proxmox|-ec2].sh)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ztd test [flags]&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="options"&gt;Options&lt;a class="anchor" href="#options"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; -h, --help help for test&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="see-also"&gt;SEE ALSO&lt;a class="anchor" href="#see-also"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ztd.md"&gt;ztd&lt;/a&gt;	 - Zero Trust Dev — disposable isolated VMs for untrusted dev work&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ztd test:config</title><link>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_testconfig/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_testconfig/</guid><description>&lt;h2 id="ztd-testconfig"&gt;ztd test:config&lt;a class="anchor" href="#ztd-testconfig"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Run the VM-free config-loader unit test (bash scripts/test-config.sh)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ztd test:config [flags]&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="options"&gt;Options&lt;a class="anchor" href="#options"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; -h, --help help for test:config&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="see-also"&gt;SEE ALSO&lt;a class="anchor" href="#see-also"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ztd.md"&gt;ztd&lt;/a&gt;	 - Zero Trust Dev — disposable isolated VMs for untrusted dev work&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ztd tunnel</title><link>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_tunnel/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_tunnel/</guid><description>&lt;h2 id="ztd-tunnel"&gt;ztd tunnel&lt;a class="anchor" href="#ztd-tunnel"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Forward a VM port to localhost (default 8080; e.g. ztd tunnel 8080)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ztd tunnel [port] [flags]&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="options"&gt;Options&lt;a class="anchor" href="#options"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; -h, --help help for tunnel&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="see-also"&gt;SEE ALSO&lt;a class="anchor" href="#see-also"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ztd.md"&gt;ztd&lt;/a&gt;	 - Zero Trust Dev — disposable isolated VMs for untrusted dev work&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ztd unmount</title><link>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_unmount/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_unmount/</guid><description>&lt;h2 id="ztd-unmount"&gt;ztd unmount&lt;a class="anchor" href="#ztd-unmount"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Unmount a remote guest&amp;rsquo;s repo (bash scripts/mount-remote.sh unmount)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ztd unmount [flags]&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="options"&gt;Options&lt;a class="anchor" href="#options"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; -h, --help help for unmount&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="see-also"&gt;SEE ALSO&lt;a class="anchor" href="#see-also"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ztd.md"&gt;ztd&lt;/a&gt;	 - Zero Trust Dev — disposable isolated VMs for untrusted dev work&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ztd up</title><link>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_up/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_up/</guid><description>&lt;h2 id="ztd-up"&gt;ztd up&lt;a class="anchor" href="#ztd-up"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Boot the VM (generates the ephemeral guest key first)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ztd up [flags]&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="options"&gt;Options&lt;a class="anchor" href="#options"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; -h, --help help for up&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="see-also"&gt;SEE ALSO&lt;a class="anchor" href="#see-also"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ztd.md"&gt;ztd&lt;/a&gt;	 - Zero Trust Dev — disposable isolated VMs for untrusted dev work&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ztd validate</title><link>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_validate/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_validate/</guid><description>&lt;h2 id="ztd-validate"&gt;ztd validate&lt;a class="anchor" href="#ztd-validate"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Validate the Terraform configuration&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ztd validate [flags]&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="options"&gt;Options&lt;a class="anchor" href="#options"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; -h, --help help for validate&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="see-also"&gt;SEE ALSO&lt;a class="anchor" href="#see-also"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ztd.md"&gt;ztd&lt;/a&gt;	 - Zero Trust Dev — disposable isolated VMs for untrusted dev work&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ztd version</title><link>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_version/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/reference/cli/ztd_version/</guid><description>&lt;h2 id="ztd-version"&gt;ztd version&lt;a class="anchor" href="#ztd-version"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Print the ztd version&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ztd version [flags]&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="options"&gt;Options&lt;a class="anchor" href="#options"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; -h, --help help for version&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="see-also"&gt;SEE ALSO&lt;a class="anchor" href="#see-also"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ztd.md"&gt;ztd&lt;/a&gt;	 - Zero Trust Dev — disposable isolated VMs for untrusted dev work&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Install ztd</title><link>https://ztd-98a2ef.gitlab.io/how-to/install/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ztd-98a2ef.gitlab.io/how-to/install/</guid><description>&lt;h2 id="install-ztd"&gt;Install ztd&lt;a class="anchor" href="#install-ztd"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;ztd&lt;/code&gt; is a single static binary. It carries its own runtime assets — the Terraform
root, the lima template, cloud-init, the toolbox compose file — embedded inside
it, so there is &lt;strong&gt;no ZTD source checkout to clone&lt;/strong&gt; and nothing to keep in sync
with the binary.&lt;/p&gt;
&lt;p&gt;What it still needs from the host is the thing that can&amp;rsquo;t be shipped in a binary:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Backend&lt;/th&gt;
					&lt;th&gt;Host needs&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;vz&lt;/code&gt; (local macOS)&lt;/td&gt;
					&lt;td&gt;Docker + &lt;a href="https://lima-vm.io/"&gt;lima&lt;/a&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;kvm&lt;/code&gt; (local Linux)&lt;/td&gt;
					&lt;td&gt;Docker + libvirt/qemu/dnsmasq + &lt;code&gt;virtiofsd&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;proxmox&lt;/code&gt; / &lt;code&gt;ec2&lt;/code&gt; (remote)&lt;/td&gt;
					&lt;td&gt;Docker only&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Run &lt;a href="https://ztd-98a2ef.gitlab.io/reference/cli/ztd_check/"&gt;&lt;code&gt;ztd check&lt;/code&gt;&lt;/a&gt; after installing — it
verifies every one of those and tells you the exact command to fix what&amp;rsquo;s missing.&lt;/p&gt;</description></item></channel></rss>