{
  "name": "spotify",
  "kind": "registry",
  "title": "Spotify",
  "description": "Search, play, queue, like and add to playlists on Spotify from the keyboard, with lyrics that follow the song and a bar item that shows the line playing.",
  "version": "0.1.0",
  "icon": {
    "tile": {
      "svg": "M12 0C5.4 0 0 5.4 0 12s5.4 12 12 12 12-5.4 12-12S18.66 0 12 0zm5.521 17.34c-.24.359-.66.48-1.021.24-2.82-1.74-6.36-2.101-10.561-1.141-.418.122-.779-.179-.899-.539-.12-.421.18-.78.54-.9 4.56-1.021 8.52-.6 11.64 1.32.42.18.479.659.301 1.02zm1.44-3.3c-.301.42-.841.6-1.262.3-3.239-1.98-8.159-2.58-11.939-1.38-.479.12-1.02-.12-1.14-.6-.12-.48.12-1.021.6-1.141C9.6 9.9 15 10.561 18.72 12.84c.361.181.54.78.241 1.2zm.12-3.36C15.24 8.4 8.82 8.16 5.16 9.301c-.6.179-1.2-.181-1.38-.721-.18-.601.18-1.2.72-1.381 4.26-1.26 11.28-1.02 15.721 1.621.539.3.719 1.02.419 1.56-.299.421-1.02.599-1.559.3z",
      "box": 24,
      "bg": "#1ED760",
      "fg": "#000000"
    }
  },
  "author": "pal",
  "spec": "github:zcag/pal/extensions/spotify@v0.9.1",
  "source": "https://github.com/zcag/pal/tree/HEAD/extensions/spotify",
  "commit": "63287e180ce349dac3aa87c68ce4c80bc42ad409",
  "manifest": {
    "name": "spotify",
    "title": "Spotify",
    "description": "Search, play, queue, like and add to playlists on Spotify from the keyboard, with lyrics that follow the song and a bar item that shows the line playing.",
    "version": "0.1.0",
    "icon": {
      "tile": {
        "svg": "M12 0C5.4 0 0 5.4 0 12s5.4 12 12 12 12-5.4 12-12S18.66 0 12 0zm5.521 17.34c-.24.359-.66.48-1.021.24-2.82-1.74-6.36-2.101-10.561-1.141-.418.122-.779-.179-.899-.539-.12-.421.18-.78.54-.9 4.56-1.021 8.52-.6 11.64 1.32.42.18.479.659.301 1.02zm1.44-3.3c-.301.42-.841.6-1.262.3-3.239-1.98-8.159-2.58-11.939-1.38-.479.12-1.02-.12-1.14-.6-.12-.48.12-1.021.6-1.141C9.6 9.9 15 10.561 18.72 12.84c.361.181.54.78.241 1.2zm.12-3.36C15.24 8.4 8.82 8.16 5.16 9.301c-.6.179-1.2-.181-1.38-.721-.18-.601.18-1.2.72-1.381 4.26-1.26 11.28-1.02 15.721 1.621.539.3.719 1.02.419 1.56-.299.421-1.02.599-1.559.3z",
        "box": 24,
        "bg": "#1ED760",
        "fg": "#000000"
      }
    },
    "author": "pal",
    "repo": "bundled",
    "settings": [
      {
        "kind": "text",
        "id": "client_id",
        "label": "Client id",
        "placeholder": "32 hex characters from developer.spotify.com",
        "description": "Your own Spotify app's client id (README: create one at developer.spotify.com with the redirect http://127.0.0.1:27182/callback). No secret is needed: pal signs in with PKCE.",
        "default": ""
      },
      {
        "kind": "number",
        "id": "redirect_port",
        "label": "Redirect port",
        "description": "The port pal listens on for the sign-in redirect; must match the redirect URI registered on the app.",
        "min": 1024,
        "max": 65535,
        "default": 27182
      },
      {
        "kind": "list",
        "id": "pinned",
        "label": "Pinned playlists",
        "placeholder": "A playlist name, or its spotify:playlist: link",
        "description": "Each one is a \"Play \u003cname\u003e\" row at the root.",
        "default": []
      }
    ],
    "palettes": {
      "now-playing": {
        "title": "Lyrics",
        "description": "The track playing with its cover, a ticking progress bar, the state, and lrclib's synced lyrics around the line playing; follows the song while open.",
        "kind": "view",
        "refresh": 5,
        "keys": [
          {
            "keys": "space, enter",
            "title": "Play or pause"
          },
          {
            "keys": "left, right",
            "title": "Seek 10 s back or forward"
          },
          {
            "keys": "up, down",
            "title": "Volume up or down"
          },
          {
            "keys": "l",
            "title": "Like or unlike"
          },
          {
            "keys": "s",
            "title": "Shuffle on or off"
          },
          {
            "keys": "r",
            "title": "Repeat: all, one, off"
          },
          {
            "keys": "q",
            "title": "The queue"
          },
          {
            "keys": "d",
            "title": "Devices"
          },
          {
            "keys": "cmd+right, cmd+left",
            "title": "Next or previous track"
          },
          {
            "keys": "cmd+c",
            "title": "Copy the line playing (the track without lyrics)"
          },
          {
            "keys": "cmd+o",
            "title": "Open in Spotify"
          },
          {
            "keys": "f",
            "title": "Search lrclib when it has no lyrics"
          }
        ]
      },
      "search": {
        "title": "Search Spotify",
        "description": "Tracks, artists, albums, playlists, podcasts and episodes as sections with their cover art.",
        "kind": "input",
        "keys": [
          {
            "keys": "enter",
            "title": "Play"
          },
          {
            "keys": "cmd+enter",
            "title": "Add to queue (a track); show tracks (a playlist or album)"
          },
          {
            "keys": "cmd+l",
            "title": "Like or unlike a track"
          },
          {
            "keys": "cmd+p",
            "title": "Add a track to the playlist picked in the bar's field"
          },
          {
            "keys": "cmd+s",
            "title": "Play a playlist shuffled"
          },
          {
            "keys": "cmd+o",
            "title": "Open in Spotify"
          },
          {
            "keys": "cmd+c",
            "title": "Copy link"
          }
        ]
      },
      "playlists": {
        "title": "Playlists",
        "description": "Your playlists and the ones you follow; a drill-in lists the tracks and plays from one.",
        "kind": "list",
        "ttl": 300,
        "keys": [
          {
            "keys": "enter",
            "title": "Play"
          },
          {
            "keys": "cmd+enter",
            "title": "Show tracks (a playlist); add to queue (a track of one)"
          },
          {
            "keys": "cmd+s",
            "title": "Play shuffled"
          },
          {
            "keys": "cmd+l",
            "title": "Like or unlike a track of a listed playlist"
          },
          {
            "keys": "cmd+p",
            "title": "Add a listed track to the playlist picked in the bar's field"
          },
          {
            "keys": "cmd+o",
            "title": "Open in Spotify"
          },
          {
            "keys": "cmd+c",
            "title": "Copy link"
          }
        ],
        "lazy": true
      },
      "library": {
        "title": "Library",
        "description": "Liked Songs newest first, recently played, and the top tracks and artists of the last weeks, as filters.",
        "kind": "list",
        "ttl": 300,
        "keys": [
          {
            "keys": "tab",
            "title": "Liked Songs, Recently played, Top tracks, Top artists"
          },
          {
            "keys": "enter",
            "title": "Play"
          },
          {
            "keys": "cmd+enter",
            "title": "Add to queue"
          },
          {
            "keys": "cmd+l",
            "title": "Like or unlike"
          },
          {
            "keys": "cmd+p",
            "title": "Add to the playlist picked in the bar's field"
          },
          {
            "keys": "cmd+o",
            "title": "Open in Spotify"
          },
          {
            "keys": "cmd+c",
            "title": "Copy link"
          }
        ],
        "lazy": true
      },
      "devices": {
        "title": "Spotify Devices",
        "description": "Every device Spotify is open on: transfer playback to one, and the volume of the active one (up, down, mute, or a level typed in the bar).",
        "kind": "live",
        "keys": [
          {
            "keys": "enter",
            "title": "Play here (a device); volume up, down, mute (the volume rows); on Set volume…, the level typed in the bar's field"
          },
          {
            "keys": "cmd+enter",
            "title": "Transfer without playing"
          },
          {
            "keys": "cmd+up, cmd+down",
            "title": "Volume of the active device"
          }
        ],
        "lazy": true
      },
      "queue": {
        "title": "Queue",
        "description": "What plays now and what comes next; skip to a row.",
        "kind": "live",
        "keys": [
          {
            "keys": "enter",
            "title": "Skip to the row (play or pause on the first)"
          },
          {
            "keys": "cmd+l",
            "title": "Like or unlike"
          },
          {
            "keys": "cmd+p",
            "title": "Add to the playlist picked in the bar's field"
          },
          {
            "keys": "cmd+o",
            "title": "Open in Spotify"
          },
          {
            "keys": "cmd+c",
            "title": "Copy link"
          }
        ],
        "lazy": true
      },
      "commands": {
        "title": "Spotify",
        "description": "Play or pause, next, previous, like, lyrics, sign out, and a Play row per pinned playlist, all root results.",
        "kind": "list",
        "tier": "primary",
        "keys": [
          {
            "keys": "enter",
            "title": "Run"
          },
          {
            "keys": "cmd+s",
            "title": "Play a pinned playlist shuffled"
          },
          {
            "keys": "cmd+o",
            "title": "Open a pinned playlist in Spotify"
          }
        ]
      }
    },
    "states": {
      "playing": {
        "description": "Spotify is playing",
        "kind": "boolean"
      },
      "loaded": {
        "description": "A track is loaded, playing or paused",
        "kind": "boolean"
      }
    },
    "bar": {
      "playing": {
        "title": "Spotify",
        "description": "The track playing (or the lyric line, with \"Lyrics\"), hidden while nothing plays; the popover is the lyrics view in a compact layout with the transport keys and the queue's next two, ticking while it is up.",
        "mocks": {
          "lyrics": {
            "title": "Synced lyric line",
            "item": {
              "icon": "󰓇",
              "title": "Your eyes",
              "tooltip": "Radiohead - Weird Fishes/ Arpeggi (hornet)"
            }
          },
          "track": {
            "title": "No synced lyrics",
            "item": {
              "icon": "󰓇",
              "title": "Weird Fishes/ Arpeggi · Radiohead",
              "tooltip": "Radiohead - Weird Fishes/ Arpeggi (hornet)"
            }
          },
          "held": {
            "title": "Paused, kept on the bar (While a track is loaded)",
            "item": {
              "icon": "󰓇",
              "title": "Weird Fishes/ Arpeggi · Radiohead",
              "color": "muted",
              "tooltip": "Radiohead - Weird Fishes/ Arpeggi, paused"
            }
          },
          "paused": {
            "title": "Paused or nothing playing",
            "item": {
              "hidden": true,
              "empty": {
                "icon": "󰓇",
                "tooltip": "Nothing playing"
              }
            }
          }
        },
        "refresh": {
          "every": 30,
          "on": [
            "show",
            "wake",
            "network",
            "media"
          ]
        },
        "keys": [
          {
            "keys": "space",
            "title": "Pause or play"
          },
          {
            "keys": "cmd+right",
            "title": "Next track"
          },
          {
            "keys": "cmd+left",
            "title": "Previous track"
          },
          {
            "keys": "right",
            "title": "Seek 10 s forward"
          },
          {
            "keys": "left",
            "title": "Seek 10 s back"
          },
          {
            "keys": "up",
            "title": "Volume up"
          },
          {
            "keys": "down",
            "title": "Volume down"
          },
          {
            "keys": "l",
            "title": "Like or unlike"
          },
          {
            "keys": "s",
            "title": "Shuffle on or off"
          },
          {
            "keys": "r",
            "title": "Repeat all, one, off"
          },
          {
            "keys": "q",
            "title": "Open the queue"
          },
          {
            "keys": "d",
            "title": "Open the devices"
          },
          {
            "keys": "cmd+c",
            "title": "Copy the current line (or the track)"
          },
          {
            "keys": "cmd+o",
            "title": "Open in Spotify"
          }
        ],
        "rules": [
          {
            "id": "paused",
            "when": "spotify.loaded and not spotify.playing",
            "description": "A loaded track that is paused: off the strip, muted for anyone who keeps it.",
            "hidden": true,
            "color": "muted"
          }
        ],
        "settings": [
          {
            "kind": "boolean",
            "id": "lyrics",
            "label": "Lyrics",
            "text": "Show the lyric line playing instead of the track name",
            "description": "Only when lrclib has synced lyrics for the track; the track name otherwise.",
            "default": true
          }
        ]
      }
    },
    "license": "MIT",
    "store": {
      "tagline": "Search, play and queue Spotify from the keyboard",
      "category": "media",
      "features": [
        "Search tracks, artists, albums, playlists and podcasts as you type; `enter` plays, `cmd+enter` queues",
        "Like with `cmd+l`, add to a playlist with `cmd+p`, open in Spotify with `cmd+o`",
        "Your playlists, liked songs, recently played, top tracks, devices and the queue",
        "Synced lyrics around the line playing, with the cover, progress and playback on keys",
        "Play, pause, skip and like from the root, plus a row for each pinned playlist",
        "A bar item with the track or the lyric line playing"
      ],
      "permissions": [
        "network",
        "token"
      ],
      "platforms": [
        "macos",
        "linux"
      ],
      "screenshots": [
        {
          "file": "1-lyrics.png",
          "caption": "The lyrics view: the cover, the progress, the line playing bright among the lines around it"
        },
        {
          "file": "2-search.png",
          "caption": "Search: tracks, artists, albums, playlists and podcasts as sections"
        },
        {
          "file": "3-playlists.png",
          "caption": "Playlists: yours and the followed ones; cmd+enter lists a playlist's tracks"
        },
        {
          "file": "4-library.png",
          "caption": "Library: Liked Songs newest first, the other filters on Tab"
        },
        {
          "file": "5-queue.png",
          "caption": "The queue: what plays now, what comes next, Enter skips to a row"
        },
        {
          "file": "bar-menubar.png",
          "caption": "On the menu bar: the lyric line playing beside the Spotify mark",
          "kind": "bar"
        },
        {
          "file": "bar-menubar-track.png",
          "caption": "A track lrclib has no synced lyrics for: the track and the artist in the line's place",
          "kind": "bar"
        },
        {
          "file": "bar-popover.png",
          "caption": "A click opens the popover: the cover and the track, the bar ticking, the lyrics around the line playing, the transport keys, and the queue's next two",
          "kind": "bar",
          "box": [
            264,
            64,
            840,
            942
          ]
        },
        {
          "file": "bar-sketchybar.png",
          "caption": "On sketchybar: the mark in the icon font, the line as the label",
          "kind": "bar"
        }
      ],
      "actions": [
        {
          "title": "Play",
          "description": "A track, or a playlist, album, artist or show as the context.",
          "keys": "enter"
        },
        {
          "title": "Add to queue",
          "keys": "cmd+enter"
        },
        {
          "title": "Show tracks",
          "description": "A playlist's or album's tracks as a level; Enter plays from there.",
          "keys": "cmd+enter"
        },
        {
          "title": "Play shuffled",
          "keys": "cmd+s"
        },
        {
          "title": "Like",
          "description": "Adds to or removes from Liked Songs.",
          "keys": "cmd+l"
        },
        {
          "title": "Add to playlist",
          "description": "On any track row: the playlist (yours or a collaborative one) picked in the bar's field; a form with the same select from a hotkey.",
          "keys": "cmd+p"
        },
        {
          "title": "Open in Spotify",
          "keys": "cmd+o"
        },
        {
          "title": "Copy link",
          "keys": "cmd+c"
        },
        {
          "title": "Play or pause",
          "description": "In the lyrics view.",
          "keys": "space"
        },
        {
          "title": "Seek back 10 s",
          "keys": "left"
        },
        {
          "title": "Seek forward 10 s",
          "keys": "right"
        },
        {
          "title": "Volume up",
          "keys": "up"
        },
        {
          "title": "Volume down",
          "keys": "down"
        },
        {
          "title": "Shuffle on",
          "keys": "s"
        },
        {
          "title": "Repeat all",
          "description": "Then Repeat one, then off.",
          "keys": "r"
        },
        {
          "title": "Queue",
          "keys": "q"
        },
        {
          "title": "Devices",
          "keys": "d"
        },
        {
          "title": "Copy current line",
          "keys": "cmd+c"
        },
        {
          "title": "Search on lrclib",
          "description": "When lrclib has no lyrics for the track.",
          "keys": "f"
        },
        {
          "title": "Play here",
          "description": "Transfers playback to the device.",
          "keys": "enter"
        },
        {
          "title": "Transfer without playing",
          "keys": "cmd+enter"
        },
        {
          "title": "Set volume",
          "description": "In Devices: the level (0 to 100) typed in the bar, on the active device.",
          "keys": "enter"
        },
        {
          "title": "Skip to it",
          "description": "In the queue: one Next per row ahead.",
          "keys": "enter"
        },
        {
          "title": "Sign in to Spotify",
          "description": "Opens the browser; pal listens on 127.0.0.1 for the redirect."
        },
        {
          "title": "Sign out",
          "description": "Forgets the tokens."
        }
      ]
    }
  },
  "playable": false,
  "updated_at": "2026-09-30T01:45:08Z",
  "url": "https://pal.cagdas.io/extensions/spotify",
  "tagline": "Search, play and queue Spotify from the keyboard",
  "category": "media",
  "screenshots": [
    "https://pal.cagdas.io/extensions/spotify/screenshots/1-lyrics-dark.png",
    "https://pal.cagdas.io/extensions/spotify/screenshots/1-lyrics.png",
    "https://pal.cagdas.io/extensions/spotify/screenshots/2-search-dark.png",
    "https://pal.cagdas.io/extensions/spotify/screenshots/2-search.png",
    "https://pal.cagdas.io/extensions/spotify/screenshots/3-playlists-dark.png",
    "https://pal.cagdas.io/extensions/spotify/screenshots/3-playlists.png",
    "https://pal.cagdas.io/extensions/spotify/screenshots/4-library-dark.png",
    "https://pal.cagdas.io/extensions/spotify/screenshots/4-library.png",
    "https://pal.cagdas.io/extensions/spotify/screenshots/5-queue-dark.png",
    "https://pal.cagdas.io/extensions/spotify/screenshots/5-queue.png",
    "https://pal.cagdas.io/extensions/spotify/screenshots/bar-menubar-dark.png",
    "https://pal.cagdas.io/extensions/spotify/screenshots/bar-menubar-track-dark.png",
    "https://pal.cagdas.io/extensions/spotify/screenshots/bar-menubar-track.png",
    "https://pal.cagdas.io/extensions/spotify/screenshots/bar-menubar.png",
    "https://pal.cagdas.io/extensions/spotify/screenshots/bar-popover-dark.png",
    "https://pal.cagdas.io/extensions/spotify/screenshots/bar-popover.png",
    "https://pal.cagdas.io/extensions/spotify/screenshots/bar-sketchybar-dark.png",
    "https://pal.cagdas.io/extensions/spotify/screenshots/bar-sketchybar.png"
  ],
  "panel_screenshots": [
    "https://pal.cagdas.io/extensions/spotify/screenshots/1-lyrics.png",
    "https://pal.cagdas.io/extensions/spotify/screenshots/2-search.png",
    "https://pal.cagdas.io/extensions/spotify/screenshots/3-playlists.png",
    "https://pal.cagdas.io/extensions/spotify/screenshots/4-library.png",
    "https://pal.cagdas.io/extensions/spotify/screenshots/5-queue.png"
  ],
  "bar_screenshots": [
    "https://pal.cagdas.io/extensions/spotify/screenshots/bar-menubar-track.png",
    "https://pal.cagdas.io/extensions/spotify/screenshots/bar-menubar.png",
    "https://pal.cagdas.io/extensions/spotify/screenshots/bar-popover.png",
    "https://pal.cagdas.io/extensions/spotify/screenshots/bar-sketchybar.png"
  ],
  "panel_screenshots_dark": [
    "https://pal.cagdas.io/extensions/spotify/screenshots/1-lyrics-dark.png",
    "https://pal.cagdas.io/extensions/spotify/screenshots/2-search-dark.png",
    "https://pal.cagdas.io/extensions/spotify/screenshots/3-playlists-dark.png",
    "https://pal.cagdas.io/extensions/spotify/screenshots/4-library-dark.png",
    "https://pal.cagdas.io/extensions/spotify/screenshots/5-queue-dark.png"
  ],
  "bar_screenshots_dark": [
    "https://pal.cagdas.io/extensions/spotify/screenshots/bar-menubar-track-dark.png",
    "https://pal.cagdas.io/extensions/spotify/screenshots/bar-menubar-dark.png",
    "https://pal.cagdas.io/extensions/spotify/screenshots/bar-popover-dark.png",
    "https://pal.cagdas.io/extensions/spotify/screenshots/bar-sketchybar-dark.png"
  ],
  "has_bar": true,
  "bar_items": [
    {
      "id": "playing",
      "title": "Spotify",
      "description": "The track playing (or the lyric line, with \"Lyrics\"), hidden while nothing plays; the popover is the lyrics view in a compact layout with the transport keys and the queue's next two, ticking while it is up.",
      "refresh": {
        "every": 30,
        "on": [
          "show",
          "wake",
          "network",
          "media"
        ]
      },
      "refresh_words": "every 30s, when the panel shows, on wake, when the network is back"
    }
  ],
  "has_links": false,
  "links": [],
  "multi": false,
  "has_readme": true
}
