# Changelog All notable changes to this project will be documented in this file. In-app What's New reads [WHATSNEW.md](WHATSNEW.md). The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] ## [0.9.2] - 2026-11-02 ### Added - **View -> Full screen** or **F11** fills the display; **Escape** leaves full screen. Full screen is not restored on the next launch. - **Settings -> Screen saver** enables a bubbles overlay after idle minutes while full screen. The console stays readable under the bubbles. Any mouse or key press clears the overlay without leaving full screen. ### Changed - AppStream screenshots stay on tag `v0.8.6`, where those images are stored. The `0.9.2` release entry points at this version's changelog. ## [0.9.1] - 2026-10-31 ### Added - The cluster catalog can collapse to a narrow rail labeled Connections, the same way the details pane and overview chat collapse. Opening it restores the previous width. The choice is saved with the layout. ### Changed - The Linux Flatpak no longer ships kubelogin. Download CLI installs kubelogin into the app the same way as gcloud, az, aws, oci, doctl, and ibmcloud. - Overview charts show node usage from metrics-server first. The full pod list and the issues lists refresh less often when the app stays open. - AppStream screenshots stay on tag `v0.8.6`, where those images are stored. The `0.9.1` release entry points at this version's changelog. ### Fixed - The Cloud window no longer says the Flatpak bundle includes doctl and kubelogin. Download CLI installs both. - While a resource watch is live, the app no longer lists every pod and ReplicaSet every five seconds for overview metrics. ## [0.9.0] - 2026-10-21 ### Added - S3 Browser, under Longhorn, opens the default backup target and any other S3 targets. The bucket list shows every bucket those credentials can see, and the backup bucket opens first. New bucket creates one. Delete bucket removes a bucket and everything in it. A bucket used by a Longhorn backup target cannot be deleted. Add a target to write the Longhorn backup target and its credential secret. The browser opens folders, uploads and downloads files and folders, creates a folder, renames, copies, deletes, and edits a small text object in its own window. - Longhorn volumes use the same columns as the Longhorn UI, with attachment shown as Volume and Node. Name stays the technical Longhorn name. Volume is the PersistentVolumeClaim name. Columns: State, Name, Size, Actual Size, Created, Data Engine, PV/PVC, Namespace, Volume, Node, Schedule, and Last Backup At. State is colored by health. PV/PVC shows Bound, Available, or Released, and the tip names the PV and PVC. Actual size prefers the running controller. Schedule includes recurring-job labels. The Node tip lists pods using the volume. Attach and Detach are in the footer. Attach picks a Ready Longhorn node. Detach can force a leftover ticket off the volume. Schedule backup creates a periodic backup job for the selected volumes. Backups lists each volume in the backup target, matching the Longhorn UI, because Longhorn does not keep a Backup object per copy. Delete removes that volume's backups. Recurring jobs lists every Longhorn schedule, and the hint explains when to use Backup, Snapshot, Snapshot Delete, Snapshot Cleanup, Filesystem Trim, and System Backup. State is Running while a run is in progress, Failed when the latest run failed, and Idle when nothing is running. Last Successful Run is when the job last finished without error. Run now starts the selected job immediately, and does not start another while a run of that job is still in progress. Edit can rename a job. - Overview and chat call out a degraded or faulted Longhorn volume that is still attached, including a failed or stopped replica of it, beside a detached volume for the same PVC or one restored from that volume's backup. That is usually a leftover from backup or a reinstall. Detach the leftover, then attach the new volume. Do not delete the new volume. If detach leaves it attached, detach again with force. Chat can do those two steps after you approve them. - Connections can add Google Kubernetes Engine, Azure Kubernetes Service, Amazon EKS, Oracle Kubernetes, DigitalOcean Kubernetes, and IBM Cloud Kubernetes from a separate Cloud window. Sign in with that provider's CLI first. The window runs the CLI, which writes the API server, certificate, and login. Add still writes a token, certificate, username and password, or an exec plugin when you already know the API server. The CLI must be on PATH. The Linux Flatpak ships kubelogin inside the bundle. On Linux, Download CLI installs gcloud and gke-gcloud-auth-plugin, az, aws, oci, doctl, or ibmcloud into the app and puts them on PATH, so a token refresh runs inside the sandbox. Published checksums are checked. The AWS CLI zip is checked with the AWS CLI public key. IBM publishes no checksum, so that archive is taken only from download.clis.cloud.ibm.com. A CLI installed on the host still cannot be started from Flatpak. ### Fixed - A System Backup job shows Volume backup policy in the creation window: If not present, Always, or Disabled. The choice is no longer applied as If not present without being on the form. The task list is on that window too, including when the job is created from a volume. - A truncated `settings.json` no longer crashes the app when the file changes. The unreadable file is kept beside it as `settings.json.corrupt-*`, and the app continues. Settings are replaced as a whole file so a save is not a partial write. ### Changed - AppStream screenshots stay on tag `v0.8.6`, where those images are stored. The `0.9.0` release entry points at this version's changelog. ## [0.8.9] - 2026-10-09 ### Changed - About, What's New, the log window, and the crash dialog come from the MaksIT.Core.UI package. Crash text and the screenshot-tour flags come from MaksIT.Core.Desktop. - The README and the Microsoft Store listing use the current screens: deployment pods, Helm history, Dapr sidecars, Longhorn volumes, and node images. The listing text matches Helm history, overview chat, Longhorn, CloudNativePG, and a username-and-password context. - AppStream screenshots stay on tag `v0.8.6`, where those images are stored. The `0.8.9` release entry points at this version's changelog. ## [0.8.8] - 2026-10-06 ### Fixed - A ControllerRevision opens in the details pane. Its data is a snapshot, so each value is shown as text. A ConfigMap or Secret whose values are strings stays as it is. ### Changed - The screenshot tour saves every visible detail tab: YAML, events, related pods, logs, and terminal. Chat is left out. Data, Helm values, secret and ConfigMap YAML, Dapr component YAML, and Helm manifests are blurred in the PNG. A details load that fails during the tour no longer closes the app. - AppStream screenshots stay on tag `v0.8.6`, where those images are stored. The `0.8.8` release entry points at this version's changelog. ## [0.8.7] - 2026-10-05 ### Added - When Settings -> AI is on, Chat sits on the cluster overview beside Errors and Warnings. Analyze issues asks which objects are still failing and which events are leftover after the pods recovered. Those warnings and errors go with the question. ### Changed - The details pane, and the overview chat, can collapse to a narrow rail. The rail reads Chat on the overview and the current kind elsewhere. Opening it restores the previous width. The choice is saved with the layout. - The Linux Flatpak sandbox no longer requests pulseaudio. The app has no audio. `--share=network` still uses this computer's network, including localhost, so a local cluster API, local Ollama, and a port-forward opened in the browser stay reachable. A kubeconfig login that starts `aws`, `gcloud`, or `kubelogin` cannot start that program from the sandbox. A certificate or token in the kubeconfig is enough. The README and AppStream say so. - AppStream screenshots stay on tag `v0.8.6`, where those images are stored. The `0.8.7` release entry points at that version's changelog. - Flathub verification uses the token from the developer portal. The well-known file does not list the application id. ## [0.8.6] - 2026-10-03 ### Added - When AI is on, the drain dialog includes a short note: whether it is safe to continue, which pods will move, and which stay. The note does not drain the node. Cancel still leaves the node as it is. ### Fixed - A resource list that the API answers with Too Many Requests, including while storage is still initializing, is retried. The wait uses `retryAfterSeconds` when the response includes it. If the list still fails, the message says the cluster is still preparing that list. ### Changed - Cordon and Drain stay hidden unless another Ready node can still take pods. A single-node cluster has neither. Uncordon still restores a node that is already cordoned. - The README and the Microsoft Store listing describe that rule and the drain note. - README screenshots are the captures in `assets/screenshots`. AppStream uses those images. The earlier `assets/images` set is removed. - The window footer is a separate control. Each window supplies its own buttons and fields. - The main window only switches surface. Cluster overview, workloads, the resource table, and each detail tab are their own views. - Helm, Dapr, applications, drain preview, and cluster issues are loaded by their own readers. Port-forward and shell streams open on their own connection types. List, get, apply, and delete stay on the cluster session. - Saved settings keep the same JSON keys. Layout, local AI, and port-forwards are read as their own sections. ## [0.8.5] - 2026-10-01 ### Added - Helm Charts lists each chart version installed in the cluster, from the release secrets, instead of an empty page. - Helm releases show revision history, user-supplied values, the rendered manifest, and a diff between two revisions. - Drain asks before it changes the node. The dialog is a table: teal Will move, amber Will remain, including anything a PodDisruptionBudget would refuse. Long text wraps and the row grows. Drain continues only after you accept. Cancel leaves the node as it is. A denied eviction is not deleted. - Longhorn volumes and nodes, and CloudNativePG clusters, appear in the navigator when those APIs are installed. - Cluster issues include LoadBalancer services that are pending or unreachable, and PersistentVolumeClaims that are Pending. - Hint explains the kind on screen. After an upgrade, What's New lists additions since the version you last opened. ### Changed - The README and the Microsoft Store listing describe the console's actions, larger local Ollama models for repairs, and cluster changes that wait for approval. - The catalog radio writes kubectl `current-context` for the command line. This app connects the row you click and does not read that field. ## [0.8.4] - 2026-09-30 ### Added - Flathub submission documents are in `packaging/flathub`. - Microsoft Store text for the `runFullTrust` capability is in `packaging/microsoft-store/restricted-capabilities.md`. ### Changed - Client and UI code is grouped by area: cluster session, kubeconfig, terminal, charts, editor, grid, and the shell, connection, and storage windows. - AppStream includes screenshots, an age rating, and the kubeconfig step after install. ## [0.8.3] - 2026-09-29 ### Added - Pod Terminal opens a live shell. Attach follows a container's output. Debug adds an ephemeral container. - Deployments, StatefulSets, and DaemonSets can pause, resume, show rollout history, and undo. - PersistentVolumeClaims can be resized. Storage classes and volumes can switch reclaim policy between Delete and Retain. A class change is delete-and-recreate; the dialog explains the gap for new claims. - Certificate signing requests can be approved or denied. A ServiceAccount token is created and shown once. - Node details include an Images tab. Cached images are marked Used or Unused from the pods on that node. - The navigator adds admission policies, CSI objects, API services, flow schemas, priority levels, and dynamic resource allocation types. Custom resource tables use the CRD `additionalPrinterColumns`. - A list can send a label selector with the API request. - YAML apply falls back to create or replace when the API server rejects an apply patch. - Settings -> AI sets the local Ollama endpoint and model. Chat stays read-only unless the agent is enabled; restart, pod delete, scale, and apply then wait for a confirmation. - Help -> About shows the product, license, and contact. ### Fixed - YAML highlighting covers the whole document. Long values no longer drop color partway through a line, and later lines stay colored when you switch resources or open the YAML tab. ### Changed - The README lists every feature under Features. Screenshots stay with the features that have one. - Microsoft Store product features and the listing description match that list. ## [0.8.2] - 2026-09-28 ### Added - Microsoft Store package is a full-trust x64 MSIX (`MAKS-IT.ClusterConsole`). The WiX setup exe remains the GitHub installer. The MSIX is not a GitHub release asset. ## [0.8.1] - 2026-09-27 ### Fixed - Windows setup keeps a single desktop shortcut across upgrades. An icon that is already there stays when the checkbox is off, and a checked box no longer leaves a second `.lnk` or a `(2)` copy. ## [0.8.0] - 2026-09-26 ### Added - Help -> Logs shows the app log and crash reports, and an unhandled error opens a copyable debug window instead of closing the app. - YAML view, volume files, and ConfigMap/Secret values highlight as JSON or YAML. A data key or file name uses its extension (`.json`, `.yaml`, `.yml`); a key without one stays plain. The resource YAML tab is always YAML. - Services table includes Status: Active when the load-balancer address is assigned, Pending when none is set, and Unreachable when a BGP or requested address is not the one in `status.loadBalancer.ingress` (or Cilium IPAM reports it unsatisfied). ### Fixed - Applying YAML for a LoadBalancer service (for example a Cilium BGP service whose `last-applied-configuration` annotation contains a newline) no longer crashes. Multiline and quoted strings are written as valid YAML. ## [0.7.0] - 2026-09-12 ### Added - macOS GitHub Release assets for all Macs: `osx-arm64` (Apple Silicon) and `osx-x64` (Intel) DMGs, built on `macos-latest` when a release is published. Unsigned until Apple notarization (first launch: Open from the context menu). ### Changed - Linux Flatpak app id is lowercase `com.maks_it.clusterconsole`. Uninstall the old `com.maks_it.ClusterConsole` id before installing a new bundle. AppStream and the desktop file live in `data/`. Avalonia 12.1.2. ### Fixed - Linux Flatpak GNOME app icon uses X11/XWayland (`UsePlatformDetect` only). Avalonia 12.1.2 native Wayland still hangs on GNOME `xdg_toplevel.configure(0, 0)`. - Flatpak AppStream version is the same shared release version as zip and MSI (`DotNetReleaseVersion` from the UI csproj / `Directory.Build.props`), so `flatpak info` matches the bundle file name. ## [0.6.2] - 2026-09-03 ### Changed - Operator settings (layout, port-forwards, Chat) are written to `%AppData%/MaksIT/Cluster Console/settings.json` (WiX `installFolderName`). Shipped `appsettings.json` next to the exe keeps host logging only; a leftover `Configuration` block is copied once into the user file. - Synced RepoUtils: ContainerRegistry JSON catalog (PascalCase Harbor / InCluster keys) and `RepoUtilsSecrets` pack slots instead of per-plugin `*Secret` env names. ## [0.6.1] - 2026-08-30 ### Changed - Windows setup is per-machine: install path `C:\Program Files\MaksIT\Cluster Console`, Start Menu folder **MaksIT**, shortcuts named **Cluster Console**. The bootstrapper install-folder box expands Program Files instead of showing a raw `[ProgramFiles6432Folder]` token. ## [0.6.0] - 2026-08-30 ### Fixed - Footer actions that can run independently now apply to every selected table row (Restart, Scale, Delete, Force delete, Force delete namespace, Cordon, Uncordon, Drain, Trigger, Stop port-forward), not only the current row. ### Changed - Dark UI uses the MAKS.IT origami blues (`#33A5CF` highlight, `#006199` accent). Window/installer/Flatpak icon is a faceted cluster of nodes with a console chevron (not the brand M). GitHub release assets are siblings: portable `maksit-cluster-console-{version}.zip` (win-x64 only), Windows setup `maksit-cluster-console-{version}.exe`, and `maksit-cluster-console-{version}.flatpak`. The installer and Flatpak are not packed inside the zip. On Windows the Flatpak bundle is built via WSL Debian. ## [0.5.1] - 2026-08-24 ### Added - Release packaging can resolve enabled plugin `*Secret` values from **MaksIT Vault** when `useVault` is set in `scriptSettings.json` (PowerShell module or HTTP API; `Shared` application fallback). ### Changed - Copying resource-table rows includes column headers, so Ctrl+C pastes into Excel as a TSV table. ### Fixed - Copying resource-table rows no longer pastes empty quoted cells after CPU/memory tooltips moved columns to templates. ## [0.5.0] - 2026-08-22 ### Added - **Applications** table shows live **CPU** (% of cluster allocatable) and **Memory** (k8s `Mi`/`Gi`) from summed pod metrics when metrics-server is available. - **Deployments**, **StatefulSets**, and **DaemonSets** tables include **CPU** and **Memory** columns (millicores / `MiB`, summed from owned pods). - Applications metric **tooltips**: CPU in millicores; memory as `MiB` plus rounded `MB`. - Applications pod attribution matches instance labels, direct workload owners, and **ReplicaSet -> Deployment** owners. - Transient Kubernetes API errors (for example HTTP/2 `ResponseEnded`) retry automatically; the client uses HTTP/1.1 for list traffic. ### Changed - Applications memory uses k8s compact units (`512.0MiB`, `<1Mi`) instead of Task Manager `MB` labels; CPU stays as cluster %. - DataGrid row separators, headers, and zebra rows are tuned for the dark theme (less harsh white lines). ### Fixed - Pod metrics memory was misread when stored as `MiB`-style strings, which made Applications **Memory** show `0 MB` while CPU looked correct. - Pod metrics now sum **all** container usages in a pod (not only the last container). ## [0.4.2] - 2026-08-21 ### Fixed - Switching kubectl current-context only patches `current-context` and never writes sibling `config.bak.*` files (Lens treats those as extra kubeconfigs). Blank cluster/user names reuse existing context entries (or match the context name) instead of creating `{name}-cluster` / `{name}-user` orphans. Structural kubeconfig saves also skip `.bak` siblings for the same reason. - ConfigMap and Secret Data editors accept multiline values and multiline paste via a dedicated value box under the key list. ## [0.4.1] - 2026-08-21 ### Fixed - Staying on Pods (or any resource table) now picks up cluster changes on the automatic refresh. The grid previously only updated after leaving and returning to the view. - Logs **Follow** tails new pod lines instead of hanging on the snapshot request, and turning Follow off no longer races the live stream into the log text. ## [0.4.0] - 2026-08-20 ### Added - Resource table column filters, row sort, widths, and search are stored per cluster in `appsettings.json` (`Configuration:Layout:Tables`). ### Fixed - Switching clusters no longer resets table column filters or sort order. ## [0.3.0] - 2026-08-20 ### Changed - Catalog radios set kubectl current-context. The asterisk marker and Connections **Use for kubectl** button are gone. ## [0.2.1] - 2026-08-20 ### Fixed - Resource table IP columns (**Cluster IP**, **External IP**) sort as addresses, not text (`10.1.1.2` before `10.1.1.10`). ## [0.2.0] - 2026-08-20 ### Added - Status-bar messages for port-forward start, stop, restore, and failure. - Local / Remote labels on the port-forward bar so the two port fields are explicit. - Rebind the host port of an existing forward from **Network -> Port Forwarding** (Local field + Rebind). - Double-click a live port-forward in **Network -> Port Forwarding** to open `http://127.0.0.1:{local}` in the default browser. ### Changed - Active port-forwards are listed in **Network -> Port Forwarding** (stop from the table). They are no longer shown in the status bar. - Resource table footer, YAML/Data edit bars, and workload limit apply buttons show only for a selected row that can use them. Empty toolbars are hidden. - Enabled port-forwards are saved in `appsettings.json` (`Configuration:PortForwards`) and restored when a cluster reconnects. ### Fixed - Service port-forward resolves a backend pod from `spec.selector` and maps the service port to `targetPort`, matching kubectl. - Service related-pods follow `spec.selector` only, so Helm siblings (for example Longhorn CSI vs UI) are not mixed; named `targetPort` is resolved on a pod that actually declares it. - Port-forward tunnels use the Kubernetes port-forward multiplex protocol (`StreamType.PortForward`, channel 0, one stream per local connection) instead of exec stdin/stdout. - Port Forwarding **Remote** is the requested service/pod port (for example `80`), not the mapped container port (`8000` for Longhorn UI). Open `http://127.0.0.1:{local}`. - Port-forward listens on both IPv4 and IPv6 loopback so `localhost` works on Windows. The IPv6 listener is IPv6-only so it does not collide with IPv4 on Windows. - Port-forward opens multiplex streams before starting the demuxer, then copies with blocking socket I/O, matching the Kubernetes C# client port-forward example. - Persisted port-forwards re-resolve a Running pod by Service/workload owner or stable labels after replica recreation, including on each new local connection. ## [0.1.1] - 2026-08-19 ### Fixed - Release engine reads `` from `src/Directory.Build.props` when the UI csproj has none. - Warnings no longer treat k3s `EtcdIsVoter=True` as unhealthy; only `False` (learner / non-voter) is raised. ## [0.1.0] - 2026-08-19 ### Added - First public release of **MaksIT.ClusterConsole**, an Avalonia Kubernetes desktop console (catalog, navigator, tables, YAML apply, logs, exec, port-forward), licensed under **Apache 2.0**. - Cluster access through the official **KubernetesClient** and the same kubeconfig/RBAC as kubectl, including an in-process connections editor. - Helm releases, Dapr CRDs, Applications view, force-delete, volume file browse, resource-limit patches, and a read-only local Ollama **Chat** tab. See [README.md](README.md) for the full feature list.