Skip to content

Plugin API: add cover-art widgets and composable layouts for custom screens #396

Description

@natersalad

Is your feature request related to a problem? Please describe.

Lua plugins can register full-screen custom views, read synchronized lyrics, and react to playback, but API v5 custom screens can only render vertically stacked paragraph, list, and gauge widgets. Plugins cannot reuse Spotatui's already-downloaded in-memory cover art or place widgets side by side.

This prevents plugins from building customizable now-playing screens such as cover art beside synchronized lyrics. The current alternatives are maintaining a native fork, downloading the same image again and writing terminal graphics commands directly to /dev/tty, or using a text-only approximation.

Describe the solution you'd like

Expose Spotatui-managed cover art as a plugin screen widget, backed by the existing in-memory CoverArt state rather than another network download. For example:

{
  type = "cover_art",
  source = "current",
  fit = "contain",
  height = 20,
}

For full customization, also support composable row/column containers (or an equivalent grid API), for example:

{
  type = "row",
  children = {
    { type = "cover_art", source = "current", width_percent = 40 },
    { type = "paragraph", lines = lyrics, width_percent = 60 },
  },
}

The app should retain ownership of downloading, decoding, terminal-protocol selection, resizing, placement, and cleanup. Plugins would only declare where the current image should appear.

This could be introduced in a new scripting API version while keeping the current widget format compatible.

Describe alternatives you've considered

  • A built-in combined cover-art/lyrics view. This solves one layout but does not enable broader plugin customization.
  • A plugin that independently downloads artwork and writes Kitty graphics protocol escapes to /dev/tty. This duplicates downloads and can conflict with Ratatui rendering and cleanup.
  • A text/half-block approximation, which loses the quality of the existing image renderer.
  • Maintaining a custom native fork, which complicates normal Homebrew updates.

Additional context

A motivating plugin would combine current cover art with spotatui.get_lyrics() in a responsive now-playing screen. More generally, image widgets could support dashboards, album details, notifications, and source-specific views without requiring each idea to become a built-in route.

Spotatui already stores separate playbar and fullscreen image protocol state, so a plugin-specific render state may fit the existing ownership model.

thanks for taking a look, any feedback is appreciated!

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions