Releases: kernpilot/lok8s
Release list
v0.6.0
What's Changed
- fix(docs): the site builds again by @fentas in #204
- fix(e2e): the round-trip gate accepts a relative binary path by @fentas in #205
- test(e2e): a real cluster matrix, one binary, both implementations by @fentas in #206
- feat(kubehz): the 503 AT_CAPACITY message names the control-plane shape by @fentas in #207
- feat(kubehz)!: a space is three numbers, not a plan by @fentas in #208
Full Changelog: v0.5.0...v0.6.0
v0.5.0
One presentation layer for the terminal, the lo init screens and a
new verb. No command changed its piped output, with the exceptions
listed under Changed.
The rule
lo decides per stream. Off a terminal (a pipe, a file, CI) the output is
the plain text of the bash implementation, byte for byte. Scripts keep
matching on it.
On a terminal lo renders one house style. Titles and sections are bold.
The ✓ ! ✗ · markers and the [error]/[warn] prefixes have colour.
Tables measure their columns. A command with an obvious next step ends on
a dim next: lo <cmd> # why line. NO_COLOR (set to a non-empty value)
and the new global --no-color flag keep the terminal shape without colour. See
Output.
Changed
-
lo doctorno longer prints ANSI escapes into a pipe. It is the one
command whose piped bytes change. The bash implementation gates its colour
the same way, so both print the same plain bytes. On a terminal the
command is the title, and the report starts with its first section.
lo up,lo down,lo provision,lo recover, the apply progress
and the bootstrap engine still print their escapes into a pipe, as
the bash implementation does. Their gate is a follow-up (WP12). -
A project with a bash tree ejected before v0.5.0 keeps the escapes in
the doctor's provider section untillo assets update bash. -
lo statusrenders bold headers on a terminal. Piped, it is unchanged. -
lo toolchain doctorhas a title and no leading blank line. When a
pinned tool is missing it ends onnext: lo toolchain install.
lo toolchain installends onnext: lo toolchain doctor. -
lo addonsmeasures its columns on a terminal, so a long addon name
stays in line. Piped, the printf layout is unchanged.lo assets list
andlo assets diffmeasure in both modes. -
The not-found messages of
lo status, and of every command that
resolves a spec, nameclusters/<domain>/. The old text named
.lok8s/<domain>/. Both implementations changed together. -
Bare
lo initon a terminal. Without a project here, or in a
project without a git repository, one welcome line and one bootstrap
screen with every value prefilled (the name, the first cluster
<name>.dev, the driver, the environment file, the toolchain,git init);Create,Change detailsorCancel.Createruns and
continues in project mode. In a project: the state card in the layout
of thelo upheader, then one choice from what the state allows
(a cluster, a service, the test suite, the toolchain when a pinned
tool is missing, the active domain when none is valid or with several
clusters, the bash tree or the implementation switch,Exit); each
action is one screen, then the card again with a one-line result. A
failed step is a row under the card, not an exit. Nothing is written
except on a screen'sCreate. Esc cancels; Ctrl-C leaves with rc 130.
Off a terminal, underCIor with--yes, barelo initprints the
help as before. Seelo init. -
The state card. Two columns, the project name first, the facts
joined with·: the implementation, the branch and the count of
uncommitted paths, the clusters grouped by driver with the active one
first, the toolchain with the count of pinned tools, the environment
file, the bash tree,services.yaml,tests/. A row that starts with
!needs an action; the command is in the list'sequivalentrow and
in--plan. No doctor sections inside the card (lo doctorkeeps
them). -
lo init serviceandlo init testopen their screen on a
terminal without--yes; a value given on the command line is a fixed
row. Off a terminal they run as before. -
lo init --planprints the mode's screen as text: the welcome
and the bootstrap screen, or the card with the action list and the
next step.
Added
- A bare
lo useon a terminal opens a select over the domains and
preselects the active one. Enter sets it. Esc or Ctrl-C leaves it as it
is. Without a cluster it printsno clusters yetand points at
lo init. lo use <unknown>on a terminal adds the closest domain and the
available ones under the error.lo bogusprints cobra's "Did you mean this?" block and the
Run "lo -h"hint. Words from other tools (start,stop,delete,
switch,apply) suggest theirlocommand.- Every flag error, on every command, prints in the one argsh shape.
--no-color.lo init cluster [domain] [--driver lo|kubeone|capi|kkp|kubehz-hosted] [--no-active] [--force]writesclusters/<domain>/cluster.lok8s.yaml
and makes the domain the active one. The verb behind project mode's
"Add a cluster". Go-only.--yes,--planand--dry-runonlo init cluster,lo init serviceandlo init test.
Removed
- The
lo initwizard's menu, form chain, Yes/No confirms and summary
screen from v0.3.x. Their flag twins stay:lo init project --env --cluster --driver --implementation,lo init service <name> --path,
lo init test,lo toolchain install --groups,lo assets eject bash,lo use <domain>.
Discoverability
lo completion bash|zsh|fish|powershellcompletes the values that live
in the project. Domains complete onlo use,lo audit,lo recover,
every--domainand--cluster-override, and the drivers' positional.
Addon names complete onlo addons, asset paths onlo assets eject|diff|update, service names onlo init service. A Tab never
writes into the project. Install lines: CLI reference.- Every command's
--helpends with anExamples:block of one to three
lines with real-looking values. - The generated CLI commands page lists every
command with its flags and examples.go test ./internal/clidoc/fails
while the committed page is stale. - A bare
loon a terminal prints an orientation block: the project, the
active domain and its driver, the kubeconfig when one exists, the six
everyday commands and the next step. Off a terminal it prints the full
help as before. - The Short of the Go-only commands (
assets,mcp,toolchain) starts
with a verb and has at most 60 characters.
Safety and scripts
- On a terminal,
lo down,lo clean,lo destroy(local driver),lo registry cleanandlo image cleanlist what they remove (the cluster
name, the kubeconfig, the registry containers and volumes, the docker
volumes) and ask once.--yesanswers the prompt;--forcekeeps its
meaning (a precondition override) and does not. Off a terminal nothing
changes: no prompt, no new requirement. -o,--output text|json|yamlonuse,status,addons,assets list,registry status,versionanddoctor, with stable lowerCamel
field names (CLI reference).- On a terminal an error with a next step prints as
error: …and
next: …. Off a terminal the exact[error]line prints as before.
--debugnames every failed external command with its exit code. The
exit codes are documented (CLI reference). lo lint --format text|editor|github.githubis the default under
GITHUB_ACTIONS=trueoff a terminal.-q,--quietsilences the informational stderr lines.-vstays the
[debug]channel (Levels).
Upgrade
Reinstall the binary: bash lo-install.sh, or unpack lo-<os>-<arch>.tar.gz
(lo-full-<os>-<arch>.tar.gz for the in-process build) from the release.
A project that pins lo through lo toolchain install bumps
github.com/kernpilot/lok8s in .bin/b.yaml to v0.5.0 and runs
b install. A project that routes commands to the bash tree runs
lo assets update bash to pick up the colour gate in verbose.sh and
libs/doctor.
What's Changed
- feat(ui): one presentation layer for the terminal; piped output stays the bash contract by @fentas in #200
- feat(init): the state card in the header layout, the bootstrap screen, project mode, lo init cluster by @fentas in #198
- feat(cli): discoverability: completion, examples, generated reference, bare lo orientation (UX PR A) by @fentas in #199
- feat(cli): safety and scripts: confirmations, -o json|yaml, the error shape, lint --format, -q and --debug (UX PR B) by @fentas in #201
- release: v0.5.0 by @fentas in #203
Full Changelog: v0.4.1...v0.5.0
v0.4.1
One fix for lo up in a shell that exports only PATH. No configuration
change is needed.
Fixed
-
lo upwith the v0.4.0lo(core) binary created the kind cluster and
then failed in the bootstrap step:Error: loading generator plugins: failed to load generator: unable to find plugin root - tried: ('<no value>'; homed in $KUSTOMIZE_PLUGIN_HOME), … [error] bootstrap: render failed for ciliumEvery addon that depends on
ciliumwas skipped.lo doctorin the same
shell reported✓ KUSTOMIZE_PLUGIN_HOME=<project>/.kustomize.The cause: the binary set
KUSTOMIZE_PLUGIN_HOMEfor its bash children
and for thelo buildrender, but not for the kustomize child of the
addon render that bootstrap runs. The project.envrcexports the
variable; a shell that exports onlyPATHdoes not. In that shell the
child had no plugin home.The fix: one function decides the plugin home for every child of the
binary. It returns the variable when the shell exports it, else
<project>/.kustomize. The addon render,lo build,lo k8s, the
registry TLS mint, the bash shim andlo doctorall read that function.
lo doctorcannot report a home that the render does not use.
Who is affected
A project that runs lo (core), or lo-full with LO_RENDER=exec, from a
shell that does not export KUSTOMIZE_PLUGIN_HOME. The in-process render
of lo-full reads no plugin home and was not affected. A shell that
exports the variable was not affected.
Upgrade
- Install the binary:
bash lo-install.sh, or unpack
lo-<os>-<arch>.tar.gz(lo-full-<os>-<arch>.tar.gzfor the
in-process build) from the release. A project that pinslothrough
lo toolchain installbumpsgithub.com/kernpilot/lok8sin
.bin/b.yamltov0.4.1and runsb install. - Run
lo upagain. The addons that were skipped are applied.
Assets
The same set as v0.4.0: for linux and darwin, amd64 and arm64,
lo-<os>-<arch>.tar.gz, lo-full-<os>-<arch>.tar.gz,
kustomize-secret-<os>-<arch>, lochat-<os>-<arch>, plus
lok8s-v0.4.1.tar.gz (the framework tree), lo-install.sh and
checksums.txt.
Previous notes: v0.4.0, v0.3.1, v0.3.0.
What's Changed
Full Changelog: v0.4.0...v0.4.1
v0.4.0
The registry TLS certificate moves out of the project tree. New commands
manage it. One fix for lo up in a shell without PATH_SECRETS.
Breaking
- The registry TLS certificate lives in a docker volume.
lo upmints
the certificate for a registry set into the volume
<network>-registry-tls, next to the set's data volumes. Every registry
container mounts the volume at/etc/registry/certs. Releases before
v0.4.0 wrote the certificate to.secrets/tls/registries/and
bind-mounted that directory. See
TLS registries. .secrets/holds no lok8s content. The per-domain store
clusters/<domain>/secrets/is the only secrets store.lo lintno
longer treatsregistries-tlsas a legitimate flat-store entry. See
Migrating a flat.secrets/store.
New
lo registry tls statusprints the certificate (SANs, validity dates)
and what each registry container mounts.lo registry tls renewmints a new certificate into the volume and
restarts the set's containers.lo doctor(the binary) reports which mount the registry containers use
when they still mount the pre-v0.4.0 directory.- See
lo registry tls.
Fixed
lo upon thelo(kind) driver failed with
error: PATH_SECRETS is not set — cannot mint the registry TLS certin a
project whose shell exports onlyPATH. The bash entrypoint defaulted
PATH_SECRETSbefore any driver ran; the binary did not. The mint no
longer readsPATH_SECRETS: it hands the Secret generator a scratch
directory underclusters/<domain>/and stores the result in the volume.
Who is affected
Every project with spec.registries.tls: true (the default). A project on
a release before v0.4.0 has its certificate in .secrets/tls/registries/
and registry containers that bind-mount that directory.
Upgrade
- Reinstall the binary:
bash lo-install.sh, or unpack
lo-<os>-<arch>.tar.gz(lo-full-<os>-<arch>.tar.gzfor the in-process
build) from the release. A project that pinslothrough
lo toolchain installbumpsgithub.com/kernpilot/lok8sin
.bin/b.yamltov0.4.0and runsb install. - Run
lo up. The first run imports the certificate from
.secrets/tls/registries/into the volume and prints one[warn]line:
the running registry containers still mount the old directory. - Run
lo registry down && lo registry up. The registries come back with
the volume mounted.lo registry tls statusshowsvolumefor each
container. Then remove.secrets/. - Add
clusters/*/.registry-tls-tmp.*/to the project.gitignore. The
mint writes its scratch store there. A mint that stops before its cleanup
leaves the directory with the private key in it. New projects get the
pattern fromlo init project.lo upremoves stale directories before
each mint.
The bash implementation changed the same way. A project that routes
registry or up to bash (lok8s.yaml spec.implementation) mints into
the same volume, imports the same legacy files and has the same
lo registry tls status|renew. A switch between the implementations never
leaves two certificate locations behind.
Two lo up runs on the same registry network at the same time can
collide on the helper container <network>-registry-tls-io: that run
fails, and a retry succeeds because the read-out checks both files and
mints again into an incomplete volume.
Assets
The same set as v0.3.1: for linux and darwin, amd64 and arm64,
lo-<os>-<arch>.tar.gz, lo-full-<os>-<arch>.tar.gz,
kustomize-secret-<os>-<arch>, lochat-<os>-<arch>, plus
lok8s-v0.4.0.tar.gz (the framework tree), lo-install.sh and
checksums.txt.
Previous notes: v0.3.1, v0.3.0.
What's Changed
- fix(lo): registry TLS cert in the set's docker volume (both implementations); lo registry tls; v0.4.0 by @fentas in #197
Full Changelog: v0.3.1...v0.4.0
v0.3.1
A fix release for lo build. No new commands, no changed flags.
Fixed
-
lo buildfailed withsplit: failed to split <domain>/artifacts.yaml
on every split-mode domain when the OS temp dir is on a different
filesystem than the project. The split staged its files under$TMPDIR
and moved them intoclusters/<domain>/with a rename, which fails
across filesystems (EXDEV). The scratch dir now lives in the domain
dir (.artifacts-tmp.*, removed on every exit), and a move that still
crosses a device copies the file instead. -
The split's failure messages name the cause:
split: failed to split <artifact>: <error>.
Who is affected
Any project whose /tmp is a separate filesystem from the project tree:
a tmpfs /tmp (Arch, Fedora and many CI runners; Debian and Ubuntu keep
/tmp on disk) with the project on a disk, or a CI runner whose workspace
is a mounted volume (the
kubehz-cluster render.yml runners failed on every domain). A project on
the same filesystem as /tmp, or a build with TMPDIR set to a directory
on the project's filesystem, was not affected. The bash implementation was
not affected: mv copies across devices.
Upgrade
Reinstall the binary: bash lo-install.sh, or unpack lo-<os>-<arch>.tar.gz
(lo-full-<os>-<arch>.tar.gz for the in-process build) from the release.
Nothing in the project changes. A project that pins lo through
lo toolchain install bumps github.com/kernpilot/lok8s in .bin/b.yaml
to v0.3.1 and runs b install.
Assets
The same set as v0.3.0: for linux and darwin, amd64 and arm64,
lo-<os>-<arch>.tar.gz, lo-full-<os>-<arch>.tar.gz,
kustomize-secret-<os>-<arch>, lochat-<os>-<arch>, plus
lok8s-v0.3.1.tar.gz (the framework tree), lo-install.sh and
checksums.txt.
What's Changed
Full Changelog: v0.3.0...v0.3.1
v0.3.0
lo is one Go binary. Every command runs natively in it. The binary embeds
the frozen argsh tree, and the tree stays runnable: a project selects it per
command through lok8s.yaml (spec.implementation).
Install
New installs use lo-install.sh. Download it and checksums.txt from the
release, verify, read, then run it. See
Installation.
Two builds, and both install as lo:
-
lo(core, about 18 MB) renders through the pinnedkustomizebinary and
the exec plugins thatlo toolchain installinstalls withb. -
lo-full(lo-install.sh --full) links the kustomize API and khelm and
renders in-process. The two builds give byte-identical output.
New
-
lo initruns a wizard on a terminal. It detects where you stand, asks,
prints the plan, then writes.lo init --planprints the plan and writes
nothing. Every answer has a flag twin on a subcommand. -
lo toolchain installwrites.bin/b.yamlwith the pins of thislo
build. It installsb(SHA-256 verified) and runsb install.
lo toolchain doctorverifies what landed. -
lo assetsis the eject model. The binary embeds the addons, the driver
templates, the CRD mirror, the Tilt extension and the bash tree. They land
in.lok8s/on first use.lo assets list|diff|eject|updatemanage the
copies. A local copy always wins. -
lo mcpserves the MCP server for editors and agents from the same binary. -
lo secretsuses the kernpilot age-only sops fork. The fork drops the
cloud KMS, Vault and PGP backends.lorejects a rule with such a
recipient.
Removed
-
LO_IMPLandLO_GO_BASH. Nothing in the environment selects the
implementation.lok8s.yamldoes. -
lo assets show. Uselo assets diff <rel>. -
lo init project --env both. Pickmise,direnvornone.
Deprecated
lo init toolchainis a hidden alias oflo toolchain install. This
release keeps it, the next one removes it.
Breaking
-
.lok8s/lono longer marks a project root. The binary walks up to the
nearestclusters/directory or akind: Projectlok8s.yaml(D30). -
Install through
lo-install.shor the release archives.lo-upstays
online as legacy and does not install the Go binary. -
Go refuses
go install github.com/kernpilot/lok8s/cmd/lo@v0.3.0. The
module carriesreplacedirectives.
Upgrade an existing project
-
Install the binary:
bash lo-install.sh. -
Add
lok8s.yamlat the project root if there is none:kind: Project spec: implementation: default: go
-
Run
lo toolchain install. It never overwrites an existing.bin/b.yaml.
It prints a diff against the pins. -
Optional:
lo assets eject bashwrites the frozen tree into.lok8s/.
Thenspec.implementation.bash.commandscan route a command to it. -
Run
lo doctor.
Deviations
Where the binary does not match the bash on purpose:
the deviations catalogue.
Assets
For linux and darwin, amd64 and arm64: lo-<os>-<arch>.tar.gz,
lo-full-<os>-<arch>.tar.gz, kustomize-secret-<os>-<arch>,
lochat-<os>-<arch>, plus lok8s-v0.3.0.tar.gz (the framework tree),
lo-install.sh and checksums.txt.
What's Changed
- fix(kubeone): render_addons carries the cluster's inline bootstrap values by @fentas in #160
- test(drift-gate): catch |.kind pipe stages; name the (.kind) grouping gap by @fentas in #161
- docs: b.yaml toolchain page, service-vs-target note, drop the private-repo pointer by @fentas in #162
- feat(audit): lo audit --sarif — SARIF 2.1.0 output for GitHub code scanning by @fentas in #163
- feat(kubehz): lo kubehz node join|remove|status — nodes you bring to a hosted control plane (A-5 phase 5) by @fentas in #165
- fix(kubehz): node r3 findings — post-mint slot note, server-string scrub, per-word kubeadm log by @fentas in #166
- docs: STE pass over the user guide — minimize em dashes, active voice, short words by @fentas in #167
- feat(kubehz): lo kubehz join writes the api's join script to a private file by @fentas in #170
- fix(security): supply chain, CI proof of the Go binary, credential handling (2026-09-05 review) by @fentas in #171
- docs+quality: CLI reference drift, one ErrHandled, real flags for the hand-parsed leaves, parity holes (2026-09-05 review) by @fentas in #172
- kubehz: re-vendor the live agent at kubehz-agent v0.1.0 by @fentas in #173
- build(deps): sops age-only fork shrinks the core binary by @fentas in #174
- fix: address review round 2 on the Go port by @fentas in #175
- feat: single-binary Go lo — full port with parity gates, goreleaser release, verified installer by @fentas in #168
- ci(deps): Bump docker/setup-buildx-action from 3.12.0 to 4.3.0 by @dependabot[bot] in #176
- ci(deps): Bump actions/deploy-pages from 4.0.5 to 5.0.1 by @dependabot[bot] in #177
- ci(deps): Bump helm/kind-action from 1.12.0 to 1.15.0 by @dependabot[bot] in #178
- ci(deps): Bump actions/upload-pages-artifact from 3.0.1 to 5.0.0 by @dependabot[bot] in #179
- ci(deps): Bump docker/setup-qemu-action from 3.7.0 to 4.3.0 by @dependabot[bot] in #180
- chore(deps): Bump golang.org/x/term from 0.45.0 to 0.46.0 by @dependabot[bot] in #181
- chore(deps): Bump golang.org/x/crypto from 0.54.0 to 0.57.0 by @dependabot[bot] in #182
- docs+chore: internal plan moved, self-contained ai/README, .lok8s/README, stale .secrets and api/ stubs removed by @fentas in #186
- chore(deps): Bump filippo.io/age from 1.3.1 to 1.3.2 by @dependabot[bot] in #183
- chore(deps): Bump golang.org/x/crypto from 0.54.0 to 0.57.0 in /kustomize by @dependabot[bot] in #184
- ci: run the main-only e2e and kind jobs from their own workflow by @fentas in #185
- feat(mcp): the editor talks to lo mcp; docs for the Go and the bash server by @fentas in #187
- feat: embed the bash implementation in the binary (WP7) by @fentas in #188
- feat(cli): select the implementation in lok8s.yaml, remove LO_IMPL (WP8) by @fentas in #190
- feat: WP9: lo toolchain, files-only init, assets and marker cleanup, lint --notes by @fentas in #191
- feat: a context-aware bare lo init (WP9b) by @fentas in #192
- release: prepare v0.3.0 by @fentas in #193
New Contributors
- @dependabot[bot] made their first contribution in #176
Full Changelog: v0.2.0...v0.3.0
v0.2.0
What's Changed
- fix(ci): silence SC2120 in .lok8s/libs/ai (greens main ShellCheck) by @fentas in #15
- chore(operator): refresh image + toolchain to clear CVE alerts (305→30) by @fentas in #16
- docs(readme): rewrite for first-impressions and broader positioning by @fentas in #18
- docs(home): lead landing-page install with the curl one-liner by @fentas in #19
- feat(tilt): tilt.hooks — dev lifecycle hooks via a hidden
lo hooksby @fentas in #20 - fix(tilt): drop live_update for production builds by @fentas in #21
- fix(lo): self-protect the generated .containerd tree with a .gitignore by @fentas in #17
- feat(lok8s): KubeOne driver to production (OIDC, addon overrides, registry auth) + secrets env-fallbacks by @fentas in #22
- feat(bootstrap): parallel addon scheduler with per-entry wait: barriers by @fentas in #24
- fix(ceph-osd): GPT bare-metal carve + cloud/bare-metal split + ROOT_GIB 60 by @fentas in #23
- feat(bootstrap): add dependsOn for fine-grained DAG ordering (parallel CRD owners) by @fentas in #25
- feat(bootstrap): add name: entry override to disambiguate dependsOn (addon vs same-name target) by @fentas in #26
- fix(bootstrap): on failure skip only the failed entry's dependents, not the whole run by @fentas in #27
- feat(hetzner): cloud.d module library — reach framework modules from a custom cloudInit.path by @fentas in #28
- feat(rook-ceph): bump to v1.20.1 + document bare-metal single-disk OSD limit by @fentas in #29
- fix(ceph-osd): document the real bare-metal #17716/FORCE_GPT limitation by @fentas in #30
- chore(b): bump vendored b v4.16.0 → v4.18.4 by @fentas in #31
- feat(provision): lo provision -b|--bootstrap — re-apply spec.bootstrap on an existing cluster by @fentas in #32
- fix(cert-manager-webhook-hetzner): auth-reader RoleBinding must stay in kube-system by @fentas in #33
- feat(rook-ceph): add ceph-csi-drivers — fix idle CSI operator / all PVCs Pending by @fentas in #34
- feat(build/deploy): domain-based build/deploy — one artifact per domain + opt-in -l filter by @fentas in #35
- feat(kubeone): make bundled provider CSI opt-in via spec.network.csi (Ceph-first default) by @fentas in #37
- fix(lint): resolve spec.bootstrap via the shared parser (map-form entries) by @fentas in #39
- feat(kubehz): heartbeat agent reports control-plane component health + platform docs page by @fentas in #40
- feat(hetzner): #wipe-devices — guarded device wipe on bare-metal fresh install by @fentas in #36
- feat(hetzner): provider::rebuild + provider::doctor hooks; lo doctor infra section by @fentas in #38
- feat(recover): lo recover — bare-metal DR orchestrator by @fentas in #41
- fix(bootstrap): export driver spec-env on the standalone lo bootstrap path by @fentas in #42
- chore(kubehz): park the non-functional managed-operator manifests (ghost image) by @fentas in #45
- feat(kubehz): per-node instanceType in heartbeat (self-hosted cost overview) by @fentas in #44
- feat(kubehz): P0 self-hosted agent-secret claim (in-cluster identity + authed heartbeat) by @fentas in #47
- fix(kubehz): robustly parse heartbeat node names/roles/version (P0: agent DOA on modern k8s) by @fentas in #48
- feat(audit):
lo auditstatic security-posture audit + addon overview by @fentas in #49 - fix(ci): install pinned kustomize for bats + repair docs deploy by @fentas in #50
- chore(deps): force vite ^6.4.3 via resolutions (fixes both Dependabot alerts) by @fentas in #51
- feat: ClusterInventory CRD wave — lo-written deploy inventory + published addons index by @fentas in #52
- fix(recover): load provider creds before doctor/rebuild phases by @fentas in #53
- fix(recover): multi-worker installimage, cred-loader return-0, restore.d DR hook, CCM placement by @fentas in #55
- feat(kubeone): plumb node-tier labels from #labels to Node labels by @fentas in #56
- feat(kubehz): render the capacity-rejection envelope on hosted provision by @fentas in #57
- fix(cilium): raise Hetzner per-node pod CIDR to /23 (double CP density) by @fentas in #58
- fix(cli): argsh-conformance sweep — inert dispatches, guards, imports, annotations by @fentas in #61
- fix(cilium): raise Hetzner per-node pod CIDR to /23 (double CP density) by @fentas in #59
- fix(kubeone): descriptor-anchored inventory — exclude machine-controller VMs from static hosts by @fentas in #62
- feat(bootstrap): valueFiles on inline addon entries by @fentas in #66
- fix(cli): lo up exit code, surfaced destroy failures, build/deploy doc drift by @fentas in #60
- fix(ci): inventory kind-test asserted pruning, but SSA rejects — red since #52 by @fentas in #64
- style: antipattern sweep — brace positionals, SC2250 enforcement, underscore-prefix cleanup by @fentas in #67
- feat(lint): adopt argsh lint (shellcheck + argsh-lint) as the one entrypoint by @fentas in #68
- feat(addons): add fluxcd (Flux CD GitOps toolkit) framework addon by @fentas in #69
- chore(lo-driver): make kapply a hard dependency, drop the [[ -f ]] guard by @fentas in #70
- feat(bootstrap): aggregate parallel apply output — buffered blocks + progress ticker by @fentas in #71
- feat(build): spec-declared split artifacts — per-resource files + sops Secrets by @fentas in #74
- feat(build): decouple Secret encryption from split — spec.build.encrypt + on:change + lo build --no-secrets by @fentas in #75
- feat(secrets): store-free plugin off switch + run-but-suppress env knobs by @fentas in #76
- feat(secrets):
lo secrets setaccepts-to read the value from stdin by @fentas in #77 - feat(addons): sso-gate — OIDC login in front of any HTTPRoute by @fentas in #78
- feat(cilium): restore WireGuard encryption + production posture (KubeOne) by @fentas in #79
- feat(kubehz): apply the customer bootstrap DAG onto hosted clusters by @fentas in #80
- fix(cilium): MTU 1250 → 1380 — the 1.19 knob is the RAW pod MTU by @fentas in #81
- docs: align ARCHITECTURE + concepts with the bootstrap DAG by @fentas in #82
- fix(cilium): encryption belongs to the Hetzner provider layer by @fentas in #83
- fix(build): support renvsubst — envsubst flavor shim for restricted substitution by @fentas in #84
- fix(build): restricted substitution goes native (jq) on non-GNU envsubst by @fentas in #85
- fix(build): route the artifacts pipe through template::envsubst by @fentas in #86
- feat(addons): loki + promtail — cluster log store and node collector by @fentas in #87
- fix(cli): single domain-resolution point — env precedence, driver gates, honest errors by @fentas in #88
- feat(secret): template: generator for composite secrets by @fentas in #92
- feat(secret): template typed sub-sections, bash-style substitutions, key: generator by @fentas in #93
- ci(e2e): wire
lo up --ciend-to-end job (GOLIVE 0.2) by @fentas in #94 - feat(secrets):
lo secrets set --encrypt+ stale-.enc warning by @fentas in #95 - fix(secrets): address PR #95 review — pin
sops --config+ clearer warn by @fentas in #96 - fix(bootstrap): reconcile cilium/ccm via --bootstrap on KubeOne (gate on path, not DS existence) by @fentas in #97
- feat(bootstrap): unify gate execution + batched conflict heal by @fentas in #98...
v0.1.0
What's Changed
- feat(capi): complete the CAPH driver — real Hetzner clusters, E2E green by @fentas in #7
- feat(capi): HA + private-network + multi-pool example variant by @fentas in #8
- docs: install one-liner + sync capi docs to the reworked driver by @fentas in #9
- feat(secrets): lint flags flat-store shadows of per-domain secrets by @fentas in #10
- feat: local AI for lok8s —
lo chatassistant + the benchmark that shaped it by @fentas in #11 - feat:
lo aiskill management + skill drift-audit + new skills by @fentas in #12 - ci(release): build + attach the
lo chat(lochat) binaries by @fentas in #13 - fix(ci): build kustomize plugins in the release (unblock the broken tarball) by @fentas in #14
New Contributors
Full Changelog: https://github.com/kernpilot/lok8s/commits/v0.1.0