Skip to content

What korvid is

A tool-using bird for your cluster.

korvid is one program that grows with what you install: a keyboard-first Kubernetes cockpit that needs nothing but a kubeconfig, plus one extra for an embedded AI agent and another that makes it a tool other AI clients can drive. One core, independent adapters, one safety model.

The shape

Three independent drivers, one korvid boundary, one Kubernetes adapter. The center is a behavior contract, not a claim that every read shares one snapshot.

flowchart LR
    HUMAN["👤 Human operator"]
    MODEL["🤖 Model / provider<br/>Copilot · Azure · Anthropic<br/>OpenAI · Ollama · compatible"]
    CLIENT["🖥 Editor / external assistant<br/>VS Code · Claude Code<br/>Cursor · Zed"]
    CLUSTER[("☸ Kubeconfig +<br/>cluster")]

    subgraph KORVID["KORVID — product boundary"]
        direction LR
        TUI["TUI adapter<br/><b>INCLUDED</b><br/>browse · filter · describe<br/>logs · port-forward · exec"]
        AGENT["Agent adapter<br/><b>OPTIONAL</b> korvid[agent]<br/>Ctrl-A chat panel<br/>context-aware reads<br/>provider payload masking"]
        CORE["Observe · diagnose · navigate<br/>approval-gated operations<br/>audit log"]
        MCP["MCP adapter<br/><b>OPTIONAL</b> korvid[mcp]<br/>read + UI-drive over MCP<br/>write proposals opt-in<br/>tool-specific disclosure"]
        K8S["Kubernetes adapter<br/><b>INCLUDED</b><br/>watch · read · apply"]

        TUI --> CORE
        AGENT --> CORE
        MCP --> CORE
        CORE --> K8S
    end

    HUMAN <--> TUI
    MODEL <--> AGENT
    CLIENT <--> MCP
    K8S <--> CLUSTER

    style KORVID fill:#1a202c,color:#e2e8f0,stroke:#4a5568,stroke-width:2px
    style CORE fill:#2d3748,color:#e2e8f0,stroke:#4a5568
    style TUI fill:#22543d,color:#fff,stroke:#276749
    style K8S fill:#22543d,color:#fff,stroke:#276749
    style AGENT fill:#553c9a,color:#fff,stroke:#6b46c1
    style MCP fill:#2c5282,color:#fff,stroke:#3182ce
    style HUMAN fill:#edf2f7,color:#1a202c,stroke:#a0aec0,stroke-dasharray: 4 4
    style MODEL fill:#edf2f7,color:#1a202c,stroke:#a0aec0,stroke-dasharray: 4 4
    style CLIENT fill:#edf2f7,color:#1a202c,stroke:#a0aec0,stroke-dasharray: 4 4
    style CLUSTER fill:#edf2f7,color:#1a202c,stroke:#a0aec0,stroke-dasharray: 4 4

The center is a product contract, not the src/korvid/core/ package: every adapter shares cluster reads and UI control, and any write request that reaches korvid — from the TUI, the embedded agent, or an MCP write proposal — passes through the approval gate and is logged. Provider payload masking belongs to the embedded Agent boundary; MCP result disclosure remains tool-specific.

The two adapter extras are independent, not a ladder, and neither implies the other: korvid[mcp] gives an editor's assistant cluster sight with no embedded agent, and korvid[agent] needs no MCP. Observability is an add-on to either tool surface (korvid[agent,observability], korvid[mcp,observability]), never a standalone base-TUI surface:

uv tool install korvid                 # cockpit only
uv tool install 'korvid[agent]'        # + embedded AI agent
uv tool install 'korvid[mcp]'          # + MCP server for external agents
uv tool install 'korvid[all]'          # agent, mcp, observability

brew install hellices/korvid/korvid    # macOS/Linux, no Python needed (= agent)

Entra ID auth for Azure OpenAI is a separate korvid[agent,entra] extra, excluded from [all]. (pipx works the same way.) A missing extra is not an error: korvid starts and the feature it powers is simply absent — unless you asked for it on the command line, in which case it refuses to start and tells you what to install.


The three surfaces

The cockpit (included). Navigate any resource kind with :, filter with / (fuzzy, regex, or label selectors), drill into relationships with Enter — deployment to replicaset to pods, a Helm release or operator to everything it installed. Split panes, live sort, CPU/MEM against enforced limits, and a troubled pod that explains itself before you open it. Plus log tailing, exec, file transfer without the kubectl binary, and port-forwards that flip to broken when their pod dies instead of failing silently. All it needs is a kubeconfig — no AI, no account, no network beyond your cluster. Keys in keybindings.md, the tour in tui.md.

The agent (korvid[agent]). Ctrl-A opens a chat panel that already knows your view, namespace, selection, and filter. It reads through read-only tools — manifests, logs, events, compound diagnostics — and drives the UI itself: "show me the crashing pod's logs" navigates, filters, and opens the log pane instead of printing a suggestion. Answers cite the reads behind them and a navigable citation opens its actual view; korvid reports an invented reference rather than accepting it quietly, but it cannot force a model to cite everything, so an uncited sentence stays exactly that. It needs a provider (Copilot, Azure OpenAI, Anthropic, OpenAI, Ollama, or any OpenAI-compatible endpoint), and agent.model_tier: low targets 3B–14B models on your own hardware. See agent.md.

The MCP server (korvid[mcp]). The same read and UI-driving tools over MCP, so VS Code Copilot Chat, Claude Code, Cursor, or Zed gains cluster sight and moves korvid's UI while you watch. It cannot change anything: cluster writes are not on the MCP surface — not gated there, absent. Opting in with mcp.write_proposals: true (off by default) adds one ability: leaving a write proposal a human approves inside korvid. See mcp.md.


Four agent/MCP adapter compositions

Four core shapes come from the two independent adapters; observability is an optional overlay on any shape with agent or MCP, and korvid[all] includes it.

flowchart TB
    subgraph ROW1["  "]
        direction LR
        subgraph C4["korvid[all]  —  agent + MCP + observability"]
            direction TB
            C4A["Agent<br/>OPTIONAL"]
            C4M["MCP<br/>OPTIONAL"]
            C4O["Prometheus/Loki<br/>OPTIONAL"]
            C4T["TUI<br/>INCLUDED"]
            C4R["Core"]
            C4K["K8s<br/>INCLUDED"]
            C4A --> C4R
            C4M --> C4R
            C4O --> C4R
            C4T --> C4R --> C4K
        end

        subgraph C2["korvid[agent]  —  + embedded AI"]
            direction TB
            C2A["Agent<br/>OPTIONAL"]
            C2T["TUI<br/>INCLUDED"]
            C2R["Core"]
            C2K["K8s<br/>INCLUDED"]
            C2A --> C2R
            C2T --> C2R --> C2K
        end
    end

    subgraph ROW2["  "]
        direction LR
        subgraph C3["korvid[mcp]  —  + MCP server"]
            direction TB
            C3M["MCP<br/>OPTIONAL"]
            C3T["TUI<br/>INCLUDED"]
            C3R["Core"]
            C3K["K8s<br/>INCLUDED"]
            C3M --> C3R
            C3T --> C3R --> C3K
        end

        subgraph C1["korvid  —  cockpit only"]
            direction TB
            C1T["TUI<br/>INCLUDED"]
            C1R["Core"]
            C1K["K8s<br/>INCLUDED"]
            C1T --> C1R --> C1K
        end
    end

    NOTE["korvid[agent,entra] is a separate<br/>auth extra — not included in [all]"]

    style ROW1 fill:none,stroke:none
    style ROW2 fill:none,stroke:none
    style NOTE fill:#fffbeb,color:#92400e,stroke:#d97706,stroke-dasharray: 4 4

    style C1T fill:#22543d,color:#fff,stroke:#276749
    style C1R fill:#2d3748,color:#e2e8f0,stroke:#4a5568
    style C1K fill:#22543d,color:#fff,stroke:#276749

    style C2T fill:#22543d,color:#fff,stroke:#276749
    style C2A fill:#553c9a,color:#fff,stroke:#6b46c1
    style C2R fill:#2d3748,color:#e2e8f0,stroke:#4a5568
    style C2K fill:#22543d,color:#fff,stroke:#276749

    style C3T fill:#22543d,color:#fff,stroke:#276749
    style C3M fill:#2c5282,color:#fff,stroke:#3182ce
    style C3R fill:#2d3748,color:#e2e8f0,stroke:#4a5568
    style C3K fill:#22543d,color:#fff,stroke:#276749

    style C4T fill:#22543d,color:#fff,stroke:#276749
    style C4A fill:#553c9a,color:#fff,stroke:#6b46c1
    style C4M fill:#2c5282,color:#fff,stroke:#3182ce
    style C4R fill:#2d3748,color:#e2e8f0,stroke:#4a5568
    style C4K fill:#22543d,color:#fff,stroke:#276749

The one rule all four share

Nothing changes your cluster without a human keystroke, and nothing changes it unlogged.

Not a policy prompt, not an opt-in confirmation setting. The write path goes through the dialog — there is no second route, for you, for the agent, or for an MCP client — and a write whose audit record cannot be written does not happen at all. Most dialogs preview the change (a server-side dry-run diff, a rendered Helm manifest); some have none, and a preview that times out never holds the dialog hostage: the preview is a courtesy, the dialog and the audit entry are the guarantee. --readonly removes writes entirely; a protected context makes every confirmation there require typing the context name instead of a single y.

Secret values and the credential patterns korvid recognises are masked before anything reaches the embedded agent's provider, and :ai payload shows what was sent — a boundary you cannot inspect is a promise, not a control. Two honest limits: a secret only your application knows is a secret, sitting in a log line, may pass undetected; and an external MCP client applies its own data policy, not korvid's. threat-model.md is specific about both, ops.md about the write path itself.


Why this shape

Three convictions, visible in the structure above:

An operator's tool should work without AI. The cockpit is complete on its own, so it keeps working when a provider is down, a token expires, or policy forbids sending cluster data anywhere.

An AI that cannot act is a search engine; one that acts unsupervised is a liability. The middle ground does everything except the irreversible part, and hands you that part with a preview attached.

Where the model runs is your decision. A frontier API, or a 3B model on a node in your own cluster; the low tier and a published per-model scoreboard make that choice informed rather than hopeful.


Where to go next

You want to Read
Install and start using it README
Learn the keys keybindings.md
Set up the agent agent.md
Connect an editor over MCP mcp.md
Understand the write safety model ops.md
Know exactly what reaches a model threat-model.md
Check the measured envelope performance.md
Run without internet access airgap.md
See how the code is organised dev/specs/2026-08-12-korvid-architecture.md