lok8s

module
v0.4.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 14, 2026 License: MIT

README ΒΆ

lok8s

Install Β· Quick Start Β· How it works Β· AI Β· CLI Β· Docs

Stars Release CI License

Β 

Kubernetes, from your laptop to production β€” one CLI, one folder convention, the same workflow everywhere.

lok8s gives you a single CLI (lo) and a single per-domain folder layout for the whole journey: spin up a throwaway cluster on your laptop, iterate with a live dev loop, and ship the exact same definitions to production. It doesn't replace the tools you already know β€” kustomize builds your manifests, Helm charts inflate in place, kind runs clusters locally, and Tilt powers the hot-reload loop. lok8s is the thin, opinionated orchestration around them, so clusters/<your-domain>/ means the same thing in dev, CI, and prod.

Open-sourced in 2026 after ~9 years running real production workloads β€” new to GitHub, but shaped by nearly a decade of operating clusters for keeps.

Β 

✨ Why lok8s

  • 🧰 Standard tools, not a walled garden. Targets are plain kustomize builds; Helm charts inflate via the khelm kustomize plugin (no helm CLI to install). The lo CLI and the folder convention are orchestration and ergonomics β€” the artifacts underneath are vanilla Kubernetes YAML you could kubectl apply by hand. No lock-in: lok8s produces standard manifests you can take anywhere.
  • πŸ’» Dev-first, runs against any cluster. The default experience is a local kind cluster with TLS, a registry mirror, and a Tilt hot-reload loop that just works. lo build emits portable artifacts.yaml you can kubectl apply to any cluster. The Hetzner/KubeOne/CAPI provisioners are a convenience for standing up production β€” not a requirement.
  • πŸ€– AI built in, local-first. lo chat is an on-device assistant for your cluster (read-only by default, with a code-enforced safety gate), and lo mcp exposes every lo command to agents like Claude Code over MCP. No data leaves your machine unless you explicitly opt into a frontier model.
  • πŸ§ͺ Nine years in production. The conventions here aren't speculative β€” they're the residue of ~9 years of running this in production, keeping what survived contact with reality and dropping what didn't.
  • 🐚 Transparent and debuggable. lo is one static Go binary, but it still runs the same kubectl/kustomize/kind commands you'd run by hand: orchestrated, not reimplemented. lo --verbose shows every command, and the bash implementation the binary was ported from ships frozen inside every project (a project's lok8s.yaml can route any command to it), so you can always read, lint and step through the reference. (Why a Go binary, and why the bash stays)

Β 

🧭 Philosophy

A few principles shape every decision in lok8s:

  1. Production is the reference; local dev is a nerfed overlay of it. You don't learn one workflow for your laptop and a different one for prod β€” it's the same tree, the same commands, the same cluster.lok8s.yaml. The local cluster is just production with the expensive parts swapped out.
  2. One cluster = one folder, keyed by FQDN. Everything about a cluster lives under clusters/<fqdn>/. The domain is the identity, which makes multi-cluster and multi-environment setups obvious rather than clever.
  3. Stand on standard tools. lok8s orchestrates kustomize, Helm (via khelm), kind, and Tilt β€” it doesn't reimplement them. If you know those, you already know most of lok8s.
  4. Two concerns, kept apart. Cluster creation (a pluggable driver) is separate from cluster content (kustomize targets). Swapping how a cluster is born never touches what runs on it.
  5. Minimal magic, maximal transparency. Rendered artifacts are plain YAML, every external call is a tool you could run yourself (lo --verbose prints it), and the only ordering primitive is an explicit spec.bootstrap list. When something breaks, you can see exactly what ran.

Β 

βœ… When to use lok8s (and when not to)

Honesty up front β€” lok8s is opinionated, and that won't fit everyone.

Reach for lok8s when you want to…

  • Have the same workflow from local kind to production instead of maintaining two parallel setups.
  • Manage one or many clusters with a clear, FQDN-keyed folder convention.
  • Keep a fast local dev loop (Tilt hot-reload, local registry, working TLS) without bespoke glue.
  • Use kustomize + Helm charts as your manifest layer and want ergonomics around them.
  • Provision on Hetzner (kind/KubeOne/CAPI) with sensible, batteries-included defaults β€” or just deploy to a cluster you already have.

Look elsewhere (or use lok8s only for the deploy side) when…

  • You're fully invested in a managed platform's native workflow (EKS/GKE/AKS + their tooling) and don't want another convention on top.
  • You prefer a pure-GitOps, controller-driven model (Argo/Flux as the source of truth) β€” lok8s can emit manifests for that, but its dev-loop is CLI/Tilt-centric, and the in-tree lo gitops layer is still being built.
  • You need ready-made production provisioning on a cloud other than Hetzner today β€” the provisioning drivers currently target Hetzner. (You can still deploy lok8s-built artifacts to any cluster; you'd just bring your own provisioning.)
  • A tool with no bash anywhere is a hard requirement for your team. lo is a single binary, but a project still carries the framework tree (.lok8s/), the Hetzner provider plugin is bash, and bash β‰₯ 4.3 is a prerequisite.

Β 

πŸ“¦ Install

lo is a single static binary (linux/darwin Γ— amd64/arm64), attached to every GitHub release with a checksums.txt. Download, verify, then run β€” nothing here is piped into a shell:

curl -fsSLO https://github.com/kernpilot/lok8s/releases/latest/download/lo-install.sh
curl -fsSLO https://github.com/kernpilot/lok8s/releases/latest/download/checksums.txt
sha256sum --ignore-missing -c checksums.txt   # macOS: shasum -a 256 --ignore-missing -c checksums.txt
less lo-install.sh                            # read it first
bash lo-install.sh                            # β†’ ~/.local/bin/lo  (--dir, --version, --full, --dry-run)

The installer fetches lo-<os>-<arch>.tar.gz and checksums.txt from the release, refuses to extract anything whose SHA-256 does not match, and only then installs lo. What changed in this release and how to upgrade an existing project: v0.3.0 release notes. Prefer no script at all? The same four steps by hand:

V=v0.4.0; A=lo-linux-amd64.tar.gz             # your tag and platform
curl -fsSLO "https://github.com/kernpilot/lok8s/releases/download/${V}/${A}"
curl -fsSLO "https://github.com/kernpilot/lok8s/releases/download/${V}/checksums.txt"
sha256sum --ignore-missing -c checksums.txt
tar -xzf "${A}" lo && install -m 0755 lo ~/.local/bin/lo

Two builds, one tree. lo (the default, ~50 MB) is the core build: it runs the manifest render through the pinned kustomize binary and the two exec generators (khelm's ChartRenderer, the secrets.lok8s.dev Secret plugin) that lo toolchain install installs into the project with b. lo-full (bash lo-install.sh --full, ~120 MB) links the same kustomize API and khelm release into the binary and renders in-process β€” no kustomize, khelm or .kustomize/ needed. Both install as lo; lo --version names the build ((core) / (full)), and both render byte-identical output β€” that is the gate, see the Go binary reference.

Then scaffold a project: lo init project writes clusters/, lok8s.yaml, the .gitignore entries and a mise.toml (files only, no network). lo toolchain install writes .bin/b.yaml, installs b itself into .bin/ (pinned release, SHA-256-verified, no curl | sh) and runs b install for the pinned toolchain (kubectl, kustomize, khelm, the Secret plugin; kind, Tilt, mkcert for the dev loop). The framework assets a cluster references are embedded in the binary and ejected into .lok8s/ on first use:

mkdir my-project && cd my-project
lo init project                # the project files
lo toolchain install           # b + the pinned toolchain into .bin/
lo toolchain doctor            # b, kustomize, khelm and the Secret plugin at the pins

Joining a project that already has .bin/b.yaml? lo toolchain install never overwrites it β€” it prints a diff against the pins this lo was built with β€” and b install reproduces the committed b.lock. The full profile-based path (b env add github.com/kernpilot/lok8s#local && b install, which also syncs the framework tree and the frozen bash reference) is documented in The Toolchain.

Other ways (use mise, clone the repo) Β· legacy (argsh) install

Prefer mise? A mise.toml ships at the repo root β€” mise install && mise activate provisions the same toolchain. Then lo doctor to verify.

Cloning the repo directly? The argsh runtime is vendored in .bin/, so lo doctor runs immediately and tells you which tools are still missing β€” no b install needed just to diagnose the environment. make build produces the Go binary at bin/lo.

Legacy (argsh) install. New installs use lo-install.sh (above; also served at lok8s.io/lo-install.sh). Before the Go binary, a self-contained argsh script (lo-up) bootstrapped a project β€” installing b, the profile and the toolchain in one go. It does not install the Go binary. It is retired, not removed: the source and build live under .archive/legacy/install/ and the published bundle stays at lok8s.io/lo-up for existing users. Download and read it before running it: curl -fsSL https://lok8s.io/lo-up -o lo-up && less lo-up && sh lo-up.

Profiles β€” each ships only the binaries it needs:

Profile Adds Use case
core framework only Remote deploy only β€” no kind/Tilt
kustomize kustomize plugins Standalone kustomize plugin use
local kind, Tilt, mkcert Local dev (recommended starting point)
capi clusterctl, hcloud Cluster API provisioning
kubeone kubeone, hcloud KubeOne provisioning

Every profile ships a preconfigured clusters/lok8s.dev/ β€” a local cluster with working TLS out of the box. Bring your own FQDN later, or use *.[N].lok8s.dev for multiple projects.

Prerequisites: Docker, and bash β‰₯ 4.3 (macOS ships 3.2 β€” brew install bash). Everything else comes from b (or mise). Run lo doctor to check.

Β 

🐾 Quick Start

From zero to a running local cluster with a live dev loop:

lo use lok8s.dev          # select the active domain (ships preconfigured)
lo up                     # create the kind cluster, bootstrap infra, start Tilt
                          # β†’ Tilt UI on the URL it prints (per-domain port, 10351–10499)
lo status                 # Running βœ“
lo down                   # tear it all down when you're done

That's the interactive loop. For headless/CI or deploying to a remote cluster, the same definitions drive a build β†’ deploy pipeline:

lo build                  # render the domain kustomization β†’ clusters/<domain>/artifacts.yaml
lo deploy                 # apply built artifacts (CRDs first, then resources, with health waits)
lo lint                   # validate specs, bootstrap entries, and target references

lo build's output is plain Kubernetes YAML β€” kubectl apply -f clusters/<domain>/artifacts.yaml works against any cluster, with or without the rest of lok8s. With spec.build.artifacts: split the build additionally emits committable per-resource files under clusters/<domain>/artifacts/ (Secrets sops-encrypted) for GitOps consumers β€” see specs.

Β 

🧠 How it works

lok8s keeps two concerns strictly separate:

  1. Cluster creation β€” how the cluster comes to exist. Handled by a driver (.lok8s/drivers/<kind>/main), selected by the kind: of your cluster.lok8s.yaml.
  2. Cluster content β€” what runs on it. Plain kustomize, split into two planes: ordered bootstrap infrastructure and independent workload targets.

Everything is keyed by FQDN. A cluster domain owns a cluster (cluster.lok8s.yaml); a deployment domain ships content to another domain's cluster (deploy.lok8s.yaml).

flowchart LR
    spec["cluster.lok8s.yaml<br/>kind: Lo Β· KubeOne Β· Capi Β· Kkp"] --> drv{{driver}}
    drv -->|provision| k8s[("Kubernetes cluster")]
    k8s --> a["Plane A β€” bootstrap<br/>spec.bootstrap addons<br/>(CNI β†’ LB β†’ cert-manager …)"]
    a --> b["Plane B β€” workloads<br/>targets/* Β· kustomize"]
    b -->|"Tilt (dev) / lo deploy (CI)"| run(["running cluster"])

Concretely, lo up runs:

lo up                    # domain comes from `lo use` / --domain
 β”œβ”€ provision   driver creates the cluster        (kind / KubeOne / CAPI / KKP)
 β”œβ”€ bootstrap   framework applies spec.bootstrap   (CNI β†’ MetalLB β†’ cert-manager β†’ …,
 β”‚              addons in order, waits healthy      health-gated between stages)
 └─ tilt up     Tilt builds & live-reloads          (or: lo build + lo deploy, headless)

The two content planes:

  • Plane A β€” bootstrap (cluster infrastructure). An ordered spec.bootstrap list of framework addons (CNI, load balancer, cert-manager, …) applied at provision time, with health waits between stages. The cluster isn't "ready" until this finishes.
  • Plane B β€” workloads. User-named kustomize directories under targets/, each built independently into its own artifacts.yaml. No framework-level ordering β€” you express any ordering you need with Tilt's resource_deps or your GitOps engine.

Drivers are pluggable cluster backends:

Kind Runtime Use for
Lo Docker + kind Local dev / CI
KubeOne KubeOne (Hetzner) Self-managed production
Capi Cluster API (Hetzner / CAPH today) Declarative production provisioning
Kkp Kubermatic KKP Hosted control planes

The four drivers share one .lok8s/ tree and one spec format. Lo (local) needs nothing but Docker; the production drivers target Hetzner today but are optional β€” you can run lok8s entirely against clusters you provision yourself. Adding a driver for another backend is a documented extension point (see Extensibility).

For the full model β€” layer map, atoms/molecules, build/deploy pipeline β€” see ARCHITECTURE.md and the Concepts guide.

Β 

πŸ—‚οΈ The clusters/<fqdn>/ convention

This single convention is what makes the "same workflow everywhere" promise hold. The framework (/.lok8s/) stays flat and framework-owned; your content lives in a parallel clusters/ tree, one directory per cluster, named by its FQDN:

clusters/
β”œβ”€β”€ lok8s.dev/                  # local dev cluster (ships with lok8s)
β”‚   β”œβ”€β”€ cluster.lok8s.yaml       #   the spec β€” kind, bootstrap, network, …
β”‚   β”œβ”€β”€ targets/                 #   workload plane: one kustomize dir per target
β”‚   β”‚   β”œβ”€β”€ platform/
β”‚   β”‚   └── apps/
β”‚   β”œβ”€β”€ artifacts/               #   rendered output (gitignored, rebuilt on demand)
β”‚   └── secrets/                 #   per-domain secret store (encrypted, opt-in)
β”œβ”€β”€ cluster.example.in.net/     # production cluster (same structure!)
β”‚   └── cluster.lok8s.yaml
└── api.example.com/            # deployment domain β†’ deploys onto another cluster
    └── deploy.lok8s.yaml

Why this matters:

  • The folder name is the cluster's API hostname, so the same brand can be served by different environments without collisions (clusters/example.com/ locally, clusters/cluster.example.in.net/ in prod).
  • Secrets are per-domain (clusters/<domain>/secrets/), so dev and prod can never accidentally cross-pollinate credentials.
  • A Deploy domain carries no cluster of its own β€” it clusterRefs another domain and ships workloads there, which is how one repo can target many clusters.
  • It's just folders and YAML β€” diff-able, reviewable, and obvious to a newcomer.

See ARCHITECTURE.md for the complete tree and Specs reference for every field.

Β 

πŸ’» Local development

The local experience is the part lok8s polishes hardest, because it's where you live day to day:

  • One command, full loop. lo up creates a kind cluster, applies your spec.bootstrap infrastructure, and starts Tilt β€” which reads your services.yaml, builds images, wires docker_build + live_update, and gives you a UI at the URL it prints (a per-domain port in 10351–10499, so parallel projects never collide). Edit code β†’ Tilt syncs and reloads. (Local Dev guide)
  • Working TLS, no manual cert juggling. The secrets.lok8s.dev kustomize plugin's cert: generator mints leaf certificates from a shared local dev CA β€” no mkcert dance per project. lo trust adds the CA to your system store so browsers are happy. (Secrets guide, Kustomize plugins)
  • Fast, shared registry mirrors. A pull-through mirror network can be shared across all your lok8s projects, so images are pulled once, not once-per-cluster. Opt in per project with spec.registries.shared.enabled: true (off by default β€” the safer single-network topology). (Shared Registries guide)
  • Multi-project friendly. Use *.[N].lok8s.dev slots to run several local clusters on isolated Docker networks side by side.

Define services once, in a committed services.yaml, with personal overrides in a gitignored services.<config>.yaml ("I'm not working on the frontend today" β†’ enabled: false). Each buildable service carries a small lok8s.yaml describing its build, ports, and live-update rules. (Services guide)

Β 

πŸš€ Production & deploying anywhere

Two honest paths to production:

  1. Provision with lok8s (Hetzner today). The KubeOne and Capi drivers stand up real clusters on Hetzner Cloud (and bare metal via Hetzner Robot), with batteries-included networking, CNI, encryption-at-rest, and backups guidance. (CAPI Β· Bare Metal Β· Networking Β· Security Β· Backups)
  2. Bring your own cluster. lo build renders standard artifacts.yaml β€” plain manifests you kubectl apply to whatever cluster your KUBECONFIG points at. EKS, GKE, a Raspberry Pi, a colleague's kind cluster β€” if kubectl can reach it, lok8s' output runs on it. (lo deploy automates the apply against the kubeconfig it resolves for the domain.)

The optional operator (shell-operator-based) reconciles Lo and Capi CRDs on a management cluster; its hooks are the same lo binary (lo operator <hook>), so cluster lifecycle can be declarative when you want it. (Operator guide)

The hosted, managed-platform layer (kubehz) is a separate product built on top of lok8s β€” lok8s works fully without it. No-lock-in is a design goal, not a slogan.

Β 

πŸ€– AI, built in

lok8s treats AI as a first-class, local-first capability β€” not a cloud dependency.

  • lo chat β€” an on-device cluster assistant. Ask "why won't this deploy?" or "what's the LB IP?" and it routes through lo tools, gathers facts, and streams a markdown answer in your terminal. It runs read-only by default, enforced in code (not by trusting the model), so it can't mutate your cluster unless you switch posture with /posture open. Backends are local: Ollama or any OpenAI-compatible server (llama-server, llamafile, vLLM). Frontier CLIs (claude/gemini/codex) are strictly opt-in handoffs. Run lo chat --check for a guided setup. (Local AI guide)
  • lo mcp β€” your CLI as agent tools. Every leaf lo command is exposed as an MCP tool (lo_status, lo_build, lo_deploy, …) over stdio, so agents like Claude Code or Cursor can drive lok8s the same way you do. Commands are tagged @readonly / @idempotent / @destructive, and a deterministic posture gate decides what an agent may actually run. A ready-to-use .mcp.json ships in the repo root. It launches bin/lo mcp start with the full tool surface enabled (see below).
  • lo ai β€” wire skills into your assistant. The repo ships curated skills (cluster specs, services, addons, secrets, the dev loop, troubleshooting…). lo ai link claude symlinks them into .claude/skills/ for native loading; other agents get them by injection. lo ai check reports the whole setup at a glance.

Try it in two commands:

lo chat --check    # guided: checks the bridge + a local model, prints setup hints
lo chat            # then ask, e.g. "why won't my deployment start?"

If a piece needs setup, lo ai check / lo doctor tell you exactly what to run. (lo mcp is native to the binary. lo mcp claude|vscode|cursor enable writes the editor config. The bash variant, the argsh mcp builtin, starts as .lok8s/lo mcp from a checkout and wants argsh builtins install; see lo mcp.)

Β 

🧩 Extensibility

lok8s is conventions, not a cage β€” every layer has a documented seam:

  • Custom cluster drivers. The built-in drivers are Go packages under internal/driver/. The bash driver contract, a file at .lok8s/drivers/<kind>/main implementing driver::provision, driver::destroy, driver::status, driver::kubeconfig (plus an optional driver::post_provision), is still honoured by the frozen implementation (a lok8s.yaml that routes provision to bash) and by lo drivers <kind> …; the binary's own dispatch reads only the Go registry today. The Driver Contract reference includes a complete worked example (a k3s driver).
  • Your own addons. Drop a kustomize-buildable directory at .lok8s/addons/<name>/ (a khelm ChartRenderer + layered values.<driver>.yaml/values.<provider>.yaml, or any plain kustomization) and reference it by name in spec.bootstrap. (Addons guide)
  • Adopt what you already have. Point a target's kustomization.yaml at an existing kustomize base (resources: [ ../path/to/your/kustomization ]), or inflate an existing Helm chart via a khelm ChartRenderer β€” no rewrite required.
  • Add tools. The toolchain is managed by b: add an entry to .bin/b.yaml, assign it a profile group, b install, and it's on PATH.

Β 

🐚 Why a Go binary β€” and why the bash stays

For most of its life the lo CLI was bash, built on argsh. It is now a single static Go binary (cmd/lo, internal/), and the two facts below are both true on purpose:

  • The binary orchestrates the same tools; it does not reimplement them. lok8s' job is to drive kubectl, kustomize, kind, clusterctl, kubeone, and friends. The Go code calls them as subprocesses through one seam, with the exact argv the bash used β€” no SDK drift, no version-matrix games. What lok8s runs is still what you'd run by hand, and lo --verbose still prints it. What Go buys is a one-file install with a verified checksum, a hermetic unit-test suite, and one --help/MCP schema that cannot drift from the code.
  • The bash implementation is frozen, not deleted. It ships in every project under .lok8s/ as the reference the binary was ported from: a project's lok8s.yaml (spec.implementation) routes any command to it, ten differential parity harnesses diff the two implementations byte-for-byte in CI, and a go test fails if the command trees drift. When something looks wrong, you can still read the library under .lok8s/libs/, set -x, and step through it. If the bash is right and the binary is wrong, that is a bug we want reported. Full map, seams and the short list of deliberate differences: The Go lo binary.

argsh is still in the toolchain: the Hetzner provider plugin and the frozen tree source its runtime, and it is shellcheck-clean in CI (no new warnings allowed) alongside the Go lint. The kustomize plugins and the lo chat engine were Go from the start.

Β 

πŸ”§ CLI Reference

Command Description
lo use [domain] Set / show the active domain
lo up [--open-tilt] Provision cluster + bootstrap + start Tilt (--ci [--timeout <d>]: headless tilt ci, real exit status)
lo down Stop Tilt + delete the cluster
lo status Cluster health (the driver's status check)
lo provision Provision cluster infra + apply spec.bootstrap addons (no Tilt, no targets/ deploy)
lo build Render the domain kustomization β†’ clusters/<domain>/artifacts.yaml
lo deploy [-l k=v] Apply the domain artifact (CRDs β†’ resources β†’ health)
lo lint Validate specs, bootstrap entries, target refs
lo doctor Diagnose the local environment / toolchain
lo addons [name...] [--detail] List / inspect framework bootstrap addons (--detail: the ones this cluster deploys, with category + configuration hints)
lo kubeconfig Print the domain's kubeconfig (--oidc for the kubelogin exec-plugin)
lo destroy Tear down a cluster
lo clean [--all] Clean volumes; optionally prune Docker
lo chat Local AI assistant (read-only by default)
lo ai check|skills|link|unlink Manage AI skills + integration
lo mcp Start the MCP tool server (stdio)
lo tilt up|down|status|restart|ci|preflight Manage the Tilt environment (ci: headless build + deploy + wait; preflight: clear stuck-Terminating objects)
lo registry up|down|status|clean Manage registry mirrors

Most commands act on the active domain (set by lo use) or an explicit --domain <domain> β€” in this table only lo use [domain] and lo addons [name...] take a positional. lo build and lo deploy take none: both act on the whole domain kustomization (deploy narrows via -l key=value, not targets). Global flags: --verbose|-v, --force|-f, --force-recreate, --remote|-r, --cluster|-s, --kubernetes, --config, --domain, --domain-sans. Full reference: docs/reference/cli.md.

Β 

πŸ“š Documentation

Full documentation lives at lok8s.io. Good entry points:

npm run docs:dev        # local docs site
npm run docs:build      # build

Β 

🀝 Contributing

Contributions are welcome β€” see CONTRIBUTING.md, the agent/contributor guide in AGENTS.md, and the test matrix in TESTING.md. In short: conventional commits, keep CI green (go test ./... + the parity harnesses + npm run lint + npm test), and security is paramount β€” never pipe untrusted remote content into a shell, never commit secrets, validate external input.

Β 

lok8s is built on β€” and shares a philosophy with β€” a few sibling tools:

  • b Β· binary.help β€” your one-stop binary manager. It installs and pins lok8s' toolchain, and lok8s ships as a b profile.
  • argsh Β· arg.sh β€” the framework the original lo CLI was built on, and still the runtime of the frozen reference implementation and the provider plugins; it brings structure and maintainability to complex Bash (typed args, dispatch, generated --help).
  • atty Β· atty.sh β€” a suckless-style PTY proxy (Zig) that drops an LLM exec dialog, atuin autosuggest, and guardrail confirmations between your terminal and your shell.

Β 

πŸ“œ License

MIT Β© 2025-present kernpilot

MIT License

Directories ΒΆ

Path Synopsis
cmd
lo command
Command lo is the lok8s CLI.
Command lo is the lok8s CLI.
internal
addons
Package addons is the Go port of the addon render pipeline (.lok8s/libs/addons: addons::render) β€” the SINGLE canonical khelm render shared by the bootstrap engine and the KubeOne driver's pre-apply addon staging.
Package addons is the Go port of the addon render pipeline (.lok8s/libs/addons: addons::render) β€” the SINGLE canonical khelm render shared by the bootstrap engine and the KubeOne driver's pre-apply addon staging.
assets
Package assets ships the framework's first-party files inside the binary and materializes them into a project on first use (the "eject model").
Package assets ships the framework's first-party files inside the binary and materializes them into a project on first use (the "eject model").
audit
Package audit is the Go port of the argsh static security-posture audit (.lok8s/libs/audit): a linter-style command that reads cluster.lok8s.yaml + the rendered addon/kustomize inputs (exactly like `lo lint` β€” NO live cluster needed) and reports security findings with a severity, a per-cluster score, and a non-zero exit when any FAIL-level finding is present.
Package audit is the Go port of the argsh static security-posture audit (.lok8s/libs/audit): a linter-style command that reads cluster.lok8s.yaml + the rendered addon/kustomize inputs (exactly like `lo lint` β€” NO live cluster needed) and reports security findings with a severity, a per-cluster score, and a non-zero exit when any FAIL-level finding is present.
bootstrap
Package bootstrap is the Go port of the framework-level cluster infrastructure addon system (.lok8s/libs/bootstrap, all 1413 lines β€” bash wins on any divergence).
Package bootstrap is the Go port of the framework-level cluster infrastructure addon system (.lok8s/libs/bootstrap, all 1413 lines β€” bash wins on any divergence).
bootstrapspec
Package bootstrapspec is the ONE reader of spec.bootstrap entries.
Package bootstrapspec is the ONE reader of spec.bootstrap entries.
build
Package build is the Go port of the argsh build pipeline (.lok8s/libs/build): kustomize render of a domain's composed kustomization into one clusters/<domain>/artifacts.yaml, plus the spec-declared split emit into per-resource GitOps files under clusters/<domain>/artifacts/.
Package build is the Go port of the argsh build pipeline (.lok8s/libs/build): kustomize render of a domain's composed kustomization into one clusters/<domain>/artifacts.yaml, plus the spec-declared split emit into per-resource GitOps files under clusters/<domain>/artifacts/.
cli
Package cli builds the lo command tree.
Package cli builds the lo command tree.
clock
Package clock holds the wait seam every retry and poll loop sleeps through.
Package clock holds the wait seam every retry and poll loop sleeps through.
config
Package config resolves the lok8s project layout and settings.
Package config resolves the lok8s project layout and settings.
crds
Package crds is the Go port of .lok8s/libs/crds β€” operator CRD generation from a single schema source.
Package crds is the Go port of .lok8s/libs/crds β€” operator CRD generation from a single schema source.
credentials
Package credentials holds the two guards every driver runs before it talks to a cloud API: the provider credential presence check (bash: utils/credentials.sh, credentials::require) and the HTTPS-only URL check (bash: utils/http.sh, http::require_https).
Package credentials holds the two guards every driver runs before it talks to a cloud API: the provider credential presence check (bash: utils/credentials.sh, credentials::require) and the HTTPS-only URL check (bash: utils/http.sh, http::require_https).
deploy
Package deploy is the Go port of the domain artifact deployment (.lok8s/libs/deploy: deploy::apply / deploy::apply_filtered / deploy::_apply / deploy::wait_crds β€” bash wins on any divergence; the `lo destroy` half of that file stays with the provision port).
Package deploy is the Go port of the domain artifact deployment (.lok8s/libs/deploy: deploy::apply / deploy::apply_filtered / deploy::_apply / deploy::wait_crds β€” bash wins on any divergence; the `lo destroy` half of that file stays with the provision port).
domain
Package domain is the ONE place domain resolution + driver identity live β€” the Go port of .lok8s/utils/domain.sh, preserving its precedence chain, warnings, and error contract exactly.
Package domain is the ONE place domain resolution + driver identity live β€” the Go port of .lok8s/utils/domain.sh, preserving its precedence chain, warnings, and error contract exactly.
driver
Package driver defines the Go driver contract β€” the port of the bash driver contract (.lok8s/drivers/README.md): every cluster-architecture driver implements provision/destroy/status/kubeconfig, plus the optional export and post-provision hooks.
Package driver defines the Go driver contract β€” the port of the bash driver contract (.lok8s/drivers/README.md): every cluster-architecture driver implements provision/destroy/status/kubeconfig, plus the optional export and post-provision hooks.
driver/capi
Package capi is the Go port of the Capi driver (.lok8s/drivers/capi/{main,generate}): production clusters via Cluster API.
Package capi is the Go port of the Capi driver (.lok8s/drivers/capi/{main,generate}): production clusters via Cluster API.
driver/kkp
Package kkp is the Go port of the KKP driver (.lok8s/drivers/kkp/{main, api}): managed clusters via Kubermatic Kubernetes Platform.
Package kkp is the Go port of the KKP driver (.lok8s/drivers/kkp/{main, api}): managed clusters via Kubermatic Kubernetes Platform.
driver/kubehz
Package kubehz is the Go port of the kubehz driver (.lok8s/drivers/kubehz/ main): Spaces on the kubehz shared control plane (spec `kind: Kubehz`, spec.kubehz.hosting: shared).
Package kubehz is the Go port of the kubehz driver (.lok8s/drivers/kubehz/ main): Spaces on the kubehz shared control plane (spec `kind: Kubehz`, spec.kubehz.hosting: shared).
driver/kubeone
Package kubeone is the Go port of the KubeOne driver (.lok8s/drivers/kubeone/{main,config}): standalone production clusters via the kubeone CLI, which stays an exec (the binary owns the node walk).
Package kubeone is the Go port of the KubeOne driver (.lok8s/drivers/kubeone/{main,config}): standalone production clusters via the kubeone CLI, which stays an exec (the binary owns the node walk).
driver/lo
Package lo is the Go port of the Lo (kind) driver (.lok8s/drivers/lo/{main,utils/*.sh,libs/registry}): local/CI clusters via kind, with the project docker network, the framework registries (build/cache + pull-through mirrors), containerd certs.d config, CoreDNS wiring, the remote-VM CI mode, and the node-IP heal.
Package lo is the Go port of the Lo (kind) driver (.lok8s/drivers/lo/{main,utils/*.sh,libs/registry}): local/CI clusters via kind, with the project docker network, the framework registries (build/cache + pull-through mirrors), containerd certs.d config, CoreDNS wiring, the remote-VM CI mode, and the node-IP heal.
env
Package env is the Go port of .lok8s/libs/env β€” environment and service configuration.
Package env is the Go port of .lok8s/libs/env β€” environment and service configuration.
execx
Package execx locates and runs the external tools lo still shells out to.
Package execx locates and runs the external tools lo still shells out to.
fsutil
Package fsutil holds the file-existence predicates the bash `[[ -f ]]`, `[[ -d ]]` and `[[ -e ]]` tests port to.
Package fsutil holds the file-existence predicates the bash `[[ -f ]]`, `[[ -d ]]` and `[[ -e ]]` tests port to.
gitops
Package gitops is the Go port of .lok8s/libs/gitops β€” DEFERRED (post-refactor redesign), exactly like the bash.
Package gitops is the Go port of .lok8s/libs/gitops β€” DEFERRED (post-refactor redesign), exactly like the bash.
hooks
Package hooks is the Go port of .lok8s/libs/hooks β€” dev-time lifecycle actions on rendered artifacts, selected by label.
Package hooks is the Go port of .lok8s/libs/hooks β€” dev-time lifecycle actions on rendered artifacts, selected by label.
image
Package image is the Go port of .lok8s/libs/image β€” pre-pull private images into the local cache registry.
Package image is the Go port of .lok8s/libs/image β€” pre-pull private images into the local cache registry.
initctx
Package initctx reads the room for a bare `lo init`: where the user stands (a project root, a subdirectory, a service directory, a submodule under an umbrella project, an empty or a bare directory), what git says about it, what the project already has, and whether a terminal is attached.
Package initctx reads the room for a bare `lo init`: where the user stands (a project root, a subdirectory, a service directory, a submodule under an umbrella project, an empty or a bare directory), what git says about it, what the project already has, and whether a terminal is attached.
inventory
Package inventory is the Go port of the ClusterInventory writer (.lok8s/libs/inventory/main β€” bash wins on any divergence).
Package inventory is the Go port of the ClusterInventory writer (.lok8s/libs/inventory/main β€” bash wins on any divergence).
kapply
apply.go β€” the Go port of kapply::apply and its healing half (.lok8s/utils/kapply.sh): server-side kubectl apply with bounded, interactive-or-opt-in self-healing.
apply.go β€” the Go port of kapply::apply and its healing half (.lok8s/utils/kapply.sh): server-side kubectl apply with bounded, interactive-or-opt-in self-healing.
kubehz
Package kubehz is the Go port of the kubehz platform integration (.lok8s/libs/kubehz/{main,shared,hosted,node,handover,deploy} and the vendored manifests/ tree): the spec.kubehz config reader + validator, the platform-api client (register / deregister / status / assess / re-enroll / claim), the hosted-control-plane flows the kubeone and capi drivers call through their Hooks, Spaces on the shared control plane (hosting: shared β€” the kubehz driver), the static-pool node verbs, the control-plane handover target side, and the in-cluster agent deploy.
Package kubehz is the Go port of the kubehz platform integration (.lok8s/libs/kubehz/{main,shared,hosted,node,handover,deploy} and the vendored manifests/ tree): the spec.kubehz config reader + validator, the platform-api client (register / deregister / status / assess / re-enroll / claim), the hosted-control-plane flows the kubeone and capi drivers call through their Hooks, Spaces on the shared control plane (hosting: shared β€” the kubehz driver), the static-pool node verbs, the control-plane handover target side, and the in-cluster agent deploy.
lint
Package lint is the Go port of .lok8s/libs/lint β€” structure and spec validation.
Package lint is the Go port of .lok8s/libs/lint β€” structure and spec validation.
oidc
Package oidc reads spec.oidc from a cluster spec into the LOK8S_SPEC_OIDC_* environment β€” the Go port of .lok8s/utils/oidc.sh (oidc::enabled / oidc::load_spec).
Package oidc reads spec.oidc from a cluster spec into the LOK8S_SPEC_OIDC_* environment β€” the Go port of .lok8s/utils/oidc.sh (oidc::enabled / oidc::load_spec).
operator
Package operator is the Go port of the shell-operator hooks (operator/hooks/*.sh, frozen at .archive/legacy/operator/hooks/): the three reconcilers behind `lo operator <hook>`, which the hook shims exec.
Package operator is the Go port of the shell-operator hooks (operator/hooks/*.sh, frozen at .archive/legacy/operator/hooks/): the three reconcilers behind `lo operator <hook>`, which the hook shims exec.
provider/bridge
Package bridge runs the BASH infrastructure providers (providers/<name>/main in the bash tree) as children of the Go dispatch.
Package bridge runs the BASH infrastructure providers (providers/<name>/main in the bash tree) as children of the Go dispatch.
provision
Package provision is the Go port of the cluster-lifecycle dispatch (.lok8s/libs/provision): spec resolution, the real-infrastructure gate, provider-credential loading, and the provision/destroy/status dispatch over the driver registry (internal/driver).
Package provision is the Go port of the cluster-lifecycle dispatch (.lok8s/libs/provision): spec resolution, the real-infrastructure gate, provider-credential loading, and the provision/destroy/status dispatch over the driver registry (internal/driver).
recover
Package recover is the Go port of `lo recover <domain>` β€” rebuild a cluster from bare metal (disaster recovery); .lok8s/libs/recover, bash wins on any divergence.
Package recover is the Go port of `lo recover <domain>` β€” rebuild a cluster from bare metal (disaster recovery); .lok8s/libs/recover, bash wins on any divergence.
render
Package render is the single kustomize entry point for the Go binary.
Package render is the single kustomize entry point for the Go binary.
scaffold
Package scaffold is the Go port of .lok8s/libs/init β€” `lo init service` and `lo init test`: scaffold lok8s project/service config from a correct template.
Package scaffold is the Go port of .lok8s/libs/init β€” `lo init service` and `lo init test`: scaffold lok8s project/service config from a correct template.
secrets
Package secrets is the Go port of .lok8s/libs/secrets β€” secret cache management with SOPS/age encryption.
Package secrets is the Go port of .lok8s/libs/secrets β€” secret cache management with SOPS/age encryption.
testutil
Package testutil holds the fixture helpers the package tests share: the repo root (for tests that read the checked-in tree), the mkdir-then-write fixture writer, the drift gate (drift.go) and the golden compare with its -update rewrite.
Package testutil holds the fixture helpers the package tests share: the repo root (for tests that read the checked-in tree), the mkdir-then-write fixture writer, the drift gate (drift.go) and the golden compare with its -update rewrite.
tilt
Package tilt is the Go port of .lok8s/libs/tilt β€” Tilt lifecycle management (`lo tilt {up,ci,down,status,restart,preflight}`).
Package tilt is the Go port of .lok8s/libs/tilt β€” Tilt lifecycle management (`lo tilt {up,ci,down,status,restart,preflight}`).
toolchain
Package toolchain owns the consumer toolchain of a lok8s project: the pinned versions of the tools `lo` execs, the .bin/b.yaml template that declares them for b (github.com/fentas/b), the verified bootstrap of b itself, and the doctor checks that verify what landed.
Package toolchain owns the consumer toolchain of a lok8s project: the pinned versions of the tools `lo` execs, the .bin/b.yaml template that declares them for b (github.com/fentas/b), the verified bootstrap of b itself, and the doctor checks that verify what landed.
ui
Package ui carries the CLI's output conventions, matching the bash implementation's verbose.sh helpers byte for byte so ported commands stay indistinguishable from their argsh originals.
Package ui carries the CLI's output conventions, matching the bash implementation's verbose.sh helpers byte for byte so ported commands stay indistinguishable from their argsh originals.
yqsem
Package yqsem is the ONE yq-semantics reader over yaml.v3 nodes.
Package yqsem is the ONE yq-semantics reader over yaml.v3 nodes.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL