Skip to content
2.2GitOps, usage history and access review

Kubernetes,
beautifully.

JET Pilot is a fast, native and open-source Kubernetes desktop client. Every cluster, from your kubeconfig or your cloud, in one calm app that updates live.

Free and MIT licensed · macOS, Windows and Linux

JET Pilot showing pods from two clusters, prod-eu-west-1 and staging-us-east-2, in one table with Context and Namespace columns, live CPU and memory sparklines and colour-coded statuses
The Clusters hub: clusters in favourites and folders with environment badges, versions and statuses, and the details panel of Checkout, a protected production GKE cluster

Every cluster, one hub.

Every cluster from every kubeconfig and cloud account, named, sorted and checked, a keystroke away.

  • Names, colours, folders and tags
  • Status, version and sign-in at a click
  • Open it with ⌘O or Ctrl+O
The GitOps page: Flux and Argo CD deliveries under Needs attention and In progress, each with its state in words, and the panel of the payments Kustomization, unhealthy because Deployment payments-worker isn't ready, with Reconcile and Suspend buttons and the resources it delivered

New in 2.2

GitOps, at a glance.

Every Flux and Argo CD delivery across your clusters on one page, problems first.

  • Why it fails, in plain words
  • What it delivered, out of sync first
  • Reconcile, sync, suspend or refresh
The side panel of the payments-api Deployment: CPU and memory charts over 6 hours with request lines, and a readout at 02:31 of 887m CPU, 74% of the request

New in 2.2

Usage, over time.

CPU and memory over an hour to a week, right in the side panel, with requests and limits drawn in.

  • Finds Prometheus, Thanos or VictoriaMetrics by itself
  • Through the API server: nothing to port-forward
  • metrics-server’s last 15 minutes as a fallback
Access review: Can I delete deployments in payments? Yes, granted to the group acme:payments-team by RoleBinding payments-team-admin and ClusterRole admin, above a matrix of what you can do in payments

New in 2.2

Who can do what.

Ask “Can I delete deployments in payments?” and get a yes or no, with the binding and role behind it.

  • Who can: every user, group and service account
  • What a subject can do, and how
  • Roles and bindings in sentences

Nine clouds, built in.

Connect an account and JET Pilot finds its clusters, and keeps the list current.

The Add a cluster dialog: nine clouds (AWS, Google Cloud, Azure, DigitalOcean, Akamai, Civo, Scaleway, Vultr and Exoscale) above options to paste a kubeconfig, import a file or enter a cluster by hand
  • AWS, Google Cloud, Azure, DigitalOcean, Akamai, Civo, Scaleway, Vultr and Exoscale
  • Or paste, import or type a kubeconfig
  • Credentials in your system keychain
The resource graph with the checkout-api Deployment selected: its Service, PodDisruptionBudget and ConfigMap highlighted along the path, and a side panel listing its pods, relationships and replica status

What’s broken, first.

Every app gets its own lane, from Ingress to Service to Pods, and health rolls up from pods to apps.

  • Missing references as red dashed nodes
  • P shows only the problems

Everything else.

The details you reach for every day, all in the free app.

  • The release panel of payments-api: deployed revision 42 of chart 2.14.3, and a history whose latest entry says 2.14.2 → 2.14.3 · image.tag changed

    Helm, built inNew

    Releases read straight from the cluster, a history that says what changed, chart search and a guided install.

  • A certificate whose ACME challenge fails: Issuance failed, the chain from request to order to challenge, and “The CA got a 404 from the challenge URL”

    Operators, first-classNew

    cert-manager, Gateway API, Karpenter, KEDA, External Secrets and Prometheus Operator, in plain words.

  • The side panel of a crash-looping pod: “Restarting: the container keeps crashing: it exits with code 1”, with its node, owner chain and service account

    Panels that explainNew

    Every side panel opens with the object’s state in a sentence, and links to what it’s connected to.

  • Editing the labels of the payments-api Deployment in its side panel, with a preview of three changes and a Save 3 changes button

    Edit labels in placeNew

    Labels, annotations and node taints, with a preview of every change before you save.

  • The port forwards list: payments-api on localhost:8080, checkout-web reconnected 4 minutes ago because its pod was replaced, and postgres on localhost:5432

    Port forwards that healNew

    Forwards follow their pod through restarts and rollouts, and an HTTP tester sends them requests.

  • Settings › Actions: actions such as Logs since…, Open in Grafana and Restart deployment with on/off switches, one broken file with its line number and a Fix in YAML button

    Your own actionsNew

    Small YAML files become one-click actions in row menus, the side panel and the command palette.

  • The command palette open over the pods table, listing actions such as Switch workspace, Open terminal, Switch context, Change a setting and Add cluster

    Command palette

    ⌘K or Ctrl+K for resources, settings and clusters, and k9s-style keys for the rest.

  • The context switcher open with two active contexts, prod-eu-west-1 and staging-us-east-2, each with the payments and checkout namespaces selected

    Several clusters, one table

    Pick contexts and namespaces from one switcher; tables merge them, with a Context column.

  • The workspace switcher listing Payments on-call, Checkout incident, Staging rollout and Platform & ingress with their shortcuts

    Workspaces

    Save contexts, tabs and port forwards, switch in one keystroke, and split two tabs side by side.

  • Reviewing changes to the payments-api Deployment: a side-by-side diff with replicas changed from 4 to 6, and a “Server dry run passed” status next to the Apply button

    Review before you apply

    YAML with your cluster’s own schemas, then a diff and a server-side dry run.

  • Rollout history for the payments-api Deployment: revisions with their change causes, and a diff between the current revision and r6 with a “Roll back to r6” button

    Roll out, roll back

    Rollout history with a diff per revision, pause, restart and a safe rollback.

  • Logs for the payments-api Deployment: four pods listed with their own colours, container and field filters, and interleaved log lines prefixed with the pod and container they came from

    Every pod, one stream

    Follow all pods of a Deployment, StatefulSet, DaemonSet, Job or Service at once, with JSON parsed into fields.

  • The pods table with CPU and memory sparkline columns next to each pod's status

    Live, not polled

    Tables stream changes from the API server, with CPU and memory sparklines for every pod.

  • Signing in to AWS inside JET Pilot: the device code QXRW-PLMK, the verification address device.sso.eu-west-1.amazonaws.com and an Open browser button

    Sign in, in the app

    Device codes and browser sign-ins for kubelogin, gcloud, az, AWS and OIDC plugins appear right in JET Pilot.

  • The built-in terminal panel below the pods table, opened for prod-eu-west-1 with a note that KUBECONFIG points to a temporary copy

    Built-in terminal

    Ctrl+` opens kubectl on the current context, without touching your kubeconfig.

  • Straight to the APINew

    Describe, YAML, browsing Helm releases and port forwards work without kubectl or helm.

  • Columns for every CRDNew

    Any custom resource shows its CRD’s own columns, live, and well-known projects get their own section.

  • Production guardrails

    Type the name before anything destructive, or make a cluster read-only.

  • Keychain credentials

    Tokens and keys stay in your system keychain, and added clusters work in kubectl and k9s.

  • Paste, import or type

    Add clusters from a kubeconfig, or by hand with a token or client certificate.

  • A guided first launch

    Finds your kubeconfig files and tools, and connects your clouds in a few steps.

  • Settings you can search

    Every preference in one searchable place, or as settings.json with validation.

  • Shells and debugging

    Shells into any container, ephemeral debug containers, node shells and file copies.

  • Hardened by default

    A strict content security policy, minimal permissions, and Secrets that stay in memory.

Your colours.
Every pixel.

Pick one of 14 built-ins or bring your own. The sidebar, tables, YAML editor and terminal all follow, in light and dark.

JET Pilot's theme library under Settings › Appearance: built-in themes as cards, each with a live miniature of the app in its colours
  • Bring the theme you use in your editor, syntax and terminal colours included
  • One-click installs from an open theme gallery
  • A JSON editor with a live preview: two colours are enough

Take the controls.

Free for everyone, forever. Always the latest release.

Heads-up for macOS

JET Pilot isn’t notarized by Apple: it’s free and open source, and we’d rather not pay Apple’s yearly fee. So on first launch macOS may say the app is “damaged” or refuse to open it. Remove the quarantine flag once and you’re good. Auto-updates keep working.

xattr -dr com.apple.quarantine "/Applications/JET Pilot.app"

Run it in Terminal after moving JET Pilot to Applications. Not needed with Homebrew: the tap does it for you.

Prefer Homebrew?

Install from our tap in one line. It opens right away, no quarantine step.

brew install --cask unxsist/tap/jet-pilot

Installed it from homebrew/cask before? Run brew uninstall --cask jet-pilot first: Homebrew’s main repository only carries notarized apps now. Older versions are on GitHub Releases.

Built in the open.

MIT licensed and developed on GitHub since December 2023. No paid tier, no feature gates, no account wall: a tool made by people who use Kubernetes every day.

Questions, answered.

Something else? Open a GitHub issue and we’ll take a look.

Is JET Pilot really free?
Yes. JET Pilot is open source under the MIT licence. There is no paid tier, no trial and no account — download it and go.
macOS says JET Pilot is “damaged” or can’t be opened. What now?
Nothing is wrong with the app: JET Pilot isn’t notarized by Apple, so macOS quarantines it after download. Open Terminal and run xattr -dr com.apple.quarantine "/Applications/JET Pilot.app" once. Auto-updates keep working afterwards. Installing with Homebrew (brew install --cask unxsist/tap/jet-pilot) takes care of this for you.
Windows SmartScreen warns me about the installer.
The Windows installers aren’t code-signed, so SmartScreen may show a warning the first time. Click More info and then Run anyway.
How do I run the AppImage on Linux?
Make it executable first with chmod +x JET.Pilot_*.AppImage, then run it. Prefer packages? Use the .deb (Debian, Ubuntu) or .rpm (Fedora, RHEL) instead.
What do I need to connect to my clusters?
A kubeconfig, or a cloud account. JET Pilot finds the kubeconfig files you already have, and from 2.0 it connects AWS, Google Cloud, Azure, DigitalOcean, Akamai, Civo, Scaleway, Vultr and Exoscale and finds the clusters in them. You can also paste a kubeconfig, import a file or enter a cluster by hand. It uses kubectl for some tasks and helm to install, upgrade and roll back charts; if you don’t have them, Settings › Advanced downloads checksum-verified copies. It works with any conformant cluster you can reach, including exec-plugin and SSO sign-ins such as kubelogin, AWS IAM Identity Center, gcloud and az.
How does signing in work?
When a session runs out, JET Pilot shows a quiet notice and lets you sign in without leaving the app: device codes and sign-in links show up in a dialog, and your views, log streams and port forwards reconnect on their own. Background checks never start a sign-in, so no browser window opens out of nowhere.
Can I use several clusters and kubeconfig files at once?
Yes. JET Pilot finds ~/.kube/config, $KUBECONFIG, ~/.kube/*.yaml and ~/.kube/config.d, and the Clusters hub lists every context in them. Select several contexts and namespaces together: tables aggregate everything and show Context and Namespace columns so you always know where a resource lives.
How does JET Pilot stay up to date with my cluster?
From v1.37, lists stream changes from the Kubernetes API through watches instead of polling kubectl. Changes show up in a fraction of a second — about 200 ms from scaling a Deployment to the update on screen in our tests against a real kube-apiserver — and coming back to a view is instant.
Can I use the theme from my editor?
Yes. From v1.38, JET Pilot imports the colour theme formats editors commonly use: JSON colour themes (JSONC and include chains too) and .tmTheme-style colour schemes. Drop the file on Settings › Appearance, or install a theme from an open theme gallery inside the app. The theme’s interface colours become JET Pilot’s palette, its syntax colours the YAML editor and its terminal colours the terminal. Want to see it first? Preview your theme on the website: it’s converted in your browser.
Why does the gallery only install MIT-licensed themes?
JET Pilot is MIT licensed, and we want everything it downloads and installs for you to fit that licence without reviewing extensions one by one. So the gallery only installs themes whose licence is MIT, or allows MIT (such as MIT OR Apache-2.0). That still covers most popular themes. A theme under another licence isn’t blocked: you can import a file you already have yourself.
Does JET Pilot modify my kubeconfig?
No. It reads your kubeconfig files and only writes to one when you export a cluster into it (after making a backup). Clusters you add in JET Pilot go into its own kubeconfig, ~/.kube/jet-pilot/config, with their tokens and keys in your system keychain. The built-in terminal uses a temporary, owner-only kubeconfig that contains just the current context.
Do clusters I add in JET Pilot work in kubectl and k9s?
Yes. JET Pilot’s kubeconfig gets credentials through a small helper, jetpilot-auth, so KUBECONFIG=~/.kube/config:~/.kube/jet-pilot/config kubectl get pods works, and so does k9s. Settings › Advanced shows the line to copy.
Does JET Pilot collect any data?
No. There is no account, no analytics and no telemetry in the app. It talks to your clusters, and to the cloud accounts you connect, with your own credentials. Besides that it only checks for updates, reads a small announcements file from this site, contacts Open VSX while you browse the theme gallery, talks to Artifact Hub and your Helm repositories when you look for or install charts, and downloads kubectl, Helm or kubelogin from their official sources when you ask it to. The update server counts how many update checks it gets each day and keeps nothing else.
How do updates work?
JET Pilot has a built-in updater that checks for new versions and installs them for you. Homebrew users can also run brew upgrade --cask unxsist/tap/jet-pilot.
What is it built with?
Rust and Tauri 2 for the native app, Vue 3 and TypeScript for the interface. Because Tauri uses the operating system’s own webview, the downloads are small: 16 MB for the Windows installer, about 28 MB for macOS and 28 MB for the Linux packages (the AppImage, which bundles its own libraries, is about 100 MB).