3113fc99
docs: v0.0.8 release notes, and the volumes page joins the index
a73x 2026-09-05 17:54
Commit message
docs/README.md
| Old | New | ||
|---|---|---|---|
| @@ -33,6 +33,7 @@ By what you're trying to do: | |||
| 33 | - [connecting.md](connecting.md)—reaching a guest through the jump gate with | 33 | - [connecting.md](connecting.md)—reaching a guest through the jump gate with |
| 34 | your own tenant CA | 34 | your own tenant CA |
| 35 | - [networking.md](networking.md)—published ports, and a guest on your own LAN | 35 | - [networking.md](networking.md)—published ports, and a guest on your own LAN |
| 36 | - [volumes.md](volumes.md)—durable block storage a guest keeps past its VM | ||
| 36 | - [mcp.md](mcp.md)—`/mcp`, the endpoint that lets Claude drive VMs | 37 | - [mcp.md](mcp.md)—`/mcp`, the endpoint that lets Claude drive VMs |
| 37 | - [faq.md](faq.md)—guest networking, and the other sharp edges | 38 | - [faq.md](faq.md)—guest networking, and the other sharp edges |
| 38 | 39 | ||
docs/releases.md
| Old | New | ||
|---|---|---|---|
| @@ -5,6 +5,66 @@ Tarballs and checksums for every release live at | |||
| 5 | newest. The [quickstart](quickstart.md) takes a release from download to a | 5 | newest. The [quickstart](quickstart.md) takes a release from download to a |
| 6 | running VM. | 6 | running VM. |
| 7 | 7 | ||
| 8 | ## v0.0.8 | ||
| 9 | |||
| 10 | Storage that outlives the VM. A volume claim is a request for durable bytes; | ||
| 11 | the first VM that names the claim puts those bytes on a host and leaves them | ||
| 12 | there. Delete that VM, create another naming the same claim, and the data is | ||
| 13 | waiting — a checked-out repo, a database, a build cache, anything you would | ||
| 14 | have lost with the root disk. The guest sees a raw `/dev/vdc` and owns | ||
| 15 | everything above it: partition it, format it, mount it, exactly as you would a | ||
| 16 | disk you bought. | ||
| 17 | |||
| 18 | **A claim is yours; where it lands is the fleet's.** You ask for a name and a | ||
| 19 | size and get a claim back, pending. The first create that names it decides | ||
| 20 | which host materializes the bytes, and every later VM naming that claim is | ||
| 21 | placed on that host — data does not move between hosts, so the guests that use | ||
| 22 | it do not either. A create that names a different host is refused, and the | ||
| 23 | refusal says which host holds the claim. | ||
| 24 | |||
| 25 | **Nothing deletes a volume by accident.** A claim a VM still holds cannot be | ||
| 26 | deleted. A volume file the fleet does not recognize is reported and kept, never | ||
| 27 | reclaimed. A tombstoned claim's bytes go only after the grace period, and a | ||
| 28 | host that cannot answer whether a file exists is treated as a host that has not | ||
| 29 | answered — not as one whose disk is empty. Force-removing a host is the single | ||
| 30 | path that destroys volumes on purpose, and the audit record says how many it | ||
| 31 | took. | ||
| 32 | |||
| 33 | **A host that says nothing cannot vouch for its guests.** A VM whose host has | ||
| 34 | stopped reporting now reads `unreachable` rather than holding its last known | ||
| 35 | `running` or `creating` forever. The status you see is what a host actually | ||
| 36 | told the plane, and a host that went quiet says so instead of leaving stale | ||
| 37 | optimism on the page. | ||
| 38 | |||
| 39 | **Your cloud-init and eitri's both land.** A tenant document that writes files, | ||
| 40 | runs commands or sets users no longer displaces the CA trust file, the sshd | ||
| 41 | drop-in, the clock fix or the root grow that eitri needs — both parts merge, | ||
| 42 | your scalars win, and the boot gate proves it on every run rather than assuming | ||
| 43 | it. | ||
| 44 | |||
| 45 | Under it: the toolchain moved to Go 1.27, mutation testing is one make target | ||
| 46 | away and runs on every push, and a round of hardening tightened what an | ||
| 47 | unauthenticated stranger can learn from the plane, what a misconfigured agent | ||
| 48 | will start with, and which refusals name the fix. | ||
| 49 | |||
| 50 | **Known limits.** | ||
| 51 | |||
| 52 | - Volumes are attached at create and only at create. There is no detach, no | ||
| 53 | reattach to a running VM, and no way to move one between hosts. | ||
| 54 | - The surface is the HTTP API. Volumes have no console page, no CLI command | ||
| 55 | and no MCP tool yet; `POST /api/v1/volume-claims` and the `volume_claims` | ||
| 56 | field on create are the whole of it. | ||
| 57 | - A volume is exactly as durable as one host's disk. There is no replication | ||
| 58 | and no snapshot; a host that loses its disk loses every volume on it. | ||
| 59 | - Force-removing a host destroys its volumes. Their claims return to pending | ||
| 60 | rather than staying bound to a host that is gone. | ||
| 61 | - Rolling a server back below v0.0.8 leaves a host that holds volumes stuck in | ||
| 62 | decommissioning, with nothing said about why. | ||
| 63 | - A volume file that disappears from the host is re-created empty on the next | ||
| 64 | attach, and nothing alerts on it. | ||
| 65 | - A host running an agent older than v0.0.8 refuses volume-bearing creates | ||
| 66 | rather than booting the guest without its disk. | ||
| 67 | |||
| 8 | ## v0.0.7 | 68 | ## v0.0.7 |
| 9 | 69 | ||
| 10 | A VM can be a machine on your network. Declare a bridge on a Linux host, name | 70 | A VM can be a machine on your network. Declare a bridge on a Linux host, name |
docs/volumes.md
| Old | New | ||
|---|---|---|---|
| @@ -1,4 +1,3 @@ | |||
| 1 | <!-- DRAFT: voice not yet passed by the author --> | ||
| 2 | # Volumes | 1 | # Volumes |
| 3 | 2 | ||
| 4 | *Durable block storage that outlives the VM it is attached to* | 3 | *Durable block storage that outlives the VM it is attached to* |