# Release 0.77

:material-calendar: 2026-06-28 · :material-list-status: [Full Changelog](https://github.com/srl-labs/containerlab/releases)

## Apply topology changes

The new `apply` command reconciles the topology you want with the lab that is already running. If the lab is not deployed yet, `apply` behaves like `deploy`; if the lab is running, it compares the desired topology with the live runtime and applies supported deltas without destroying and redeploying the whole lab.

The first implementation focuses on topology shape changes: adding and deleting nodes, adding and deleting supported links, starting stopped nodes, restoring parked dataplane interfaces, and restarting or recreating existing nodes for a limited set of state-backed node definition changes.

```bash
containerlab apply -t lab.clab.yml --dry-run
containerlab apply -t lab.clab.yml
```

Link changes can be handled live, with a restart, or with a recreate depending on the node kind. Linux, SR Linux, and SR-SIM can apply link changes live; cEOS restarts; vrnetlab-backed and unknown kinds use the conservative recreate mode. You can override this with [`link-apply-mode`](../manual/nodes.md#link-apply-mode) when you have validated that a NOS handles hot-plugged interfaces.

Use [`redeploy`](../cmd/redeploy.md) when you need a clean artifact state, startup configuration changes, or link parameter/type changes that `apply` intentionally does not mutate in place.

Thanks @FloSch62 @kaelemc #3207

## Cisco XRd vRouter

The new [`cisco_xrd_vrouter`](../manual/kinds/cisco_xrd_vrouter.md) kind brings Cisco IOS XRd vRouter into containerlab as a vrnetlab-backed micro-VM node. XRd vRouter's dataplane interfaces are PCI-only, so containerlab wires ordinary lab links into emulated NICs presented to the XRd vRouter guest.

Nodes boot with SSH, NETCONF, and gNMI enabled and use `clab:clab@123` credentials. Dataplane interfaces default to vmxnet3 NICs, which XRd presents as `TenGigE0/0/0/X`; set `XRD_NIC_TYPE: igb` if you need the older `GigabitEthernet0/0/0/X` naming.

```yaml
topology:
  nodes:
    xrd1:
      kind: cisco_xrd_vrouter
      image: vrnetlab/cisco_xrd-vrouter:25.4.2
    xrd2:
      kind: cisco_xrd_vrouter
      image: vrnetlab/cisco_xrd-vrouter:25.4.2
  links:
    - endpoints: ["xrd1:eth1", "xrd2:eth1"]
```

Thanks @alxrxs #3247 #3248

## SSH IdentityFile in credentials

Topology [`credentials`](../manual/nodes.md#credentials) can now include `identity-file`. When set, containerlab renders an `IdentityFile` directive into the generated per-lab SSH client config, so `ssh <node>` automatically uses the right private key without passing `-i`.

```yaml
topology:
  defaults:
    credentials:
      username: admin
      identity-file: ~/.ssh/lab-admin
  nodes:
    srl1:
      kind: nokia_srlinux
```

The key path follows the same precedence levels as other credentials (`nodes`, `groups`, `kinds`, `defaults`), resolves relative paths from the topology file location, expands `~`, and quotes paths with spaces in the rendered SSH config.

Thanks @mvanhorn #3241

## Documentation refresh

The documentation toolchain moved to Zensical while keeping the existing `mkdocs.yml` configuration. Local docs development still starts with `make serve-docs`, and the home page, tags, navigation, and several example pages were refreshed to match the new engine.

Thanks @FloSch62 #3242 #3245 #3246

## Miscellaneous

- SR Linux SSH public key provisioning now respects the 32-key SR Linux limit, logs a warning when more keys are discovered, and chooses the retained keys deterministically. Thanks @mvanhorn #3239
- `containerlab graph` now skips non point-to-point links instead of panicking on single-endpoint links such as `dummy`. Thanks @mvanhorn #3244
