Every app you run on Kubernetes is a pile of objects that must agree, and nothing in the cluster makes them. So you bundle them: a Helm chart, a Kustomize overlay, or a hand-written operator when you want a real typed API. All three work. All three leave you maintaining Go templating, patches, or a reconcile loop you own forever. Helm renders your YAML once, then forgets it.
KRO (Kube Resource Orchestrator, pronounced "crow") is a quieter fourth option, born at AWS, now a joint AWS/Google/Microsoft project in kubernetes-sigs. You write a ResourceGraphDefinition: the fields you want to expose and the resources behind them, wired with CEL. KRO generates a real CRD and registers a controller at runtime. No Go, no provider packages. Your teammates apply a clean new type in a few lines, and the cluster treats it like any other API object: validated, defaulted, kubectl get webapp, status you can watch. The stack comes up in the right order, which KRO works out. That is what makes it click: you never declare the order, the references are the order.
This talk assumes you know Kubernetes and have never touched KRO. I'll build a WebApp API live, then break it on purpose. I'll go past the README into the failure that traps newcomers: one mistyped CEL reference silently parks an instance in ErrDataPending, and because the reconcile is generation-based, no timer rescues it. Then how KRO differs from Crossplane (graduated CNCF, more mature), when Helm or an operator wins instead, and the alpha-stage sharp edges, including a recent CVE that reduces to one fact: handing someone a CRD is a cluster-admin-level trust decision. You'll leave able to build your first KRO API , and clear about when not to.