Skip to content

Prior art: how terminal dashboards let plugins take keys #9

Closed

Description

@shayan-ys

Part of the map Map: integration key contract.

Question

How do terminal dashboards and multiplexers let a plugin or external command receive key presses, and how do they handle delivery (re-run vs long-lived process), state between runs, focus, conflicts with host keys, and showing available keys? Survey at least k9s plugins, lazygit customCommands, wtfutil, zellij plugins, and tmux bind/run-shell. Report patterns, trade-offs, and failure modes relevant to devdash's one-shot integration contract (command without shell, timeout, process-group kill).

Activity

  1. self-assigned this
    on Oct 9, 2026
  2. shayan-ys commented on Oct 9, 2026

    @shayan-ys
    OwnerAuthor

    Resolution

    Findings: plugin-keys-prior-art.md (throwaway branch research/plugin-keys-prior-art).

    • Delivery: k9s, lazygit, and tmux re-run a one-shot command per key, which matches devdash's contract. Only Zellij uses a long-lived plugin that receives key events, with a different lifecycle.
    • State: one-shot tools pass the selection to each run (k9s env vars, lazygit templates). Long-lived plugins keep their own state.
    • Focus: none of them needs globally unique keys. They scope keys by context or panel (k9s, lazygit), by focus with Tab/Shift-Tab or a number key (WTF, Zellij), or by key table (tmux). No source documents rejecting duplicate keys.
    • Key syntax: case-sensitive printable keys (lazygit A ≠ a) plus named special keys (<enter>, <up>, Left, F1) and modifiers.
    • Discoverability: lazygit lists custom keys in its ? menu; k9s shows the shortcut and description in its menu.
    • In-flight runs: no source specifies what happens when a key arrives during a run. This is open design for Key-triggered runs: redraw, overlap, and errors.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions