Changelog

v0.5.0

Error prevention and operation options.

Most of the changes in this release are related to errors prevention and operation options.

Here are some highlights.

Environments

Added the option to specify a git branch instead of the default one for each repository in each workspace. To select it, expand the workspace details to visualize the git repositories and fill the field with the branch name:

Provisioned environment:

If no branch is defined, it'll clone the repository with the default branch:

Provisioned environment:


Added options to retry provisioning a workspace and visualizing setup error logs:

Operator

Most Kubernetes objects created by CPS1 now have their names normalized. That is, their name is summarized to fit their type name length restriction and a random suffix is added to avoid collisions. This prevent some errors that could happen while provisioning environments with very large names that created resources with a very strict name size (e.g statefulsets).

Added a new configuration option to set which strategy to use for volume allocation for workspaces:

  • sharedPerUser: every workspace created by that user will consume a single volume from their namespace
  • isolatedPerWorkspace: every workspace gets its own isolated volume

The default strategy is isolatedPerWorkspace. To change it, configure the workspaceVolumes in the config object:

workspaceVolumes:
  allocationStrategy: isolatedPerWorkspace  # Or "sharedPerUser"

Other options added to workspaceVolumes includes size, accessMode, and storageClass. Here is an example with the default values:

workspaceVolumes:
  allocationStrategy: isolatedPerWorkspace
  size: 12Gi
  storageClass: null  # leaving it null means it will use the cluster default StorageClass
  accessMode: ReadWriteOnce

Helm Charts

We've renamed the contrib chart to catalog, as we feel this name describes its purpose more clearly.

Added an optional CronJob that pauses every environment. Configure the values of the platform chart to use it. Here are the default values:

environmentScheduler:
  enabled: false  # Change to true to enable
  serviceAccountName: "environment-scheduler"
  clusterRoleName: "environment-scheduler"
  clusterRoleBindingName: "environment-scheduler"
  cronJob:
    name: "environment-scheduler"
    schedule: "0 22 * * *"
    image:
      name: "docker.io/alpine/kubectl"
      tag: "1.34.2"

If you enable it with the default values every environment will be paused daily at 22:00.

Also added some extra customization options for the platform, such as the Ingress class and their annotations. Here are the default values:

ingress:
  className: nginx
  annotations: {}

The internal registry size is also configurable:

internalRegistry:
  volumeSize: 50Gi

And some options were included to control the pod placement for the CPS1 server (operator), gateway and internal OCI registry. The defaults are empty:

workloads:
  # See https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector
  nodeSelector: {}
  # See https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity
  affinity: {}
  # See https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/
  tolerations: []

Here is an example to provision those pods on nodes tainted with workload=addons:NoSchedule:

workloads:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
          - matchExpressions:
              - key: workload
                operator: In
                values:
                  - addons
  tolerations:
    - key: workload
      operator: Equal
      value: addons
      effect: NoSchedule

You can use this to create a node group with smaller nodes to run CPS1 and other cluster addons, while a node group with bigger nodes are available to run the development environments.

v0.4.1

Bug fixes and behavior adjustments.

This release fixes an issue in the Gateway and make a behavior for template building opt-in.

Template building

Version 0.3 added a change where every template is built with user namespaces for Kubernetes 1.33 or newer.

But some Kubernetes distributions/worker nodes combinations still doesn't properly support this feature such as Kind (Kubernetes in Docker) and EKS clusters with Bottlerocket.

Therefore, now this behavior is opt-in. You can enable it setting CPS1's config buildWithUserNamespaces to true (it is false by default).

Gateway

Fixed an issue where an SSH channel would be closed before completely streaming an exec's stderr if the stdout finished streaming.

v0.4.0

Improvements to templates.

This release brings some improvements to templates.

Workspaces' environment variables

IDs from resources and workspaces are translated depending on the context to be used in Kubernetes objects name and CEL statements.

More variables are available in CEL contexts to refer to services exposed by other workspaces. Now it's easy to connect multiple microservices within a single environment:

Gateway

The SSH gateway was updated to support JetBrains Gateway.

Bug fixes

  • Fixed a bug that could make a new environment page become empty
  • Fixed the build logs display for templates with multiple workspaces

v0.3.0

Significant changes to core concepts and building blocks.

A new release for CPS1 is available.

Templates and Environments

In the last version (v0.2.0), CPS1 worked with 2 main concepts: Templates and Workspaces. In this new version we're working with Templates and Environments.

A template is the blueprint to create an environment. That is, a template is the static definition of a live running environment.

To build a template, you'll use workspaces and resources.

A resource is something your environment uses but you're not actively developing, that is, an external system. It can be a database such as PostgreSQL, a cloud service such as S3 Bucket, or other application/micro service that isn't the main focus of the template/environment.

A workspace is (as the name implies) an isolated space to work. It contains development tools such as compilers, interpreters and other development tools. It can clone one or more git repositories. You use workspaces to create reproducible boxes to develop an application.

A template (or environment) can contain multiple workspaces and resources.

ResourceSet

In the last version (v0.2.0) a "Resource" was a containerized service. The Resource a CPS1 user sees in the console now is actually a set of resources. Anything Kubernetes can manage, really. You can compose a ResourceSet using native Kubernetes Resources, or create new integrations combining CRDs from operators.

Check the example AWS Aurora MySQL that uses resources from AWS Controllers for Kubernetes: https://github.com/cps-1/helm-charts/blob/cps1-contrib-0.3.0/charts/cps1-contrib/templates/resources/awsrdsauroramysql.yaml

Atomic workspaces (or snapshotting/revisions)

Templates and Environments generates snapshots when they're created or updated .

A template is built composing ResourceSets and Workspaces. Workspaces are built composing Packages and other information.

In this release, those templates continues working even if you delete any of the used ResourceSet or Package. In similar fashion, creating an Environment and deleting their originating Template afterwards doesn't impact the Environment.

Updating ResourceSets, Packages, or Templates therefore doesn't impact any running Environment.

Upgrading

This update made some significant changes to the building blocks available and fundamentally to how CPS1 works. Therefore there were some couple of breaking changes.

To upgrade:

  1. Delete all your existing templates to recreate them afterwards with kubectl delete template --all -A
  2. Delete all existing Resources with kubectl delete resource --all -A
  3. Delete the current Template CRD with kubectl delete crd template
  4. Upgrade your Helm Chart with helm repo update
  5. Upgrade the CRD chart with helm upgrade cps1-crds cps1/cps1-crds
  6. Upgrade the platform chart with helm upgrade cps1-platform cps1/cps1-platform
  7. Upgrade the contrib chart with helm upgrade cps1-contrib cps1/cps1-contrib

We know it's inconvenient to recreate templates. Future updates won't require such manual migrations.

v0.3.1

Minor validations to prevent errors.

Here are the highlights.

Minor Validations

Validations

Added minor validations to Workspace and Resource IDs to prevent errors during template creation.

v0.2.0

A new CPS1 release is available today!

Here are the highlights.

Gateway

We've made some improvements and fixed some bugs in the gateway:

  • The user now connects into their home instead of /
  • The SSH gateway doesn't close a connection after a couple of minutes
  • The gateway now uses less memory for both HTTP and SSH
  • Making an SSH connection to the gateway is faster
  • HTTP requests to the gateway are faster
  • The gateway consumes less resources from the Kubernetes API Server

Packages

The Package CRD was updated from v1alpha1 to v1alpha2.

Now they support custom images. You can either embed an SVG or set an URL to an image on your custom packages.

The following example spec:

(...)
spec:
  label: Microsoft .NET
  icon:
    svg: <svg fill="#512BD4" role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>.NET</title><path
      d="M24 8.77h-2.468v7.565h-1.425V8.77h-2.462V7.53H24zm-6.852 7.565h-4.821V7.53h4.63v1.24h-3.205v2.494h2.953v1.234h-2.953v2.604h3.396zm-6.708
      0H8.882L4.78 9.863a2.896 2.896 0 0 1-.258-.51h-.036c.032.189.048.592.048 1.21v5.772H3.157V7.53h1.659l3.965
      6.32c.167.261.275.442.323.54h.024c-.04-.233-.06-.629-.06-1.185V7.529h1.372zm-8.703-.693a.868.829
      0 0 1-.869.829.868.829 0 0 1-.868-.83.868.829 0 0 1 .868-.828.868.829 0 0 1
      .869.829Z"/></svg>
    url: null
(...)

Renders the purple .NET logo in the UI.


Packages now support properties of the tag type. They're useful for properties that receive a list of values, such as a list of APT packages.

The following example spec:

(...)
  properties:
    - name: packages
      label: APT Packages
      tip: |
        You can write only the <package name> to install their latest version,
        but this can lead to distinct results each time the template is built.
        Prefer to use the syntax <package name>=<version> to specify each
        package version.
      kind: tag
      required: true
(...)

Renders as follows in the UI:

And the value is available as a list in the setup script.

Check the new apt package in the contrib CRD for a complete usage example:


Note: installed packages will automatically be updated from v1alpha1 to v1alpha2 when you update CPS1. No manual migration is required.

Contrib

We included two new packages in the contrib Helm Chart:

  • apt (to pre-install arbitrary APT packages in your template)
  • kubectl

v0.1.0

CPS1 is now publicly available!

CPS1 (Cloud Programming Shell) is a new CDE (Cloud Development Environment) system.

Features

Templates

Organize and standardize development environments with the template system:

Workspaces

Start to work under a minute with ready to use workspaces based on your templates:

Web or Desktop IDE

Work on your projects the way you want.

Through the browser in a Web IDE:

Or on your desktop IDE, connected to the remote workspace:

Preview URLs

Share your work with colleagues to collect feedback faster. Skip slow CI/CD pipelines. The preview URLs are available only to users signed in your CPS1 instance:

Start to use right now

CPS1 is installable in any Kubernetes cluster with Helm. It takes only a minute. To install refer to our Helm chart: https://helm.cps1.tech/

You can use it for free up to 5 users. For more details refer to our EULA (End-user License Agreement): https://www.cps1.tech/eula

Customize

CPS1 is extensible to your organization by design. Packages and Resources are configurable with simple Kubernetes objects. Our "cps1-contrib" Helm chart contains some ready-to-go examples: https://github.com/cps-1/helm-charts/tree/main/charts/cps1-contrib

More coming soon!

This is just our first release. We still have a lot of features and improvements planned ahead. Watch this repository.

Made in 🇧🇷

Copyright © 2026. All rights reserved.