Skip to content

Releases: dstackai/dstack

0.22.5

Choose a tag to compare

@r4victor r4victor released this 22 Oct 11:04
e59a6ca

Run configurations

Python 3.15

Run configurations now accept python: "3.15":

type: dev-environment
python: "3.15"
ide: vscode

The default Docker image now preinstalls Python 3.11 to 3.15. Runs use the preinstalled build instead of downloading Python on every container startup. See python.

Backends

Lium

The release adds experimental support for Lium. The lium backend supports GPU runs, private Docker images, and volumes.

projects:
  - name: main
    backends:
      - type: lium
        creds:
          type: api_key
          api_key: ...
dstack offer -b lium --group-by gpu

 #   GPU                SPOT       $/GPU       BACKENDS
 1   RTX3090:24GB:1     on-demand  0.4         lium
 2   RTX5070Ti:16GB:1   on-demand  0.4         lium
 3   A6000:48GB:1..5    on-demand  0.42..0.55  lium
 4   RTX6000Ada:48GB:1  on-demand  0.8         lium
 5   RTXPRO6000:96GB:8  on-demand  1.88..2.09  lium
 6   H100:80GB:8        on-demand  1.97..3.75  lium
 7   H200NVL:141GB:4    on-demand  4.5         lium
 8   H200:141GB:1..4    on-demand  5.36..5.58  lium
 9   B200:180GB:1..8    on-demand  5.5..7.5    lium
 10  B300:270GB:1..8    on-demand  8..10       lium

Lium volumes use S3-backed storage, grow with usage, and can be mounted in any Lium region, so size and region are omitted:

type: volume
backend: lium
name: my-volume

GCP TPUs

Important

TPU offers are no longer suggested by default. If you use TPUs with the gcp backend, enable them with tpu: true before upgrading.

TPU support is experimental, and TPU offers used to appear for anyone with a GCP backend. It is now opt-in:

projects:
  - name: main
    backends:
      - type: gcp
        project_id: my-project
        creds:
          type: default
        tpu: true

See GCP.

UI

Offers

The Offers page now shows CPU offers as well. Turn off the new GPU toggle to see CPU cards, group offers optionally, and filter by GPU vendor. Each offer shows its hourly price, with price ranges for grouped offers.

The Fleet page has a new Offers tab with the offers matching the fleet, which helps check available capacity, including for CPU-only SSH and Kubernetes fleets. Fleet instances are now shown below the General section.

User projects

The Projects tab on a user page now lists the projects the user owns or has joined, with their role in each.

Blog

Qwen3.8-Flash-Next coding agents

A new post shows how a single 4xH200 node, optimized with dstack presets, serves 16 concurrent Qwen3.8-Flash-Next coding agents with roughly 3x lower latency than the available providers.

What's Changed

New Contributors

Full Changelog: 0.22.4...0.22.5

0.22.4

Choose a tag to compare

@r4victor r4victor released this 15 Oct 15:03
a403286

Major bug-fixes

Server stability

The server could stop responding in two cases, both fixed in this release. Opening SSH connections, e.g. for service probes, could crash in gRPC and hang the server for up to 5 minutes (#4362). Submitting many runs at once kept the server busy finding offers and unable to handle other requests (#4373); finding offers is now also much faster. In either case, cloud instances being created at the time could be left running without dstack tracking them.

UI

Launch

The Launch button on the Runs page now opens a page that shows how to start a run with the CLI or with AI agents using dstack skills.

Screenshot 2026-10-15 at 17 01 09

Templates in the UI are now available only in dstack Enterprise, Factory, and Sky.

Offers

The Offers page now shows the best GPUs first, and its new Launch button takes you to the Launch page with the same filters.

Screenshot 2026-10-15 at 17 03 05

Quotas

In dstack Factory and Sky, project admins can now see the project's quotas in a new Quotas tab and request an increase.

Screenshot 2026-10-15 at 17 02 04

What's Changed

Full Changelog: 0.22.3...0.22.4

0.22.3

Choose a tag to compare

@r4victor r4victor released this 08 Oct 12:30
009e291

Hot Aisle bare metal (experimental)

dstack can now provision Hot Aisle bare metal servers with 8xMI300X in addition to VMs. Bare metal is disabled by default; enable it with bare_metal: true in the backend settings:

projects:
- name: main
  backends:
  - type: hotaisle
    team_handle: hotaisle-team-handle
    creds:
      type: api_key
      api_key: ...
    bare_metal: true

And the bare metal offers become available:

$ dstack offer --backend hotaisle
 #  BACKEND                   RESOURCE TYPE  PRICE
 1  hotaisle (us-michigan-1)  cpu=x86:104 mem=2048GB    bm-mi300x-8    $27.12
                              disk=11
                              gpu=MI300X:192GB:8

Bare metal servers are prepaid for 8 hours. Use a fleet with fixed nodes and delete it when done:

type: fleet
name: hotaisle-bm

nodes: 1
backends: [hotaisle]
instance_types: [bm-mi300x-8]

Within the 8 hours, dstack doesn't force-terminate bare metal servers: the instance stays terminating for about 15 minutes, then dstack stops tracking it and the server must be terminated manually in Hot Aisle. Controlled by DSTACK_FF_HOTAISLE_BARE_METAL_NO_FORCE_RELEASE (enabled by default, 0 disables).

What's Changed

Full Changelog: 0.22.2...0.22.3

0.22.2

Choose a tag to compare

@r4victor r4victor released this 01 Oct 11:42
70c2616

Backends

Daytona

dstack now supports Daytona as a backend for CPU and GPU dev environments, tasks, and services, including multi-GPU configurations with NVIDIA and AMD GPUs.

$ dstack offer -b daytona --gpu B300,MI355X,H200:1..8 --max-offers 3

 #  BACKEND          RESOURCES                                     INSTANCE TYPE           PRICE
 1  daytona (earth)  cpu=x86:1 mem=1GB disk=1GB gpu=H200:141GB:1     1x-H200-1cpu-1gb-1gb    $4.6067
 2  daytona (earth)  cpu=x86:1 mem=1GB disk=1GB gpu=MI355X:288GB:1   1x-MI355X-1cpu-1gb-1gb  $6.0567
 3  daytona (earth)  cpu=x86:1 mem=1GB disk=1GB gpu=B300:270GB:1     1x-B300-1cpu-1gb-1gb    $7.1667
    ...
 Shown 3 of 19 offers, $47.986708max

dstack’s Daytona integration also supports volumes. Daytona provides these as S3-backed FUSE mounts, allowing multiple instances to mount the same volume simultaneously across regions.

See the backend documentation for configuration and required permissions.

Presets

Replica groups

Preset creation now uses a separate router for regular inference as well as prefill-decode disaggregation when the fleet has placement: cluster and a CPU-only instance for the router.

Trials use task node groups, and the final service uses replica groups to run the router and GPU workers separately. Workers connect over gRPC when supported, and all benchmarks run through the router.

What's Changed

New Contributors

Full Changelog: 0.22.1...0.22.2

0.22.1

Choose a tag to compare

@un-def un-def released this 17 Sep 14:13
06d8dc4

Gateways

GCP

GCP gateways with an ALB can now use certificates managed by Google Cloud Certificate Manager, enabling HTTPS for services behind the gateway with TLS terminated at the load balancer:

type: gateway
name: example-gateway
backend: gcp
region: europe-west4
domain: example.com
replicas: 2
load_balancer:
  type: alb
certificate:
  type: gcp-cm
  name: projects/my-project/locations/europe-west4/certificates/my-certificate

The certificate must be a regional certificate created in the same region as the gateway, referenced by its full resource name. Creating such gateways requires additional GCP permissions:

certificatemanager.certs.use
compute.regionTargetHttpsProxies.create
compute.regionTargetHttpsProxies.delete
compute.regionTargetHttpsProxies.use

Refer to the docs for details.

Replicas

The maximum number of gateway replicas is raised from 3 to 9, and is now configurable server-wide via DSTACK_SERVER_GATEWAY_MAX_REPLICAS.

Replicated gateways are no longer marked experimental. The remaining limitation is that automatic certificate issuance via Let's Encrypt is not supported for them — use acm, gcp-cm, or an external load balancer for TLS termination.

Presets

Public registry

Presets in the dstack Sky registry are private by default and can now be made public. Set Presets to Public in the project settings to let anyone browse and pull the project's presets without signing in, including users of a self-hosted dstack server:

$ dstack preset pull main/qwen38-27b-mi300x
OK

Only project admins and global admins can change this setting; enabling it does not let anyone join the project.

What's changed

  • [UI] Project visibility: minor UX changes by @peterschmidt85 in #4284
  • [runner] Terminate the job's whole session, not just its shell by @un-def in #4283
  • [runner] Make the executor lifecycle explicit by @un-def in #4286
  • Fix gRPC router workers never becoming ready with model set by @Bihan in #4270
  • Add DB index for instance_health_checks by @r4victor in #4288
  • [Presets] Support public presets by @peterschmidt85 in #4287
  • Collect the last job logs before killing the container by @un-def in #4289
  • Improve DB connections handling by @r4victor in #4291
  • Prevent resuming a saved preset by @ZenAlexa in #4228
  • Support Certificate Manager for GCP gateways by @jvstme in #4290
  • Increase gateway replica count limit 3 → 9 by @jvstme in #4295
  • Treat pre-releases as final releases in feature gates by @un-def in #4296
  • Fix model endpoint protocol with LB-terminated TLS by @jvstme in #4299
  • Do not downgrade runner and shim by default by @un-def in #4297
  • Discourage automatic PRs by autonomous agents by @jvstme in #4292

New contributors

Full changelog: 0.22.0...0.22.1

0.22.0

Choose a tag to compare

@jvstme jvstme released this 10 Sep 18:10
1f7b736

Backends

GCP

Subnet configuration

You can now specify which subnets to use when provisioning instances, gateways, and TPUs in GCP. Add an optional subnetworks field to your GCP backend config — a mapping from regions to subnet names in the VPC specified by vpc_name:

projects:
- name: main
  backends:
  - type: gcp
    project_id: my-project
    regions: [europe-west4]
    vpc_name: my-vpc
    subnetworks:
      europe-west4: my-subnet
    creds:
      type: default

ALB gateways

dstack can now create and manage an Application Load Balancer (ALB) for GCP gateways. This allows you to run multiple GCP gateway replicas with automatic load balancing.

$ dstack gateway list
 NAME          BACKEND             HOSTNAME     DOMAIN       DEFAULT  STATUS
 gcp-gateway                       10.200.0.53  example.com  ✓        running
    replica=0  gcp (europe-west9)  10.200.0.54                        running
    replica=1  gcp (europe-west9)  10.200.0.55                        running

Refer to the docs for configuration examples and requirements.

Jarvislabs

Multi-node workloads

The Jarvislabs backend now supports placement: cluster fleets, multi-node tasks, and connectivity between VMs via VPC internal IPs.

Presets

Codex support

Presets can now be created with Codex in addition to Claude. Configure the agent provider, model, and effort in the preset configuration:

agent:
  provider: codex
  model: gpt-6-astra
  effort: high

Claude CLI default model

The preset agent now uses the claude CLI's default model instead of pinning a specific version.

Runner

This release includes a number of reliability fixes for job execution: runs are reliably stopped by max_duration even if the runner becomes unreachable; job cancellation is more reliable at actually stopping the underlying process; and several edge cases that could cause a run to hang or report a stale status have been fixed.

Breaking changes

Feature removals

  • Exports are being phased out of the open-source version of dstack. No new exports can be created, and existing exports can no longer be extended. A future dstack release will automatically remove any remaining exports.
  • The open-source version no longer displays the global Events page in the UI. The Events tabs on resource pages are still available.

Both the Events page and Exports will remain supported in dstack Factory (formerly dstack Enterprise) and in dstack Sky.

API

These API methods now return a JSON object instead of a list:

Deprecations

The Python API deprecates two methods:

  • APIClient.exports.list() is deprecated in favor of APIClient.exports.list_exports()
  • APIClient.imports.list() is deprecated in favor of APIClient.imports.list_imports()

What's changed

New Contributors

Full Changelog: 0.21.5...0.22.0

0.21.5

Choose a tag to compare

@un-def un-def released this 03 Sep 13:36
bb1dc7e

Backward compatibility

This update includes a hotfix for a backward compatibility issue that prevented the 0.21.4 CLI from applying service configurations on dstack servers older than 0.21.3.

It's recommended to update the CLI from 0.21.4 to 0.21.5.

Note

The server update from 0.21.4 is only necessary if you use the REST plugin with a plugin service that depends on dstack older than 0.21.3.

What's changed

  • [CLI] Exclude unset service groups from requests by @un-def in #4256

Full changelog: 0.21.4...0.21.5

0.21.4

Choose a tag to compare

@un-def un-def released this 03 Sep 13:16
32d2add

Presets

PD disaggregation

Presets can now be created for prefill-decode disaggregated setups. Previously the agent was restricted to single-node trials, and PD disaggregation was listed as a limitation.

The agent now runs multi-node trials using task node groups, benchmarks the router replica rather than individual prefill or decode workers (each of which only handles part of a request), and records the resources of every node of every group in the trial results.

Grouped services are also exported and stored in the groups syntax:

type: service
name: qwen3-pd

groups:
  - replicas: 1   # router
    commands: [...]
  - replicas: 2   # prefill
    commands: [...]
  - replicas: 2   # decode
    commands: [...]

dstack preset -v reports the hardware of all nodes a session's trials used, e.g. H200:141GB:8 x3 for a CPU router with one prefill and two decode nodes, or H200:141GB:8 + H100:80GB:8 x2 when the groups ran different GPUs.

Note

PD disaggregation requires the trial task and the resulting service to run in a fleet with placement: cluster, since the replicas need an interconnect between instances.

Services

Replica groups

Heterogeneous services are now stored and returned in the groups layout introduced in 0.21.3, instead of being converted back to the legacy replicas: [{count}] list. The legacy layout is still accepted in configuration files, and servers still send it to clients older than 0.21.3.

Warning

Ensure you update the CLI to 0.21.5, which includes a hotfix for using the CLI with servers older than 0.21.3.

Gateways

Gateways have been tuned to handle more concurrent connections.

Instances

Shim upgrades on busy instances

dstack-shim can now be upgraded on instances with running jobs, as long as the instance runs shim 0.21.3 or later. Previously the server only restarted the shim when no task was running, so an instance hosting a long-lived service or a multi-day training job kept its old shim indefinitely.

SSH access to co-located jobs

On an instance that runs several of your jobs at once — a fleet with blocks — the first job to finish no longer revokes SSH access for the jobs still running.

Backends

Container-based backends (Kubernetes, Runpod, Slurm, and Vast.ai) now honor DSTACK_SERVER_SSHPROXY_ENFORCED. Previously they added the user's key to the container regardless of the setting, unlike VM-based backends. See Tenant isolation.

What's changed

  • Allow restarting shim >= 0.21.3 with running tasks by @un-def in #4224
  • [shim] Keep shim task files out of the container by @un-def in #4223
  • [shim] Don't revoke host SSH access of co-located tasks by @un-def in #4226
  • [chore]: Drop gateway-based routers implementation by @jvstme in #4236
  • Fix adding authorized keys in Kubernetes and Slurm by @un-def in #4235
  • Tune Nginx config on the gateway by @jvstme in #4237
  • Replace the legacy replica groups serializer with a client patch by @Bihan in #4248
  • [Presets] Add PD Disaggregation Support by @Bihan in #4227
  • Honor sshproxy enforcement in container-based backends by @un-def in #4244
  • Drop gateway update.sh by @jvstme in #4245
  • Fix target type filter on Events page by @hhhhzzzj in #4253
  • Drop legacy dstack-gateway package by @jvstme in #4252

New contributors

Full changelog: 0.21.3...0.21.4

0.21.4rc1

0.21.4rc1 Pre-release
Pre-release

Choose a tag to compare

@jvstme jvstme released this 02 Sep 22:35
32d2add

What's changed

  • Allow restarting shim >= 0.21.3 with running tasks by @un-def in #4224
  • [shim] Keep shim task files out of the container by @un-def in #4223
  • [shim] Don't revoke host SSH access of co-located tasks by @un-def in #4226
  • [chore]: Drop gateway-based routers implementation by @jvstme in #4236
  • Fix adding authorized keys in Kubernetes and Slurm by @un-def in #4235
  • Tune Nginx config on the gateway by @jvstme in #4237
  • Replace the legacy replica groups serializer with a client patch by @Bihan in #4248
  • [Presets] Add PD Disaggregation Support by @Bihan in #4227
  • Honor sshproxy enforcement in container-based backends by @un-def in #4244
  • Drop gateway update.sh by @jvstme in #4245
  • Fix target type filter on Events page by @hhhhzzzj in #4253
  • Drop legacy dstack-gateway package by @jvstme in #4252

New Contributors

Full Changelog: 0.21.3...0.21.4rc1

0.21.3

Choose a tag to compare

@jvstme jvstme released this 27 Aug 14:05
d137594

Presets

Registry

Presets created on one machine can now be shared and reused on another via the dstack registry:

$ dstack preset push qwen38-27b-mi300x main/qwen38-27b-mi300x
OK

$ dstack preset pull main/qwen38-27b-mi300x
OK

$ dstack preset export main/qwen38-27b-mi300x -f qwen38.dstack.yml
OK

$ dstack apply -f qwen38.dstack.yml

Push and pull require project membership in a registry. Currently, the only available preset registry is dstack Sky.

Traces

Preset creation sessions now always write a real-time trace to ~/.dstack/presets/<id>/trace.jsonl, along with the agent prompt and final report — the --debug flag is no longer needed and has been removed.

Note

It's recommended to create presets using your own agent — either via a CLI such as Claude Code, or inside your IDE. Your agent helps you design the preset configuration, formulate hypotheses, and — most importantly — analyze the session's traces as well as the trial results (stored under ~/.dstack/presets/<id>/trials/<n>/trial.json), to decide what the next session can be and what instructions to give it via prompt.

To help your agent use dstack and presets, install the dstack and dstack-presets skills with npx skills add dstackai/dstack.

Services

Replica groups

Heterogeneous services now use the same groups layout as tasks, replacing the old replicas: [{count}] list:

groups:
  - replicas: 1
    commands: [...]

Service commands can also reference other replicas by IP:

${{ groups[i].replicas[j].IP_ADDRESS }}

Interpolation is only allowed for replica slots guaranteed to exist at start (e.g., with replicas: 2, slots 0 and 1 are valid; with replicas: 1..4, only slot 0 is). The old replicas layout still works and existing saved configurations keep using it.

Gateways

In-place update

The gateway property of a service can now be changed without stopping the service:

$ dstack apply -f my-service.dstack.yml

Active run my-service already exists. Detected changes that can be updated in-place:
- Configuration properties:
  - gateway

Update the run? [y/n]: y

This also supports migrating between having a gateway and running without one (gateway: false). Migration may cause a brief interruption while traffic reroutes.

ALB gateways without a certificate

AWS gateways can now use an Application Load Balancer without requiring a certificate, via the new load_balancer property:

type: gateway
name: example-gateway
backend: aws
region: eu-west-1
domain: example.com
load_balancer:
  type: alb
certificate: null

Events

Gateway replica lifecycle (creation, status changes, service and replica registration/unregistration) is now tracked as events, filterable with --within-gateway:

$ dstack event --within-gateway my-gateway
[2026-08-25 22:56:14] [gateway-replica my-gateway-0] Gateway replica created. Status: SUBMITTED
[2026-08-25 22:57:58] [gateway-replica my-gateway-0] Gateway replica status changed PROVISIONING -> RUNNING

Backends

Seeweb

dstack now supports Seeweb as a backend.

$ dstack offer -b seeweb --max-offers 10
 #   BACKEND          RESOURCES                                              INSTANCE TYPE  PRICE
 1   seeweb (it-fr2)  cpu=x86:4 mem=32GB disk=100GB gpu=L4:24GB:1            ECS1GPU6       $0.38
 2   seeweb (it-fr2)  cpu=x86:8 mem=32GB disk=500GB gpu=A6000:48GB:1         ECS1GPU2       $0.74
 3   seeweb (it-fr2)  cpu=x86:8 mem=64GB disk=200GB gpu=L4:24GB:2            ECS2GPU6       $0.76
 4   seeweb (it-fr2)  cpu=x86:8 mem=32GB disk=500GB gpu=L40S:48GB:1          ECS1GPU7       $0.85
 5   seeweb (it-fr2)  cpu=x86:16 mem=120GB disk=500GB gpu=RTXPRO6000:96GB:1  ECS1GPU12      $1.25
 6   seeweb (it-fr2)  cpu=x86:16 mem=64GB disk=1000GB gpu=A6000:48GB:2       ECS2GPU2       $1.48
 7   seeweb (it-fr2)  cpu=x86:16 mem=64GB disk=1000GB gpu=L40S:48GB:2        ECS2GPU7       $1.7
 8   seeweb (it-fr2)  cpu=x86:32 mem=256GB disk=750GB gpu=H200:141GB:1       ECS1GPU10      $2.6
 9   seeweb (it-fr2)  cpu=x86:32 mem=128GB disk=2000GB gpu=L40S:48GB:4       ECS3GPU7       $3.4
 10  seeweb (it-fr2)  cpu=x86:64 mem=512GB disk=1500GB gpu=H200:141GB:2      ECS2GPU10      $5.2

Breaking changes

  • dstack preset get --json now reports the served model repository as repo instead of model, distinguishing it from base (the model family) and service.model (what the endpoint serves it as).
  • dataset: random is rejected in preset configurations; omit dataset to request synthetic prompts instead.
  • The --debug flag has been removed from preset creation; traces are now always written.

What's changed

New contributors

Full changelog: 0.21.2...0.21.3