# Workshop and SDKcraft 0.9.3 release notes

## 6 July 2026

These release notes cover new features and changes in Workshop and SDKcraft 0.9.3.

## Requirements and compatibility

Workshop relies on Snap and LXD:

- See the [Tutorial](https://ubuntu.com/workshop/docs/tutorial/) for setup instructions.
- Refer to the [Contribution Guide](https://ubuntu.com/workshop/docs/contributing/) for development prerequisites.

## What’s new in 0.9.3

Workshop and SDKcraft 0.9.3 rework the workshop boot process in preparation for
VM support, give every workshop a `*.wp` hostname, and add `productid` and
`vendorid` attributes to the `custom-device` interface. The release also improves
onboarding when LXD is missing or outdated, adds storage pool monitoring, reports
where `sdkcraft whoami` stores its token, and ships v1 of the Workshop GitHub
Action.

### Workshop

**Repository:** [https://github.com/canonical/workshop](https://github.com/canonical/workshop)

- Reworked the workshop boot process in preparation for VM support. The machine
  ID and SSH host keys now persist across refreshes, and Workshop no longer uses
  SFTP to change the instance filesystem during launch or refresh, which should
  resolve a recurring LXD bug with busy ZFS volumes.
- Gave every running workshop a `*.wp` hostname in the `workshop info` output.
  When the preferred hostname is unavailable, the explanatory note is now
  simplified to `hostname-fallback` (the `workshopd` log has more details).
- Added `productid` and `vendorid` attributes to the `custom-device` interface
  (community contribution).
- Improved onboarding for users with no LXD or an older LXD installed. Error
  messages are now actionable, and `workshopd` enters a degraded state that
  recovers without a daemon restart after LXD is installed, refreshed, or
  restarted.
- Added storage pool monitoring that proactively moves the daemon into a degraded
  state and returns an actionable error message, preventing “out of space”
  failures.
- Added and expanded documentation on runtime hooks, plugs, and slots, and
  updated it to reflect recent changes to the CLI structure, output, and
  hostnames.

### SDKcraft

**Repository:** [https://github.com/canonical/sdkcraft](https://github.com/canonical/sdkcraft)

- Added `productid` and `vendorid` attributes to the `custom-device` interface.
- `sdkcraft whoami` now reports where its token is stored: the keyring, a file,
  or in memory.

### Reference SDKs

**Repository:** [https://github.com/canonical/reference-sdks](https://github.com/canonical/reference-sdks)

- Published the reference SDKs under the official Canonical account.
- Reworked and published the `hermes-agent` SDK.
- Updated the `flutter` and `direnv` SDKs to support the `ubuntu@26.04` base and
  added tests.
- Added optional desktop-interface support for opencode users, enabling clipboard
  support when the terminal emulator does not provide it.

### Workshop GitHub Action

**Repository:** [https://github.com/canonical/launch-workshop](https://github.com/canonical/launch-workshop)

- Released v1 of the Launch Workshop action to the
  [GitHub Marketplace](https://github.com/marketplace/actions/launch-workshop).
- Replaced the `token` and `version` inputs with `channel` and `revision` inputs
  for retrieving the Workshop snap:
  ```yaml
  - uses: canonical/launch-workshop@v1
    with:
      workshop: ${{ matrix.workshop }}
      cache: |
        uv:cache

  - run: workshop run "$WS" unit-tests
    env:
      WS: ${{ matrix.workshop }}
  ```

---

**Full Changelog**:

- Workshop: [https://github.com/canonical/workshop/compare/v0.9.2…v0.9.3](https://github.com/canonical/workshop/compare/v0.9.2...v0.9.3)
- SDKcraft: [https://github.com/canonical/sdkcraft/compare/0.1.14…0.9.3](https://github.com/canonical/sdkcraft/compare/0.1.14...0.9.3)
