Skip to main content

Changelog

The full release notes and downloadable artifacts live on GitHub Releases.

Releases

VersionReleasedNotes
v1.3.0 (latest)13 Aug 2026Release notes · GitHub
v1.2.029 Jul 2026Release notes · GitHub
v1.1.016 Jul 2026Release notes · GitHub
v1.0.09 Jul 2026Release notes · GitHub

v1.3.0 (latest)

Published 13 Aug 2026 · View on GitHub

Added

  • The running build version is shown as a badge next to the title on the Home dashboard, read from the public GET /version endpoint. Releases show vX.Y.Z, local builds show dev, and hovering reveals the commit and build date.
  • VyOS routers now own their pod's cluster IP. The primary CNI interface (eth0) is passed through to the guest VM like the data interfaces, so a VyOS node is reachable at its pod IP and can act as the twin's internet gateway with enable_snat on eth0, matching the native-container routers.
  • The backend drives VyOS through the guest's HTTP API. Reads come from a single POST /retrieve (config as JSON, briefly cached and deduplicated) and configure actions are merged into one atomic POST /configure per batch. Namespace IP polling on VyOS drops from ~2.2 s to ~1.1 s and a 13-action cold commit from 10-20 s to ~7 s. SSH (ssh_qemu) remains as the rescue path.
  • build-vyos-qcow2.sh builds the virgin VyOS qcow2 unattended. It downloads the chosen rolling ISO (latest by default, --list to browse) and answers the installer over the serial console inside a throwaway container, using whichever engine (podman or docker) can reach /dev/kvm.
  • New VyOS image tunables CPU_CORES (vCPUs, default 1) and HTTPS_FORWARD_PORT.
  • The interactive shell window can be resized from its bottom-right corner. The terminal reflows as you drag, snaps to whole rows so no blank strip is left at the bottom, and tells the pod its new size. Minimizing and restoring keeps the size and position it had.
  • File Manager can now take files dropped straight from your computer, onto the sidebar (root or a folder) or onto the empty editor. Archives are extracted, other files are uploaded into the target folder, folders over 1 MiB are skipped and folder drops are rejected with a hint to zip them.
  • Empty File Manager namespaces show a real empty state with New file / New folder / Import actions, right-clicking the empty editor opens the same create/import menu, files can be downloaded one at a time from their right-click menu, and the sidebar shows a file count.
  • The File Manager export now opens a dialog to pick the archive format (ZIP or gzipped tar), backed by a new format query param on GET /file-ops/{namespace}/export (zip default, or tar.gz).

Changed

  • VyOS management secrets (SSH keypair, HTTP API key) are generated per pod at startup.
  • Faster VyOS boot. GRUB menu timeout is patched to 0 wherever the release keeps it, the ephemeral qcow2 runs with cache=unsafe, ssh_qemu multiplexes SSH sessions, and the readiness probe starts at 30 s. Observed Ready time went from ~95 s to ~75 s with 2 vCPUs.
  • VyOS executors renamed by transport, vyos_ssh_cli/vyos_ssh_apply (rescue) and vyos_api/vyos_api_apply (hot path), and the executor package is now organized per platform.
  • Removed the MOVE_POD_IPS_TO_GUEST and IFACE_SETTLE_SLEEP env vars from the VyOS image. Moving IPs to the guest is now always on, and the settle fallback is fixed at 5 s.
  • License declarations unified to AGPL-3.0-or-later (README, CITATION.cff, .zenodo.json and frontend package metadata previously said AGPL-3.0-only), and the LICENSE text now matches the canonical gnu.org copy byte for byte (https URLs).
  • All Markdown docs now use single-line paragraphs, so they render correctly when pasted into GitHub releases and PRs. Enforced by the root .prettierrc (proseWrap: never).
  • Traceroute now works from VyOS routers. Guest-VM drivers run the probe inside the guest through a new optional GuestProbeProvider driver interface, using the guest routing table, instead of a debug container in a pod netns that has no connectivity. Guest drivers without probe support get a clear error.
  • The capture and traceroute panels now share a tokenized dark palette (--tool-* design tokens), collapsing the near-duplicate colors that had drifted between them. Component-specific semantic colors (protocol rows, hop kinds) stay local.
  • The interactive shell palette moved to --term-* design tokens, and xterm's canvas theme now reads them so CSS and terminal colors cannot drift apart.
  • The Swagger UI now has a working search box that filters endpoints by path, summary or tag (so "deploy" finds POST /network/deploy-network), and drops the "Explore" spec-URL bar, which was not a search. The Bearer token also persists across page refreshes.
  • Nodes added through a topology modify now settle into the organic force layout next to the neighbours they connect to without overlapping existing nodes, instead of stacking in a fixed vertical grid. Existing nodes keep their positions, and the resulting layout is saved so a reload shows the same arrangement instead of relaying everything out.
  • The File Manager export and delete-all controls are disabled when there are no files, the File Manager warns before you reload or close the tab with unsaved edits.
  • Importing an archive into a File Manager namespace that already has files now asks for confirmation first, since it can overwrite same-path files.
  • Destructive confirmations (clear topology, delete namespace, delete history, delete file or folder, delete all files) now share one modal with a consistent look: warning icon, a red confirm button, an "action cannot be undone" note, and Esc-to-close.
  • Traffic control (tc/qdisc) is applied and read on any pod, using the pod's own tc when present and falling back to an ephemeral toolbox container for node images that ship none. Shaping no longer depends on the node image bundling tc.
  • Traffic control now lives in its own floating panel, a peer of the packet capture and traceroute windows, instead of an inline editor in the node panel. Can be opened by right-clicking a link, from the link info panel, or from a node's Links tab, which now shows the shaping status and an Open button.
  • Traffic control is no longer a driver capability. The TCCapable interface is gone and the driver capabilities API no longer lists it, since shaping now works the same on every node.

Fixed

  • Long Kubernetes node names no longer widen their card into a horizontal scroll on the Home cluster status. The node name now fits wrapping to at most two lines with the full name on hover.
  • Actions on the protected eth0 interface (everything except SNAT) are now rejected for VyOS and XRd too. Drivers with a custom execution planner used to bypass the guard entirely.
  • Interface renames inside the VyOS guest no longer race the stock config.boot, whose install-time hw-id entry could hijack eth0 and shift every name at coldplug. hw-id lines are stripped from the image at build time.
  • Traceroute hops through the Kubernetes fabric (pod-network gateways, node IPs) are now tagged as cluster hops, with their own icon in the trace panel, and drawn as the way out to the internet instead of being misattributed to the topology's external network node when a router exits through its cluster interface.
  • The interactive shell no longer clips its last terminal row. Its padding sat on an inner xterm element that the fit addon does not measure, so the rows overflowed the window by a few pixels and cut a row on displays whose cell height crossed the rounding threshold. The terminal also re-fits on zoom and display-scaling changes, not only on window resizes.
  • The Swagger spec no longer pins host or schemes, so "Try it out" follows the page's own origin and protocol and works on any host and on https deployments behind a reverse proxy.
  • Reading a netem qdisc no longer mistakes the internal seed value for the interface jitter when a delay was set without one.
  • Applying a tbf qdisc no longer fails after editing the burst. The value was only accepted with a capital Kb suffix, so other forms were dropped and tc rejected the command for a missing burst.

What's Changed

Full Changelog: https://github.com/emigcm98/kubendt/compare/v1.2.0...v1.3.0

v1.2.0

Published 29 Jul 2026 · View on GitHub

Added

  • Meshnet CNI health awareness. The Home dashboard shows whether the Meshnet dataplane is running, both cluster-wide (a badge next to the node count) and per node (on each node card and in the node detail panel), so a missing or partial install is visible instead of failing silently.
  • New meshnet field on the cluster status and node detail API responses reporting the dataplane state.
  • Mounted files whose source no longer exists in the namespace file manager are flagged in the pod detail panel with a warning and a disabled link, instead of silently linking to a missing file. The mount API carries a matching missing field.
  • Optional node repulsion on the graph: dropping a node too close to another bounces it to the nearest free spot. Toggle it from the graph controls (off by default. Hold Ctrl to place nodes close), next to a new lock toggle. Both preferences persist across sessions.
  • Enable or disable a pod interface from the Links tab of the node panel by right-clicking it, the same action already available on the graph.

Changed

  • Replaced UI emojis with a consistent SVG icon set that inherits text color, and reorganized image assets into nodes/ and icons/ subfolders.
  • Unified the UI styling behind a set of design tokens (colors, radii, elevation) and refreshed the palette for a cleaner look.
  • Topology changes now require a running Meshnet CNI. Deploying, and modifying a topology (add, delete or scale), return 412 when Meshnet is not detected, so pods are never left unwired or stuck. Clearing a topology is always allowed, and ?force=true overrides the check.
  • Polished the UI with a tonal button palette (one soft color per action, applied across the graph toolbar, the namespace and File Manager bars, and the Home dashboard), thinner graph links, interface labels that stay aligned to their cable across node types, a pulsing active-node dot, custom animated zoom/fit controls with a wider zoom range, and a cleaner minimap.
  • GET /network/get-network now loads much faster on remote clusters. It reads every ConfigMap and Secret in the namespace in a single batch and resolves mounted-file paths from one directory walk, instead of one API request per node and one walk per mount.
  • Refreshed the node, link and external info panels with consistent typography, tokenized colors, a slide-in and slide-out animation, and a cleaner driver capability view. The link panel now shows its endpoint path (pod:iface ↔ pod:iface) as an attribute.
  • Unified the app's top bars and buttons: the graph navbar, Home header and Login now share the brand blue with a subtle gradient, the navbar is slimmer.
  • The topology graph auto-fits when the topology structure changes (opening a namespace, import, modify) with a smooth animated transition.

Fixed

  • The Swagger UI version badge now reflects the running build version instead of a fixed 1.0, so it changes across releases.
  • Home dashboard no longer clips the cluster/kubeconfig panels on shorter viewports (left column fits and scrolls its node list internally, like the namespaces column).
  • Mounted files stored in a subfolder now show their real path (for example web-server/index.html) and open the correct file, instead of a sanitized key (web-server_index.html) that pointed nowhere.
  • Kubendt's internal interface-count ConfigMap no longer appears in a pod's Mounted Files list.
  • The import and modify topology dialogs no longer clip their content on shorter viewports. They now use a fixed-height shell that adapts to the screen, with the JSON editor scrolling internally.

What's Changed

Full Changelog: https://github.com/emigcm98/kubendt/compare/v1.1.0...v1.2.0

v1.1.0

Published 16 Jul 2026 · View on GitHub

Added

  • Traceroute from any L3-capable node toward an IP or hostname, with each hop resolved to a topology node so the path can be followed on the graph.
  • Live WebSocket stream and single-document REST endpoint for a trace.
  • Selectable probe method (ICMP, UDP, TCP) and an mtr-based metrics mode reporting per-hop loss, RTT stats and jitter over a configurable number of cycles.
  • Per-hop detail including resolved node and interface, hop kind, ICMP unreachable flag, and the pod path crossed, marking real links versus overlay tunnels such as GTP-U.
  • Traceroute control panel in the UI with a packet animation over the graph, playback controls and JSON export.

Changed

  • Improved the Kubernetes cluster deploy guide (Meshnet timing, kind API server address, metrics-server pointers, and install links for Minikube, kind and kubeadm).

What's Changed

Full Changelog: https://github.com/emigcm98/kubendt/compare/v1.0.0...v1.1.0

v1.0.0

Published 9 Jul 2026 · View on GitHub

Initial public release. KubeNDT deploys and operates virtual network topologies on Kubernetes, defined declaratively and materialized as Kubernetes-native resources over the Meshnet CNI.

Added

  • Declarative topologies deployed as StatefulSets over Meshnet CNI, with in-place add, remove and scaling of nodes and links and external uplinks.
  • Driver and capability system covering hosts, routers (Linux, FRR, VyOS) and switches (Linux bridge, OVS), with L2/L3, DNS, traffic control, NAT and OSPF.
  • Persisted driver operation history, replayed automatically on pod restart.
  • Interactive network graph with per-node info panel, shell and metrics.
  • Live packet capture with BPF filter, pcap export and per-packet dissection.
  • Per-namespace file manager mounted into pods as ConfigMaps or Secrets.
  • Kubernetes integration for kubeconfig/context, cluster status and node detail.
  • Admin password login with sessions plus kdt_ API tokens.
  • Health, readiness and version endpoints, and Swagger docs.
  • Container images published to GHCR and a Docker Compose deployment.

Full Changelog: https://github.com/emigcm98/kubendt/releases/tag/v1.0.0