# Changelog

The single place to follow what’s new across the ZSoftly Cloud Platform. Each section below is its own changelog: platform & services, the Marketplace, the `zcp` CLI, and the Terraform / OpenTofu provider, newest first.

 [Subscribe to RSS](https://docs.zcp.zsoftly.ca/changelog/rss.xml) 

## Recent releases

[CLI v1.1.0: block storage snapshot schedules](https://docs.zcp.zsoftly.ca/changelog/#cli-v1.1.0) (October 23, 2026)

[Terraform / OpenTofu provider v1.1.0](https://docs.zcp.zsoftly.ca/changelog/#terraform-v1.1.0) (October 23, 2026)

[ZCP Store](https://docs.zcp.zsoftly.ca/changelog/#zcp-store) (October 11, 2026)

[Longer instance passwords](https://docs.zcp.zsoftly.ca/changelog/#instance-password-length) (October 11, 2026)

[CLI v1.0.1: lifecycle-route and volume fixes](https://docs.zcp.zsoftly.ca/changelog/#cli-v1.0.1) (October 11, 2026)

[CLI v1.0.0: separate root storage and backup schedules](https://docs.zcp.zsoftly.ca/changelog/#cli-v1.0.0) (October 11, 2026)

[Terraform / OpenTofu provider v1.0.0](https://docs.zcp.zsoftly.ca/changelog/#terraform-v1.0.0) (October 11, 2026)

[Compute and storage sold separately](https://docs.zcp.zsoftly.ca/changelog/#compute-storage-separate) (October 11, 2026)

[CLI v0.0.31: ACL rule pagination and dependency security updates](https://docs.zcp.zsoftly.ca/changelog/#cli-v0.0.31) (October 9, 2026)

[CLI v0.0.30: custom VM plans and object storage keys](https://docs.zcp.zsoftly.ca/changelog/#cli-v0.0.30) (October 3, 2026)

[Terraform / OpenTofu provider v0.2.0](https://docs.zcp.zsoftly.ca/changelog/#terraform-v0.2.0) (September 7, 2026)

[CLI v0.0.29: complete volume listings](https://docs.zcp.zsoftly.ca/changelog/#cli-v0.0.29) (September 7, 2026)

[Up to 8 subnets per VPC](https://docs.zcp.zsoftly.ca/changelog/#vpc-subnet-limit) (September 7, 2026)

[CLI v0.0.28: security fixes and working backups](https://docs.zcp.zsoftly.ca/changelog/#cli-v0.0.28) (September 7, 2026)

[Object storage endpoint DNS resolution from VPCs](https://docs.zcp.zsoftly.ca/changelog/#object-storage-vpc-dns-resolution) (September 6, 2026)

[Kubernetes 1.37 is available](https://docs.zcp.zsoftly.ca/changelog/#kubernetes-1.37) (September 6, 2026)

[Postpaid billing is available](https://docs.zcp.zsoftly.ca/changelog/#postpaid-billing) (September 1, 2026)

[Intel compute in Montréal (YUL)](https://docs.zcp.zsoftly.ca/changelog/#intel-compute-yul) (August 16, 2026)

[Platform and services updates](https://docs.zcp.zsoftly.ca/changelog/#platform-services) (August 8, 2026)

[CLI v0.0.26: port forwarding and SSH key fixes](https://docs.zcp.zsoftly.ca/changelog/#cli-v0.0.26) (July 19, 2026)

[CLI v0.0.25: DNS MX record support](https://docs.zcp.zsoftly.ca/changelog/#cli-v0.0.25) (July 18, 2026)

[CLI v0.0.24: lifecycle and SDK improvements](https://docs.zcp.zsoftly.ca/changelog/#cli-v0.0.24) (July 16, 2026)

[CLI v0.0.17: full object storage workflows](https://docs.zcp.zsoftly.ca/changelog/#cli-v0.0.17) (June 17, 2026)

[Marketplace updates](https://docs.zcp.zsoftly.ca/changelog/#marketplace) (June 17, 2026)

[Terraform and OpenTofu provider](https://docs.zcp.zsoftly.ca/changelog/#terraform-opentofu) (June 10, 2026)

Each component keeps its own `CHANGELOG.md` on GitHub. The CLI section below mirrors [`zcp-cli/CHANGELOG.md`](https://github.com/zsoftly/zcp-cli/blob/main/CHANGELOG.md). Use it for the complete, commit-level history.

## Platform & services

Updates to the Public Cloud platform and managed services.

### ZCP Store (October 11, 2026)

The console has a Store tab where an account buys services, licences and dedicated servers. Store products bill on the same invoice as your instances. They are account level, not tied to a project. Available today: Basic Support (free, included with every account), Pro Support at $99 a month, and ten priced bare metal servers from $231 a month. Products at CAD 100 a month or less can be bought by any account. Products above that can be bought by postpaid accounts and by prepaid accounts whose credit balance covers the order. Accounts on manual invoicing order them through support. Professional services, managed services, backup and DR, security and compliance, networking, training and licensing products are placed through support after a quote. See [Store](https://docs.zcp.zsoftly.ca/public-cloud/store).

### Longer instance passwords (October 11, 2026)

New instances get a random sixteen character provisioning password instead of six. A password reset on an existing instance also returns the longer form. Instances created before this date keep their current password until reset. See [Connect With SSH](https://docs.zcp.zsoftly.ca/public-cloud/compute/connect-ssh#where-to-find-the-password).

### Compute and storage sold separately (October 11, 2026)

Every VM plan now covers CPU and memory only. Plan names carry a `c` before the size, for example `ca2c.m` (2 vCPU, 4 GB, YUL on `b2.g1`, $24.80 per month). You choose the root disk on the OS Disk Offering step as a per-GB block storage volume. The minimum is the template size. Grow it at any time. It never shrinks. Rates per GB per month:

- `b1.g1` and `b2.g1`: $0.14
- `b1.g3`: $0.03
- `b2.g2`: $0.09
- `b2.l1`: $0.10
- `b2.l2`: $0.07

The same root size on the default tier costs the same total as before. Review and Deploy now lists compute, network, public IP, and block storage root as separate lines.

Existing servers keep their plan and their price. Resizing an existing server’s plan does not change its root disk. Custom plans, where you pick your own CPU and RAM, are retired, so choose a fixed size. CLI v1.0.0, released the same day, sets the root disk with `--blockstorage-plan` and `--root-disk-size`. The Terraform and OpenTofu provider v1.0.0 supports the same named compute and root storage selections. See [Instance Types](https://docs.zcp.zsoftly.ca/public-cloud/compute/instance-types).

### Up to 8 subnets per VPC (September 7, 2026)

Each VPC supports up to 8 subnets, up from 3. Existing VPCs get the new limit with no changes on your side. If a workload needs more than 8 subnets in a single VPC, raise a support ticket from the console. We will review the request. See [Add Subnet](https://docs.zcp.zsoftly.ca/public-cloud/networking/vpc/add-subnet).

### Object storage endpoint DNS resolution from VPCs (September 6, 2026)

Fixed DNS configuration for newly created VPCs. Workloads in these VPCs now resolve the object storage endpoint.

### Kubernetes 1.37 is available (September 6, 2026)

New managed clusters can run 1.37.0 or the refreshed patch releases 1.36.4 (the default), 1.35.8, and 1.34.11. At release, clusters already running 1.36.1, 1.35.1, or 1.34.3 remained on those versions until an upgrade. Those earlier patch releases are no longer offered for new clusters. Upgrade one minor version at a time, or apply a patch upgrade within the same minor version. Do this from the [Cluster Overview](https://docs.zcp.zsoftly.ca/public-cloud/kubernetes/cluster-overview) page. These versions are available in both regions. See [Create Kubernetes Cluster](https://docs.zcp.zsoftly.ca/public-cloud/kubernetes/create-cluster) for the full version list and lifecycle information.

### Postpaid billing is available (September 1, 2026)

Choose Postpaid during signup for eligible hourly and monthly services, then pay invoices with a credit card saved through Stripe. Choose Prepaid or Postpaid during signup. After you create your account, it remains in that billing mode for the life of the account. See [Billing](https://docs.zcp.zsoftly.ca/public-cloud/billing).

### Intel compute in Montréal (YUL)

General-purpose `ci2` plans from 1 to 96 GB of RAM, memory-optimized `cim2` plans from 8 to 64 GB of RAM, custom Intel configurations, and Intel-backed Kubernetes node capacity. See [Instance types](https://docs.zcp.zsoftly.ca/public-cloud/compute/instance-types).

### Outbound SMTP on Port 25

Outbound SMTP on port 25 is now blocked by default on all compute instances to protect platform-wide sender reputation. Ports 465 and 587 remain open for authenticated email. Verified customers can request access through support. See [SMTP Port 25](https://docs.zcp.zsoftly.ca/public-cloud/networking/public-network/smtp-port-25).

### Kubernetes 1.36

Kubernetes 1.36 is now supported for managed clusters.

### Windows Server 2025

Windows Server 2025 images are available for compute instances.

### ZSoftly Cloud Storage

Dedicated, single-tenant storage clusters are generally available.

## Marketplace

One-click application images for compute instances.

- 20+ one-click apps available, including cPanel, GitLab, Grafana, WordPress, PostgreSQL, MySQL, MariaDB, MongoDB, Elasticsearch, InfluxDB, Docker, n8n, and more. Browse them in the [Marketplace](https://docs.zcp.zsoftly.ca/public-cloud/marketplace).

## CLI (`zcp`)

The official command-line tool for the platform. The entries below mirror the CLI’s [`CHANGELOG.md`](https://github.com/zsoftly/zcp-cli/blob/main/CHANGELOG.md) on GitHub.

### v1.1.0: October 23, 2026

Snapshot schedules, DNS fixes, and security updates. See the [CLI releases](https://github.com/zsoftly/zcp-cli/releases) on GitHub and the [CLI reference](https://docs.zcp.zsoftly.ca/public-cloud/cli/reference).

- Create and manage block storage snapshot schedules. `zcp snapshot schedule` creates, lists, shows, updates, pauses, resumes, deletes, and runs schedules on demand. Configure the interval, time zone, retention, and an optional immediate snapshot.
- Keep schedules within the selected scope. Before creation, the CLI checks the target volume’s region and project. Updates and actions reject schedules outside the selected region and project.
- Certificate-verification security fix. The CLI release uses Go 1.26.10 to fix a certificate-verification vulnerability.
- Default DNS record-create output verifies the created value. Without `--show-zone`, `dns record-create` returns an error if the API accepts the request but the CLI cannot verify the new value. Inspect the zone with `dns show` before retrying. `--show-zone` prints the resulting zone after creation or deletion and skips this check during creation.
- DNS deletion handles multiple values. Default deletion output is a labelled pre-delete snapshot, not a guarantee of the values removed if the record changes concurrently. The CLI deletes the values from its initial snapshot one by one. If a deletion fails, it stops and reports partial progress. The CLI leaves values added after the read alone. An already absent record is treated as deleted.
- CAA values must be quoted. Use, for example, `--content '0 issue "letsencrypt.org"'`.

### v1.0.1: October 11, 2026

See the [v1.0.1 release](https://github.com/zsoftly/zcp-cli/releases/tag/v1.0.1) on GitHub.

- Instance cancellation and hostname changes use the current API routes. Changing a hostname restarts the instance.
- VM snapshot lists retrieve all reported pages. A later pagination failure returns an error instead of a partial list.
- Named volume plans accept an explicit capacity. Use `--plan` with `--size` in `zcp volume create`. See the [CLI reference](https://docs.zcp.zsoftly.ca/public-cloud/cli/reference).

### v1.0.0: October 11, 2026

Separate compute and root-storage selections, VM backup schedules, and complete DNS lists. See the [v1.0.0 release](https://github.com/zsoftly/zcp-cli/releases/tag/v1.0.0) on GitHub.

- New instances require named compute and root-storage plans. Pass `--plan`, `--blockstorage-plan`, and `--root-disk-size`. Custom CPU, memory, and disk inputs are retired.
- New Kubernetes clusters use separate control-plane, worker, and root-storage plans. The root disk size applies to every node. Automatic scale-out remains unverified.
- VM backup schedules support interval, time zone, retention, pause, resume, and run-now controls. List schedules after an `everyOtherDay` error because the platform can persist that policy before returning the error.
- DNS lists retrieve every reported page. A later pagination failure returns an error instead of a partial list.

### v0.0.31: October 9, 2026

ACL rule pagination controls and dependency security updates. See the [v0.0.31 release](https://github.com/zsoftly/zcp-cli/releases/tag/v0.0.31) on GitHub.

- List ACL rules across API pages. `zcp acl rules <vpc-slug> <acl-name-or-id>` now reads every API page by default. Use `--max-items`, `--starting-token`, and `--page-size` to control a paginated listing, or `--no-paginate` to request one API page. The command returns an error instead of partial rules if a later page fails. See the [CLI reference](https://docs.zcp.zsoftly.ca/public-cloud/cli/reference).
- Go dependency security updates. The language minimum remains Go 1.26.0. The selected toolchain is Go 1.26.9, and the CLI updates `golang.org/x/net` to v0.60.0.

### v0.0.30: October 3, 2026

Custom VM plans, load balancer rule lists, and object-storage access keys. See the [v0.0.30 release](https://github.com/zsoftly/zcp-cli/releases/tag/v0.0.30) on GitHub.

- Create a custom VM without a catalogue plan. Omit `--plan`, supply a CPU count with `--cpu`, and supply memory and disk in GB with `--memory` and `--disk`.
- List load balancer rules. `zcp loadbalancer list-rule <load-balancer-slug>` displays rule IDs for use with VM attachment commands.
- Rotate object-storage access keys. `zcp object-storage keys` lists, creates, and revokes S3-compatible access keys. Keep the new secret when you create the key, update your consumers, then revoke the old key. A store supports one or two active keys.
- Use saved S3 credentials for direct S3 commands. A plaintext secret is visible for five minutes after key creation. Save it, then set `ZCP_S3_ACCESS_KEY` and `ZCP_S3_SECRET_KEY`. The CLI checks that the access key is active for the selected store before it connects.
- Object-storage output follows the current API response. Allocation, usage, and unknown status values now display correctly. Debug output also redacts object-storage secrets.

### v0.0.29: September 7, 2026

Complete volume listings and clearer VPC quota errors. See the [v0.0.29 release](https://github.com/zsoftly/zcp-cli/releases/tag/v0.0.29) on GitHub.

- Volume listings now retrieve every page. The CLI and its Go SDK no longer miss volumes beyond the API’s first results page. Pagination anomalies return explicit errors instead of partial or duplicated results.
- VPC subnet-limit failures explain the next step. When `zcp network create --vpc` reaches the default limit of eight subnets, it directs you to request a quota increase through support. Run the command again after the increase is applied. See the [CLI reference](https://docs.zcp.zsoftly.ca/public-cloud/cli/reference).

### v0.0.28: September 7, 2026

Security fixes, working backups, and a public-IP-first `instance ssh`. This release also ships everything prepared for v0.0.27, which was never published. Upgrading from v0.0.26 picks up both sets of changes. See the [v0.0.28 release](https://github.com/zsoftly/zcp-cli/releases/tag/v0.0.28) on GitHub.

- `--debug` output no longer leaks your API token. Debug output and error messages now redact the token, the `password` field, and other credential fields. This includes messages built from responses the CLI cannot parse. We updated `golang.org/x/crypto` and the Go toolchain to close two SSH denial-of-service advisories. Rotate your token if you shared `--debug` output before this release.
- Backups work again. `backup list` decodes the scheduled hour whether the API sends it as a number or a string. `vm-backup delete` now works: it submits a cancellation request instead of the `DELETE` request the API always rejected. `--interval` accepts only `dailyAt` or `hourlyAt`. `backup list` and `vm-backup list` show clearer columns.
- `instance ssh` prefers the public IP. It connects over the public IP when one is attached and falls back to the private IP otherwise. New `--use-public` and `--use-private` flags force the choice.
- Output fixes: `firewall list` now shows each rule’s state. `dns show` prints `-` instead of a fabricated status. `autoscale policy delete` and `autoscale condition delete` print the numeric ID correctly.
- From v0.0.27: `instance create` supports the `Vpc` network type and can attach existing networks with `--networks`. `ip static-nat enable` now requires `--network`. `volume attach` and `volume detach` show the API’s status instead of a blank row.
- Known limitation: `object-storage bucket encryption enable` is disabled until the region’s gateway supports SSE-S3 default encryption. `status` and `disable` still work.

### v0.0.26: July 19, 2026

Port forwarding and SSH key fixes.

- `portforward list` shows the ports again. The public and private port columns were blank because the response was read from the wrong field names. They display correctly now.
- `portforward create` and `firewall create` stop printing an empty table. Both create the rule asynchronously and return no object, so they now report that the request was accepted and point you to the matching `list` command.
- `ssh-key delete` accepts the key’s ID, name, or slug. It previously took only the slug and rejected the ID that `ssh-key list` shows. Deleting an unknown key is now a no-op.

### v0.0.25: July 18, 2026

`MX` records now work from the CLI. `zcp dns record-create` never sent a record’s priority, so every `MX` create failed with an API error. It now takes a `--priority` flag (0-65535, required for `MX`): put the mail server in `--content` and the preference number in `--priority`. The CLI sends a `0` preference correctly and rejects `--priority` on every other type with a clear message. See [Manage DNS with the CLI](https://docs.zcp.zsoftly.ca/public-cloud/dns/cli).

```bash
zcp dns record-create --domain examplecom --name @ --type MX --content mail.example.com. --priority 10
```

### v0.0.24: July 16, 2026

Deleting a VM now releases its auto-assigned public IP. `instance delete` uses the same service-cancellation workflow as the console, so the address is no longer left allocated and billable. `loadbalancer delete` also uses service cancellation, but keeps its separate, reusable public IP by default. Add `--release-ip` to release the address.

- `instance list` and `instance get` now show the public IP, and `get` shows the billing cycle.
- `ip list` and `loadbalancer list` return every result instead of stopping at the first page.
- The CLI and its SDK are now Apache 2.0 licensed, allowing the Terraform / OpenTofu provider to embed the SDK.

### v0.0.23: July 8, 2026

`--wait` now reports the real instance state. The platform’s cached state sometimes lags minutes behind reality, so `instance create/start/stop --wait` kept waiting on a VM already up. The CLI now polls the live state endpoint, which reconciles with the hypervisor, and returns as soon as the VM is running.

- Corrected `instance delete --delete-public-ip` help: the platform does not release the auto-assigned public IP on delete yet (an API-side fix is in progress). The option, prompt, and help now say so plainly. Release the address manually with `zcp ip release <ip-slug>` after deleting.

### v0.0.22: July 7, 2026

DNS records display and delete correctly. The DNS service models records as record sets addressed by name and type. `zcp dns show` and `record-create` now display record content (multi-value sets included), and `dns record-delete` works with `--name` and `--type`. Record names are relative: the CLI appends the zone for you.

- `egress create` reports honestly when the platform accepts a rule but never lists it, instead of failing with a confusing lookup error.
- Automated validation now covers the command reference: a script checks all 264 examples against the built CLI, and we rewrote six sections to match the real command trees.
- L2 instances work, and `instance create` examples run as pasted, contributed by first-time community contributor [@cokerrd](https://github.com/cokerrd): the new `--is-public` option unblocks `--network-type L2`, and the required `--network-plan` and `--storage-category` options are now in every example.

### v0.0.21: July 2, 2026

Profile defaults now apply to create commands. With defaults configured through `zcp profile add`, create and mutate commands no longer error asking for `--region`/`--project`. Set them once. List and get commands already worked this way.

- First-run guidance: the installers print copy-paste setup for the production defaults (`--region yul-1 --project default-9`), and the docs use them throughout.
- We verify every example slug against the live catalog (templates, plans, backup and load balancer plans), so examples run as pasted.

### v0.0.20: June 30, 2026

`zcp instance delete` requests release of the VM’s auto-assigned public IP by default, so no address stays allocated and billed after the VM is gone. Pass `--delete-public-ip=false` to keep the address. Manually acquired and source-NAT addresses are unaffected. See the v0.0.23 note: the platform-side release is not active yet.

### v0.0.19: June 21, 2026

Manage IAM from the CLI: sub-users, roles, and permissions. Everything in the portal’s Profile area is now scriptable. These commands are account-level (no `--region`/`--project`). See [Roles & Permissions](https://docs.zcp.zsoftly.ca/public-cloud/iam/roles) and [Users](https://docs.zcp.zsoftly.ca/public-cloud/iam/users).

- `zcp permission list`: browse the permission catalog (filter with `--category`) to find the slugs you assign to roles.
- `zcp role`: `list`, `get <slug>` (shows permissions + assigned users), `create`, `update`, and `delete`. `--permission` is repeatable and replaces the role’s full set; the built-in `owner`/`service-administrator`/`service-viewer` roles are protected from edits.
- `zcp sub-user`: `list` (with `--role`/`--blocked` filters), `create`, `update`, `block`, `unblock`, and `delete`. Sub-users are referenced by ID or email; new sub-users start blocked until you `unblock` them.

Load balancers and instance references.

- `zcp loadbalancer create` works: it now sends the required first rule (`--public-port`/`--private-port`/`--algorithm`) and can attach back-ends with `--vm`.
- Reference an instance by ID, name, or slug in every `instance` subcommand, with a clear error when a name is ambiguous; `instance list` now shows the `ID` column and returns all VMs (the list is paginated).
- `reboot` refuses a non-`Running` VM instead of silently no-op’ing, and `-o json`/`-o yaml` emit full objects.

### v0.0.18: June 19, 2026

Region and project are now required for region- and project-scoped commands. This makes results predictable and matches how the platform scopes resources. See [Configuration](https://docs.zcp.zsoftly.ca/public-cloud/cli/configuration) for how to provide them.

- Set them once: `zcp profile add` now prompts for a default region (required) and project, like `aws configure`. After that, most commands need no `--region`/`--project`. You can still override per command or with the `ZCP_REGION`/`ZCP_PROJECT` environment variables.
- Lists are scoped to your region and project: every resource and catalog list now filters its output, so `plan`, `template list`, `iso list`, `marketplace list`, and `storage-category list` no longer mix entries from other regions. Account-level commands (`dns`, `auth`, `profile`, `region`, `project`, and the other discovery commands) are exempt.

SSH keys.

- `ssh-key import` fixed: it now sends the required project and region, resolving a 500 error on import, and validates the key name client-side (20 characters max).
- `instance create --ssh-key <name>` now engages SSH-key authentication correctly. Import the key first with `ssh-key import`. Key names and public-key material must be unique.

Clearer errors.

- API validation errors now surface the field-level detail (for example, `public_key: The public key has already been taken.`) instead of a generic message.

### v0.0.17: June 17, 2026

Object storage: the full S3 feature set in the CLI. Many of these are available only through the CLI (or an S3 SDK) today, not yet in the Web UI. See the [Object Storage CLI guide](https://docs.zcp.zsoftly.ca/public-cloud/storage/object-storage/cli) for the full reference and a UI-vs-CLI availability matrix.

- Object versioning workflows: list versions and delete markers, download or delete a specific version, and `restore` (undelete).
- Download objects to a local file (`object download`).
- Bucket policies: read, set (from a JSON file), or delete a bucket’s raw S3 policy.
- Tagging on buckets and objects, default encryption (SSE-S3), lifecycle rules (expire current/old versions and incomplete uploads), and CORS rules.
- Presigned URLs: time-limited download and upload links that need no credentials, even on a private bucket.
- Server-side copy / move, object stat (full metadata), and `put --metadata`.
- Make buckets public/private, empty a bucket, and clean up incomplete uploads.
- Simpler create: `zcp plan object-storage` lists plans, and `create --plan` derives the storage category for you.

CLI usability.

- Clear argument errors: every command names what’s missing, the usage, and an example.
- Unknown subcommands now error (non-zero exit) instead of silently printing help.
- Cloud provider auto-detected: saved to your profile on `zcp auth validate`, so you no longer pass `--cloud-provider`.
- `-o yaml` is now supported for policy, lifecycle, and CORS output.

### v0.0.16: June 11, 2026

- VPC subnets (tiers): create a network as a VPC subnet with `network create --vpc`, and attach a custom network ACL at creation with `--acl`.
- Network ACL rules: full rule management: `acl rules`, `acl create-rule`, `acl update-rule` (in place), `acl delete-rule`, plus `acl delete` for ACL lists. `--cidr` accepts comma-separated lists.
- `network get`: show a network’s CIDR, state, VPC membership, and attached ACL.
- `plan network`: list network plans (the slugs for `--network-plan`).
- Fixes: VPC `get`/`create` now show CIDR/status, plan tables include a SLUG column, and `vpc delete` polls for completion instead of a false-negative warning. Clearer “already deleted” handling.

### v0.0.15: June 10, 2026

- VPN: new IKE/ESP Diffie-Hellman and Perfect-Forward-Secrecy flags (`--ike-dh`, `--esp-dh`, `--esp-pfs`) on customer-gateway create/update. The full VPN configuration is now returned reliably after create/update.
- `ip allocate --project`: assign an IP to a specific project at allocation time.
- Fixes: VPN gateway/customer-gateway and VPC/network update commands no longer return blank fields. Clearing a `--description` now works.

### v0.0.14: June 10, 2026

- Infrastructure as code: the CLI’s API packages are now importable by external Go modules, enabling the [Terraform / OpenTofu provider](https://github.com/zsoftly/terraform-provider-zcp). CLI behaviour is unchanged.

### v0.0.12: June 9, 2026

- `kubernetes upgrade-version`: upgrade a running cluster’s Kubernetes version (`--version v1.x.y`). The correct version for the cluster’s region is resolved automatically.

### v0.0.11: June 8, 2026

- `instance create --user-data` / `--user-data-file`: pass a cloud-init / startup script inline or from a file at VM creation.
- Fixes: instance Private IP now displays correctly, `instance get` retries the brief window right after creation, and `instance create --blockstorage-plan` is now optional (auto-assigned).

### v0.0.10: June 7, 2026

- Object storage introduced: manage S3-compatible storage instances (list, get, create, delete, resize), buckets (list, get, create, delete), and objects (list, get, upload, delete), plus `credentials` to view S3 access keys.
- Delete commands added across instances, networks, volumes, snapshots, backups, VPCs, and VM backups (`instance delete --force` for immediate expunge).
- Kubernetes: `scale` worker nodes (with `--wait`) and `get-config` (download kubeconfig).
- Load balancer: `delete-rule` and `detach-vm`.

### v0.0.9: April 14, 2026

- Environment-variable overrides: `ZCP_PROJECT`, `ZCP_REGION`, `ZCP_CLOUD_PROVIDER`, `ZCP_OUTPUT`, `ZCP_DEBUG` reduce repetitive flags in scripts and CI/CD.
- Zero-config mode: run with only `ZCP_BEARER_TOKEN` and `ZCP_API_URL`, with no config file. `ZCP_PROFILE` selects the active profile.

### v0.0.8: April 9, 2026

- VPC tier/subnet creation confirmed end to end, with `--cloud-provider`, `--region`, and `--project` flags added to network, VPC, virtual-router, DNS, VPN, and autoscale create commands.
- A published feature roadmap documenting what works, what’s coming, and what’s blocked.

### v0.0.7: April 8, 2026

- New commands: `region list`, `profile-info` (user profile management), `vm-backup`, and discovery commands: `cloud-provider list`, `server list`, `currency list`, `billing-cycle list`, `storage-category list`.
- Cleanup: removed legacy commands that targeted retired endpoints.

### v0.0.6: April 8, 2026

Rebuilt on the current ZSoftly Cloud Platform API with Bearer-token authentication and a consistent response format. A large set of command groups arrived:

- DNS, projects, monitoring, billing, support, autoscale, dashboard, plans, store, marketplace, product, ISO, affinity groups, and backups.
- VM operations: reboot, reset, tags, change-hostname/password/plan/OS, add-network, addons.
- Global `--auto-approve` / `-y` to skip confirmation prompts in automation.

### v0.0.5: March 31, 2026

- Reliability fixes: delete commands now verify the resource is gone, volume list deduplicates entries, and messages are clearer for snapshots on detached volumes and for empty accounts.

### v0.0.4: March 27, 2026

- VPC tier networks: `vpc create-network` and `vpc update-network`.

### v0.0.3: March 27, 2026

- Added `host list`, `resource quota`, VPC-tier flags on `network create`, and a full integration test suite.

### v0.0.2: March 23, 2026

- Default zone per profile: set it once and stop typing `--zone` on every command. An explicit flag still overrides.

### v0.0.1: March 15, 2026

- Initial release of the `zcp` CLI: 28 top-level commands across compute, storage, networking, security, Kubernetes, and billing.
- Named profiles with secure (`0600`) credential storage, a `--wait` flag for async operations, `instance ssh`, shell completions (bash/zsh/fish/PowerShell), a `--pager` option, and multi-platform binaries (Linux/macOS/Windows, amd64/arm64) with one-line installers.

## Terraform / OpenTofu provider

Manage ZCP infrastructure as code with the official provider, published as `zsoftly/zcp` on the [OpenTofu registry](https://search.opentofu.org/provider/zsoftly/zcp) and the [Terraform Registry](https://registry.terraform.io/providers/zsoftly/zcp). Source code lives at [github.com/zsoftly/terraform-provider-zcp](https://github.com/zsoftly/terraform-provider-zcp).

### v1.1.0: October 23, 2026

Current provider release. Use `zcp_volume_snapshot_schedule` to manage recurring block storage snapshots as code. See the [provider releases](https://github.com/zsoftly/terraform-provider-zcp/releases) on GitHub.

- Set the schedule, retention, scope, and paused state in configuration. The resource supports hourly, daily, weekly, and monthly schedules, an optional immediate snapshot, and import.
- Import schedules without an unnecessary replacement. The first apply records the configured `immediate` value. Changing `name`, `description`, or a recorded `immediate` value replaces the schedule. Remove retained snapshots before deleting or replacing a schedule.

### v1.0.0: October 11, 2026

See the [v1.0.0 release](https://github.com/zsoftly/terraform-provider-zcp/releases/tag/v1.0.0) and the [upgrade guide](https://docs.zcp.zsoftly.ca/public-cloud/api/terraform-opentofu/).

- New instances require `plan`, `blockstorage_plan`, and `root_disk_size`. The provider rejects new custom CPU, memory, and disk configurations. Existing custom-plan state remains readable and destroyable.
- New Kubernetes clusters use separate fixed plans for control-plane nodes, workers, and root storage. Changing to that shape replaces a cluster. The provider records requested autoscaling bounds but does not confirm immediate scale-out.
- `zcp_vm_backup_schedule` manages recurring policies. It supports interval, time zone, retention, paused state, import, and policy scope. The provider rejects `everyOtherDay` before the platform can persist it and return an error.
- DNS lookups paginate by slug, named volumes accept a plan and capacity, and instance name updates use hostname changes. A hostname update can restart a running instance or start a stopped instance.

### v0.3.0: October 9, 2026

Custom VM plans, object-storage keys, and load-balancer state fixes. See the [v0.3.0 release](https://github.com/zsoftly/terraform-provider-zcp/releases/tag/v0.3.0) and [tagged changelog](https://github.com/zsoftly/terraform-provider-zcp/blob/v0.3.0/CHANGELOG.md) for the complete change list.

- Create custom-plan instances. `zcp_instance` accepts `cpu`, `memory_gb`, and `disk_gb` together when you omit `plan`. A fixed catalogue plan still uses `plan`.
- Manage object-storage keys as resources. `zcp_object_storage_key` creates, imports, and revokes S3 access keys. Its `api_secret` is sensitive and remains in Terraform state after the API stops disclosing the plaintext secret. Revoked keys are removed from state. Protect state access accordingly.
- Configure S3 bucket settings with explicit credentials. Bucket configuration resources use `ZCP_S3_ACCESS_KEY` and `ZCP_S3_SECRET_KEY` from the provider process.
- Read all ACL rules. The provider now uses CLI SDK v0.0.31, which reads every ACL-rule page and reports a later-page failure instead of treating missing results as absent.
- Look up load balancers and refresh rule IDs. `data.zcp_load_balancer` exposes rule IDs for attachments. Load-balancer resources refresh through the detail endpoint and clear an initial rule ID when the API no longer returns that rule. Destroy also accepts a load balancer or attachment that the API confirms is already absent.
- Read current object-storage allocation. Object-storage reads support the API’s current storage-size response shape.
- Apply dependency security updates. The provider selects Go 1.26.9 and uses `golang.org/x/net` v0.60.0.

The API rejects deletion of the only active `zcp_load_balancer_rule` on a load balancer. Keep at least one rule when you manage rules independently.

Upgrade the provider constraint, then run `terraform init -upgrade` or `tofu init -upgrade`:

```hcl
terraform {
  required_providers {
    zcp = {
      source  = "zsoftly/zcp"
      version = "~> 0.3.0"
    }
  }
}
```

### v0.2.0: September 7, 2026

Object storage configuration, richer instance networking, and volume lookups. See the [v0.2.0 release](https://github.com/zsoftly/terraform-provider-zcp/releases/tag/v0.2.0) and [tagged changelog](https://github.com/zsoftly/terraform-provider-zcp/blob/v0.2.0/CHANGELOG.md) for the complete change list.

- Manage object storage bucket settings as code. New `zcp_object_storage_bucket_versioning`, `zcp_object_storage_bucket_policy`, `zcp_object_storage_bucket_tagging`, `zcp_object_storage_bucket_lifecycle`, and `zcp_object_storage_bucket_cors` resources manage the respective S3-compatible gateway settings. The provider obtains gateway credentials internally and does not expose them as resource attributes.
- Attach instances to VPCs and multiple networks. `zcp_instance` now supports the `Vpc` network type and multiple networks, matching the instance-create capabilities in CLI v0.0.27.
- Look up volumes and attached disks. The new `zcp_volume` data source looks up an existing volume. `data.zcp_instance` now exposes `root_volume` and `volumes`.
- Read volume backups again. `zcp_volume_backup` now decodes the platform backup-list shape correctly.
- Destroy VM backup schedules. `zcp_vm_backup` destroys schedules through the billing cancellation workflow instead of a rejected direct delete.
- Validate backup intervals before apply. `zcp_vm_backup` and `zcp_volume_backup` accept only `dailyAt` or `hourlyAt` for `interval`, matching the platform.
- Fail fast for identifiable VPC public IPs. When `zcp_firewall_rule` identifies a VPC public IP, it fails immediately instead of polling for a rule the platform will not apply.
- Fix VPC public-IP ordering guidance. `zcp_ip_address` explains that a VPC network tier must exist first and indicates when to add `depends_on`.
- Complete volume listings. The provider now uses the `zcp` CLI SDK v0.0.29, which retrieves every page in a volume list.

Upgrade your provider constraint, then initialize again:

```hcl
terraform {
  required_providers {
    zcp = {
      source  = "zsoftly/zcp"
      version = "~> 0.2.0"
    }
  }
}
```

Run `terraform init -upgrade` for Terraform or `tofu init -upgrade` for OpenTofu. If OpenTofu reports no matching version, wait until its registry lists v0.2.0, then retry.

### v0.1.3: July 20, 2026

Port forwarding and firewall rules now record their real ID. `zcp_port_forward` and `zcp_firewall_rule` stored an empty ID because the create endpoint returns no rule object, so Terraform recreated them on every apply. Both now look up the rule after create, match it on protocol and ports, and record the real ID, so plans stay stable.

- Upgraded the `zcp` CLI SDK to v0.0.26, which corrects how port-forwarding rule ports decode.
- Security: upgraded `golang.org/x/text` to fix GO-2026-5970, an infinite loop reachable through the load balancer resource.

### v0.1.2: July 18, 2026

`MX` records in `zcp_dns_record`. A new `priority` argument (0-65535) sets the preference number. Put the mail server in `content`. The provider requires priority for `MX` and rejects it for every other type during planning, so invalid configurations fail before apply. Built on the `zcp` CLI SDK v0.0.25 and verified against the live DNS API.

- Dropped `SRV` from the documented `type` values. The DNS API rejects `SRV` and `LOC` records, so advertising `SRV` was misleading. `type` stays a free-form string.

### v0.1.1: July 18, 2026

Destroy operations release auto-assigned public IPs. `zcp_instance` and `zcp_load_balancer` release auto-assigned public IPs through the service-cancellation workflow, preventing billable addresses from remaining after destroy. Set `assign_public_ip = false` to create an instance without one. This release also upgrades the `zcp` CLI SDK to v0.0.24, which pages through every result in public IP and load balancer listings.

### v0.1.0: July 8, 2026

First public release, live on both registries. 38 resources and 12 data sources cover everything the `zcp` CLI supports: instances, volumes, snapshots and backups, VPCs and networks, firewall and egress rules, load balancers, auto-scaling, Kubernetes clusters, DNS, object storage, VPN, and account governance. Every resource supports `terraform import`, and we sign every release.

```hcl
terraform {
  required_providers {
    zcp = {
      source  = "zsoftly/zcp"
      version = "~> 0.1"
    }
  }
}
```

Set `ZCP_BEARER_TOKEN` in your environment, then run `terraform init` or `tofu init`. Generate the token in the console under Account → API Keys.
