Changelog
The full release notes and downloadable artifacts live on GitHub Releases.
Releases
| Version | Released | Notes |
|---|---|---|
v1.3.0 (latest) | 13 Aug 2026 | Release notes · GitHub |
v1.2.0 | 29 Jul 2026 | Release notes · GitHub |
v1.1.0 | 16 Jul 2026 | Release notes · GitHub |
v1.0.0 | 9 Jul 2026 | Release 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 /versionendpoint. Releases showvX.Y.Z, local builds showdev, 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_snaton 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 atomicPOST /configureper 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.shbuilds the virgin VyOS qcow2 unattended. It downloads the chosen rolling ISO (latest by default,--listto 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) andHTTPS_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
formatquery param onGET /file-ops/{namespace}/export(zipdefault, ortar.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) andvyos_api/vyos_api_apply(hot path), and the executor package is now organized per platform. - Removed the
MOVE_POD_IPS_TO_GUESTandIFACE_SETTLE_SLEEPenv 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.jsonand 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
GuestProbeProviderdriver 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
tcwhen present and falling back to an ephemeral toolbox container for node images that ship none. Shaping no longer depends on the node image bundlingtc. - 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
TCCapableinterface 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
clusterhops, 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
hostorschemes, so "Try it out" follows the page's own origin and protocol and works on any host and onhttpsdeployments 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
tbfqdisc no longer fails after editing the burst. The value was only accepted with a capitalKbsuffix, so other forms were dropped andtcrejected the command for a missing burst.
What's Changed
- show the running build version on the home dashboard by @emigcm98 in https://github.com/emigcm98/kubendt/pull/24
- fixed long node names style on card in Home by @emigcm98 in https://github.com/emigcm98/kubendt/pull/25
- vyos cluster ip passthrough and http api executors by @emigcm98 in https://github.com/emigcm98/kubendt/pull/26
- single line paragraphs across all markdown and license metadata unified to agpl-3.0-or-later by @emigcm98 in https://github.com/emigcm98/kubendt/pull/27
- traceroute runs inside guest vms and tells cluster fabric hops apart from the external network by @emigcm98 in https://github.com/emigcm98/kubendt/pull/28
- unify the capture and trace panels with design tokens by @emigcm98 in https://github.com/emigcm98/kubendt/pull/29
- fix the interactive shell terminal sizing and tokenize it by @emigcm98 in https://github.com/emigcm98/kubendt/pull/30
- serve a custom swagger ui and make the api spec deployment-agnostic by @emigcm98 in https://github.com/emigcm98/kubendt/pull/31
- settle new nodes into the organic layout on modify by @emigcm98 in https://github.com/emigcm98/kubendt/pull/32
- improve the file manager ux with drag-drop, export formats and safer import by @emigcm98 in https://github.com/emigcm98/kubendt/pull/33
- unify the destructive confirm dialogs onto one shared modal by @emigcm98 in https://github.com/emigcm98/kubendt/pull/34
- run TC on any pod via its own tc or a netshoot fallback by @emigcm98 in https://github.com/emigcm98/kubendt/pull/35
- move TC into a floating panel offered on every node and link by @emigcm98 in https://github.com/emigcm98/kubendt/pull/36
- drop the TCCapable driver capability now that traffic control is a universal tool by @emigcm98 in https://github.com/emigcm98/kubendt/pull/37
- parse the tbf burst value insensitively so a valid burst is not dropped by @emigcm98 in https://github.com/emigcm98/kubendt/pull/38
- v1.3.0 release by @emigcm98 in https://github.com/emigcm98/kubendt/pull/39
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
meshnetfield 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
missingfield. - 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/andicons/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
412when Meshnet is not detected, so pods are never left unwired or stuck. Clearing a topology is always allowed, and?force=trueoverrides 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-networknow 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
- build version is now reflected in Swagger info by @emigcm98 in https://github.com/emigcm98/kubendt/pull/10
- Refactor/icon assets by @emigcm98 in https://github.com/emigcm98/kubendt/pull/11
- Fix/home responsive by @emigcm98 in https://github.com/emigcm98/kubendt/pull/12
- Style/UI polish by @emigcm98 in https://github.com/emigcm98/kubendt/pull/13
- meshnet health badge and topology gate if not present by @emigcm98 in https://github.com/emigcm98/kubendt/pull/14
- flag missing mounted files and resolve real mount paths by @emigcm98 in https://github.com/emigcm98/kubendt/pull/15
- fit the topology dialog to the viewport and polish its toolbar by @emigcm98 in https://github.com/emigcm98/kubendt/pull/16
- polish the UI with a tonal palette and new graph controls by @emigcm98 in https://github.com/emigcm98/kubendt/pull/17
- speed up get-network by batching ConfigMap and Secret reads by @emigcm98 in https://github.com/emigcm98/kubendt/pull/18
- polish node, link and external info panels by @emigcm98 in https://github.com/emigcm98/kubendt/pull/19
- unify the top bars and tonal button palette by @emigcm98 in https://github.com/emigcm98/kubendt/pull/20
- refresh screenshots with the new UI by @emigcm98 in https://github.com/emigcm98/kubendt/pull/21
- animate auto-fit improved by @emigcm98 in https://github.com/emigcm98/kubendt/pull/22
- release v1.2.0 by @emigcm98 in https://github.com/emigcm98/kubendt/pull/23
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
- Feat/traceroute by @emigcm98 in https://github.com/emigcm98/kubendt/pull/7
- Improve K8s cluster deploy guide by @emigcm98 in https://github.com/emigcm98/kubendt/pull/8
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