Skip to content

Releases: Dangalcan/shoal

0.9.1

Choose a tag to compare

@github-actions github-actions released this 31 Oct 19:55
6abc93c

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. kubernetes now only grants reads (list,
    get, describe, YAML, logs, metrics, watches and resource events);
    kubernetes:write is needed to create, update or delete resources, save or
    apply manifests and run commands in pods, helm for every Helm call, and
    secrets to receive the data of Secrets. Without secrets, getResources,
    getResourceYaml, watches and resource events hand plugins Secrets without
    data, stringData and the last-applied annotation. Plugins that change
    the cluster must declare the new permissions; the bundled examples only
    read and keep kubernetes.

Removed

  • The filesystem, network and notifications plugin permissions, which
    never gated anything (notifications belong to ui). A manifest that names
    them is rejected with the list of valid permissions.

Fixed

  • The .deb declares libasound2 (>= 1.0.17) (ALSA) and libgbm1 (Mesa
    GBM) as dependencies, so apt install pulls them in on WSL, containers
    and other minimal systems, where Shoal failed to start with
    libasound.so.2 or libgbm.so.1 missing. The package used
    electron-builder's default dependency list, which lacks both although
    Electron links them. On Ubuntu 24.04 libasound2 is a virtual name and
    the version makes apt choose libasound2t64 rather than the OSS
    compatibility shim that also provides it. The AppImage still needs the
    system's libraries.

Security

  • Plugin license keys and secret: true settings in plugin-config.json
    are encrypted with a random key that the OS keystore wraps through
    Electron safeStorage (DPAPI on Windows, Keychain on macOS, libsecret or
    KWallet on Linux), stored owner-only in .encryption-key next 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

Choose a tag to compare

@github-actions github-actions released this 31 Oct 17:54
4ff8ba8

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 registry PATH).
  • 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.txt and THIRD_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 (a kubectl call
    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 module activate() 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
    kubectl call 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 runs kubectl 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\n does.
  • 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 --version prints 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 .deb package 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...
Read more

0.9.0-rc.6

0.9.0-rc.6 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 28 Oct 19:45
7fce232

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 registry PATH).
  • 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.txt and THIRD_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 (a kubectl call
    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 module activate() 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
    kubectl call 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 runs kubectl 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\n does.
  • 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 --version prints 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 .deb package 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...
Read more

0.9.0-rc.5

0.9.0-rc.5 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 28 Oct 15:50
4fb0e76

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 registry PATH).
  • 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.txt and THIRD_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 (a kubectl call
    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 module activate() 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
    kubectl call 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 runs kubectl 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\n does.
  • 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 --version prints 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 .deb package 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...
Read more

0.9.0-rc.4

0.9.0-rc.4 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 28 Oct 13:32
22f0bf5

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 registry PATH).
  • 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.txt and THIRD_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 (a kubectl call
    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 module activate() 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
    kubectl call 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 runs kubectl 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\n does.
  • 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 --version prints 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 .deb package 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...
Read more