v0.15.0

psviderski/uncloudv0.15.0Dec 12, 2025by psviderski

AI Summary

Major release featuring service logs streaming, new service management commands, SSH CLI connection mode, interactive cluster connection selection, HTTP/3 support, and various improvements.

Key Highlights

  • Service logs streaming with 'uc logs' command
  • New service commands: 'uc ps', 'uc start', 'uc stop'
  • SSH CLI connection mode (ssh+cli:// scheme)
  • Interactive cluster connection selection ('uc ctx connection')
  • HTTP/3 support via Caddy exposing UDP port 443

New Features

  • 'uc logs' command streams logs from service containers across all machines
  • 'uc ps' command displays all running containers in the cluster
  • 'uc start' and 'uc stop' commands for service management
  • ssh+cli:// connection scheme using system's SSH client
  • 'uc ctx connection' interactive selector for cluster connection
  • HTTP/3 (QUIC) protocol support via Caddy
  • New shorter managed DNS domain (.uncld.dev)
  • --context flag is now a global option
  • Unix domain socket connector for local daemon connections
  • Machine ID stored on connection entries for automatic cleanup
  • IP ADDRESS and CREATED columns added to 'uc ps' output

Full Release Notes

This release features **4 weeks of work** from **6 contributors**. It brings service logs streaming, new service management commands, SSH CLI connection mode, interactive cluster connection selection, HTTP/3 support, and various improvements and bug fixes.

## ✨ Highlights

### Service logs streaming

PR: #196
The new `uc logs` command streams logs from service containers across all machines in the cluster. Logs are merged from all replicas with colored output, strict timestamp ordering, and service/container identification.

You can filter logs by machine using `-m/--machine`, follow mode with `-f`, and time ranges with `--since`/`--until`.

Running `uc logs` without arguments streams logs from all services defined in the local Compose file.

<img width="2202" height="893" alt="Screenshot 2025-12-01 at 9 45 23 pm" src="https://github.com/user-attachments/assets/646b17b3-54a4-4c32-b6ad-51857a871fd5" />

### New service commands

PRs: #165, #195. Thank you @jabr for the contribution! ❤️

- The `uc ps` command displays all running containers in the cluster with service name, machine, state, health status, IP address, and creation time. You can sort containers by service, machine, or health status using the `--sort` flag.

   <img width="1467" height="883" alt="Screenshot 2025-12-12 at 10 40 07 pm" src="https://github.com/user-attachments/assets/1708e342-9524-4275-a9c2-5902429c4568" />

- New `uc start` and `uc stop` commands allows starting and stopping all containers of the specified services across cluster machines. The stop command supports `--signal` and `--timeout` options for graceful shutdown control.

### SSH CLI connection mode

PRs: #152, #173. Thank you @luislavena for the contribution! ❤️

A new `ssh+cli://` connection scheme allows using the system's `ssh` (OpenSSH) CLI client instead of the native Go implementation of the SSH protocol for connecting to cluster machines. This makes it possible to init machines in private networks via `ProxyJump`, use hardened SSH agents like 1Password or Yubikey, and use existing custom host configuration from your `~/.ssh/config`.

If `ssh <target>` works from your terminal, then `uc machine init/add ssh+cli://<target>` should also work.

We will make this connection mode the default after addressing the edge case of removing machines when using the `ssh+cli` scheme.

### Interactive connection selection

PR: #170. Thank you @jabr for the contribution! ❤️

The new `uc ctx connection` command provides an interactive selector for choosing the preferred cluster connection among multiple configured ones.

<img width="374" height="193" alt="Screenshot 2025-12-12 at 10 42 26 pm" src="https://github.com/user-attachments/assets/ef29c984-b0ee-42a4-9fc2-3dbea7e6a1bf" />

### HTTP/3 support

PR: #204. Thank you @z0rrn for the contribution! ❤️

Caddy (reverse proxy) now exposes UDP port 443 for HTTP/3 (QUIC) protocol support, enabling faster HTTPS connections for supported clients.

### New managed DNS domain

Free managed DNS subdomains now use the new shorter `xxxxxx.uncld.dev` domain instead of `xxxxxx.cluster.uncloud.run` to separate the main project domain ([uncloud.run](https://uncloud.run/)) from the user cluster's domains. See [tweet](https://x.com/psviderski/status/1999109801616523715) for more details. Existing subdomains will continue to work.

You can run `uc dns release && uc dns reserve` to release your old subdomain and reserve a new one under `uncld.dev`.

## Improvements

- `--context` flag is now a global option available on all commands (#174)
- Unix domain socket connector for local daemon connections (#186)
- Machine ID stored on connection entries in `~/.config/uncloud/config.yaml` for automatic cleanup when removing machines (#182)
- Services sorted by name in `uc ls` output
- `IP ADDRESS` column added to `uc ps` and `uc inspect` output
- `CREATED` column added to `uc ps` with fallback sorting by creation time
- Machine install.sh script supports `INSTALL_ONLY` mode to skip daemon setup (#194)
- `uc --help` output shows links to documentation and Discord
- Minor documentation updates and improvements

## Bug fixes

- Fixed volume driver options not being used when driver is not explicitly specified (#211)
- Fixed new Compose deployment with volumes and `--recreate` flag (#176)

## Upgrade to 0.15.0

### Uncloud CLI locally

To upgrade the Uncloud CLI (`uc`) locally:

```bash
# Homebrew (macOS, Linux)
brew upgrade uncloud

# Install script (macOS, Linux)
curl -fsS https://get.uncloud.run/install.sh | sh
```

### Machine daemon

To upgrade the Uncloud daemon on your machines, run the following commands on each machine:

```bash
# AMD64
curl -fsSL -o uncloudd.tar.gz https://github.com/psviderski/uncloud/releases/download/v0.15.0/uncloudd_linux_amd64.tar.gz
# ARM64
# curl -fsSL -o uncloudd.tar.gz https://github.com/psviderski/uncloud/releases/download/v0.15.0/uncloudd_linux_arm64.tar.gz
tar -xf uncloudd.tar.gz
sudo install uncloudd /usr/local/bin/uncloudd
rm uncloudd uncloudd.tar.gz
sudo systemctl restart uncloud
```

## Changelog
* 3c339732691da4c7e15488c3d07e227a6ea1e048 chore(exec): Update TODO regarding signal forwarding
* 596bc561b8ad95739413d63c570b6a6ae5f7ad22 chore: 'uc stop' - make --timeout default explicit, update flag and long descriptions
* bc65c73c512871753e1507ae7db29759f3a021f5 chore: add CREATED column to 'uc ps', fallback sorting by CREATED
* 05c8117f7b527bb397476377014f7cef276921f0 chore: add redirect from uncloud.run/discord to discord invite
* e30ea89990602a8983da1bf3f09a73cf9b648827 chore: enable CGO to be able to build fsevent required by updated compose on macOS
* 2e655d870cef27fcead3da36c39016b71e36e1e2 chore: extract version from latest redirect in install_cli.sh (#180)
* e87207eae34dfef8cc4a3a4f6f92f772bc39c164 chore: fix landing logo shadow
* f215fae6c7b8c475f85350e7109e9b1eed056633 chore: group deploy and service management commands in uc --help
* 44330950457af69f323b873ade7291b7969f8671 chore: show links to docs and Discord for the root 'uc --help' command
* 95afc7f289f63f231069d1fb1651730b31d11064 chore: sort 'uc inspect' containers by CREATED
* 3fbba6d540aae99ebaa2e67ee154247ee1bbc97d chore: sort services in 'uc ls' output by name
* 30193773104cce56ed4528f86b4c0f90bc344052 chore: update logo for docs
* 53def3a624b8418fa5ba2c34b05d2cdccd903d44 chore: update white color in logo-title-dark.svg
* bf65fbaca5501d903ddf0b81b106f31933bcc09e feat --utc flag for 'uc logs' command to print timestamps in UTC
* 234985b57dc230cf90eca06d6c46e9f144e50923 feat(install): Add install-only mode to the install script (#194)
* eea81723b818337b9624eb0fb92d87cdac64083f feat(ssh+cli): Support SSH CLI on machine init and add commands (#173)
* 4b4b721d4935c4a9b135164469e69f722c319e08 feat(uc/caddy): expose 443/udp port for HTTP3 (#204)
* 27cfe1c4f3fa20e60b814beba347d1d74da0b7ea feat: 'uc logs' without argements streams logs for services in the local Compose file
* a9a720f3c3b82bdbf3e7147990fd9b076bcd29d7 feat: Add `uc service start/stop` commands (#195)
* 1d413734d8e8f9f9058ab82a4d4c49ef46b4e8a1 feat: Interactive 'uc ctx connection` command to select preferred cluster connection (#170)
* 91a09d5d37b62f98f592b152e8f7ec69111ea668 feat: add CLI connector for unix domain socket (#186)
* cb0df2169f773b1f44506e6cf8ddb23aa62d4e51 feat: add IP ADDRESS column to 'uc ps' and 'uc inspect'
* d89bfb8e037b74a7f70ac050a75ccf766565c71d feat: add `uc ps` command to list all containers in the cluster (#165)
* 79dc05cb665d6541ea2ff1ca16af4119ae6b47d4 feat: service logs command to stream service logs (#196)
* 76b4369aa670ff4281629daaaa2ec76d22159e59 feat: store machine id on connection entries in Uncloud config so it can be removed with machine (#182)
* 1e6aaf451e431d3bc43f8d05f3d36d74f27ddccb feat: support filtering service logs by machine (-m/--machine)
* 796363f23cccd4ac7cb25aa57ada918fc438be37 fix: TestCollectContainers unit tests
* 57205e1149f9733f9cbbf8ab5782c7ec1ce593b3 fix: new Compose deployment with volumes and --recreate flag (fixes #176)
* 6373d4097ce9c5a63ee81bc2ea6dce5de3064098 fix: volume driver options are not used if driver if not specified [bug #210] (#211)
* f6d75d507cacf22b1eff57e4dc17d76ef84b62c7 lint
* ebd4622592bcecedbc51ad653513d91f43ef124e lint
* 939645e1441a2e348445bb0e347b5b1ba377ebc1 refactor: Make `--context` cli flag a global option (#174)
* 75085b3929ef920e9954be880ebfd99e3b379e2d refactor: Simplify dns e2e test using new ExecContainer functionality (#178)
* 6a1cd7bf87665d45a2f3bb7dcee6233c2c75f36c refactor: replace loadProjectFromContent with compose.LoadProjectFromContent