| e4d75234 |
smoke: a host nobody could converge cannot fail a release |
a73x |
2026-09-05 |
| 331baaef |
backup: a job that moved registries needs the credential to match |
a73x |
2026-09-05 |
| a34381fd |
backup: the image takes its fixes from the distro too |
a73x |
2026-09-05 |
| 6b45c813 |
site: the image takes its fixes from the distro, not the base tag |
a73x |
2026-09-05 |
| 0bebb556 |
retro: what the volumes release cost |
a73x |
2026-09-05 |
| ea6a7dcc |
ship: the tag probe asks the package that now owns ordering |
a73x |
2026-09-05 |
| 3113fc99 |
docs: v0.0.8 release notes, and the volumes page joins the index |
a73x |
2026-09-05 |
| 39c407f2 |
volumes: durable block storage a VM attaches at create |
a73x |
2026-09-05 |
| 7bf37937 |
release: one Feature shape for every version floor |
a73x |
2026-09-05 |
| 1ca7b3d5 |
vms: a host that says nothing cannot vouch for its guests |
a73x |
2026-09-05 |
| 6fede806 |
deps: x/crypto v0.56.0, and the gate names the option it accepts |
a73x |
2026-09-05 |
| c944d8f5 |
retro: prove at the layer the code runs through |
a73x |
2026-09-02 |
| ef7319c9 |
seed: a tenant's own cloud-init keeps eitri's trust file and disk grow |
a73x |
2026-09-02 |
| a362e825 |
vmssh: the CA set is only blamed when the row proves it |
a73x |
2026-09-02 |
| 1122d4f1 |
delegation: a begin nobody has signed yet survives the sweep |
a73x |
2026-09-02 |
| 81b4b6c1 |
fix: three boundaries the audit found open |
a73x |
2026-09-02 |
| 8d30bd3c |
retro: an empty grep is not the same as no callers |
a73x |
2026-08-23 |
| 96d90a73 |
comments: eleven claims that argued with the code beside them |
a73x |
2026-08-23 |
| d0c032f1 |
retro: what the concurrency observers cost |
a73x |
2026-08-23 |
| c053f0ba |
comments: the concurrency claims are held by alarms now |
a73x |
2026-08-23 |
| e5d55c04 |
refactor: an unconfigured host needs no special case |
a73x |
2026-08-23 |
| 2596f764 |
test: the concurrency rules this package argues are now observed |
a73x |
2026-08-23 |
| f176908b |
retro: what slowed the constant sweep down |
a73x |
2026-08-23 |
| b6b229bc |
test: three borderline constants get a literal, three are left as they are |
a73x |
2026-08-23 |
| 46dfdd1e |
test(api): the enroll limiter, the key-comment bound and the reap grace carry their own numbers |
a73x |
2026-08-23 |
| 09c1011b |
test: pin the reserved port range and the vfkit socket limit to real numbers |
a73x |
2026-08-23 |
| b1f6c62a |
test(boot): the Slowloris bounds and the HSTS window are pinned by literals |
a73x |
2026-08-23 |
| fb6afd77 |
test(agent): the lock and the fallback now have to happen |
a73x |
2026-08-23 |
| 05ed8adf |
test(syncsvc): a deadline nothing outlives proves nothing |
a73x |
2026-08-23 |
| 5d3b98b1 |
test(api): a CA line that was already canonical proves no canonicalization |
a73x |
2026-08-23 |
| d4fea635 |
test(store): a security action that cannot be recorded must not happen |
a73x |
2026-08-23 |
| a2b7e074 |
store: the cidr-pool argument lives in the tests that fail on it |
a73x |
2026-08-23 |
| b4486492 |
retro: what the loud-misconfiguration pair cost |
a73x |
2026-08-23 |
| 4c8de033 |
server: a --cidr-pool that lost says so |
a73x |
2026-08-23 |
| 20bcd5b1 |
agent: a trust root the agent cannot use is refused at the door |
a73x |
2026-08-23 |
| 290ffada |
retro: what the comment audit cost |
a73x |
2026-08-23 |
| e11ca299 |
test: eleven claims the comments made and nothing checked |
a73x |
2026-08-23 |
| b5e82f75 |
comments: a claim a test already fails on is not one |
a73x |
2026-08-23 |
| 7dd41af7 |
wire: what the rename argued, the tree now enforces |
a73x |
2026-08-23 |
| 5e59e2b0 |
wire: the spec/status vocabulary the loop always meant |
a73x |
2026-08-22 |
| c694896f |
build: an empty diff is not an invitation to mutate the tree |
a73x |
2026-08-22 |
| ba8d96a0 |
build: a push to main brings a line about what slowed it down |
a73x |
2026-08-22 |
| 0326f691 |
build: mutation testing is one make target away |
a73x |
2026-08-22 |
| 7c233ac3 |
security: a stranger on the internet is given less to work with |
a73x |
2026-08-22 |
| bc62ad02 |
build: the toolchain moves to go 1.27 |
a73x |
2026-08-20 |
| ffee0144 |
docs: the quickstart hands you the client before it uses one |
a73x |
2026-08-19 |
| d5521a0e |
site: the ssh-access redirect points somewhere a browser can go |
a73x |
2026-08-19 |
| ec07fb3e |
site: publishing the site does not move what the fleet downloads |
a73x |
2026-08-19 |
| a79a3c06 |
docs: the site says what you get, not why we built it that way |
a73x |
2026-08-19 |
| 3e860222 |
site: the reader picks the theme, not just the browser |
a73x |
2026-08-18 |
| a9a7f4b6 |
docs: pages named for what the reader is doing |
a73x |
2026-08-18 |
| 597199a9 |
site: [E] in the tab, and a card for every link |
a73x |
2026-08-18 |
| 55ac5dd4 |
docs: the roadmap stops listing what already shipped |
a73x |
2026-08-18 |
| e679b201 |
ship: a release is proven on the fleet it actually converged |
a73x |
2026-08-18 |
| b0c9d1c9 |
docs: v0.0.7 release notes |
a73x |
2026-08-14 |
| f52ac6a1 |
networks: a VM joins the operator's LAN by name, and keeps its NAT life |
a73x |
2026-08-14 |
| 683a673d |
docs: v0.0.5 and v0.0.6 release notes |
a73x |
2026-08-13 |
| d8cdbdd7 |
test: the suite catches what it was only assuming |
a73x |
2026-08-12 |
| 4a319280 |
docs: correct claims the code has outgrown |
a73x |
2026-08-12 |
| d75b0342 |
fix(server): a UDP grant only goes to an agent that speaks it, and the HTTP server bounds a slow client |
a73x |
2026-08-12 |
| a83b79fc |
test: docs can't drift from the hosted defaults or the reserved-port range |
a73x |
2026-08-12 |
| c994de4a |
refactor: one home each for facts the tree stated in several |
a73x |
2026-08-12 |
| 120a24fd |
fix(consolidation): centralize the defaults the review found drifted |
a73x |
2026-08-12 |
| 59416337 |
refactor(web): the console states each shared rule once |
a73x |
2026-08-12 |
| 6c2dcb6f |
test(wire): a proto field number cannot change unnoticed |
a73x |
2026-08-12 |
| 871f04bd |
fix(ship): a release that cannot converge says so before it rolls anything |
a73x |
2026-08-12 |
| d6105e58 |
fix(placement): the plane's refusal is never stricter than the host's admission |
a73x |
2026-08-12 |
| ac374699 |
fix(cli): what you pinned stays pinned, and offline stays offline |
a73x |
2026-08-12 |
| 4dc88c5f |
fix(store): the persistent column stays as rollback ballast, and legacy trust freezes at upgrade |
a73x |
2026-08-12 |
| 2121dde5 |
fix(agent): narration cannot outlive the pass that said it |
a73x |
2026-08-12 |
| d8888d14 |
docs: two assumptions the narration work rests on |
a73x |
2026-08-11 |
| c4ec7226 |
feat(observability): a creating VM says what it is doing, and an exposure counts its sessions |
a73x |
2026-08-11 |
| 9f95183c |
feat(ship): the pipeline converges the fleet before it asks the smoke to prove it |
a73x |
2026-08-11 |
| a00d87a3 |
fix(auth): a rejected sign-in names the origin that broke it |
a73x |
2026-08-11 |
| 0aab65cc |
fix(gate): a gate that cannot name itself refuses to boot, and the client stops guessing |
a73x |
2026-08-11 |
| ece9eee4 |
docs: a binary nobody was ever handed leaves the record |
a73x |
2026-08-11 |
| b76d6744 |
feat(cli): one guided command stands between a token and a first shell |
a73x |
2026-08-11 |
| f984021a |
fix(web): the join flow hands you the bundle your host actually takes |
a73x |
2026-08-11 |
| 7ab204ff |
feat(mcp): one surface — the plane serves /mcp, the stdio binary retires |
a73x |
2026-08-11 |
| eab8df07 |
docs: the agent aspires to kubelet |
a73x |
2026-08-11 |
| c095fa6d |
build(web): the dependency advisories are answered |
a73x |
2026-08-11 |
| 1cb92020 |
build(ci): the console's types answer to the gate |
a73x |
2026-08-11 |
| 7d929b91 |
feat(console): an offered upgrade shows itself |
a73x |
2026-08-11 |
| 55e7bb7f |
feat(server): a full host is not a place to put one |
a73x |
2026-08-11 |
| f986d9b8 |
feat(fleet): persistence is not a column |
a73x |
2026-08-11 |
| 77fe133e |
build(web): console logic answers to a test suite |
a73x |
2026-08-11 |
| 8dd4b711 |
feat(server,web): a guest names the CAs it trusts |
a73x |
2026-08-11 |
| 6f87a600 |
feat(web): the console uses the width it is given |
a73x |
2026-08-11 |
| aa035c16 |
docs: the docs download what is served |
a73x |
2026-08-11 |
| 4c1941bf |
fix(server): a tenant with no CA is told how to get one |
a73x |
2026-08-11 |
| d49a156e |
feat(web): the VM page uses the width it is given |
a73x |
2026-08-10 |
| d518b6b2 |
fix(sync): one agent per identity — a second launch is refused, a second session evicted |
a73x |
2026-08-10 |
| c94e9e57 |
fix(docs): the published pages speak to operators, not to the tree |
a73x |
2026-08-10 |
| 70f0a1d0 |
feat(api): every VM is persistent |
a73x |
2026-08-10 |
| 323e2c24 |
feat(web): the VM page hands you the command that reaches the guest |
a73x |
2026-08-09 |
| cdf4b8bc |
fix(web): a VM's controls answer for the moment it is in |
a73x |
2026-08-09 |
| 7dd7ae3c |
feat(exposures): a published port can carry datagrams |
a73x |
2026-08-09 |
| ea1d5664 |
fix(agent): a powered-off guest has no console to replay |
a73x |
2026-08-09 |
| 0438267d |
docs: networking stays minimal — just enough to be usable |
a73x |
2026-08-09 |
| ef2f020d |
fix(agent): traffic on a published port cannot starve fleet management |
a73x |
2026-08-09 |
| 692afb3b |
feat(agent): a guest steps its clock back into line after its host sleeps |
a73x |
2026-08-05 |
| 17485cac |
feat(server): a host that cannot certify a guest is not a place to put one |
a73x |
2026-08-09 |
| 9672785e |
feat(release): a tag publishes once, and nothing needs purging |
a73x |
2026-08-09 |
| 604f4e07 |
fix(ci): a test must fail, not hang; a failing gate must print its evidence |
a73x |
2026-08-09 |
| 2ff23e41 |
feat(smoke): the smoke watches a guest boot through the console |
a73x |
2026-08-08 |
| 3432ac6b |
docs: v0.0.4 release notes |
a73x |
2026-08-08 |
| 82b50b87 |
feat(devhost): the branch gate's fleet runs on the dev machine |
a73x |
2026-08-08 |
| d5d2c29f |
feat(deploy): a release is one pipeline run twice, at stg then prod |
a73x |
2026-08-08 |
| 212f6ed1 |
feat(server): a PAT is enough — public MCP at /mcp |
a73x |
2026-08-08 |
| 2874212c |
feat(server): a guest's host key never leaves its host |
a73x |
2026-08-08 |
| d865b83b |
feat(server): server key material is encrypted at rest |
a73x |
2026-08-08 |
| 6ee34b4e |
feat(web): the console speaks the site's language |
a73x |
2026-08-07 |
| 80b27101 |
feat(agent): the self-updater reads a release tarball |
a73x |
2026-08-07 |
| 081c27b8 |
feat(mcp): a VM lands on the host you name |
a73x |
2026-08-06 |
| 3243b2c9 |
fix(server): a hand-deployed agent still orders before the next release |
a73x |
2026-08-06 |
| 09afbdbd |
docs: the release notes tell v0.0.3, and the roadmap looks only forward |
a73x |
2026-08-06 |
| 1c7faf37 |
feat(mcp): an LLM publishes a VM's port |
a73x |
2026-08-06 |
| 6b7245e6 |
feat: a tenant publishes a VM's port on its host |
a73x |
2026-08-06 |
| 9fe15c33 |
docs: multi-tenancy in v0.0.1 scope, and v0.0.3 candidates |
a73x |
2026-08-06 |
| 508d3d97 |
docs: bridged guest networking |
a73x |
2026-08-06 |
| a449db80 |
feat(agent): a host refuses a guest subnet that contains its own uplink |
a73x |
2026-08-06 |
| a1533a4f |
feat: a host proposes its guest subnet, and the fleet only suggests one |
a73x |
2026-08-06 |
| 8c4f0f8a |
feat(agent): a Mac host installs the way a Mac does |
a73x |
2026-08-06 |
| 3f10d17c |
feat(agent): a Mac reads the subnet vmnet gave it |
a73x |
2026-08-06 |
| 707f1a44 |
feat: a host tells the fleet which subnet its guests are on |
a73x |
2026-08-06 |
| 8368518c |
feat(release): a Mac host gets a build like every other host |
a73x |
2026-08-06 |
| 471ce90d |
feat(agent): a lost guest reports what its hypervisor said |
a73x |
2026-08-06 |
| a789f2ce |
fix(agent): a backend signals only the processes it started, and says when it cannot |
a73x |
2026-08-06 |
| e034a30e |
feat(agent): macOS hosts run guests through vfkit |
a73x |
2026-08-06 |
| 45ac02ec |
feat(agent): the host says whether it can run a guest, before create spends anything |
a73x |
2026-08-06 |
| f6db476e |
feat(agent): a Mac joins the fleet with no VMs |
a73x |
2026-08-06 |
| 63a6dec6 |
fix(server): a host keeps saying what it is |
a73x |
2026-08-06 |
| f69c557d |
build: ci keeps the tree gofmt-clean |
a73x |
2026-08-06 |
| 401f3162 |
feat(server): a VM says which key eitri put in it |
a73x |
2026-08-06 |
| 5080647e |
fix(server): a one-click create takes the image its host can run |
a73x |
2026-08-06 |
| b982a55a |
fix(server): a guest's address is judged on its own terms, not the fleet's |
a73x |
2026-08-06 |
| b4794065 |
feat(agent): guest images are decoded in-process, not by a tool |
a73x |
2026-08-06 |
| 8c746ce1 |
feat(agent): gzipped images are decompressed in-process, sparsely |
a73x |
2026-08-06 |
| b7ac3a54 |
feat(agent): a raw image needs no conversion tool |
a73x |
2026-08-06 |
| a04fe917 |
docs: the gate harness assumes guests nest two levels |
a73x |
2026-08-06 |
| 2efa9596 |
docs: a host reboot restores persistent guests |
a73x |
2026-08-06 |
| 8951743b |
docs: record what the test gates rest on |
a73x |
2026-08-06 |
| aee1395c |
docs: record what the decisions rest on |
a73x |
2026-08-06 |
| d019c3b7 |
feat(agent): host backends sit behind two seams |
a73x |
2026-07-30 |
| 82572684 |
fix(agent): declare disk images raw so the GPT stays writable |
a73x |
2026-07-30 |
| d058f942 |
docs,web: one voice, one dash system |
a73x |
2026-07-30 |
| 46d2768e |
feat(web): the join card is the whole recipe |
a73x |
2026-07-29 |
| ee0c9258 |
feat(fleet): sweep VMs no agent will reap |
a73x |
2026-07-29 |
| 18d96cfa |
feat(seed): guests own their full disk from first boot |
a73x |
2026-07-29 |
| 7f51aba3 |
feat(mcp): self-sufficient against the hosted service |
a73x |
2026-07-29 |
| d954409a |
feat(site,web): the anvil — eitri's favicon |
a73x |
2026-07-29 |
| 043bd8dc |
feat: the credential is the tenant |
a73x |
2026-07-29 |
| fd49ad63 |
feat: eitri.sh runs eitri — the hosted control plane |
a73x |
2026-07-29 |
| 2728c909 |
feat(sync): bound the unauthenticated head of a QUIC session |
a73x |
2026-07-29 |
| f8b94183 |
docs(faq): Docker on a host silently drops guest outbound traffic |
a73x |
2026-07-29 |
| 00a6a4d0 |
feat(site,docs): v0.0.1 release notes; quickstart downloads by plain curl |
a73x |
2026-07-29 |
| 15c5a499 |
feat(arch): main packages are wiring only — R14 |
a73x |
2026-07-29 |
| 6c663030 |
feat: server and issuer run as dedicated non-root users |
a73x |
2026-07-29 |
| d7e93399 |
feat: multi-tenant console with OIDC sign-in |
a73x |
2026-07-29 |
| 2823c631 |
feat(arch): every crossing is owned — R7 through R10 |
a73x |
2026-07-26 |
| f6605653 |
feat(cli): the eitri client binary |
a73x |
2026-07-26 |
| 59c69363 |
feat(web): show each VM's allocation in the fleet table |
a73x |
2026-07-26 |
| 9101e104 |
feat(agent): bootstrap cloud-hypervisor and the guest firmware |
a73x |
2026-07-26 |
| 4c10e425 |
feat(site): eitri.sh — site, docs, releases, and the publish image |
a73x |
2026-07-26 |
| 857a4547 |
feat(agent): run fleet agents under systemd |
a73x |
2026-07-26 |
| 752d49c4 |
feat(fleet): per-host agent upgrades from the web console |
a73x |
2026-07-26 |
| b6a96396 |
docs: index the doc set, record decisions, and set the v0.0.1 roadmap |
a73x |
2026-07-26 |
| da27bc64 |
build: adopt Go 1.26 idioms |
a73x |
2026-07-26 |
| cdae8e89 |
feat: coverage-instrumented boot-gate (eitri-smoke) with live SSH-CA gate check |
a73x |
2026-07-26 |
| fd31fa9e |
feat(agent): reconcile each VM in its own worker |
a73x |
2026-07-26 |
| eba17d0a |
feat(agent): admit VMs against host resources through one serialized gate |
a73x |
2026-07-25 |
| d3f4ed21 |
feat(server,agent): report host OS facts and live metrics per fleet host |
a73x |
2026-07-25 |
| 76296277 |
build: pre-push hook runs make ci before pushing to main |
a73x |
2026-07-25 |
| 9f7b4f69 |
feat(ssh): bring-your-own per-tenant SSH user CA |
a73x |
2026-07-25 |
| 8d63ba78 |
feat(net): embedded DHCP + per-VM reservation networking |
a73x |
2026-07-25 |
| d0b7e5e1 |
feat(tenant): multi-tenancy — data model, principal, and gate authz |
a73x |
2026-07-25 |
| 9a302830 |
feat(eitri-mcp): MCP server for Claude-driven VM sandboxes via the SSH-CA gate |
a73x |
2026-07-25 |
| 72a48183 |
feat: UEFI guest boot, deploy boot-gate, and control-plane hardening |
a73x |
2026-07-25 |
| bd0d241b |
feat: serial console, teardown observability, quotas, and the SSH-CA jump gate |
a73x |
2026-07-25 |
| e523eae3 |
feat: single-paste join enrollment and reliability hardening |
a73x |
2026-07-25 |
| 13b9c2e5 |
feat: architecture governance and the explorable shape diagram |
a73x |
2026-07-25 |
| c2b35d97 |
feat: Eitri — BYO-hardware VM fleet control plane |
a73x |
2026-07-25 |