Repository navigation
Releases
v2.0.0
The major release that modernizes Freelens internals and unlocks further development.
v2.0.0 is a full internal rewrite of how Freelens is built, bundled, and tested. The application, its internal packages, and the extension API are now ESM-first, compiled by a single Vite (electron-vite) pipeline directly from TypeScript sources, and tested with Vitest. The UI runs on React 19, and the extension API has been redesigned as a specified, frozen contract, checked by porting real extensions to it. Most of the work is in the foundation, but the release also brings a standalone terminal, faster and more reliable cluster connections over HTTP/2, custom resources for users who may not list their definitions, verified binary downloads, and a long list of fixes. The extension API is not compatible with v1 extensions.
What's new:
Breaking Changes
- The extension API has been reorganized and is not compatible with Freelens v1 extensions. Extensions must be updated for v2 before they will load. Extensions may now be authored as either ESM or CommonJS, and must target React 19. See the migration guide. See #2102, #2110, #2304, #2465
- Extensions are now installed under the application data directory (
<userData>/extensions) instead of~/.freelens/extensions. Extensions installed for v1 are not migrated and have to be installed again in their v2 versions. See #2400, #2467 - Renderer extensions get no guarantee of Node or Electron,
require()included; Node work belongs in the main process, reached over IPC. See #2483, #2484 - Freelens is now ESM-first throughout β the main process, the renderer, all internal modules, and the extension API ship as ES modules. See #2102, #1718
- macOS 13 Ventura or later is required: Electron 44 no longer supports macOS 12. See #2864
- Removed the hierarchical-namespaces (HNC) tree view from the namespace details, together with the deprecated
@mui/labit was built on. See #2290 - Downloaded kubectl versions start at Kubernetes 1.22, and the China package mirror option is gone (the mirror stopped syncing). Older clusters use the bundled kubectl. See #2348, #2351
New Features
- Open a terminal outside a cluster session: a standalone terminal page with its own tabs, reachable from the Welcome page, the Catalog, the hotbar and the command palette. It uses your own shell environment,
KUBECONFIGandkubectl/helm, and the application's proxy asHTTPS_PROXY. See #2359, #2364 - Custom resources work for users who may list them but not their
CustomResourceDefinitions: the sidebar, the list views and the details are built from the cluster's API discovery instead. See #2675, #2676, #2677, #2679 - Resource search matches across dashes and underscores, so
nginxingressfindsnginx-ingress. See #1937, #2711 - Cluster settings to skip the namespace authorization and metrics endpoint checks, for faster connection to large clusters. See #1699
- Terminal tabs show startup progress, including the kubectl download and its verification, instead of a stalled "Connecting ...". See #2357, #2358, #2367, #2368
- macOS natural text editing shortcuts in the embedded terminal (Option+Arrow word navigation, Command+Arrow line navigation, Command/Option+Delete). See #1051, #2338, #2354, #2355
- Installing an extension that is already installed and enabled offers to replace it, or to reinstall the same version, instead of failing with "Disable or uninstall it first". See #2798, #2799
- The Extensions page shows "Failed to load" for an enabled extension whose code did not load, with the process, the stage and the error in its tooltip, and labels each install as
verified,unverifiedordevelopmentin colour. See #2780, #2787, #2788 - Downloaded log files have a timestamp in their name, so repeated downloads no longer overwrite each other. See #1884, #2565
- The Node Group column of the nodes list recognizes kops instance groups. See #2454
- The installers have their own icon, the application icon with an install badge, so they are no longer mistaken for the application. See #2838
- The HTTP Proxy preference accepts
socks5://proxies as well ashttp://andhttps://, and becomesHTTPS_PROXYin the terminal outside clusters, as the proxy of a cluster already is in its terminal. Both proxy settings now say what goes through them. See #2433, #2878
Extensions API
- A specified contract. The v2 API is described by normative contracts β the guarantee, the stable surface and the failure mode of each part β and everything it exports stays frozen until the next major. See api.md, binaries.md and the migration guide with the v1 β v2 rename table. See #2304, #2465, #2501, #2562
- Proven by porting real extensions. The contract and the migration guide were checked by porting the example, Gateway API, Flux CD, AI, Karpenter, Velero and Freelens for Claude extensions to v2, and every gap found on the way was fixed in the host or in the documentation. The documentation points to freelens-example-extension as the reference template, and to its agent skills for creating and porting an extension. See #2653, #2654, #2655, #2662, #2663, #2664, #2665, #2666, #2686, #2687, #2694, #2696, #2705, #2706, #2719, #2723, #2732, #2761, #2770
- New delivery mechanism. A built-in installer replaces pnpm (and drops 20 MB of it from every build): install from a package name, a URL, a
.tgzfile or a local directory, with integrity checked at install time. Extensions are served over a privilegedfreelens-extension://scheme and loaded by URL, and a development extension reloads when it is rebuilt β once per rebuild, also for a build that writes its main and renderer entries in two runs. Installing from a typed Windows drive path now works. See #2400, #2467, #2468, #2469, #2471, #2472, #2500, #2710 - Host singletons. React, ReactDOM, the JSX runtime, MobX, mobx-react and Monaco are shared with extensions through the
FreelensExtensionApiglobal, so an extension never ships its own copy.@ogre-tools/*is no longer part of the contract; an extension that wants dependency injection bundles its own. See #2450, #2474, #2534, #2535 - Complete Kubernetes types.
K8sApire-exports the whole kube-object and kube-api type surfaces, andKubeApiand the other type-and-value pairs can be named as types again. The concrete host store classes are no longer exported. See #2365, #2475, #2478, #2480, #2504, #2505 - Typed registrations.
Renderer.K8sApi.detailsFor()andmenuItemFor()build detail and menu registrations from the model class, so a component written for another kind does not compile. Pages, preference inputs and hints, menu items and cluster frame components are typed with the props the host actually passes. See #2655, #2656, #2670, #2671, #2672, #2692 - Custom resources. A new
customResourcesfield lists the custom resources an extension presents with pages of its own, and hides them from the Custom Resources tree of the sidebar while the extension is enabled. The host registers an API and a store for every served version of a CRD, prefers the served storage version, and drops the APIs and stores of a deleted CRD. See #2655, #2656, #2668, #2674, #2698, #2700 - The host's kubectl, helm and terminal environment are available to main-process extensions through
Main.Shell: the binaries Freelens runs for a cluster, with the download and verification phases reported, and the environment its terminals get. The same code now prepares the cluster, node shell and standalone terminals. See #2704, #2709, #2712, #2715 - Renderer-safe utilities.
Main.Util.fetch, the host's proxy-awarefetch, typed as the standardfetch(the renderer uses Chromium's globalfetch),createReactKey,sha256HexandkustomizeHashhashing helpers, a Node-free event emitter forCatalogCategory, and the Node-bound members removed fromUtil.Catalog.getAllClusters()andgetClusterById()are observable by contract in both processes. See #2395, #2396, #2481, #2482, #2487, #2488, #2489, #2490, #2723, #2732 - Fixes found by the ports.
KubeJsonApi.forClusteris callable,objectConstructorof an API object is the class itself, so a store over a host API applies its watch events,ExtensionStoreaccepts a model declared as an interface, disabling an extension stops the sync of its stores instead of leaving two copies saving each other in an endless loop, stylesheets load without console errors, andRenderer.Navigation.navigatewarns about a relative pathname. An unset boolean query value ofKubeApi(follow,watch,previous,timestamps) is no longer sent astrue, andPodApi.deleteWithFinalizers()really clears the finalizers. See #2651, #2652, #2667, #2669, #2707, #2708, #2721, #2722, #2759, #2767, #2770 - A leaner published package.
@freelensapp/extensionsships a self-contained declaration built with TypeScript 7 and rolldown-plugin-dts. Unused members that pulled Electron,react-window,@xterm/xterm, MUI,forRemoteClusterand several abandoned packages into the declaration are gone, every external package it imports is declared, and the build fails if it ever references Node. See #2360, #2363, #2375, #2388, #2445, #2446, #2485, #2486, #2498, #2499, #2545, #2557, #2559 - An in-repo fixture extension tests the contract in the unit and integration suites on all three platforms. See #2451, #2452, #2492, #2500
Architecture
- Vite replaces webpack. The entire webpack setup β the app bundle, the `packag...
v1.10.3
This is a patch release that adds support for admission policy resources and new Nodes list columns, respects the default-container annotation, and fixes node and pod metrics, cluster loading, cluster events, pod logs, and kubectl binary handling.
What's new:
New Features
- Added support for the
ValidatingAdmissionPolicyandValidatingAdmissionPolicyBindingresources. See #2089, #1688
Bug Fixes
- Clusters no longer get stuck on the loading screen when the CRD store subscription fires before the cluster proxy is ready. See #2093, #1617
- Node CPU usage in the Nodes list view is now formatted in cores instead of being rendered as
0.0Ki. See #2084, #1883 - The "Show previous terminated container" log option is no longer persisted as a global default, so new pod log tabs no longer start with it enabled. See #2096, #2095
- The bundled kubectl binary is no longer removed when its self-check hits a transient
EBUSYerror (e.g. when the file is briefly locked on Windows). See #2063 - The default kubectl download mirror is now used as a fallback when the custom mirror preference is left empty. See #2064
- Prometheus metrics queries no longer fail when
kube_pod_infoexposes duplicate series that differ only by a flappingpod_ip/host_iplabel. See #2086
Improvements
- The Kubernetes API proxy now supports SOCKS5 proxies for upgrade requests (used by exec, attach, and port-forward), so these features work behind a SOCKS5 proxy. See #2092
- Freelens now respects the
kubectl.kubernetes.io/default-containerannotation: the Attach, Pod Shell, and Pod Logs actions target the annotated container instead of always using the first one, falling back to the first container when the annotation is missing or invalid. See #2098, #1557 - The Nodes list view gained pods, instance type, node group, and capacity columns (hidden by default, sortable and searchable) plus a resource requests overlay, which are especially useful on managed-cloud clusters. See #2097, #1940
- Node memory usage now shows
N/Ainstead ofNaNwhen metrics-server data is missing. See #2084 - Pod logs now use a light background in the Light theme instead of always rendering dark. See #2019
- Cluster sidebar pages that were previously unreachable from the command palette can now be found there. See #2090, #1782
- Events from the newer
events.k8s.io/v1API now show their source and repeat count. See #2074 - Kubeconfigs stored on a WSL 9p share are now watched via polling, so newly added clusters appear without restarting Freelens. See #2083
- Prometheus/Thanos query errors are now logged with the actual server error to make failing queries easier to diagnose. See #2085
- The bundled binaries directory is now added to
PATHin PowerShell and fish terminals, matching the behavior of other shells. See #2062
Updates
- 17 dependencies have been updated in total.
- Uses Electron v41.10.0 with Chromium 146.0.7680.216 and Node v24.18.0
- Has bundled kubectl v1.36.2 and Helm v4.2.2
v1.10.2
This is a patch release containing signed binaries for Windows that should bypass false positive alerts from antivirus programs.
What's new:
Bug Fixes
- Fixed extension installs failing when the user-data directory did not contain a
package.json. See #2016 - Fixed the pod context menu staying open after clicking a sub-menu item. See #2054
Improvements
- Windows binaries are now signed, which should prevent false-positive alerts from antivirus programs.
node-ptynow ships as a prebuilt binary to avoid antivirus false positives inconpty_console_list.node(Win64.Trojan.Ulise). See #2023, #2018- The Helm binary path and the Helm server-side apply preference are now persisted. See #2046
Updates
- 20 dependencies have been updated in total.
- Uses Electron v41.9.0 with Chromium 146.0.7680.216 and Node v24.17.0
- Has bundled kubectl v1.36.2 and Helm v4.2.2
v1.10.1
What's new:
This is a patch release with fixes and updates for v1.10.0 that couldn't be released as Flatpak because of the issue with the app.asar archive.
Bug Fixes
- Fixed empty lines accumulating below word-wrapped log blocks in the log viewer. See #2006
- Synchronous spawn errors from external binaries (e.g. kubectl, helm) are now reported as failures instead of crashing the app. See #2001
Improvements
- Reduced packaged app size by excluding cross-platform native binaries at pack time instead of pruning
app.asar. See #2000 - Release artifacts now include a Software Bill of Materials (SBOM). See #2005
Updates
- 5 dependencies have been updated in total, including 3 security updates.
- Uses Electron v41.7.2 with Chromium 146.0.7680.216 and Node v24.15.0
- Has bundled kubectl v1.36.2 and Helm v4.2.2
v1.10.0
What's new:
New Features
- Time range selector for metrics charts β choose from predefined windows (1 h, 3 h, 24 h, 7 dβ¦) or enter a custom start/end time. See #1475, #1962
- Custom download mirror URL for kubectl in Preferences β Kubernetes β Kubectl, useful for air-gapped environments. See #1825
- Pod details now show the scheduler name (e.g.
default-scheduler). See #1942 - Node details now show the cloud provider ID (e.g.
aws:///us-east-1a/i-...). See #1926
Bug Fixes
- Fixed pod status: successfully completed pods and Job pods no longer show a warning icon. See #1913
- Fixed UI freezes on clusters with large numbers of pods. See #1956
- Fixed a crash on clusters with many CRDs installed (Istio, Kyverno, Flux, KEDA, etc.). See #1876
- Fixed "Bad Request" errors when installing Helm charts. See #1897
- Fixed Option-key character combinations in the integrated terminal on macOS with non-US keyboard layouts (
|,{,}, etc.). See #1965 - OCI image volumes are now displayed in pod details instead of showing "Unknown pod volume kind". See #1924
- IPv6:Port endpoints are now correctly formatted in the Endpoints listing. See #1838
- Fixed kubectl exec / port-forward / attach when proxying through a bastion (Warpgate, Teleport). See freelensapp/freelens-k8s-proxy#150
Extensions API
- Expose navigateToPreferences on renderer extension API. See #1983
Improvements
- Kubeconfig entries added or removed in Preferences now take effect immediately without restarting the app. See #1951
- Log viewer preferences (timestamps, word wrap, show previous container logs) are now persisted globally. See #1904
- Linked search preference is now remembered across restarts. See #1872
- Welcome page is now the first item in the default hotbar on a fresh install. See #1950
- App binaries are now built natively on Ubuntu 24.04, macOS 15, and Windows 11, eliminating spurious "Intel Mac" warnings for Apple Silicon users. See #1868, #1949
- Reduced download size: the macOS DMG is now about 50 MB smaller. See #1966
Updates
- Upgraded to Electron v41 with Node.js v24 (previously Node v22). See #1833
- 28 dependencies have been updated in total, including 5 security updates.
- Uses Electron v41.7.2 with Chromium 146.0.7680.216 and Node v24.15.0
- Has bundled kubectl v1.36.2 and Helm v4.2.1
v1.9.0
What's new:
- Pods can be resized by patching their resources or container resources. See #1805, #1840
- Logs can be wrapped for better readability. See #1674
- When pressing
Ctrl+F/Cmd+Fin the pod logs view, the search input is now prefilled with the currently selected text. See #1672 - Fixed search input when too fast typing caused dropping characters while typing. See #1646, #1809
- OpenShift Prometheus support with bearer token authentication. See #1647
- Prometheus HTTP request method can be switched from GET to POST. See #1824
- Correct service labels are used to detect Helm chart with Prometheus. See #1783
- Gracefully exiting remote shell to prevent orphaning shell sessions. See #1691
- Better handling for high-volume terminal traffic during large file transfers. See #1694
- Added a warning column for pods with K8s warning events. See #1540, #1539
- The default color theme now is "Sync with system". See #1834
- 109 dependencies have been updated in total.
- Uses Electron v39.8.9 with Chrome v142.0.7444.265 and Node v22.22.1
- Has bundled kubectl v1.36.0 and Helm v4.1.4
v1.8.1
What's new
- New section for favorite items in a sidebar menu. See #1565
- Fixed a regression when Freelens stopped working with active HTTP proxy. See #1552, #1526
- Fixed an issue where the line progress for CPU and memory was not visible in PodDetailsList. See #1556
- Fixed HPA metrics for type ContainerResource. See #1537
- Fixed Prometheus Operator support. See #1529
- Fixed typos in the template names. See #1548
- Electron v39.5.2 with Chrome v142.0.7444.265 and Node v22.22.0.
- kubectl 1.35.1
- Helm 4.1.1
v1.8.0
What's new
- Menu items can be reordered. See #1248
- Columns can be resized. See #1514
- Correctly install helm chart with edited values. See #1510
- API: New API for multi-cluster operations in extensions. See #1430
- Internals: explicit registration of DI components. See #1474
- Electron v39.2.7 with Chromium 142.0.7444.235 and Node 22.21.1
- Kubernetes 1.35.0
- Helm 4.0.4
v1.7.0
New features and some bug fixes.
- Optional modes for YAML editor: to show managed fields or sort keys. See #1427, #1399, #814
- Windows Portable distribution target is available to download. See #1436, #1416
- More safe dereferencing of values in env and envFrom fields that fixes crashes. See #1390, #1389
- Presentation of host and pod IPs that fixes crashes. See #1415,
- Presentation of pod-level resource requests and limits. See #1426, #1251
- Presentation of managed fields. See #1411
- Middle mouse click doesn't open the default browser. See #1395
- Custom User-Agent is used for Kubernetes API queries. See #1412
- Additional notification about the new version of Freelens. See #1393, #714
- Extensions API changes: New functions to query registered Kubernetes clusters. See #1422, #1421, #1429, #1173
- Helm upgraded to v4.0.1. See #1363
v1.6.2
What's Changed
- New column with direct access to logs of the main container. See #1301
- Right-click open context menu on resources list view. See #1294, #1318
- Persistent mode for search with the option to link views and namespaces. See #722, #1303, #1317, #1321
- Option to auto-hide the toolbar. See #780, #1291
- Option to hide systray icon. See #1307, #1369, #1371
- Pods present value from resourceFieldref. See #1366
- Cluster search and port forwards are available from the command palette. See #925, #1272, #1330
- Less confusing indicator for restarted containers. See #1237, #1315
- Annotations are not a part of the search field. See #1335
- CRDs store refresh after changes. See #1250
- New components LinkToStorageClass and LinkToConfigMap. See #1365
- Turborepo is used for faster builds. See #1331
- Licenses of used libraries and components are listed under the Help menu. See #1316
- Kubernetes 1.34.2
- Helm 3.19.2
- freelens-k8s-proxy 1.4.1.
Full Changelog: v1.6.1...v1.6.2