Skip to main content
This page provides an overview of the core concepts in Ctrlplane. The three pillars of Ctrlplane answer the fundamental questions of deployment:
  • Deployments define what to deploy and how — the service, its versions, and the job agent that executes the deployment.
  • Environments define where to deploy — logical stages that dynamically group resources via selectors.
  • Policies define when to deploy — rules like approvals, verification, progression gates, and deployment windows that control timing.
System
  ├── Deployments (what & how)
  │     └── Versions (specific builds)
  ├── Environments (where)
  │     └── Resources (deployment targets)
  └── Policies (when)

Release Target = Deployment × Environment × Resource

Release = Version deployed to a Release Target
  └── Job (executed by Job Agent)

System

A System is a logical grouping of related deployments, environments, and resources. Think of it as a workspace for a product or team.
PropertyDescription
nameDisplay name
slugURL-friendly identifier
descriptionWhat this system encompasses
Example: “E-commerce Platform” system containing API, Frontend, and Payment deployments. When to create a System: One per product, platform, or team boundary.

Resource

A Resource is a deployment target—the actual infrastructure where your code runs.
PropertyDescription
nameHuman-readable name
kindType (e.g., KubernetesCluster, AWS/Lambda)
identifierUnique identifier
metadataKey-value pairs for classification
configResource-specific configuration
versionCurrent version/state
Examples: Kubernetes cluster, EC2 instance, Lambda function, VM. How created: Via Resource Providers (auto-sync from K8s, AWS, GCP) or API.
name: prod-us-east-1
kind: KubernetesCluster
identifier: k8s-prod-use1
metadata:
  region: us-east-1
  environment: production
  tier: critical
config:
  server: https://k8s.example.com

Environment

An Environment defines where to deploy. It represents a logical deployment stage (dev, staging, prod) that groups resources using selectors.
PropertyDescription
nameEnvironment name
systemIdParent system
resourceSelectorSelector determining which resources belong
directoryOptional path for hierarchical organization
Key concept: Environments are dynamic. When you add a new resource matching the selector, it automatically joins the environment.
name: Production
resourceSelector: resource.metadata["environment"] == "production"

Deployment

A Deployment defines what to deploy and how. It represents a service or application you want to deploy, along with the job agent configuration that determines how the deployment is executed.
PropertyDescription
nameDeployment name
slugURL-friendly identifier
descriptionWhat this deployment does
systemIdParent system
resourceSelectorOptional filter for which resources can run this
jobAgentIdWhich job agent executes deployments
jobAgentConfigConfiguration passed to the job agent
Examples: “API Service”, “Frontend App”, “Payment Processor”.

Version

A Version is a specific build or release of a deployment, typically created by your CI pipeline.
PropertyDescription
deploymentIdParent deployment
tagVersion identifier (e.g., v1.2.3, sha-abc123)
nameOptional human-readable name
statusbuilding, ready, or failed
metadataArbitrary metadata (git commit, build number)
configVersion-specific configuration
jobAgentConfigOverrides deployment’s job agent config
Status meanings:
  • building — Still being built, won’t be deployed
  • ready — Ready for deployment (default for policies)
  • failed — Build failed, won’t be deployed
# CI creates a version after building
curl -X POST ".../deployments/{id}/versions" \
  -d '{
    "tag": "v1.2.3",
    "status": "ready",
    "metadata": {"commit": "abc123"}
  }'

Release Target

A Release Target is the combination of a Deployment, Environment, and Resource. It represents a specific place where a deployment can be released.
Release Target = Deployment × Environment × Resource
Example:
  • Deployment: “API Service”
  • Environment: “Production”
  • Resource: “us-east-1 cluster”
  • Release Target: “API Service on Production/us-east-1”
Automatic creation: Release targets are computed from the intersection of:
  1. Environment’s resource selector → which resources
  2. Deployment’s resource selector (if any) → further filtering

Release

A Release is an instance of deploying a specific Version to a Release Target.
PropertyDescription
versionIdWhich version to deploy
deploymentIdWhich deployment
environmentIdWhich environment
resourceIdWhich resource
createdAtWhen the release was created
Releases do not carry their own status. The state of a release is inferred from the Release Target State — which tracks the desired release, current release, and latest job for each target.

Job

A Job is the actual deployment task executed by a Job Agent.
PropertyDescription
releaseIdThe release this job deploys
jobAgentIdWhich agent executes this job
statuspending, in_progress, completed, failed
externalIdExternal identifier (e.g., GitHub run ID)
messageStatus message or error details
Job lifecycle:
  1. Ctrlplane creates job for approved release
  2. Job agent polls and receives the job
  3. Agent acknowledges and executes
  4. Agent updates status as it progresses
  5. Agent marks completed or failed

Job Agent

A Job Agent is the executor that performs deployments. It bridges Ctrlplane to your infrastructure.

Policy

A Policy defines when a version is allowed to deploy. Policies are the rules governing deployment timing—approvals, gates, windows, and verification that control when releases progress.
ComponentDescription
namePolicy name
selectorsWhich release targets this policy applies to
rulesThe specific rules to enforce
Policy types:
TypeDescription
ApprovalRequires manual sign-off
Environment ProgressionWait for another environment to succeed first
Gradual RolloutDeploy to targets sequentially with delays
Deployment WindowOnly deploy during certain hours
Version SelectorFilter which versions can deploy
Version CooldownMinimum time between deployments
Deployment DependencyWait for another deployment to complete
VerificationCheck metrics after deployment
Policy evaluation: When a release target needs deployment:
  1. Find all policies matching the target
  2. Evaluate each rule
  3. All pass → create job
  4. Any requires action → release is pending
  5. Any denies → release is blocked

Selector

Selectors are query expressions used to match resources, environments, or deployments.
# Match resources in production
resource.metadata["environment"] == "production"

# Match critical deployments in any region
deployment.metadata["tier"] == "critical" &&
  resource.metadata["region"] in ["us-east-1", "eu-west-1"]
Used in:
  • Environment resource selectors
  • Deployment resource selectors
  • Policy target selectors
See Selectors for full syntax.

Variables

Variables provide dynamic configuration for deployments.
TypeDescription
Deployment VariablesDefined per deployment, vary by environment
Resource VariablesDefined on resources
{
  "deploymentVariable": "replicas",
  "values": [
    { "environmentId": "dev", "value": "1" },
    { "environmentId": "prod", "value": "3" }
  ]
}

Quick Reference Table

EntityWhat It Is
SystemWorkspace grouping deployments and environments
ResourceDeployment target (cluster, VM, function)
DeploymentWhat & how — service/app to deploy and its agent config
EnvironmentWhere — logical stage grouping resources via selectors
VersionSpecific build of a deployment
Release TargetDeployment × Environment × Resource
ReleaseVersion being deployed to a release target
JobExecution task sent to a job agent
Job AgentExecutor (ArgoCD, GitHub Actions, etc.)
PolicyWhen — rules controlling deployment timing
SelectorQuery expression matching entities

Next Steps