Every resource kind opens the same page scaffold: a header (status pill, the kind's pills, Deleted when it goes away, age), tabs and an Actions bar. The page updates live. Kinds add what is specific to them; everything mirrors the desktop app's views where a phone can. Writes are always two steps.
Every page
- Tabs: Summary, Describe (needs the server's
describecapability) and YAML (with Edit and a reviewed diff). Logs, Terminal and Files appear where they make sense (pods, workloads; never on CronJobs or nodes, and no Terminal or Files on read-only clusters). - Summary sections: info, owners, related pods, labels, annotations (kubectl's last-applied copy hidden), conditions and events. Related objects (what owns it, what it selects, what uses it) are links.
- Actions: Edit YAML, Scale, Restart, Cordon or Uncordon, Run now, Suspend or Resume and Delete (with a grace period), depending on the kind. Read-only clusters show a “Read-only cluster” chip instead of the bar. Pages also have an AI agent button when agents are on (next release).
- Metrics section (pods, workloads, nodes, namespaces and PVCs, when the server has a metrics source): charts with a shared range (15m to 7d), touch scrub for values and a refresh every few seconds. Deployments and the like show their pods' usage; there are no per-container charts.
- A Network flows section appears on pods, workloads, Services and namespaces when a flow backend exists; see Metrics, alerts and flows.
Pods
- Table: status exactly as
kubectl get podscomputes it (a degraded pod's Ready is red, restarts turn red from 3). Rows show<none>for an empty node; Wide adds IP and nominated node. - Summary: owner chain, Containers (init and ephemeral ones marked
initanddebug; state, image, requests and limits, probes and restarts; tap one for probes, mounts, command and last state), ports, volumes, usage for the last hour against requests and limits, metrics, conditions and events. - Actions: Kill (force), Delete with a grace period, Debug… (starts an ephemeral container from an image such as
busybox:1.37, optionally sharing a process namespace, then opens a shell in it), Attach, Forward… and Edit YAML. - Terminal: container and shell picker, reconnect and re-attach.
- Files (pods only): one pane with a path bar, folders first, hidden-files toggle and container picker; preview and edit text files (a conflict check protects against overwriting), download through the share sheet, upload with verification, new folder, rename, delete, change mode and copy path. Secret volume files are listed but never readable. Images without a shell offer the debug-container route. One transfer at a time; no drag and drop or directory upload.
Port-forward and web views
The server holds the forward, because a phone has no local port to offer. For a port that speaks HTTP(S) the app opens an in-app web view on a one-time address; a small loopback proxy inside the app handles the server's pinned certificate. Close it (the web view's close button, or x on the forward) and the forward ends. Forwards live only while the app runs and are not saved; raw TCP ports are not reachable, and there is no local port or bind address to choose. A port that does not look like HTTP asks for a scheme and start path first. Forward needs create pods/portforward and is hidden on read-only clusters; Web view… also works there.
Workloads
Deployments, ReplicaSets, StatefulSets, DaemonSets, Jobs and CronJobs.
- Header:
ready/desired readywith-and+to scale (one confirmation for the final count) and a “scaling to n” pill. Jobs show their status; DaemonSets and CronJobs the age. - Sections: the Deployment's facts, Rollout history (the last 8 revisions, current in green), the CronJob's schedule and Job history (the last 10 with status, completions and duration, pods per Job), Pods (the first 12; grouped by ReplicaSet for a Deployment with several), metrics.
- Actions: Rollout undo (pick a revision; Deployments, StatefulSets and DaemonSets), Pause or Resume rollout (Deployments), Scale, Restart, Run now, Suspend or Resume, Delete, Edit YAML. Undo and scale on a PROD cluster ask for the cluster name.
- Logs read all the workload's pods by its selector; a workload with an empty selector is refused rather than reading everything.
Nodes
- Table: status, roles, version and CPU and memory bars. Page: usage, capacity, taints, addresses, metrics (needs node metrics), conditions, events and Pods on this node (the first 12 with a Show more).
- Cordon / Uncordon: only the one that applies is offered.
- Drain: confirm with the desktop's note, then a progress dialog with every state line. Hide it and reopen it from the Drain section; it keeps running on the server for an hour. A drain does not survive a server restart (the node stays cordoned) and cannot be cancelled. A PodDisruptionBudget with no allowed disruptions blocks it, as with kubectl.
- Shell: the Terminal tab opens a shell on the node. The server starts a privileged helper pod (image
docker.io/tyrola/kubyl-debug:3.24inkube-system; not configurable yet), says so in the confirmation, and deletes the pod when the session ends. Reopening asks again. On PROD clusters the cluster name is required.
Network
- Kinds: Services, Ingresses, Routes (OpenShift), Endpoints, EndpointSlices, IngressClasses, NetworkPolicies, Gateways, HTTPRoutes and GatewayClasses.
- Services: type, ports (
80/TCP → 8080, each with Forward), Endpoints (or a yellow “No ready endpoints”), pods, Logs (selector), and a Web button under the table row for ports that look like web UIs (at most three). Each port has a Web views entry; “Other web UIs in namespace” offers presets (Grafana, Alertmanager, Prometheus, Argo CD, RabbitMQ, Kibana, Kafka UI, Jaeger). - Ingresses: backends with their Service ports and TLS secret as links.
- Routes: header pills (
Admitted · router,Not admitted,Pending) and TLS, the host and URL (copy, open), per-router verdicts, TLS settings, weighted backends with their resolved ports, ready endpoints. The TLS key is masked; the eye reveals it behind Face ID, in memory only. - Endpoints and the Route's ready counts are refreshed about every 10 seconds rather than streamed.
Config and storage
- Kinds: ConfigMaps, Secrets, ResourceQuotas, LimitRanges, PersistentVolumeClaims, PersistentVolumes, StorageClasses and the like, in the groups Config & Secrets and Storage.
- ConfigMaps and Secrets: a Data section with each key as a block (format detected, a 20-line preview, a 2,000-line cap with “Open in YAML editor”, wrap, copy, expand or collapse all, a filter above 8 keys, Copy all as YAML or
.env, binary values as base64 with Save… through the share sheet). Used by · N pods, grouped by workload. Secret rows are masked; the eye per key reveals one value (device lock, then not again for 30 seconds on that page). Secrets cannot be edited on the phone. - PVCs and PVs: capacity, the claim with its reclaim policy and volume link, Pods · N using the claim (“No pod uses this claim”), tones for unused or failing volumes.
- Quotas and limit ranges: usage bars against the hard limits.
Access control
ServiceAccounts, Roles, RoleBindings, ClusterRoles and ClusterRoleBindings are a group of their own after Storage. Tables follow the desktop (bindings show Role plus wide Users, Groups and Service accounts). A ServiceAccount shows Used by · N pods; a binding links its Role and subjects. Rules, roleRef and subjects are in the YAML tab; there is no rules viewer (the desktop has none). A kind you may not list is hidden from the Resources tab, and a forbidden list explains it: “You may not list … across all namespaces. Pick a namespace.” Delete is left out when you lack the right.
Namespaces, events and custom resources
- Namespaces: a list and a page with conditions; Use this namespace switches the app to it.
- Events: a live view with folding of repeats, OOMKilled rows, type chips, search, a namespace filter and Pause; tap an event to open its object. Each object's page has its own Events section.
- CRDs and custom resources: CRD lists and custom resource lists use the printer columns the CRD defines, grouped by API group under Resources.
- HPA, VPA and PodDisruptionBudgets: generic pages with Related (what an HPA scales, the pods a budget covers).