Deploying, managing, debugging, and explaining applications and resources on OpenChoreo (open-source IDP on Kubernetes). Use this whenever the user mentions OpenChoreo, occ CLI, workload.yaml, Project/Component/Workload/ReleaseBinding/WorkflowRun, ComponentType, Trait, SecretReference, deployment pipelines, or wants to deploy or debug an app on OpenChoreo, even if they only mention YAML, logs, builds, or routing problems.
Help developers work with OpenChoreo, an open-source Internal Developer Platform on Kubernetes. Default assumption: developers have occ access but NOT kubectl access.
Read references/ files as needed, not all at once:
concepts.md - OpenChoreo abstractions, resource relationships, cell architecture. Read when explaining concepts or understanding how things fit together.cli-reference.md - Install occ, setup, all commands, exploration workflow. Read when running CLI commands or first-time setup.deployment-guide.md - End-to-end deployment, workload descriptors, source builds, promoting, debugging. Read when deploying an app.resource-schemas.md - Full YAML schemas for all resources. Read when writing or debugging YAML.platform-engineer.md - Platform-side abstractions (ComponentType, Trait, Workflow definitions, infrastructure planes). Read when you need to understand what the platform provides or when something requires PE escalation.Before inventing YAML, prefer repo-backed examples from samples/from-image/, samples/from-source/, and samples/getting-started/.
Treat these as known defaults unless live cluster output disproves them:
occ, not kubectl.occ component scaffold takes the component name as a positional argument: occ component scaffold my-app --type deployment/service.occ <resource> get <name> returns the full YAML. Do not look for -o / --output.spec.workflow, not old spec.build or templateRef examples from older docs or proposals.workload.yaml belongs at the root of the workflow appPath.repository.appPath and docker.context / docker.filePath solve different problems:
appPath tells the workflow which source subdirectory and workload.yaml to use.docker.context and docker.filePath must still point at the real repo-root-relative Docker build paths.backend/Dockerfile and appPath: ./backend, then use docker.context: ./backend and docker.filePath: ./backend/Dockerfile or the equivalent leading-slash form.occ context projectspec.owner.projectNamespec.workflow.parameters.scope.projectName
If any of these still says default, the build can generate Workloads owned by the wrong project.docker workflow even if the app is written in React. Reserve a framework-specific workflow such as react for the simple/default shape it expects.occ component workflow run accepts --project, but occ component workflow logs does not. Set or update context before log-following and later get/debug steps instead of assuming subcommand flags are consistent.spec.owner is effectively immutable once created. If a build generated a Workload under the wrong project, fix the Component/workflow project references and rerun or recreate the Workload; do not plan on patching the owner in place.address env var behind a /api/ location when the backend endpoint already has a basePath; that can create /api/api/... requests. Prefer host and port bindings, or handle basePath separately./api defaults. If a build-time env may be intentionally empty or omitted, read it with ?? or an explicit undefined check rather than ||, which can accidentally fall back to http://localhost.occ releasebinding get <binding> status fields such as invokeURL, externalURLs, and internalURLs. Never construct them by hand.occ component workflow logs <name> -f plus occ component get / occ releasebinding get are better truth sources than immediately trusting occ component workflowrun list <name>, which can lag behind a completed build.references/concepts.md first.references/platform-engineer.md only if the question crosses into ComponentType internals, Trait definitions, workflow templates, gateways, or PE-managed planes.Start with the specific component or binding the user already has. Do NOT run a full cluster inventory unless names are unknown or the failure points there.
Inspect the current state first:
occ component get <name>occ releasebinding list --project <proj> --component <comp>occ releasebinding get <binding>occ component logs <name> --env <env> --since 30mocc component workflow logs <name> -focc component workflowrun list <name>Broaden only if the failure points there:
occ clustercomponenttype list, occ componenttype listocc workflow listocc clustertrait list, occ trait listocc environment list, occ deploymentpipeline listNever guess endpoint URLs:
status.endpoints, invokeURL, externalURLs, or internalURLs in occ releasebinding get <binding>.When a user says "deploy this to OpenChoreo":
Analyze the app: Read Dockerfile(s), compose files, package manifests, env handling, ports, and inter-service dependencies.
Ensure occ is installed: Run occ version. If missing, read references/cli-reference.md for install steps. Download to /tmp, not the working directory.
Ask for the API URL if not configured: Run occ namespace list. If it fails, ask the user: "What's your OpenChoreo API server URL?" Then configure: occ config controlplane update default --url <their-url> and occ login.
Set or update context once namespace/project are known so later commands do not repeat flags:
occ config context add myctx --controlplane default --credentials default \
--namespace <ns> --project <project>
occ config context use myctx
occ config context update <ctx> --project <project> before scaffolding, building, or reading workflow logs.Discover only what this task needs:
occ project listocc environment list, occ deploymentpipeline listocc clustercomponenttype list, occ componenttype listocc clustertrait list, occ trait listocc workflow listIf the component already exists, inspect it before scaffolding with occ component get <name>.
Map services to components: Each service becomes a Component. Pick the ComponentType from what's actually available on the cluster. Common mappings:
deployment/servicedeployment/web-applicationcronjob/<available-type>Scaffold instead of hand-writing the first draft:
occ component scaffold <name> --type <workloadType/typeName> -o <file>For source builds, use spec.workflow, not the obsolete spec.build shape:
occ workflow listocc workflow get <name> if you need its parameter schemadocker workflow instead of assuming a framework-specific workflow fitsspec.owner.projectName and spec.workflow.parameters.scope.projectName identical to the target project before the first buildworkload.yaml descriptor in each service's appPath root so the build can generate the Workload CR with endpoints and connectionsdocker.context and docker.filePath aligned to the real repo layout, not just the appPathreferences/deployment-guide.md for descriptor format and examplesFor inter-service communication: Use Workload connections, not hardcoded URLs. The platform resolves service addresses and injects them as env vars. If services need to talk to each other, use the connections field in the workload descriptor.
host / port bindings unless you explicitly want the endpoint basePath folded into the upstream URL.references/deployment-guide.md "Making Local Apps Work on OpenChoreo" section. Key things to find and fix:localhost / 127.0.0.1 URLs -> replace with env var reads, keeping localhost as the defaultocc apply -f <file>occ component workflow run <name> then occ component workflow logs <name> -fworkflow logs, make sure context already points at the right project because that subcommand does not accept --projectocc component get <name>, occ releasebinding list --project <proj> --component <comp>, occ releasebinding get <binding>, and occ component logs <name>references/resource-schemas.md and the nearest matching sample before editing.occ component scaffold for Components and real samples for Workload, ReleaseBinding, and SecretReference shapes.spec.workflowworkload.yamlNo kubectl: Developers typically don't have cluster access. Everything goes through occ. If debugging requires kubectl, frame it as a PE escalation.
occ get returns YAML: occ <resource> get <name> outputs full YAML (spec + status). No --output/-o flag. This is the primary debugging tool.
Use scaffold: occ component scaffold <name> ... generates correct YAML from the cluster's actual types. Always prefer it over writing YAML from scratch.
deploymentPipelineRef is a string: Just the pipeline name, not an object. deploymentPipelineRef: default, not deploymentPipelineRef: {kind: ..., name: ...}.
Source builds use workflow: On Component resources, use spec.workflow. Do not use old spec.build or templateRef examples.
Workload descriptor placement: workload.yaml goes at the root of the appPath directory (not the docker context, not the repo root). If appPath is /backend, the file goes at /backend/workload.yaml in the repo.
Docker workflow paths are repo-relative: appPath does not make docker.context or docker.filePath relative to that folder. Point them at the actual repo paths for the Docker build.
Project references must agree: For source builds, align the active context project, spec.owner.projectName, and spec.workflow.parameters.scope.projectName before the first build. Do not leave scaffolded default values in place when deploying to another project.
Workflow subcommands are not flag-consistent: occ component workflow run accepts --project; occ component workflow logs does not. Use context to carry project scope for follow-up log and debug commands.
Endpoint visibility and gateways: external requires a northbound gateway (usually set up). internal and namespace require a westbound gateway which may not be configured. If internal visibility causes rendering errors, it likely means the internal gateway isn't set up. Escalate to PE or use external only.
autoDeploy: Set spec.autoDeploy: true on Component to auto-create releases when Workload changes. Otherwise you need to manually run occ component deploy.
Use ReleaseBinding status for deployed URLs: When you need the actual invoke URL, inspect occ releasebinding get <binding> instead of constructing hostnames by hand.
Workflow run listings can lag: If workflowrun list still shows Pending but the workflow logs show a successful publish/generate/deploy path, confirm through occ component get and occ releasebinding get before assuming the build is still stuck.
Workload owners are immutable in practice: If a generated Workload points at the wrong project/component owner, fix the source build config and recreate or regenerate the Workload instead of trying to patch spec.owner.
Proxy path handling matters: If a connection address already includes an endpoint basePath, do not prepend the same path again in nginx or app routing.
Frontend browser builds should default to same-origin paths: Prefer /api over http://localhost... for production-safe defaults, and use ?? or explicit undefined checks when empty-string env values are meaningful.
Some things are outside what a developer can do. When you hit these, generate a clear message for the user to send to their platform engineering team:
Format: "To do X, we need Y configured on the platform side. Can you ask the platform engineering team to Z?"
Common escalations (read references/platform-engineer.md for details):
deployment/<name> ComponentType with [requirements]?"occ <resource> get <name> and read the conditions sectionocc component logs <name> --env <env> --since 30mocc component workflow logs <name> -focc releasebinding list --project <proj> --component <comp> then occ releasebinding get <name>When users ask about a concept, read references/concepts.md and explain with practical examples. For platform-side concepts (ComponentType internals, Trait definitions, CEL templates), also read references/platform-engineer.md. Connect abstractions to real scenarios rather than repeating documentation language.
spec.build, templateRef, or other stale YAML from older docsocc component scaffoldocc component scaffold --name ...; the component name is positionaldefault project values in spec.owner.projectName or spec.workflow.parameters.scope.projectName when deploying to another projectinternal endpoint visibility without verifying the internal gateway existsworkload.yaml in the wrong directory (must be at appPath root)appPath also rewrites Docker build pathsocc component workflow ... subcommand accepts --projectWorkload.spec.owner after a build produced the wrong owneraddress behind an /api/ proxy without checking whether the backend endpoint already contributes /api|| for browser build-time API envs when empty-string or omitted values should preserve same-origin behavior