Changelog
All notable changes to kinder since forking from kind at commit 89ff06bd.
v1.4 — Cluster Capabilities
Section titled “v1.4 — Cluster Capabilities”Released: April 10, 2026
Four cluster capabilities that fill the gap between plain kind and a production-like local environment: multi-version per-node Kubernetes, offline/air-gapped cluster creation, local-path-provisioner dynamic storage, and host-directory mounting — plus a provider-abstracted kinder load images utility that ties the offline and multi-version workflows together. Zero new Go module dependencies.
Multi-Version Node Validation
Section titled “Multi-Version Node Validation”- Per-node image preservation —
--imageflag no longer overrides explicit per-nodeimage:entries. Explicit image assignments capture pre-defaults viaExplicitImagesentinel inencoding/convert.go - Version-skew validation — config parse rejects workers more than 3 minor versions behind the control-plane before any containers are created, with a precise error message stating the violating node and version delta
- HA consistency check — control-plane nodes at different versions are rejected at config validation time
- Doctor cluster-skew check —
kinder doctorreports a warning when a running multi-version cluster violates version-skew policy; injectable node reader enables test coverage without a live runtime - New
kinder get nodescolumns — output now includesVERSION,IMAGE, andSKEWcolumns sourced via containerinspect(avoids import cycle withpkg/cluster) - Non-semver image tags (e.g.
latest) skip version-skew validation to preserve backward compatibility with test/dev configs
Air-Gapped Cluster Creation
Section titled “Air-Gapped Cluster Creation”--air-gappedflag — new flag onkinder create clusterdisables all network calls for image pulls across docker, podman, and nerdctl providers- Fast-fail with actionable error — missing images produce a complete list of what must be pre-loaded, instead of timing out or hanging on failed pulls. Per-runtime pre-load instructions via
formatMissingImagesError(binaryName) - Addon image warning — non-air-gapped creation prints a NOTE listing every addon image that will be pulled, so users know what to pre-load before switching to offline mode
- Doctor offline-readiness check —
kinder doctorlists which required images are absent from the local image store, serving as a pre-flight offline readiness check. Skips gracefully when no container runtime is found RequiredAddonImagesutility — centralised image inventory imported from addon packages (no import cycle, since addon packages don’t import common)- Working Offline guide — new working-offline guide documenting the two-mode offline workflow: pre-create image baking vs. post-create
kinder load images
Local-Path-Provisioner Addon
Section titled “Local-Path-Provisioner Addon”- New default addon — local-path-provisioner v0.0.35 installed by default;
local-pathis the only default StorageClass (the legacystandardStorageClass frominstallstorageis gated off) - Automatic dynamic PVC provisioning —
PersistentVolumeClaimresources transition toBoundautomatically in both single-node and multi-node clusters without manual operator action - Opt-out config —
addons.localPath: falsein the cluster config skips the addon and restores the legacystandardStorageClass (exact pre-v1.4 behavior) - CVE-2025-62878 doctor check —
kinder doctorwarns when local-path-provisioner is below v0.0.34 (the fix version; strictly less-than triggers warn) - Air-gapped compatible — embedded manifest pins
busybox:1.37.0withimagePullPolicy: IfNotPresent, ensuring PVC operations work in air-gapped clusters wherebusybox:latestcannot be pulled - Uses
boolVal(opt-out, default true) consistent with MetalLB/CertManager pattern
Host-Directory Mounting
Section titled “Host-Directory Mounting”- Pre-flight path validation —
extraMountsentries with non-existent host paths are rejected before any containers are created, with an error message identifying the missing path. Relative paths resolved viafilepath.Absbeforeos.Stat - Platform propagation warnings —
propagation: HostToContainerorBidirectionalon macOS or Windows now emits a visible warning explaining that propagation is unsupported on Docker Desktop and defaults toNone - Doctor host-mount check — on macOS,
kinder doctorverifies that configured host mount paths exist and that Docker Desktop file sharing is enabled for that path, reporting actionable guidance when either check fails. Falls back to Docker Desktop default dirs whensettings-store.jsonis absent --configflag on doctor —kinder doctor --config cluster.yamlextractsextraMountspaths from the config and wires them into mount checks;mountPathConfigurableinterface allows per-check mount path injection- Host Directory Mounting guide — new guide walks through the two-hop mount pattern (host directory → node
extraMount→ podhostPathPV) with complete YAML examples
kinder load images Command
Section titled “kinder load images Command”- New
kinder load images <image> [<image>...]subcommand — loads one or more local images into every node of a running cluster with a single command - Provider-abstracted —
providerBinaryName()resolves the actual binary for docker, podman, nerdctl, finch, and nerdctl.lima.save()andimageID()takebinaryNameas a parameter instead of hardcodingdocker save - Docker Desktop 27+ containerd fallback —
LoadImageArchiveWithFallbackinnodeutilsdetects the “content digest: not found” error fromctr images import --all-platformsand retries without--all-platforms. Factory pattern (openArchive func() (io.ReadCloser, error)) provides a fresh reader for the retry since tar streams cannot be rewound - Smart-load skip — re-running with an image already present on all nodes completes without re-importing and logs
"Image ... found to be already present on all nodes." - Load Images CLI reference — new CLI reference page with per-provider examples, smart-load behavior, and the Docker Desktop 27+ compatibility note
Website
Section titled “Website”- Local Path Provisioner addon page documenting config, verification, CVE check, and air-gapped image list
- Working Offline guide with pre-load and post-create workflows
- Host Directory Mounting tutorial with two-hop mount walkthrough
- Load Images CLI reference covering all three providers, smart-load behavior, and Docker Desktop 27+ fallback
- Landing page updated with local-path in Core Addons
- Configuration reference gained the
localPathaddon field
Internal
Section titled “Internal”ExplicitImagecaptured pre-defaults inencoding/convert.go(SetDefaultsCluster fills empty Image fields beforeConvertv1alpha4, making post-defaults detection impossible)stderrorsalias for stdliberrorsavoids conflict withsigs.k8s.io/kind/pkg/errorsimportisContentDigestErrorchecksRunError.Outputbefore falling back toerr.Error()stringLoadImageArchive(existing public API) unchanged — newLoadImageArchiveWithFallbackcoexists forkinder load imagesusagerealListNodes/realGetProvisionerVersion/realListNodesin doctor checks use the low-level containerexecCLI approach to avoid import cycles withpkg/cluster/internal
v1.3 — Known Issues & Proactive Diagnostics
Section titled “v1.3 — Known Issues & Proactive Diagnostics”Released: March 6, 2026
Expanded kinder doctor from 3 to 18 diagnostic checks across 8 categories, wired automatic mitigations into kinder create cluster, and added a comprehensive Known Issues documentation page.
Doctor Infrastructure
Section titled “Doctor Infrastructure”- Check interface — unified
Checkcontract withName(),Category(),Platforms(),Run()methods. All checks return structuredResultvalues with ok/warn/fail/skip status - Category-grouped output —
kinder doctorgroups checks by category (Runtime, Docker, Tools, GPU, Kernel, Security, Platform, Network) with Unicode status icons - JSON output —
kinder doctor --output jsonproduces an envelope with checks array and summary object (total/ok/warn/fail/skip counts) - Platform filtering — checks declare target platforms; non-matching platforms get
skipstatus instead of crashing - SafeMitigation system — tier-based mitigation infrastructure wired into
kinder create clusterbefore provisioning. Errors logged as warnings, never fatal
Docker & Tool Checks
Section titled “Docker & Tool Checks”- Disk space — warns at <5GB, fails at <2GB using Docker’s data root path. Build-tagged
statfsfor Linux/macOS - daemon.json init flag — detects
"init": trueacross 6 candidate paths (native Linux, Docker Desktop macOS, rootless, Snap, Rancher Desktop, Windows) - Docker snap — detects Docker installed via snap through symlink resolution. Warns about
TMPDIRissues - kubectl version skew — parses
kubectl version --client -o jsonand warns when skew exceeds +/-1 minor version from reference (v1.31) - Docker socket permissions — detects permission denied on Linux and suggests
usermod -aG docker $USERfix
Kernel & Security Checks (Linux)
Section titled “Kernel & Security Checks (Linux)”- inotify limits — warns when
max_user_watches< 524288 ormax_user_instances< 512 with exactsysctlfix commands - Kernel version — fails on kernels below 4.6 (cgroup namespace support is a hard blocker for kind)
- AppArmor — detects enabled AppArmor and warns about stale profile interference (
moby/moby#7512) - SELinux — detects enforcing mode on Fedora and warns about
/dev/dma_heapdenials - firewalld — detects nftables backend (Fedora 32+ default) and warns about Docker networking issues
Platform Checks
Section titled “Platform Checks”- WSL2 — multi-signal detection (microsoft in
/proc/version+WSL_DISTRO_NAMEorWSLInterop) prevents Azure VM false positives. Checks cgroup v2 controllers (cpu, memory, pids) - Rootfs device — detects BTRFS as Docker storage driver or backing filesystem
- Subnet clash — detects Docker network subnet overlaps with host routing table using
netip.Prefix.Overlaps. Handles macOS abbreviated CIDR notation
Create-Flow Integration
Section titled “Create-Flow Integration”kinder create clustercallsApplySafeMitigations()after containerd config patches and before provisioning- Only tier-1 mitigations applied (env vars, cluster config adjustments) — never calls
sudoor modifies system files - Mitigation errors are informational warnings, never block cluster creation
Website
Section titled “Website”- Known Issues page documenting all 18 diagnostic checks across 8 categories with What/Why/Platforms/Fix structure
- Known Issues added to sidebar navigation
- Cross-linked from Troubleshooting page
Internal
Section titled “Internal”golang.org/x/sys/unixpromoted from indirect to direct dependency forunix.Statfsandunix.Uname- Deps struct injection pattern for all checks: injectable
readFile,execCmd,lookPathfor unit testing without system calls - Build-tagged platform pairs:
kernel_linux.go/kernel_other.go,disk_unix.go/disk_other.go - 80+ new unit tests across 10 check files with table-driven parallel execution
v1.2 — Distribution & GPU Support
Section titled “v1.2 — Distribution & GPU Support”Released: March 5, 2026
First stable release with automated binary distribution via GoReleaser, Homebrew tap, and NVIDIA GPU addon.
Distribution
Section titled “Distribution”- GoReleaser pipeline — automated cross-platform binary builds for linux/darwin (amd64 + arm64) and windows (amd64) with SHA-256 checksums and categorized changelog
- GitHub Releases — tagged releases automatically publish platform archives to GitHub Releases
- Homebrew tap —
brew install patrykquantumnomad/kinder/kinderinstalls a pre-built binary on macOS. Cask auto-published on each stable release via GoReleaser - goreleaser-action — replaces legacy
cross.sh+softpropsrelease workflow;cross.shretired
NVIDIA GPU Addon
Section titled “NVIDIA GPU Addon”- NVIDIA device plugin (v0.17.0) — DaemonSet installed via go:embed + kubectl apply when
addons.nvidiaGPU: true. RuntimeClassnvidiacreated for GPU pod scheduling - Opt-in config —
NvidiaGPU *boolfield in v1alpha4 config API, defaults tofalse(unlike other addons which default totrue) - Platform guard — GPU addon skips with informational message on non-Linux platforms without failing cluster creation
- Pre-flight validation — checks for
nvidia-smi,nvidia-ctk, and nvidia runtime in Docker config before applying manifests. Fails fast with actionable error messages - Doctor checks —
kinder doctorreports NVIDIA driver version, container toolkit presence, and Docker runtime configuration (Linux only, warn-not-fail) - Documentation — GPU addon page at kinder.patrykgolabek.dev/addons/nvidia-gpu with prerequisites, configuration, usage, and troubleshooting
Website
Section titled “Website”- Installation page updated with Homebrew install instructions and GitHub Releases download links
Internal
Section titled “Internal”project_name: kinderandgomod.proxy: falsein GoReleaser config for fork safetyskip_upload: autoon Homebrew cask to prevent publishing pre-release buildsHOMEBREW_TAP_TOKENfine-grained PAT scoped tohomebrew-kinderrepo for cross-repo cask push
v0.4.1-alpha — Website Use Cases & Documentation
Section titled “v0.4.1-alpha — Website Use Cases & Documentation”Released: March 4, 2026
Expanded the documentation site with 3 tutorials, 3 CLI reference pages, and enriched all 7 addon pages with examples, troubleshooting, and configuration details.
Tutorials
Section titled “Tutorials”- TLS Web App — deploy a web app with TLS termination using cert-manager + Envoy Gateway
- HPA Auto-Scaling — set up Horizontal Pod Autoscaler with Metrics Server and load-test it
- Local Dev Workflow — build, push to local registry, and deploy with hot-reload iteration
CLI Reference
Section titled “CLI Reference”- Profile Comparison — side-by-side table of all 4 addon profiles (minimal, full, gateway, ci)
- JSON Output — schema reference for
--output jsonon env, doctor, get clusters, get nodes - Troubleshooting — common issues with
kinder envandkinder doctor, exit codes
Addon Page Enrichment
Section titled “Addon Page Enrichment”- All 7 addon pages updated with: configuration examples, version pinning details, symptom/cause/fix troubleshooting tables, and verification commands
- Core vs optional addon grouping on landing page and configuration reference
- Quick-start guide updated with all 7 addon verifications and
--profiletip
v0.4.0-alpha — Code Quality & Features
Section titled “v0.4.0-alpha — Code Quality & Features”Released: March 4, 2026
Modernized the Go toolchain, added context.Context cancellation plumbing, built a comprehensive unit test suite, implemented wave-based parallel addon execution, and shipped JSON output and cluster profile presets for the CLI.
Go Toolchain & Code Quality
Section titled “Go Toolchain & Code Quality”- Go 1.24 baseline — go.mod bumped to 1.24.0,
golang.org/x/sysupdated to v0.41.0,rand.NewSourcedead code cleaned up - golangci-lint v2 — migrated from v1.62.2 to v2.10.1 with full config conversion, 55+ lint violations fixed across 60+ files
- Layer violation fix — version package moved from
pkg/cmd/kind/versiontopkg/internal/kindversionto enforce cleancmd -> cluster -> internalimport direction - SHA-256 subnet hashing — SHA-1 replaced with SHA-256 for Docker/Podman/Nerdctl subnet generation
- Code quality — log directory permissions
0777→0755, dashboard token atV(1), error naming convention (ErrNoNodeProviderDetected)
Architecture
Section titled “Architecture”- context.Context plumbing —
Contextfield added toActionContextand propagated through all 7 addonExecute()methods vianode.CommandContext().waitForReady/tryUntilare now cancellation-aware withselectonctx.Done() - Centralized addon registry — 7 hard-coded
runAddon()calls replaced with a data-driven[]AddonEntryregistry loop increate.go
Unit Tests
Section titled “Unit Tests”- Test infrastructure — shared
testutilpackage withFakeNode,FakeCmd, andFakeProvidertypes for testing addon actions without a live cluster - Addon test coverage — 30+ table-driven tests covering
installenvoygw,installmetricsserver,installcertmanager,installdashboard, andinstalllocalregistry - Race-detector clean — all tests pass under
go test -race
Parallel Addon Execution
Section titled “Parallel Addon Execution”- Wave-based execution — 6 independent addons run concurrently via
errgroup.WithContext+SetLimit(3)in Wave 1; EnvoyGateway runs sequentially in Wave 2 (depends on MetalLB) - Race-free node caching —
RWMutex-basedcachedDatareplaced withsync.OnceValuesfor exactly-once node caching, eliminating a TOCTOU race - Install timing — per-addon install duration printed in the creation summary (e.g., “MetalLB: 12.3s”)
- Added
golang.org/x/syncdependency andmake test-raceMakefile target
CLI Features
Section titled “CLI Features”--output json— added tokinder env,kinder doctor,kinder get clusters, andkinder get nodes. All produce clean,jq-parseable JSON on stdout; logger output redirected to stderr in JSON mode--profileflag —kinder create cluster --profile <name>selects a named addon preset:minimal— no kinder addons (core kind only)full— all addons enabledgateway— MetalLB + Envoy Gateway onlyci— Metrics Server + cert-manager (CI-optimized)
- Default behavior (no
--profile) is fully preserved
Internal
Section titled “Internal”- Added
golang.org/x/syncv0.19.0 forerrgroup CreateWithAddonProfilenil-guardso.Configby loading default config when no--configflag given--profileapplied afterwithConfigso profile addons override config-file addon settings
v0.3.0-alpha — Harden & Extend
Section titled “v0.3.0-alpha — Harden & Extend”Released: March 3, 2026
Fixed 4 correctness bugs, eliminated ~525 lines of provider code duplication, and added batteries-included local registry, cert-manager, and CLI diagnostic tools.
Bug Fixes
Section titled “Bug Fixes”- Port leak fix — port listeners in
generatePortMappingsare now released at loop iteration end, not deferred to function return, across docker/nerdctl/podman providers - Tar truncation fix —
extractTarballreturns a descriptive error on truncated archives instead of silently succeeding - Cluster name fix —
ListInternalNodeswraps empty cluster names withdefaultName()for consistent resolution across all providers - Network sort fix — network sort comparator uses strict weak ordering with
!=guard for deterministic results
New Addons
Section titled “New Addons”- Local Registry (
localhost:5001) — aregistry:2container is created on the kind network during cluster creation. All nodes are patched with containerdcerts.dconfiguration. Akube-public/local-registry-hostingConfigMap is applied for Tilt/Skaffold/dev-tool discovery. Disable withaddons.localRegistry: false - cert-manager (v1.16.3) — embedded manifest applied via
--server-side. All three components (controller, webhook, cainjector) reach Available status before the cluster is reported ready. A self-signedClusterIssuer(selfsigned-issuer) is created automatically soCertificateresources work immediately. Disable withaddons.certManager: false
New Commands
Section titled “New Commands”kinder env— printsKINDER_PROVIDER,KIND_CLUSTER_NAME, andKUBECONFIGin eval-safekey=valueformat. Warnings go to stderr. Use witheval $(kinder env)in shell scriptskinder doctor— checks binary prerequisites (docker/podman/nerdctl, kubectl) and prints actionable fix messages. Exit codes:0= all good,1= hard failure,2= warnings only
Config API
Section titled “Config API”- Added
LocalRegistryandCertManagerfields to the v1alpha4Addonsstruct (both*bool, defaulttrue) - Wired through all 5 config pipeline locations: types, defaults, deepcopy, conversion, validation
Internal
Section titled “Internal”- Extracted shared docker/podman/nerdctl logic to
common/package (common/node.go,common/provision.go) - Deleted per-provider
provision.gofiles (~525 lines eliminated) - Updated
go.modtogo 1.21.0withtoolchain go1.26.0 - Added
Provider.Name()method viafmt.Stringertype assertion
v0.2.0-alpha — Branding & Polish
Section titled “v0.2.0-alpha — Branding & Polish”Released: March 2, 2026
Established kinder’s visual identity with a custom logo, SEO discoverability, documentation rewrite, and dark-only theme enforcement.
Branding
Section titled “Branding”- Kinder logo — modified kind robot with “er” in cyan, exported as SVG, PNG,
favicon.ico, and OG image - Original kind logo preserved in
logo/directory - Logo displayed in hero section of landing page
SEO & Discoverability
Section titled “SEO & Discoverability”llms.txtandllms-full.txtfor AI crawler discovery- JSON-LD
SoftwareApplicationstructured data - Complete Open Graph and Twitter Card meta tags
- Author backlinks and attribution to patrykgolabek.dev
Documentation
Section titled “Documentation”- Root README rewritten from kind boilerplate to kinder identity
kinder-site/README updated with project-specific documentation
Design
Section titled “Design”- Dark-only theme enforced site-wide (light mode toggle removed)
- Terminal aesthetic with cyan accents as core visual identity
v0.1.0-alpha — Kinder Website
Section titled “v0.1.0-alpha — Kinder Website”Released: March 2, 2026
Launched the documentation website at kinder.patrykgolabek.dev with dark terminal aesthetic, interactive landing page, and comprehensive documentation.
Website
Section titled “Website”- Astro v5 + Starlight documentation site
- GitHub Actions deployment to GitHub Pages
- Custom domain:
kinder.patrykgolabek.devwith HTTPS - Dark terminal aesthetic (cyan accents,
hsl(185))
Documentation Pages
Section titled “Documentation Pages”- Installation — pre-built binary and build-from-source instructions
- Quick Start — create your first cluster walkthrough
- Configuration — v1alpha4 config reference with addon fields
- MetalLB — LoadBalancer addon documentation
- Envoy Gateway — Gateway API routing documentation
- Metrics Server —
kubectl topand HPA documentation - CoreDNS — DNS tuning documentation
- Headlamp — dashboard addon documentation
Landing Page
Section titled “Landing Page”- Hero section with feature overview
- Copy-to-clipboard install command
- Kind vs Kinder feature comparison grid
- Addon feature cards for all 5 default addons
Quality
Section titled “Quality”- Mobile responsive at 375px viewport
- Lighthouse 90+ on all metrics
robots.txtand Pagefind search index- Custom 404 page
v0.0.1-alpha — Batteries Included
Section titled “v0.0.1-alpha — Batteries Included”Released: March 1, 2026
Forked kind into kinder with 5 default addons that work out of the box. One command gives you a fully functional Kubernetes development environment.
- Binary renamed from
kindtokinder(backward compatible) - Config schema extended with
addonssection in v1alpha4 - Existing kind configs work unchanged
- Each addon individually disableable via
addons.<name>: false - All addons wait for readiness before the cluster is reported ready
Default Addons
Section titled “Default Addons”- MetalLB (v0.15.3) — auto-detects Docker/Podman/Nerdctl subnet and assigns LoadBalancer IPs without user input. Platform warning on macOS/Windows
- Envoy Gateway (v1.3.1) — Gateway API CRDs installed, HTTP routing via LoadBalancer IPs. Uses
--server-sideapply for large CRDs - Metrics Server (v0.8.1) —
kubectl top nodesandkubectl top podswork immediately. Configured with--kubelet-insecure-tlsfor local clusters - CoreDNS tuning — in-place Corefile modification:
autopath,pods verified,cache 60 - Headlamp (v0.40.1) — web dashboard with auto-generated admin token and printed port-forward command
Architecture
Section titled “Architecture”- Addons implemented as creation actions (follows kind’s
installcni/installstoragepattern) - All manifests embedded via
go:embed(offline-capable) - Runtime apply via
kubectl(not baked into node image) *booladdon fields:nildefaults totrue, explicitfalsedisables