Butler Releases
Release history and changelog for the Butler Kubernetes-as-a-Service platform.
Component Versions
| Component | Latest | Type | Released |
|---|---|---|---|
CRD type definitions (the API contract) | 0.9.2 | module | Mar 26, 2026 |
Core reconciliation controllers | 0.14.0 | container | Apr 4, 2026 |
HTTP/WS API server | 0.4.6 | container | Mar 31, 2026 |
Web console | 0.4.5 | container | Mar 31, 2026 |
CLI tools (butlerctl, butleradm) | 0.6.0 | binary | Mar 23, 2026 |
Management cluster bootstrap controller | 0.4.1 | container | Mar 26, 2026 |
Harvester HCI provider controller | 0.2.2 | container | Mar 26, 2026 |
Nutanix AHV provider controller | 0.2.2 | container | Mar 26, 2026 |
AWS provider controller | 0.1.1 | container | Mar 26, 2026 |
GCP provider controller | -- | container | -- |
Azure provider controller | -- | container | -- |
OS image building and hosting service | -- | container | -- |
Backstage-based developer portal | 0.1.2 | container | Feb 19, 2026 |
Helm charts for deployment | 0.10.0 | helm | Apr 3, 2026 |
Kubernetes Compatibility
| Butler Version | Kubernetes Versions |
|---|---|
| v0.9.x | 1.28, 1.29, 1.30, 1.31 |
| v0.8.x | 1.28, 1.29, 1.30, 1.31 |
| v0.7.x | 1.28, 1.29, 1.30 |
Release History
- feat: controller scale readiness - predicates, requeue tuning, configurable concurrency by @atbagan in https://github.com/butlerdotdev/butler-controller/pull/44
- refactor: rename kamaji packages and references to steward by @atbagan in https://github.com/butlerdotdev/butler-controller/pull/43
- test: add unit tests for kamajisecret and kamajistatus controllers by @atbagan in https://github.com/butlerdotdev/butler-controller/pull/42
- refactor: cache ProviderConfig per reconcile cycle by @atbagan in https://github.com/butlerdotdev/butler-controller/pull/41
- refactor: decompose TenantCluster controller into sub-reconciler files by @atbagan in https://github.com/butlerdotdev/butler-controller/pull/40
- feat: TenantCluster observability - metrics, events, degraded conditions by @atbagan in https://github.com/butlerdotdev/butler-controller/pull/39
- Controller hardening: concurrency safety, client caching, finalizer robustness by @atbagan in https://github.com/butlerdotdev/butler-controller/pull/38
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
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
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.
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
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
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
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
chore: bump butler-api to v0.9.2, remove stale replace directive
chore: bump butler-api to v0.9.2
chore: bump butler-api to v0.9.2
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
chore: bump butler-api to v0.9.2
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
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".
- 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
- 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
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)
- chore: bump butler-api to v0.9.1 by @atbagan in https://github.com/butlerdotdev/butler-server/pull/22
- chore: bump butler-api to v0.9.1 by @atbagan in https://github.com/butlerdotdev/butler-provider-nutanix/pull/10
- 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
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
- Update CRDs first --
helm upgrade butler-crds oci://ghcr.io/butlerdotdev/charts/butler-crds --version 0.8.0 -n butler-system - Upgrade controller --
helm upgrade butler-controller oci://ghcr.io/butlerdotdev/charts/butler-controller --version 0.9.0 -n butler-system - Upgrade console --
helm upgrade butler-console oci://ghcr.io/butlerdotdev/charts/butler-console --version 0.5.0 -n butler-system - Verify -- Check controller logs and TenantCluster status