Repository navigation
Releases: Dangalcan/shoal
Releases · Dangalcan/shoal
Release list
0.9.1
Same-day follow-up to 0.9.0: the Linux package pulls in the libraries it
needs, plugin permissions are split, and plugin secrets rest on the OS
keystore.
Changed
- Plugin permissions are split.
kubernetesnow only grants reads (list,
get, describe, YAML, logs, metrics, watches and resource events);
kubernetes:writeis needed to create, update or delete resources, save or
apply manifests and run commands in pods,helmfor every Helm call, and
secretsto receive the data of Secrets. Withoutsecrets,getResources,
getResourceYaml, watches and resource events hand plugins Secrets without
data,stringDataand the last-applied annotation. Plugins that change
the cluster must declare the new permissions; the bundled examples only
read and keepkubernetes.
Removed
- The
filesystem,networkandnotificationsplugin permissions, which
never gated anything (notifications belong toui). A manifest that names
them is rejected with the list of valid permissions.
Fixed
- The
.debdeclareslibasound2 (>= 1.0.17)(ALSA) andlibgbm1(Mesa
GBM) as dependencies, soapt installpulls them in on WSL, containers
and other minimal systems, where Shoal failed to start with
libasound.so.2orlibgbm.so.1missing. The package used
electron-builder's default dependency list, which lacks both although
Electron links them. On Ubuntu 24.04libasound2is a virtual name and
the version makes apt chooselibasound2t64rather than the OSS
compatibility shim that also provides it. The AppImage still needs the
system's libraries.
Security
- Plugin license keys and
secret: truesettings inplugin-config.json
are encrypted with a random key that the OS keystore wraps through
ElectronsafeStorage(DPAPI on Windows, Keychain on macOS, libsecret or
KWallet on Linux), stored owner-only in.encryption-keynext to the
config. Values written by earlier versions, whose key derived from the
machine id and a salt stored next to the data, still load and are
re-encrypted with the new key on the next save. Without a keystore (Linux
without a keyring) the machine-bound key stays in use and the log says so.
0.9.0
First public release, for Windows and Linux. Installers are not code-signed
yet, so Windows SmartScreen shows a warning on first launch.
Added
- An application menu, shown with Alt: zoom (Ctrl +, Ctrl −, Ctrl 0), full
screen (F11), reload, and a Help menu with the user guide, a new GitHub
issue, the logs folder and the About box. The window remembers its size,
position and maximized state. - Cluster management for local clusters created with kind or k3d, and any
kubeconfig context. - Dashboard with the active context summary, the state of Docker and Podman
and the widgets of the enabled plugins; light and dark theme. - Resource browser for the core resource kinds (workloads, networking,
configuration, storage, RBAC, cluster objects) with namespace filter,
sortable columns and a column picker, describe, YAML and recent logs,
rollout restart, scaling and deletion. Settings hold the default
namespace and the auto-refresh interval. - Live log streaming. Follow in the log viewer streams new lines as the
pod writes them (kubectl logs -f, starting from the last 200 lines), for
the container chosen in the picker. The view scrolls with new lines while
it is at the bottom and pauses when you scroll up to read, with a button to
jump back to the latest line; the footer tells a snapshot from a live
stream. The viewer keeps the last 5,000 lines. When the stream stops on its
own (container stopped, pod deleted, kubectl error), a banner shows
kubectl's reason and a Reconnect button. Streams stop when the viewer
closes, the pod or container changes, Follow is turned off or the window
reloads, and every kubectl process ends with Shoal. - Manifest library with folders, templates, file import and one-click apply.
- Docker Compose to Kubernetes migration through kompose.
- Local terminal and pod exec sessions, and port-forward management.
- Sandboxed plugin system with two signed example plugins, Namespace Watcher
and Resource Monitor, enabled on first run. - Auto-update from GitHub Releases for the Windows installer and the AppImage.
- Guidance when kubectl, kind, k3d or Docker is missing, with install links
and a re-check button. On Windows the re-check also picks up tools
installed while Shoal was running (it re-reads the registryPATH). - A custom kubeconfig path set in Settings is remembered across restarts.
- Local error log for the main process and the UI, and an About & Support
card in Settings with the version, an update check, the logs folder and a
prefilled GitHub issue. Nothing is sent anywhere. - Installers ship
LICENSE.txt,COPYRIGHT.txtandTHIRD_PARTY_NOTICES.txt
with the license texts of every bundled open source package.
Changed
- Renamed from Kubernetes Desktop to Shoal (Linux Foundation trademark
guidelines), with a new app icon. - Electron 44.9.3 and Node 22 toolchain.
- The app version shown in the sidebar now always comes from
package.json. - Cluster cards show the real provider (kind or k3d, from the context name)
and no longer label every context as running. - Dependency updates before the beta. React 19.3, lucide-react 1.x (two
icons are redrawn), js-yaml 5 (still reads Compose files with the YAML 1.1
rules, so merge keys keep working) and semver 7.8, plus build and test
tooling (Vitest 5, Playwright 1.64, Tailwind CSS 4.3, Prettier 3.9).
The GitHub Actions workflows use the Node 24 releases of their actions. - The installers no longer carry a second, unused copy of the renderer
libraries (React, React Router, lucide, sonner, xterm, clsx,
tailwind-merge): Vite already bundles them, so they are build-time
dependencies now. The packed application code (app.asar) shrinks from
50 MB to 8 MB; the compressed installers lose about 2 MB. The third-party
notices are unchanged.
Fixed
- A release candidate's update check falls back to pre-releases again when
no stable release exists. electron-updater wraps the failure of its stable
lookup inside its feed-parsing error, so the check ended in an error
instead of offering the next candidate (an installed rc.4 never saw rc.5). - The Plugins page keeps its list on screen while it refreshes (a plugin
activating at start-up, Enable, Disable, Reload) instead of swapping it
for the loading spinner each time: the cards no longer flicker, and a
click on a card button that arrived during the swap is no longer lost. - A bundled plugin whose
activate()never returns (akubectlcall
against an unreachable cluster, say) is marked as errored after 30
seconds, with the reason, instead of staying "loading", and Enable and
Reload report it instead of hanging. The hook itself keeps running in the
background. - Disabling a bundled plugin stops it. Resource Monitor and Namespace
Watcher kept polling kubectl every 10 seconds after Disable, because
their deactivation hooks ran in a fresh copy of the plugin module, whose
timers were empty. The moduleactivate()ran in now serves the
deactivation hooks and plugin actions until the plugin is disabled,
reloaded or uninstalled, and a plugin that is active or still activating
is not activated a second time when start-up and an Enable click
overlap. Resource Monitor 1.1.1 no longer expects an argument in
deactivate(), which made every Disable log a failed hook. - A pre-release build moves to the stable release as soon as it is
published: the update check asks for the stable channel first and only
falls back to pre-releases while no stable release exists. - The log viewer drops a late answer from the pod opened before instead of
showing its lines as the new pod's, starts blank when the same pod is
opened on another cluster, and asks kubectl for the container shown in
the picker. Init containers appear in the picker too. - Screen readers get the names of the plugin settings fields, the shell
picker of the pod terminal, the resource filter, the Compose manifest
editor and the cluster name field; a plugin modal closes with Escape;
marketplace cards open with Space as well as Enter. - The window opens as soon as Shoal starts. It used to wait until every
enabled plugin had finished activating, and Namespace Watcher's first
kubectlcall could hold it back for up to 30 seconds when the current
context was unreachable. Plugins now activate after the window is up, one
at a time with a 5-second budget each, and the plugin list and sidebar
follow their state. - A window in the dark theme no longer flashes light while it loads, it
cannot be shrunk below 960 by 600 pixels, and a crashed window offers to
reload instead of staying blank. - Cluster details no longer alternate between a spinner and an error while
the cluster is unreachable: the last data stays on screen while a refresh
fails, and the error panel stays (with a "Retrying" hint) until a refresh
succeeds. - Namespace lists, logs, describe and YAML reads time out after 30 seconds
like the resource tables, instead of waiting for kubectl's own network
timeout. - A missing kubectl is explained once by the notice on the page, without a
second toast saying the same. - The empty cluster list and the Dashboard say where Shoal looks for
contexts (the kubeconfig) and how to point it elsewhere, and switching the
active context says that it runskubectl config use-context, so the
terminal follows. - Manifests show the database error instead of a generic message when the
library cannot be read. - The log viewer starts blank for the next pod instead of showing the
previous pod's lines while the new ones load, offers a container picker
for pods with several containers (sidecars) and a copy button. - Sortable column headers, cluster cards, the Dashboard cluster list and the
manifest drop zone work from the keyboard (Tab, Enter, Space) and announce
their sort state. - A page that throws no longer takes the sidebar with it: the error shows in
the page area and the rest of the app stays usable. - Native commands run from a Windows shell (
kubectl get pods,docker ps)
no longer print their output as a staircase: their bare line feeds return
the cursor to the first column, like PowerShell's own\r\ndoes. - Terminal output no longer splits a multibyte character (accented letters,
box drawing) across two chunks. - The main bundle no longer carries every Lucide icon for plugin resource
actions; actions pick from a named set (see the plugin guide). - Linux desktop entries carry a comment and search keywords, and
shoal --versionprints the version instead of opening a window. - The bundled example plugins no longer offer "Uninstall" (they came back
on the next launch); disable them instead. Uninstalling a plugin you
installed now also removes its stored data. - The "Update available" and "Update ready" toasts survive a renderer reload
and no longer go missing when the start-up check finishes before the
window is listening. - The
.debpackage no longer runs the updater (it was never able to update
itself); a manual check says to use the package manager instead. - Local terminal: Ctrl+C now stops the running command (
ping,
kubectl logs -f) and leaves the shell usable. On Linux the interrupt
only reached the shell; on Windows it stopped nothing at all (it looked
the command up by process name and never found it). The terminal starts
with the right line endings from the first prompt instead of being
recreated when the shell list arrives; a shell that fails to start says so
instead of hanging; open shells are closed when Shoal quits. - The YAML and Describe views clear the previous resource's text when they
open or fail to load; "Save to DB" could store the previous resource's
YAML under the new name while the new one was still loading. - The kubeconfig path placeholder in Settings matches the platform, and the
terminal font stack covers Linux and macOS instead o...
0.9.0-rc.6
First public release, for Windows and Linux. Installers are not code-signed
yet, so Windows SmartScreen shows a warning on first launch.
Added
- An application menu, shown with Alt: zoom (Ctrl +, Ctrl −, Ctrl 0), full
screen (F11), reload, and a Help menu with the user guide, a new GitHub
issue, the logs folder and the About box. The window remembers its size,
position and maximized state. - Cluster management for local clusters created with kind or k3d, and any
kubeconfig context. - Dashboard with the active context summary, the state of Docker and Podman
and the widgets of the enabled plugins; light and dark theme. - Resource browser for the core resource kinds (workloads, networking,
configuration, storage, RBAC, cluster objects) with namespace filter,
sortable columns and a column picker, describe, YAML and recent logs,
rollout restart, scaling and deletion. Settings hold the default
namespace and the auto-refresh interval. - Live log streaming. Follow in the log viewer streams new lines as the
pod writes them (kubectl logs -f, starting from the last 200 lines), for
the container chosen in the picker. The view scrolls with new lines while
it is at the bottom and pauses when you scroll up to read, with a button to
jump back to the latest line; the footer tells a snapshot from a live
stream. The viewer keeps the last 5,000 lines. When the stream stops on its
own (container stopped, pod deleted, kubectl error), a banner shows
kubectl's reason and a Reconnect button. Streams stop when the viewer
closes, the pod or container changes, Follow is turned off or the window
reloads, and every kubectl process ends with Shoal. - Manifest library with folders, templates, file import and one-click apply.
- Docker Compose to Kubernetes migration through kompose.
- Local terminal and pod exec sessions, and port-forward management.
- Sandboxed plugin system with two signed example plugins, Namespace Watcher
and Resource Monitor, enabled on first run. - Auto-update from GitHub Releases for the Windows installer and the AppImage.
- Guidance when kubectl, kind, k3d or Docker is missing, with install links
and a re-check button. On Windows the re-check also picks up tools
installed while Shoal was running (it re-reads the registryPATH). - A custom kubeconfig path set in Settings is remembered across restarts.
- Local error log for the main process and the UI, and an About & Support
card in Settings with the version, an update check, the logs folder and a
prefilled GitHub issue. Nothing is sent anywhere. - Installers ship
LICENSE.txt,COPYRIGHT.txtandTHIRD_PARTY_NOTICES.txt
with the license texts of every bundled open source package.
Changed
- Renamed from Kubernetes Desktop to Shoal (Linux Foundation trademark
guidelines), with a new app icon. - Electron 44.9.3 and Node 22 toolchain.
- The app version shown in the sidebar now always comes from
package.json. - Cluster cards show the real provider (kind or k3d, from the context name)
and no longer label every context as running. - Dependency updates before the beta. React 19.3, lucide-react 1.x (two
icons are redrawn), js-yaml 5 (still reads Compose files with the YAML 1.1
rules, so merge keys keep working) and semver 7.8, plus build and test
tooling (Vitest 5, Playwright 1.64, Tailwind CSS 4.3, Prettier 3.9).
The GitHub Actions workflows use the Node 24 releases of their actions. - The installers no longer carry a second, unused copy of the renderer
libraries (React, React Router, lucide, sonner, xterm, clsx,
tailwind-merge): Vite already bundles them, so they are build-time
dependencies now. The packed application code (app.asar) shrinks from
50 MB to 8 MB; the compressed installers lose about 2 MB. The third-party
notices are unchanged.
Fixed
- A release candidate's update check falls back to pre-releases again when
no stable release exists. electron-updater wraps the failure of its stable
lookup inside its feed-parsing error, so the check ended in an error
instead of offering the next candidate (an installed rc.4 never saw rc.5). - The Plugins page keeps its list on screen while it refreshes (a plugin
activating at start-up, Enable, Disable, Reload) instead of swapping it
for the loading spinner each time: the cards no longer flicker, and a
click on a card button that arrived during the swap is no longer lost. - A bundled plugin whose
activate()never returns (akubectlcall
against an unreachable cluster, say) is marked as errored after 30
seconds, with the reason, instead of staying "loading", and Enable and
Reload report it instead of hanging. The hook itself keeps running in the
background. - Disabling a bundled plugin stops it. Resource Monitor and Namespace
Watcher kept polling kubectl every 10 seconds after Disable, because
their deactivation hooks ran in a fresh copy of the plugin module, whose
timers were empty. The moduleactivate()ran in now serves the
deactivation hooks and plugin actions until the plugin is disabled,
reloaded or uninstalled, and a plugin that is active or still activating
is not activated a second time when start-up and an Enable click
overlap. Resource Monitor 1.1.1 no longer expects an argument in
deactivate(), which made every Disable log a failed hook. - A pre-release build moves to the stable release as soon as it is
published: the update check asks for the stable channel first and only
falls back to pre-releases while no stable release exists. - The log viewer drops a late answer from the pod opened before instead of
showing its lines as the new pod's, starts blank when the same pod is
opened on another cluster, and asks kubectl for the container shown in
the picker. Init containers appear in the picker too. - Screen readers get the names of the plugin settings fields, the shell
picker of the pod terminal, the resource filter, the Compose manifest
editor and the cluster name field; a plugin modal closes with Escape;
marketplace cards open with Space as well as Enter. - The window opens as soon as Shoal starts. It used to wait until every
enabled plugin had finished activating, and Namespace Watcher's first
kubectlcall could hold it back for up to 30 seconds when the current
context was unreachable. Plugins now activate after the window is up, one
at a time with a 5-second budget each, and the plugin list and sidebar
follow their state. - A window in the dark theme no longer flashes light while it loads, it
cannot be shrunk below 960 by 600 pixels, and a crashed window offers to
reload instead of staying blank. - Cluster details no longer alternate between a spinner and an error while
the cluster is unreachable: the last data stays on screen while a refresh
fails, and the error panel stays (with a "Retrying" hint) until a refresh
succeeds. - Namespace lists, logs, describe and YAML reads time out after 30 seconds
like the resource tables, instead of waiting for kubectl's own network
timeout. - A missing kubectl is explained once by the notice on the page, without a
second toast saying the same. - The empty cluster list and the Dashboard say where Shoal looks for
contexts (the kubeconfig) and how to point it elsewhere, and switching the
active context says that it runskubectl config use-context, so the
terminal follows. - Manifests show the database error instead of a generic message when the
library cannot be read. - The log viewer starts blank for the next pod instead of showing the
previous pod's lines while the new ones load, offers a container picker
for pods with several containers (sidecars) and a copy button. - Sortable column headers, cluster cards, the Dashboard cluster list and the
manifest drop zone work from the keyboard (Tab, Enter, Space) and announce
their sort state. - A page that throws no longer takes the sidebar with it: the error shows in
the page area and the rest of the app stays usable. - Native commands run from a Windows shell (
kubectl get pods,docker ps)
no longer print their output as a staircase: their bare line feeds return
the cursor to the first column, like PowerShell's own\r\ndoes. - Terminal output no longer splits a multibyte character (accented letters,
box drawing) across two chunks. - The main bundle no longer carries every Lucide icon for plugin resource
actions; actions pick from a named set (see the plugin guide). - Linux desktop entries carry a comment and search keywords, and
shoal --versionprints the version instead of opening a window. - The bundled example plugins no longer offer "Uninstall" (they came back
on the next launch); disable them instead. Uninstalling a plugin you
installed now also removes its stored data. - The "Update available" and "Update ready" toasts survive a renderer reload
and no longer go missing when the start-up check finishes before the
window is listening. - The
.debpackage no longer runs the updater (it was never able to update
itself); a manual check says to use the package manager instead. - Local terminal: Ctrl+C now stops the running command (
ping,
kubectl logs -f) and leaves the shell usable. On Linux the interrupt
only reached the shell; on Windows it stopped nothing at all (it looked
the command up by process name and never found it). The terminal starts
with the right line endings from the first prompt instead of being
recreated when the shell list arrives; a shell that fails to start says so
instead of hanging; open shells are closed when Shoal quits. - The YAML and Describe views clear the previous resource's text when they
open or fail to load; "Save to DB" could store the previous resource's
YAML under the new name while the new one was still loading. - The kubeconfig path placeholder in Settings matches the platform, and the
terminal font stack covers Linux and macOS instead o...
0.9.0-rc.5
First public release, for Windows and Linux. Installers are not code-signed
yet, so Windows SmartScreen shows a warning on first launch.
Added
- An application menu, shown with Alt: zoom (Ctrl +, Ctrl −, Ctrl 0), full
screen (F11), reload, and a Help menu with the user guide, a new GitHub
issue, the logs folder and the About box. The window remembers its size,
position and maximized state. - Cluster management for local clusters created with kind or k3d, and any
kubeconfig context. - Dashboard with the active context summary, the state of Docker and Podman
and the widgets of the enabled plugins; light and dark theme. - Resource browser for the core resource kinds (workloads, networking,
configuration, storage, RBAC, cluster objects) with namespace filter,
sortable columns and a column picker, describe, YAML and recent logs,
rollout restart, scaling and deletion. Settings hold the default
namespace and the auto-refresh interval. - Live log streaming. Follow in the log viewer streams new lines as the
pod writes them (kubectl logs -f, starting from the last 200 lines), for
the container chosen in the picker. The view scrolls with new lines while
it is at the bottom and pauses when you scroll up to read, with a button to
jump back to the latest line; the footer tells a snapshot from a live
stream. The viewer keeps the last 5,000 lines. When the stream stops on its
own (container stopped, pod deleted, kubectl error), a banner shows
kubectl's reason and a Reconnect button. Streams stop when the viewer
closes, the pod or container changes, Follow is turned off or the window
reloads, and every kubectl process ends with Shoal. - Manifest library with folders, templates, file import and one-click apply.
- Docker Compose to Kubernetes migration through kompose.
- Local terminal and pod exec sessions, and port-forward management.
- Sandboxed plugin system with two signed example plugins, Namespace Watcher
and Resource Monitor, enabled on first run. - Auto-update from GitHub Releases for the Windows installer and the AppImage.
- Guidance when kubectl, kind, k3d or Docker is missing, with install links
and a re-check button. On Windows the re-check also picks up tools
installed while Shoal was running (it re-reads the registryPATH). - A custom kubeconfig path set in Settings is remembered across restarts.
- Local error log for the main process and the UI, and an About & Support
card in Settings with the version, an update check, the logs folder and a
prefilled GitHub issue. Nothing is sent anywhere. - Installers ship
LICENSE.txt,COPYRIGHT.txtandTHIRD_PARTY_NOTICES.txt
with the license texts of every bundled open source package.
Changed
- Renamed from Kubernetes Desktop to Shoal (Linux Foundation trademark
guidelines), with a new app icon. - Electron 44.9.3 and Node 22 toolchain.
- The app version shown in the sidebar now always comes from
package.json. - Cluster cards show the real provider (kind or k3d, from the context name)
and no longer label every context as running. - Dependency updates before the beta. React 19.3, lucide-react 1.x (two
icons are redrawn), js-yaml 5 (still reads Compose files with the YAML 1.1
rules, so merge keys keep working) and semver 7.8, plus build and test
tooling (Vitest 5, Playwright 1.64, Tailwind CSS 4.3, Prettier 3.9).
The GitHub Actions workflows use the Node 24 releases of their actions. - The installers no longer carry a second, unused copy of the renderer
libraries (React, React Router, lucide, sonner, xterm, clsx,
tailwind-merge): Vite already bundles them, so they are build-time
dependencies now. The packed application code (app.asar) shrinks from
50 MB to 8 MB; the compressed installers lose about 2 MB. The third-party
notices are unchanged.
Fixed
- The Plugins page keeps its list on screen while it refreshes (a plugin
activating at start-up, Enable, Disable, Reload) instead of swapping it
for the loading spinner each time: the cards no longer flicker, and a
click on a card button that arrived during the swap is no longer lost. - A bundled plugin whose
activate()never returns (akubectlcall
against an unreachable cluster, say) is marked as errored after 30
seconds, with the reason, instead of staying "loading", and Enable and
Reload report it instead of hanging. The hook itself keeps running in the
background. - Disabling a bundled plugin stops it. Resource Monitor and Namespace
Watcher kept polling kubectl every 10 seconds after Disable, because
their deactivation hooks ran in a fresh copy of the plugin module, whose
timers were empty. The moduleactivate()ran in now serves the
deactivation hooks and plugin actions until the plugin is disabled,
reloaded or uninstalled, and a plugin that is active or still activating
is not activated a second time when start-up and an Enable click
overlap. Resource Monitor 1.1.1 no longer expects an argument in
deactivate(), which made every Disable log a failed hook. - A pre-release build moves to the stable release as soon as it is
published: the update check asks for the stable channel first and only
falls back to pre-releases while no stable release exists. - The log viewer drops a late answer from the pod opened before instead of
showing its lines as the new pod's, starts blank when the same pod is
opened on another cluster, and asks kubectl for the container shown in
the picker. Init containers appear in the picker too. - Screen readers get the names of the plugin settings fields, the shell
picker of the pod terminal, the resource filter, the Compose manifest
editor and the cluster name field; a plugin modal closes with Escape;
marketplace cards open with Space as well as Enter. - The window opens as soon as Shoal starts. It used to wait until every
enabled plugin had finished activating, and Namespace Watcher's first
kubectlcall could hold it back for up to 30 seconds when the current
context was unreachable. Plugins now activate after the window is up, one
at a time with a 5-second budget each, and the plugin list and sidebar
follow their state. - A window in the dark theme no longer flashes light while it loads, it
cannot be shrunk below 960 by 600 pixels, and a crashed window offers to
reload instead of staying blank. - Cluster details no longer alternate between a spinner and an error while
the cluster is unreachable: the last data stays on screen while a refresh
fails, and the error panel stays (with a "Retrying" hint) until a refresh
succeeds. - Namespace lists, logs, describe and YAML reads time out after 30 seconds
like the resource tables, instead of waiting for kubectl's own network
timeout. - A missing kubectl is explained once by the notice on the page, without a
second toast saying the same. - The empty cluster list and the Dashboard say where Shoal looks for
contexts (the kubeconfig) and how to point it elsewhere, and switching the
active context says that it runskubectl config use-context, so the
terminal follows. - Manifests show the database error instead of a generic message when the
library cannot be read. - The log viewer starts blank for the next pod instead of showing the
previous pod's lines while the new ones load, offers a container picker
for pods with several containers (sidecars) and a copy button. - Sortable column headers, cluster cards, the Dashboard cluster list and the
manifest drop zone work from the keyboard (Tab, Enter, Space) and announce
their sort state. - A page that throws no longer takes the sidebar with it: the error shows in
the page area and the rest of the app stays usable. - Native commands run from a Windows shell (
kubectl get pods,docker ps)
no longer print their output as a staircase: their bare line feeds return
the cursor to the first column, like PowerShell's own\r\ndoes. - Terminal output no longer splits a multibyte character (accented letters,
box drawing) across two chunks. - The main bundle no longer carries every Lucide icon for plugin resource
actions; actions pick from a named set (see the plugin guide). - Linux desktop entries carry a comment and search keywords, and
shoal --versionprints the version instead of opening a window. - The bundled example plugins no longer offer "Uninstall" (they came back
on the next launch); disable them instead. Uninstalling a plugin you
installed now also removes its stored data. - The "Update available" and "Update ready" toasts survive a renderer reload
and no longer go missing when the start-up check finishes before the
window is listening. - The
.debpackage no longer runs the updater (it was never able to update
itself); a manual check says to use the package manager instead. - Local terminal: Ctrl+C now stops the running command (
ping,
kubectl logs -f) and leaves the shell usable. On Linux the interrupt
only reached the shell; on Windows it stopped nothing at all (it looked
the command up by process name and never found it). The terminal starts
with the right line endings from the first prompt instead of being
recreated when the shell list arrives; a shell that fails to start says so
instead of hanging; open shells are closed when Shoal quits. - The YAML and Describe views clear the previous resource's text when they
open or fail to load; "Save to DB" could store the previous resource's
YAML under the new name while the new one was still loading. - The kubeconfig path placeholder in Settings matches the platform, and the
terminal font stack covers Linux and macOS instead of falling back to the
generic monospace font. - Toasts no longer appear twice on the Clusters and cluster details pages.
- Creating a cluster that fails showed a green "created" toast next to the
red one; it now shows one toast with the result. - Contexts whose name contains a slash (EKS, OpenSh...
0.9.0-rc.4
First public release, for Windows and Linux. Installers are not code-signed
yet, so Windows SmartScreen shows a warning on first launch.
Added
- An application menu, shown with Alt: zoom (Ctrl +, Ctrl −, Ctrl 0), full
screen (F11), reload, and a Help menu with the user guide, a new GitHub
issue, the logs folder and the About box. The window remembers its size,
position and maximized state. - Cluster management for local clusters created with kind or k3d, and any
kubeconfig context. - Dashboard with the active context summary, the state of Docker and Podman
and the widgets of the enabled plugins; light and dark theme. - Resource browser for the core resource kinds (workloads, networking,
configuration, storage, RBAC, cluster objects) with namespace filter,
sortable columns and a column picker, describe, YAML and recent logs,
rollout restart, scaling and deletion. Settings hold the default
namespace and the auto-refresh interval. - Live log streaming. Follow in the log viewer streams new lines as the
pod writes them (kubectl logs -f, starting from the last 200 lines), for
the container chosen in the picker. The view scrolls with new lines while
it is at the bottom and pauses when you scroll up to read, with a button to
jump back to the latest line; the footer tells a snapshot from a live
stream. The viewer keeps the last 5,000 lines. When the stream stops on its
own (container stopped, pod deleted, kubectl error), a banner shows
kubectl's reason and a Reconnect button. Streams stop when the viewer
closes, the pod or container changes, Follow is turned off or the window
reloads, and every kubectl process ends with Shoal. - Manifest library with folders, templates, file import and one-click apply.
- Docker Compose to Kubernetes migration through kompose.
- Local terminal and pod exec sessions, and port-forward management.
- Sandboxed plugin system with two signed example plugins, Namespace Watcher
and Resource Monitor, enabled on first run. - Auto-update from GitHub Releases for the Windows installer and the AppImage.
- Guidance when kubectl, kind, k3d or Docker is missing, with install links
and a re-check button. On Windows the re-check also picks up tools
installed while Shoal was running (it re-reads the registryPATH). - A custom kubeconfig path set in Settings is remembered across restarts.
- Local error log for the main process and the UI, and an About & Support
card in Settings with the version, an update check, the logs folder and a
prefilled GitHub issue. Nothing is sent anywhere. - Installers ship
LICENSE.txt,COPYRIGHT.txtandTHIRD_PARTY_NOTICES.txt
with the license texts of every bundled open source package.
Changed
- Renamed from Kubernetes Desktop to Shoal (Linux Foundation trademark
guidelines), with a new app icon. - Electron 44.9.3 and Node 22 toolchain.
- The app version shown in the sidebar now always comes from
package.json. - Cluster cards show the real provider (kind or k3d, from the context name)
and no longer label every context as running. - Dependency updates before the beta. React 19.3, lucide-react 1.x (two
icons are redrawn), js-yaml 5 (still reads Compose files with the YAML 1.1
rules, so merge keys keep working) and semver 7.8, plus build and test
tooling (Vitest 5, Playwright 1.64, Tailwind CSS 4.3, Prettier 3.9).
The GitHub Actions workflows use the Node 24 releases of their actions. - The installers no longer carry a second, unused copy of the renderer
libraries (React, React Router, lucide, sonner, xterm, clsx,
tailwind-merge): Vite already bundles them, so they are build-time
dependencies now. The packed application code (app.asar) shrinks from
50 MB to 8 MB; the compressed installers lose about 2 MB. The third-party
notices are unchanged.
Fixed
- The Plugins page keeps its list on screen while it refreshes (a plugin
activating at start-up, Enable, Disable, Reload) instead of swapping it
for the loading spinner each time: the cards no longer flicker, and a
click on a card button that arrived during the swap is no longer lost. - A bundled plugin whose
activate()never returns (akubectlcall
against an unreachable cluster, say) is marked as errored after 30
seconds, with the reason, instead of staying "loading", and Enable and
Reload report it instead of hanging. The hook itself keeps running in the
background. - Disabling a bundled plugin stops it. Resource Monitor and Namespace
Watcher kept polling kubectl every 10 seconds after Disable, because
their deactivation hooks ran in a fresh copy of the plugin module, whose
timers were empty. The moduleactivate()ran in now serves the
deactivation hooks and plugin actions until the plugin is disabled,
reloaded or uninstalled, and a plugin that is active or still activating
is not activated a second time when start-up and an Enable click
overlap. Resource Monitor 1.1.1 no longer expects an argument in
deactivate(), which made every Disable log a failed hook. - A pre-release build moves to the stable release as soon as it is
published: the update check asks for the stable channel first and only
falls back to pre-releases while no stable release exists. - The log viewer drops a late answer from the pod opened before instead of
showing its lines as the new pod's, starts blank when the same pod is
opened on another cluster, and asks kubectl for the container shown in
the picker. Init containers appear in the picker too. - Screen readers get the names of the plugin settings fields, the shell
picker of the pod terminal, the resource filter, the Compose manifest
editor and the cluster name field; a plugin modal closes with Escape;
marketplace cards open with Space as well as Enter. - The window opens as soon as Shoal starts. It used to wait until every
enabled plugin had finished activating, and Namespace Watcher's first
kubectlcall could hold it back for up to 30 seconds when the current
context was unreachable. Plugins now activate after the window is up, one
at a time with a 5-second budget each, and the plugin list and sidebar
follow their state. - A window in the dark theme no longer flashes light while it loads, it
cannot be shrunk below 960 by 600 pixels, and a crashed window offers to
reload instead of staying blank. - Cluster details no longer alternate between a spinner and an error while
the cluster is unreachable: the last data stays on screen while a refresh
fails, and the error panel stays (with a "Retrying" hint) until a refresh
succeeds. - Namespace lists, logs, describe and YAML reads time out after 30 seconds
like the resource tables, instead of waiting for kubectl's own network
timeout. - A missing kubectl is explained once by the notice on the page, without a
second toast saying the same. - The empty cluster list and the Dashboard say where Shoal looks for
contexts (the kubeconfig) and how to point it elsewhere, and switching the
active context says that it runskubectl config use-context, so the
terminal follows. - Manifests show the database error instead of a generic message when the
library cannot be read. - The log viewer starts blank for the next pod instead of showing the
previous pod's lines while the new ones load, offers a container picker
for pods with several containers (sidecars) and a copy button. - Sortable column headers, cluster cards, the Dashboard cluster list and the
manifest drop zone work from the keyboard (Tab, Enter, Space) and announce
their sort state. - A page that throws no longer takes the sidebar with it: the error shows in
the page area and the rest of the app stays usable. - Native commands run from a Windows shell (
kubectl get pods,docker ps)
no longer print their output as a staircase: their bare line feeds return
the cursor to the first column, like PowerShell's own\r\ndoes. - Terminal output no longer splits a multibyte character (accented letters,
box drawing) across two chunks. - The main bundle no longer carries every Lucide icon for plugin resource
actions; actions pick from a named set (see the plugin guide). - Linux desktop entries carry a comment and search keywords, and
shoal --versionprints the version instead of opening a window. - The bundled example plugins no longer offer "Uninstall" (they came back
on the next launch); disable them instead. Uninstalling a plugin you
installed now also removes its stored data. - The "Update available" and "Update ready" toasts survive a renderer reload
and no longer go missing when the start-up check finishes before the
window is listening. - The
.debpackage no longer runs the updater (it was never able to update
itself); a manual check says to use the package manager instead. - Local terminal: Ctrl+C now stops the running command (
ping,
kubectl logs -f) and leaves the shell usable. On Linux the interrupt
only reached the shell; on Windows it stopped nothing at all (it looked
the command up by process name and never found it). The terminal starts
with the right line endings from the first prompt instead of being
recreated when the shell list arrives; a shell that fails to start says so
instead of hanging; open shells are closed when Shoal quits. - The YAML and Describe views clear the previous resource's text when they
open or fail to load; "Save to DB" could store the previous resource's
YAML under the new name while the new one was still loading. - The kubeconfig path placeholder in Settings matches the platform, and the
terminal font stack covers Linux and macOS instead of falling back to the
generic monospace font. - Toasts no longer appear twice on the Clusters and cluster details pages.
- Creating a cluster that fails showed a green "created" toast next to the
red one; it now shows one toast with the result. - Contexts whose name contains a slash (EKS, OpenSh...