Skip to main content
hexr build leaves you a .hexr/ directory. This page takes that to an agent running on a cluster with a real identity.
Every command and every output here was run end to end on a clean machine on 2026-09-27 against live clusters. Where something failed, the failure is shown rather than edited out.

The three commands

Read the next section before using hexr deploy in production.

What each step actually does

hexr build does not build an image

This is the most common surprise. hexr build writes a Dockerfile, Kubernetes manifests, a pinned hexr-sdk wheel and a requirements.txt. It never invokes Docker. The summary line:
names the tag the manifests will reference. Nothing is built or pushed yet. Skip the push and your pod sits in ImagePullBackOff, because the manifests use imagePullPolicy: Always.

Everything is amd64, on purpose

The wheel is downloaded with pip download --platform manylinux2014_x86_64, so it is x86_64 and nothing else.
On Apple Silicon with SDK older than 0.5.32, docker build defaults to arm64 and fails:
From 0.5.32 the generated Dockerfile pins FROM --platform=linux/amd64 and hexr push defaults to amd64 only, so this works with no flags. On an older SDK, pass --platform linux/amd64 to both.
Docker prints a FromPlatformFlagConstDisallowed lint warning about that pin. Warning, not error, and deliberate.

hexr deploy skips two manifests that hexr build generated

Know this before you rely on it. hexr deploy applies exactly three files plus the Envoy ConfigMap:
It does not apply network-policy.yaml or resource-quota.yaml. That is a deliberate backlog decision recorded in cli/deploy.py, not a bug — but the consequence is that a hexr deploy agent runs with no network isolation and no resource quota, and the command still prints:
Count the manifests to see it. hexr deploy --dry-run reports Would apply 9 manifests, while kubectl apply -f .hexr/manifests/ applies 11 objects. The two missing ones are the NetworkPolicy and the ResourceQuota.
For any environment where tenant isolation matters, either apply the full directory with kubectl, or apply the two files yourself after hexr deploy:

Walkthrough

1. Build

2. Push

Or do it by hand. Read the image out of the manifest so the two cannot drift, and note the build context is .hexr, not .:
Check what you built:
--entrypoint python is required. The image has its own entrypoint, so docker run <image> python -c ... passes python to that entrypoint and fails with can't open file '/app/python'.

3. Check against the real cluster before applying

A server dry-run runs full admission, RBAC and quota checks and creates nothing:
unchanged on the RBAC objects means the tenant is already onboarded; on a new tenant they read created.

4. Apply

Full set, recommended:
Or the CLI, accepting the two omissions above:
--skip-guidance turns off interactive cluster selection; use it in CI.

5. Verify identity, which is the actual goal

A Running pod is not success. Success is the agent holding an SVID and writing signed evidence. Unsigned rows mean the agent never got an identity and is attributing nothing, while still looking busy.
signed must be greater than zero. If rows climbs while signed stays at zero, stop and fix identity before going further.

Troubleshooting