Reconciliation & state without a state file
The control loop is the source of truth.
Crossplane has no state file. The desired state lives in the Kubernetes API (the objects you applied), the actual state lives in the cloud, and a controller runs a reconcile loop that continuously compares them and drives reality toward the spec. This is the standard Kubernetes controller pattern applied to external infrastructure — the cluster’s etcd is the record, and reconciliation, not a periodic plan/apply, is how convergence happens.
What no state file changes
It removes a whole category of problems Terraform users know well — no state file to store, lock, encrypt, or corrupt, and no “state drift” because reconciliation is continuous rather than a snapshot. It also changes the failure mode: instead of a plan that fails at apply time, you get objects whose conditions and events tell you, live, what the controller is doing and where the cloud API is refusing.
# delete the bucket directly in AWS; Crossplane notices and recreates it$ aws s3 rb s3://acme-logs-prod --force$ kubectl get bucket acme-logs-prod -wacme-logs-prod False True # briefly not-ready...acme-logs-prod True True # ...reconciled back into existence