Skip to main content

Butler Releases

Release history and changelog for the Butler Kubernetes-as-a-Service platform.

Component Versions

ComponentLatestTypeReleased
CRD type definitions (the API contract)
0.9.2moduleMar 26, 2026
Core reconciliation controllers
0.14.0containerApr 4, 2026
HTTP/WS API server
0.4.6containerMar 31, 2026
Web console
0.4.5containerMar 31, 2026
CLI tools (butlerctl, butleradm)
0.6.0binaryMar 23, 2026
Management cluster bootstrap controller
0.4.1containerMar 26, 2026
Harvester HCI provider controller
0.2.2containerMar 26, 2026
Nutanix AHV provider controller
0.2.2containerMar 26, 2026
AWS provider controller
0.1.1containerMar 26, 2026
GCP provider controller
--container--
Azure provider controller
--container--
OS image building and hosting service
--container--
Backstage-based developer portal
0.1.2containerFeb 19, 2026
Helm charts for deployment
0.10.0helmApr 3, 2026

Kubernetes Compatibility

Butler VersionKubernetes Versions
v0.9.x1.28, 1.29, 1.30, 1.31
v0.8.x1.28, 1.29, 1.30, 1.31
v0.7.x1.28, 1.29, 1.30

Release History

butler-controller0.14.0Apr 4, 2026
  • feat: controller scale readiness - predicates, requeue tuning, configurable concurrency by @atbagan in https://github.com/butlerdotdev/butler-controller/pull/44
butler-charts0.10.0butler-controllerApr 3, 2026
butler-controller0.13.0Apr 3, 2026
  • refactor: rename kamaji packages and references to steward by @atbagan in https://github.com/butlerdotdev/butler-controller/pull/43
butler-controller0.12.3Apr 3, 2026
  • test: add unit tests for kamajisecret and kamajistatus controllers by @atbagan in https://github.com/butlerdotdev/butler-controller/pull/42
butler-controller0.12.2Apr 3, 2026
  • refactor: cache ProviderConfig per reconcile cycle by @atbagan in https://github.com/butlerdotdev/butler-controller/pull/41
butler-controller0.12.1Apr 3, 2026
  • refactor: decompose TenantCluster controller into sub-reconciler files by @atbagan in https://github.com/butlerdotdev/butler-controller/pull/40
butler-controller0.12.0Apr 3, 2026
  • feat: TenantCluster observability - metrics, events, degraded conditions by @atbagan in https://github.com/butlerdotdev/butler-controller/pull/39
butler-controller0.11.0Apr 2, 2026
  • Controller hardening: concurrency safety, client caching, finalizer robustness by @atbagan in https://github.com/butlerdotdev/butler-controller/pull/38
butler-controller0.10.2Mar 31, 2026

Talos Node Hostname Matching for CAPK

Sets `machine.network.hostname` to the CAPI Machine name via `--config-patch` during `talosctl apply-config`. This makes CAPK's node matching (`Node.Name == Machine.Name`) work for Talos clusters, enabling autonomous KubevirtMachine finalizer removal during rolling updates.

Combined with the providerID fix in v0.10.1, this completes the full rolling update lifecycle on Harvester: CAPI can start the rollout (providerID), and CAPK can complete it (hostname matching for finalizer cleanup).

Only affects new nodes. Existing nodes retain their IP-based names.

  • fix: set Talos node hostname to CAPI Machine name for CAPK matching by @atbagan in https://github.com/butlerdotdev/butler-controller/pull/37
butler-controller0.10.1Mar 31, 2026

Node providerID Reconciliation

Patches `Node.spec.providerID` on tenant cluster nodes to match CAPI Machine providerIDs, enabling CAPI to populate `Machine.status.nodeRef`. This unblocks MachineDeployment rolling updates which previously stalled on Talos and Flatcar workers on KubeVirt and Nutanix.

  • Uses strategic merge patch (not full Node.Update) to avoid race conditions with kubelet heartbeats
  • Short-circuits when MachineDeployment readyReplicas equals desired AND no extra replicas exist (zero tenant API calls in steady state)
  • Filters out Deleting/Failed Machines and detects duplicate IPs during rolling updates to prevent wrong Machine-to-Node binding
  • Provider-agnostic: works for any CAPI provider where the kubelet does not set providerID natively
  • fix: patch Node.spec.providerID for CAPI Machine-Node matching by @atbagan in https://github.com/butlerdotdev/butler-controller/pull/36
butler-console0.4.5Mar 31, 2026

Cluster Spec Edit Modal

Add EditClusterModal for day-2 cluster editing:

  • Kubernetes version, CP replicas (admin-only), worker replicas, CPU, memory, disk size
  • Optimistic concurrency via resourceVersion with conflict detection and refresh
  • Structured field error display from server validation
  • Explicit downgrade acknowledgment checkbox for CP replicas 3 to 1
  • Admin role scoped to active team

ApiError Enhancement

ApiError now carries the parsed response body, enabling structured error handling (field errors, conflict payloads) in catch blocks across the console.

butler-server0.4.6Mar 31, 2026

TenantCluster Spec Edit Endpoint

Add `PUT /api/clusters/{namespace}/{name}` for partial spec editing with optimistic concurrency:

  • Kubernetes version (no downgrades)
  • Control plane replicas (1 or 3) and resources
  • Worker replicas, CPU, memory, disk size
  • Infrastructure overrides (platform admin only, merge semantics)

Validation returns structured field errors. Conflict returns 409 with current cluster state. Phase allowlist restricts edits to Ready/Pending clusters.

  • feat: PUT endpoint for TenantCluster spec editing by @atbagan in https://github.com/butlerdotdev/butler-server/pull/31
butler-controller0.10.0Mar 31, 2026

StewardControlPlane Spec Drift Reconciliation

The controller now detects and reconciles drift between TenantCluster spec and the live StewardControlPlane for:

  • **Kubernetes version** changes
  • **Control plane replicas** (1 or 3)
  • **Control plane resources** (apiserver, controller-manager, scheduler requests/limits)

Uses JSON merge patch for safe concurrent updates with capi-steward and kamajistatus controllers. Resource quantities are compared with normalization (e.g., `500m` == `0.5`).

MachineTemplate Rolling Update Extensions

  • **Disk size** drift detection for KubevirtMachineTemplate (Harvester)
  • **Full NutanixMachineTemplate support**: vcpuSockets, memorySize, systemDiskSize
  • Provider dispatch refactored from if/else to switch on infraRefKind

Exported Builder Functions

`ResolveControlPlaneResources`, `ComponentResourceMap`, and `GetMachineSpecs` exported from the CAPI builder package for reconciler reuse.

  • feat: enforce team resource quotas in webhook and controller by @atbagan in https://github.com/butlerdotdev/butler-controller/pull/34
  • feat: StewardControlPlane spec drift reconciliation and MachineTemplate extensions by @atbagan in https://github.com/butlerdotdev/butler-controller/pull/35
butler-console0.4.4Mar 27, 2026

Phase 2: Visibility & Detail Enrichment

**New Features:**

  • Cluster YAML export button on cluster detail header
  • Inline provisioning card showing MachineRequest VM status during cluster creation
  • LoadBalancerRequest status card on cluster overview
  • TenantCluster spec enrichment: CP replicas, worker machine template (CPU/memory/disk), CP resources, infrastructure overrides
  • AddonDefinition CRUD admin page (`/admin/addons`) with create, edit, delete
  • Team delete button with type-to-confirm safety modal

**Improvements:**

  • Builtin addon definitions are protected from edit/delete (shows "managed" label)
  • Team delete disabled when team has active clusters
  • Export YAML includes X-Butler-Team header for team-scoped auth
  • Fixed potential infinite re-render from toast dependency in addon catalog
  • Fixed NodesTab indentation
butler-server0.4.5Mar 27, 2026

Phase 2: Visibility & Detail Enrichment

**New Endpoints:**

  • `GET /api/clusters/{ns}/{name}/export` — Export TenantCluster as clean YAML (server-side field stripping)
  • `GET /api/clusters/{ns}/{name}/machines` — List MachineRequests for a cluster
  • `GET /api/clusters/{ns}/{name}/load-balancers` — List LoadBalancerRequests for a cluster
  • `POST /api/addons/catalog` — Create AddonDefinition (admin)
  • `PUT /api/addons/catalog/{name}` — Update AddonDefinition (admin)
  • `DELETE /api/addons/catalog/{name}` — Delete AddonDefinition (admin)

**Improvements:**

  • ExportYAML: deep copy to prevent in-place mutation, filename sanitization, complete metadata stripping
  • MachineRequest/LoadBalancerRequest handlers gracefully return empty arrays when CRDs don't exist
  • DeleteAddonDefinition returns 404 instead of 500 for not-found resources
  • CreateAddonDefinition validates displayName and category as required fields
butler-provider-aws0.1.1Mar 26, 2026

chore: bump butler-api to v0.9.2, remove stale replace directive

butler-provider-nutanix0.2.2Mar 26, 2026

chore: bump butler-api to v0.9.2

butler-provider-harvester0.2.2Mar 26, 2026

chore: bump butler-api to v0.9.2

butler-bootstrap0.4.1Mar 26, 2026

chore: bump butler-api to v0.9.2

  • chore: bump butler-api to v0.9.2 by @atbagan in https://github.com/butlerdotdev/butler-bootstrap/pull/21
butler-server0.4.4Mar 26, 2026

chore: bump butler-api to v0.9.2

butler-console0.4.3Mar 26, 2026

feat: cluster worker scaling UI

  • Add Scale Workers modal on cluster detail page
  • Show worker scaling progress with auto-refresh polling
  • Handle nil workerNodesReady in cluster detail display
  • Client-side scale tracking for clusters without worker status
  • Silent polling to prevent UI flash during scaling
  • Use parseInt for defensive replica input parsing
butler-api0.9.2Mar 26, 2026

fix: remove omitempty from WorkerNodesReady/WorkerNodesDesired status fields

Zero is a valid value for these int32 fields. With omitempty, 0 was dropped from JSON serialization, making it impossible for consumers to distinguish "0 ready" from "field not set".

butler-console0.4.2Mar 25, 2026
  • Add ButlerConfig management page at /admin/settings
  • 7 card sections with per-section save: general settings, control plane exposure, default addon versions, default team limits, default CP resources, image factory, SSH authorized key
  • Add configApi client with TypeScript types
  • Form state re-syncs from server response after save
  • feat: add ButlerConfig management page by @atbagan in https://github.com/butlerdotdev/butler-console/pull/18
butler-server0.4.3Mar 25, 2026
  • Add ButlerConfig management API endpoints (GET/PUT `/api/admin/config`)
  • Exposes all spec fields: multi-tenancy, default namespace, default provider, control plane exposure, addon versions, team limits, CP resources, image factory, SSH key
  • Full section replacement semantics for reliable field clearing
  • Resource quantity validation with descriptive 400 errors
  • feat: add ButlerConfig management API endpoints by @atbagan in https://github.com/butlerdotdev/butler-server/pull/23
butler-cli0.6.0Mar 23, 2026

Changelog

  • feat: add Azure imageURN and vmSize to bootstrap config (#14)
  • feat: use validated LoadBalancerPool for MetalLB address range (#15)
  • fix: update example configs with current versions and loadBalancerPool (#16)
butler-charts0.9.0butler-crdsMar 23, 2026
butler-server0.4.2Mar 23, 2026
  • chore: bump butler-api to v0.9.1 by @atbagan in https://github.com/butlerdotdev/butler-server/pull/22
butler-provider-nutanix0.2.1Mar 23, 2026
  • chore: bump butler-api to v0.9.1 by @atbagan in https://github.com/butlerdotdev/butler-provider-nutanix/pull/10
butler-provider-harvester0.2.1Mar 23, 2026
  • chore: bump butler-api to v0.9.1 by @atbagan in https://github.com/butlerdotdev/butler-provider-harvester/pull/9
  • fix: support parent-context Docker builds for local dev by @atbagan in https://github.com/butlerdotdev/butler-provider-harvester/pull/10
butler-provider-aws0.1.0Mar 23, 2026

Initial release of the Butler AWS provider controller.

Features

  • **MachineRequest reconciliation** — watches MachineRequest CRDs and provisions EC2 instances with Talos-compatible cloud-init UserData
  • **LoadBalancerRequest controller** — provisions AWS Network Load Balancers for tenant cluster services
  • **Cloud bootstrap support** — full lifecycle for bootstrapping tenant clusters on AWS
  • **Custom Talos AMIs** — support for pre-built Talos AMIs with iscsi-tools, plus CI workflows for AMI builds
  • **Provider interface compliance** — standard MachineRequest phase lifecycle (Pending → Creating → Running → Failed/Deleting/Deleted), finalizer-gated deletion, event recording

Built against butler-api v0.9.1.

v0.9.x Highlights

The v0.9.x release cycle introduced cloud provider support and multi-OS workers:

  • butler-api v0.9.0/v0.9.1: LoadBalancerRequest CRD, cloud-aware bootstrap types, multi-OS worker fields, Azure vmSize/imageURN additions
  • butler-controller v0.9.0: Multi-OS kubeadm bootstrap for non-Talos workers (Rocky, Flatcar, Bottlerocket, Kairos)
  • butler-cli v0.5.0: Cloud bootstrap CLI with credential override flags for GCP, AWS, Azure
  • butler-bootstrap v0.3.0: Cloud bootstrap support, LoadBalancerRequest HA
  • butler-console v0.4.1: Images page and ImageSync management UI
  • butler-server v0.4.1: API dependency bump
  • butler-crds v0.8.0: 17 CRDs including LoadBalancerRequest
  • butler-provider-harvester v0.2.0: butler-api v0.9.0 dependency bump
  • butler-provider-nutanix v0.2.0: butler-api v0.9.0 dependency bump

Cloud Provider Initial Releases

  • butler-provider-aws v0.1.0: AWS EC2 VM provisioning via MachineRequest
  • butler-provider-gcp v0.1.0: GCP Compute Engine VM provisioning via MachineRequest
  • butler-provider-azure v0.1.0: Azure VM provisioning via MachineRequest

Upgrade Guide

From v0.8.x to v0.9.x

  1. Update CRDs first -- helm upgrade butler-crds oci://ghcr.io/butlerdotdev/charts/butler-crds --version 0.8.0 -n butler-system
  2. Upgrade controller -- helm upgrade butler-controller oci://ghcr.io/butlerdotdev/charts/butler-controller --version 0.9.0 -n butler-system
  3. Upgrade console -- helm upgrade butler-console oci://ghcr.io/butlerdotdev/charts/butler-console --version 0.5.0 -n butler-system
  4. Verify -- Check controller logs and TenantCluster status