Skip to content

Contributing

Contributions are very welcome! The project uses Kubebuilder and the standard controller-runtime patterns — if you’ve worked on a Kubernetes operator before, you’ll feel at home.

This repo uses Conventional Commits. Your messages drive the next version (see the release process).

Examples:

  • feat(plugins): add cohere
  • fix(runner): handle empty prompts directory
  • docs: clarify FlowSet credentials section
  • feat!: rename PluginConfig.credentialsRef to authRef (the ! flags a breaking change)

The fastest inner loop is a local kind cluster — no registry needed, images are loaded straight into the nodes.

  • Go 1.25+
  • Docker (or Podman — set CONTAINER_TOOL=podman)
  • kind
  • kubectl
Terminal window
# 1. Create a dedicated cluster (the default name is "genkit").
kind create cluster --name genkit
# 2. Build manager + runner, load both into kind, install CRDs, deploy controller.
make kind-deploy IMG=genkit-operator:dev RUNNER_IMG=genkit-runner:dev

kind-deploy chains four targets:

StepTargetWhat it does
1kind-loaddocker build the manager → kind load docker-image
2runner-kind-loaddocker build -f Dockerfile.runner the runner → load into kind
3installkubectl apply the CRDs from config/crd/bases/
4deploykustomize build config/default | kubectl apply -f -

Useful overrides:

Terminal window
make kind-deploy \
IMG=genkit-operator:dev \
RUNNER_IMG=genkit-runner:dev \
KIND_CLUSTER=my-cluster # default: genkit
Terminal window
# Apply the sample CRs.
kubectl apply -k config/samples/
# Tail the controller logs.
kubectl -n genkit-operator-system logs \
deploy/genkit-operator-controller-manager -c manager -f
# Watch the Flow rollout the controller creates.
kubectl get flow,deploy,svc -A -w

After editing controller / runner Go code, rebuild just what changed and reload it:

Terminal window
# Manager only
make kind-load IMG=genkit-operator:dev
kubectl -n genkit-operator-system rollout restart \
deploy/genkit-operator-controller-manager
# Runner only (Flow pods will pick it up on next reconcile;
# force a rollout with `kubectl rollout restart deploy/<flow-name>`)
make runner-kind-load RUNNER_IMG=genkit-runner:dev

kind load docker-image only updates the image inside the kind nodes — it does not restart running pods. Use kubectl rollout restart (or delete the pod) to pick up a new build.

After editing *_types.go or kubebuilder markers:

Terminal window
make manifests # regenerate CRDs + RBAC
make generate # regenerate DeepCopy methods

After editing any Go file:

Terminal window
make lint-fix
make test # unit tests with envtest (real apiserver + etcd)

For the tightest feedback loop, skip the image build entirely and run the manager on your host against the kind cluster:

Terminal window
make install # CRDs only
make run # uses your current kubeconfig context

You’ll still need the runner image inside kind so that Flow pods can start:

Terminal window
make runner-kind-load RUNNER_IMG=genkit-runner:dev
Terminal window
make undeploy # remove the controller + RBAC
make uninstall # remove the CRDs
kind delete cluster --name genkit
  1. Add the import in cmd/runner/plugins.go.
  2. Register a builder in pluginRegistry.
  3. (Optional) Add defaultCredentialKeys if your provider has a conventional env var.
  4. Document it under website/src/content/docs/plugins/<name>.md.
  5. Add a sample under config/samples/.
  6. Use a feat(plugins): add <name> commit.

The website lives under website/ and is an Astro Starlight project.

Terminal window
cd website
npm install
npm run dev # http://localhost:4321/genkit-operator

It is deployed to GitHub Pages on every push to main by .github/workflows/docs.yml.