{
  "commit": "716a53dada65ac18ee9aa97b61df7f06cf98b628",
  "extensions": [
    {
      "name": "apps",
      "kind": "bundled",
      "title": "Applications",
      "description": "Installed applications with their own icons: .app bundles on macOS (running ones tagged, with Quit and Hide; the System Settings panes as rows), .desktop entries on Linux (their own actions as secondary actions).",
      "version": "0.1.0",
      "icon": "▢",
      "author": "pal",
      "spec": "github:zcag/pal/extensions/apps@pali",
      "source": "https://github.com/zcag/pal/tree/pali/extensions/apps",
      "commit": "716a53dada65ac18ee9aa97b61df7f06cf98b628",
      "manifest": {
        "name": "apps",
        "title": "Applications",
        "description": "Installed applications with their own icons: .app bundles on macOS (running ones tagged, with Quit and Hide; the System Settings panes as rows), .desktop entries on Linux (their own actions as secondary actions).",
        "version": "0.1.0",
        "icon": "▢",
        "author": "pal",
        "repo": "bundled",
        "license": "MIT",
        "settings": [
          {
            "kind": "list",
            "id": "folders",
            "label": "Extra folders",
            "description": "Scanned in addition to the system's application folders.",
            "placeholder": "/path/to/apps",
            "default": []
          }
        ],
        "store": {
          "tagline": "Every installed app, with its icon, one keystroke from launching.",
          "category": "productivity",
          "features": [
            "macOS: `.app` bundles in `/Applications`, `/System/Applications` and `~/Applications`, one level deep so the Utilities folders come along",
            "Linux: `.desktop` entries from every XDG data dir and the flatpak exports, hidden and `NoDisplay` ones skipped",
            "The bundle id and the display name are keywords, so `com.apple.` or `Chrome` finds the app",
            "A running app carries a green `Running` tag and gains Quit (`cmd+q`) and Hide (`cmd+h`)",
            "35 System Settings panes as rows on macOS: `Keyboard`, `Displays`, `Privacy \u0026 Security`, found by words like `dark mode` or `dns`",
            "A `.desktop` file's own actions (`New Private Window`) are the row's secondary actions on Linux"
          ],
          "permissions": [
            "automation"
          ],
          "platforms": [
            "macos",
            "linux"
          ],
          "screenshots": [
            {
              "file": "1-list.png",
              "caption": "The applications, their source as the subtitle, the running ones tagged"
            },
            {
              "file": "2-search.png",
              "caption": "Typing at the root: the name, the bundle id and the display name all match"
            },
            {
              "file": "3-actions.png",
              "caption": "A running app: Open, Quit, Hide, Reveal in Finder, Copy path, Copy bundle id"
            },
            {
              "file": "4-panes.png",
              "caption": "The System Settings panes are rows too, found by what they hold"
            }
          ],
          "actions": [
            {
              "title": "Open",
              "keys": "enter"
            },
            {
              "title": "Quit",
              "description": "Asks the app through AppleScript, so it may ask you to save; a toast when it is not running.",
              "keys": "cmd+q"
            },
            {
              "title": "Hide",
              "description": "Through System Events.",
              "keys": "cmd+h"
            },
            {
              "title": "Reveal in Finder",
              "keys": "cmd+shift+r"
            },
            {
              "title": "Copy path",
              "keys": "cmd+c"
            },
            {
              "title": "Copy bundle id",
              "keys": "cmd+shift+c"
            },
            {
              "title": "Copy URL",
              "description": "On a System Settings pane: its x-apple.systempreferences: link.",
              "keys": "cmd+c"
            }
          ]
        },
        "palettes": {
          "apps": {
            "kind": "list",
            "description": "Everything that launches.",
            "keys": [
              {
                "keys": "enter",
                "title": "Open the app"
              },
              {
                "keys": "cmd+q",
                "title": "Quit a running app"
              },
              {
                "keys": "cmd+shift+r",
                "title": "Reveal in Finder"
              }
            ]
          }
        }
      },
      "updated_at": "2026-09-16T14:42:34Z",
      "url": "https://pal.cagdas.io/extensions/apps",
      "tagline": "Every installed app, with its icon, one keystroke from launching.",
      "category": "productivity",
      "screenshots": [
        "https://pal.cagdas.io/extensions/apps/screenshots/1-list.png",
        "https://pal.cagdas.io/extensions/apps/screenshots/2-search.png",
        "https://pal.cagdas.io/extensions/apps/screenshots/3-actions.png",
        "https://pal.cagdas.io/extensions/apps/screenshots/4-panes.png"
      ],
      "has_readme": true
    },
    {
      "name": "audio",
      "kind": "bundled",
      "title": "Audio",
      "description": "Output and input devices: switch the default, set the volume, mute.",
      "version": "0.1.0",
      "icon": "♫",
      "author": "pal",
      "spec": "github:zcag/pal/extensions/audio@pali",
      "source": "https://github.com/zcag/pal/tree/pali/extensions/audio",
      "commit": "716a53dada65ac18ee9aa97b61df7f06cf98b628",
      "manifest": {
        "name": "audio",
        "title": "Audio",
        "description": "Output and input devices: switch the default, set the volume, mute.",
        "version": "0.1.0",
        "icon": "♫",
        "author": "pal",
        "repo": "bundled",
        "license": "MIT",
        "store": {
          "tagline": "Switch the output or input, set the volume, mute, without leaving the keyboard.",
          "category": "system",
          "features": [
            "Every output and input in two sections, the default of each direction tagged `default`, the volume on the right, `muted` where it is",
            "`enter` makes the row the default for its direction; a headset shows once under Output and once under Input",
            "`cmd+shift+v` drills into presets of 0, 25, 50, 75 and 100 %, the current one tagged",
            "`cmd+m` toggles mute and stays in the list",
            "The transport (`bluetooth`, `usb`, `builtin`, `hdmi`) in the subtitle when the OS reports it",
            "Live: the defaults and volumes are read again on every show"
          ],
          "permissions": [],
          "platforms": [
            "macos",
            "linux"
          ],
          "screenshots": [
            {
              "file": "1-devices.png",
              "caption": "Outputs and inputs, the defaults tagged, a muted device marked, the volume on the right"
            },
            {
              "file": "2-actions.png",
              "caption": "What a device can do: set as output, set the volume, mute"
            },
            {
              "file": "3-volume.png",
              "caption": "The volume presets for one device, the current level tagged"
            }
          ],
          "actions": [
            {
              "title": "Set as Output / Set as Input",
              "description": "Makes the row the default for its direction; the HUD names it.",
              "keys": "enter"
            },
            {
              "title": "Set Volume…",
              "description": "A level of presets, 0 to 100 %.",
              "keys": "cmd+shift+v"
            },
            {
              "title": "Mute / Unmute",
              "description": "Toggles mute and stays in the list.",
              "keys": "cmd+m"
            }
          ]
        },
        "palettes": {
          "audio": {
            "kind": "live",
            "description": "Every output and input, the defaults tagged, with their volume.",
            "keys": [
              {
                "keys": "enter",
                "title": "Set as the default output or input"
              },
              {
                "keys": "cmd+shift+v",
                "title": "Set the volume"
              },
              {
                "keys": "cmd+m",
                "title": "Mute or unmute"
              }
            ]
          }
        }
      },
      "updated_at": "2026-09-16T14:42:34Z",
      "url": "https://pal.cagdas.io/extensions/audio",
      "tagline": "Switch the output or input, set the volume, mute, without leaving the keyboard.",
      "category": "system",
      "screenshots": [
        "https://pal.cagdas.io/extensions/audio/screenshots/1-devices.png",
        "https://pal.cagdas.io/extensions/audio/screenshots/2-actions.png",
        "https://pal.cagdas.io/extensions/audio/screenshots/3-volume.png"
      ],
      "has_readme": true
    },
    {
      "name": "blackjack",
      "kind": "bundled",
      "title": "Blackjack",
      "description": "A hand of blackjack in the panel, keyboard only: H hit, S stand, D double, P split, Enter deals. The bankroll and the record persist.",
      "version": "0.1.0",
      "icon": "🃏",
      "author": "pal",
      "spec": "github:zcag/pal/extensions/blackjack@pali",
      "source": "https://github.com/zcag/pal/tree/pali/extensions/blackjack",
      "commit": "716a53dada65ac18ee9aa97b61df7f06cf98b628",
      "manifest": {
        "name": "blackjack",
        "title": "Blackjack",
        "description": "A hand of blackjack in the panel, keyboard only: H hit, S stand, D double, P split, Enter deals. The bankroll and the record persist.",
        "version": "0.1.0",
        "icon": "🃏",
        "author": "pal",
        "repo": "bundled",
        "license": "MIT",
        "settings": [
          {
            "kind": "number",
            "id": "decks",
            "label": "Decks",
            "description": "Decks in the shoe; it is reshuffled once a quarter is left.",
            "min": 1,
            "max": 8,
            "default": 6
          },
          {
            "kind": "number",
            "id": "starting_bankroll",
            "label": "Starting bankroll",
            "description": "Chips a new game starts with.",
            "min": 10,
            "max": 1000000,
            "step": 10,
            "unit": "$",
            "default": 1000
          },
          {
            "kind": "number",
            "id": "min_bet",
            "label": "Minimum bet",
            "description": "The smallest bet, and the step + and - move it by.",
            "min": 1,
            "max": 10000,
            "unit": "$",
            "default": 10
          },
          {
            "kind": "boolean",
            "id": "dealer_hits_soft_17",
            "label": "Dealer hits soft 17",
            "text": "The dealer draws on a soft 17 (H17) instead of standing (S17).",
            "default": false
          },
          {
            "kind": "boolean",
            "id": "insurance",
            "label": "Offer insurance",
            "text": "Ask about insurance when the dealer shows an ace.",
            "default": false
          }
        ],
        "store": {
          "tagline": "A hand of blackjack in the panel, keyboard only; the bankroll and the record persist.",
          "category": "fun",
          "features": [
            "The table as a view level: the phase replaces the search input (`Place your bet`, `Your turn`, `Dealer busts`), the footer shows the primary key, `cmd+k` lists every move",
            "`+` and `-` set the bet, `Enter` deals; `H` hit, `S` stand, `D` double down, `P` split a pair; totals show live (`Soft 17`)",
            "Dealer stands on 17 (H17 by setting), blackjack pays 3:2, a dealer blackjack is checked at once, doubling after a split allowed, no surrender; insurance by setting",
            "A shoe of 1 to 8 decks, reshuffled once under a quarter is left (the status line's bar)",
            "Escape leaves at any point; the hand, the bankroll and the record are there when you come back, across restarts",
            "Cards are SVG the extension draws itself, pips laid out as on a real deck"
          ],
          "permissions": [],
          "platforms": [
            "macos",
            "linux"
          ],
          "screenshots": [
            {
              "file": "1-bet.png",
              "caption": "Placing a bet: + and - move it by the minimum, Enter deals"
            },
            {
              "file": "2-hand.png",
              "caption": "Mid-hand after a split: hand 1 is being played, the hole card is face down"
            },
            {
              "file": "3-settled.png",
              "caption": "Settled: the dealer drew and bust, the net for the hand, the record moved"
            },
            {
              "file": "4-moves.png",
              "caption": "A pair of eights against a king: hit, stand, double down or split, each with its key"
            }
          ],
          "actions": [
            {
              "title": "Deal",
              "description": "Also Next hand once a hand is settled.",
              "keys": "enter"
            },
            {
              "title": "Hit",
              "keys": "h"
            },
            {
              "title": "Stand",
              "keys": "s"
            },
            {
              "title": "Double down",
              "description": "On the first two cards: one card, then stand.",
              "keys": "d"
            },
            {
              "title": "Split",
              "description": "A pair, once; split aces take one card each.",
              "keys": "p"
            },
            {
              "title": "Raise the bet",
              "keys": "+"
            },
            {
              "title": "Lower the bet",
              "keys": "-"
            },
            {
              "title": "Take insurance",
              "description": "Offered on an ace with `insurance` on; Enter declines.",
              "keys": "i"
            },
            {
              "title": "New game",
              "description": "A fresh bankroll and record; asks first.",
              "keys": "n"
            }
          ]
        },
        "palettes": {
          "blackjack": {
            "kind": "view",
            "description": "The table. Escape leaves mid-hand; the hand is there when you come back.",
            "keys": [
              {
                "keys": "enter",
                "title": "Deal, or the next hand"
              },
              {
                "keys": "h",
                "title": "Hit"
              },
              {
                "keys": "s",
                "title": "Stand"
              },
              {
                "keys": "d",
                "title": "Double down"
              },
              {
                "keys": "p",
                "title": "Split"
              }
            ]
          }
        }
      },
      "updated_at": "2026-09-16T14:42:34Z",
      "url": "https://pal.cagdas.io/extensions/blackjack",
      "tagline": "A hand of blackjack in the panel, keyboard only; the bankroll and the record persist.",
      "category": "fun",
      "screenshots": [
        "https://pal.cagdas.io/extensions/blackjack/screenshots/1-bet.png",
        "https://pal.cagdas.io/extensions/blackjack/screenshots/2-hand.png",
        "https://pal.cagdas.io/extensions/blackjack/screenshots/3-settled.png",
        "https://pal.cagdas.io/extensions/blackjack/screenshots/4-moves.png"
      ],
      "has_readme": true
    },
    {
      "name": "bluetooth",
      "kind": "bundled",
      "title": "Bluetooth",
      "description": "Paired devices: connect, disconnect, see the battery.",
      "version": "0.1.0",
      "icon": "󰂯",
      "author": "pal",
      "spec": "github:zcag/pal/extensions/bluetooth@pali",
      "source": "https://github.com/zcag/pal/tree/pali/extensions/bluetooth",
      "commit": "716a53dada65ac18ee9aa97b61df7f06cf98b628",
      "manifest": {
        "name": "bluetooth",
        "title": "Bluetooth",
        "description": "Paired devices: connect, disconnect, see the battery.",
        "version": "0.1.0",
        "icon": "󰂯",
        "author": "pal",
        "repo": "bundled",
        "license": "MIT",
        "store": {
          "tagline": "Connect and disconnect paired devices, with their battery, from the panel.",
          "category": "system",
          "features": [
            "Every paired device, connected ones first, with a glyph for its kind (headphones, speaker, keyboard, mouse, controller, phone)",
            "The battery on the right when the OS reports it; AirPods show `L 80% · R 75% · Case 90%`",
            "`enter` connects or disconnects, on the state read back from the OS at that moment; Disconnect asks first",
            "`cmd+c` copies the address (`AA:BB:CC:DD:EE:FF`)",
            "Nothing to install: IOBluetooth on macOS, `bluetoothctl` on Linux",
            "Live: the connected state is read again on every show"
          ],
          "permissions": [],
          "platforms": [
            "macos",
            "linux"
          ],
          "screenshots": [
            {
              "file": "1-devices.png",
              "caption": "Paired devices, the connected ones first with their battery"
            },
            {
              "file": "2-actions.png",
              "caption": "Connect a device that is not, or copy its address"
            },
            {
              "file": "3-disconnect.png",
              "caption": "Disconnect asks first"
            }
          ],
          "actions": [
            {
              "title": "Connect / Disconnect",
              "description": "Toggles the connection; Disconnect asks first; the HUD says which happened.",
              "keys": "enter"
            },
            {
              "title": "Copy Address",
              "keys": "cmd+c"
            }
          ]
        },
        "palettes": {
          "bluetooth": {
            "kind": "live",
            "description": "Every paired device, the connected ones first, with battery when the OS reports it.",
            "keys": [
              {
                "keys": "enter",
                "title": "Connect or disconnect"
              },
              {
                "keys": "cmd+c",
                "title": "Copy the address"
              }
            ]
          }
        }
      },
      "updated_at": "2026-09-16T14:42:34Z",
      "url": "https://pal.cagdas.io/extensions/bluetooth",
      "tagline": "Connect and disconnect paired devices, with their battery, from the panel.",
      "category": "system",
      "screenshots": [
        "https://pal.cagdas.io/extensions/bluetooth/screenshots/1-devices.png",
        "https://pal.cagdas.io/extensions/bluetooth/screenshots/2-actions.png",
        "https://pal.cagdas.io/extensions/bluetooth/screenshots/3-disconnect.png"
      ],
      "has_readme": true
    },
    {
      "name": "bookmarks",
      "kind": "bundled",
      "title": "Bookmarks",
      "description": "Your browsers' bookmarks (Chrome, Brave, Edge, Chromium, Vivaldi, Arc, Safari, Firefox) and hand-picked links from a JSON file: open one, copy its address, or open it in the browser it came from.",
      "version": "0.2.0",
      "icon": "🔖",
      "author": "pal",
      "spec": "github:zcag/pal/extensions/bookmarks@pali",
      "source": "https://github.com/zcag/pal/tree/pali/extensions/bookmarks",
      "commit": "716a53dada65ac18ee9aa97b61df7f06cf98b628",
      "manifest": {
        "name": "bookmarks",
        "title": "Bookmarks",
        "description": "Your browsers' bookmarks (Chrome, Brave, Edge, Chromium, Vivaldi, Arc, Safari, Firefox) and hand-picked links from a JSON file: open one, copy its address, or open it in the browser it came from.",
        "version": "0.2.0",
        "icon": "🔖",
        "author": "pal",
        "repo": "bundled",
        "license": "MIT",
        "settings": [
          {
            "kind": "path",
            "id": "file",
            "label": "Bookmarks file",
            "pick": "file",
            "description": "A JSON array of {name, url, subtitle?, icon?, keywords?}; the url is opened or copied.",
            "default": "~/.config/pal/data/bookmarks.json"
          },
          {
            "kind": "list",
            "id": "browsers",
            "label": "Browsers",
            "description": "Whose bookmarks to list, in order (the first wins a url two have): chrome, brave, edge, chromium, vivaldi, arc, safari, firefox. Empty lists the file alone.",
            "placeholder": "chrome",
            "default": [
              "chrome",
              "brave",
              "edge",
              "chromium",
              "vivaldi",
              "arc",
              "safari",
              "firefox"
            ]
          },
          {
            "kind": "list",
            "id": "exclude_folders",
            "label": "Exclude folders",
            "description": "Bookmark folders skipped, by name (`Archive`) or a short path (`Bookmarks Bar/Old`).",
            "placeholder": "Archive",
            "default": []
          }
        ],
        "store": {
          "tagline": "Your browsers' bookmarks and a JSON file of your own links, searched by name, folder and keyword.",
          "category": "productivity",
          "features": [
            "Chrome, Brave, Edge, Chromium, Vivaldi and Arc: every profile's `Bookmarks` file, a section per browser and profile (`Chrome (Work)`)",
            "Safari's `Bookmarks.plist` and Firefox's `places.sqlite`, read on every listing so an edit shows at once",
            "A JSON file of hand-picked links with `name`, `url`, optional `subtitle`, `icon` and `keywords`",
            "The folder path on the right (`Bookmarks Bar / Dev`) and as keywords; a url two sources have is listed once",
            "Open, copy the link, copy it as `[name](url)`, or open it in the browser it came from"
          ],
          "permissions": [
            "full-disk-access"
          ],
          "platforms": [
            "macos",
            "linux"
          ],
          "screenshots": [
            {
              "file": "1-list.png",
              "caption": "The file's links first, then each browser in its section, the folder on the right"
            },
            {
              "file": "2-search.png",
              "caption": "A folder name is a keyword: typing it finds what is filed under it"
            },
            {
              "file": "3-actions.png",
              "caption": "Open in browser, Copy link, Copy as markdown, Open in Chrome"
            }
          ],
          "actions": [
            {
              "title": "Open in browser",
              "description": "The system's default browser.",
              "keys": "enter"
            },
            {
              "title": "Copy link",
              "keys": "cmd+c"
            },
            {
              "title": "Copy as markdown",
              "description": "[name](url).",
              "keys": "cmd+shift+c"
            },
            {
              "title": "Open in Chrome, Safari, Firefox",
              "description": "On a browser's row: the browser it came from."
            }
          ]
        },
        "palettes": {
          "bookmarks": {
            "kind": "list",
            "description": "The links in the file and the browsers, by name, folder and keyword.",
            "keys": [
              {
                "keys": "enter",
                "title": "Open in the browser"
              },
              {
                "keys": "cmd+c",
                "title": "Copy the link"
              },
              {
                "keys": "cmd+shift+c",
                "title": "Copy as markdown"
              }
            ]
          }
        }
      },
      "updated_at": "2026-09-16T14:42:34Z",
      "url": "https://pal.cagdas.io/extensions/bookmarks",
      "tagline": "Your browsers' bookmarks and a JSON file of your own links, searched by name, folder and keyword.",
      "category": "productivity",
      "screenshots": [
        "https://pal.cagdas.io/extensions/bookmarks/screenshots/1-list.png",
        "https://pal.cagdas.io/extensions/bookmarks/screenshots/2-search.png",
        "https://pal.cagdas.io/extensions/bookmarks/screenshots/3-actions.png"
      ],
      "has_readme": true
    },
    {
      "name": "browser-tabs",
      "kind": "bundled",
      "title": "Browser Tabs",
      "description": "Every open tab of your browsers with its favicon. Enter switches to it; close, mute and copy from the action panel.",
      "version": "0.1.0",
      "icon": "◍",
      "author": "pal",
      "spec": "github:zcag/pal/extensions/browser-tabs@pali",
      "source": "https://github.com/zcag/pal/tree/pali/extensions/browser-tabs",
      "commit": "716a53dada65ac18ee9aa97b61df7f06cf98b628",
      "manifest": {
        "name": "browser-tabs",
        "title": "Browser Tabs",
        "description": "Every open tab of your browsers with its favicon. Enter switches to it; close, mute and copy from the action panel.",
        "version": "0.1.0",
        "icon": "◍",
        "author": "pal",
        "repo": "bundled",
        "license": "MIT",
        "settings": [
          {
            "kind": "number",
            "id": "port",
            "label": "DevTools port",
            "description": "The --remote-debugging-port of a Chromium browser (Chrome, Brave, Edge, Chromium). When something listens there its tabs come over the DevTools protocol, with playing and muted state; otherwise the browsers below are asked.",
            "min": 1,
            "max": 65535,
            "default": 9222
          },
          {
            "kind": "list",
            "id": "apps",
            "label": "Scriptable browsers",
            "description": "macOS only: browsers asked over AppleScript when they are running, by app name. A Chromium browser already on the DevTools port is skipped.",
            "placeholder": "Safari",
            "default": [
              "Safari",
              "Google Chrome"
            ]
          },
          {
            "kind": "boolean",
            "id": "firefox",
            "label": "Firefox",
            "text": "List Firefox tabs from its session file",
            "description": "Read-only: Firefox has no scripting interface, so Focus only raises its window.",
            "default": true
          },
          {
            "kind": "path",
            "id": "firefox_session",
            "label": "Firefox session file",
            "description": "A sessionstore-backups/recovery.jsonlz4; empty finds the most recent profile's.",
            "pick": "file",
            "default": ""
          }
        ],
        "store": {
          "tagline": "Every open tab across Chrome, Safari and Firefox; Enter switches to it.",
          "category": "productivity",
          "features": [
            "A Chromium browser started with `--remote-debugging-port=9222` lists over the DevTools protocol, with `playing` and `muted` tags",
            "Safari and Chrome over one AppleScript run on macOS, so a Chrome without the port still lists",
            "Firefox's tabs from its session file, read-only: they list, and Focus raises its window",
            "Live: listed again on every show, so tab titles are root results; the url, the host and the browser are keywords",
            "Filters: All, Audible (what is playing sound), This window",
            "Close (`cmd+w`), Mute (`cmd+m`, the page's media elements), Copy URL (`cmd+c`), Copy as markdown link (`cmd+shift+c`)"
          ],
          "permissions": [
            "automation",
            "accessibility"
          ],
          "platforms": [
            "macos",
            "linux"
          ],
          "screenshots": [
            {
              "file": "1-list.png",
              "caption": "The tabs of two browsers in their own order, the host as the subtitle, playing and muted tagged"
            },
            {
              "file": "2-audible.png",
              "caption": "The Audible filter: only the tabs a page reports as playing sound"
            },
            {
              "file": "3-actions.png",
              "caption": "Focus, Close, Copy URL, Mute, Copy as markdown link"
            },
            {
              "file": "4-root.png",
              "caption": "Live: tab titles are root results, so part of one typed at the root finds it"
            }
          ],
          "actions": [
            {
              "title": "Focus",
              "description": "Selects the tab in the browser, then raises its window; for Firefox only the window.",
              "keys": "enter"
            },
            {
              "title": "Close",
              "description": "Not for Firefox.",
              "keys": "cmd+w"
            },
            {
              "title": "Copy URL",
              "keys": "cmd+c"
            },
            {
              "title": "Mute / Unmute",
              "description": "DevTools tabs only: the page's media elements, not Chrome's tab mute.",
              "keys": "cmd+m"
            },
            {
              "title": "Copy as markdown link",
              "description": "[title](url).",
              "keys": "cmd+shift+c"
            }
          ]
        },
        "palettes": {
          "tabs": {
            "kind": "live",
            "description": "Open tabs across Chrome, Safari and Firefox.",
            "keys": [
              {
                "keys": "enter",
                "title": "Switch to the tab"
              },
              {
                "keys": "cmd+w",
                "title": "Close the tab"
              },
              {
                "keys": "cmd+m",
                "title": "Mute the tab"
              },
              {
                "keys": "tab",
                "title": "All, Audible, This window"
              }
            ]
          }
        }
      },
      "updated_at": "2026-09-16T14:42:34Z",
      "url": "https://pal.cagdas.io/extensions/browser-tabs",
      "tagline": "Every open tab across Chrome, Safari and Firefox; Enter switches to it.",
      "category": "productivity",
      "screenshots": [
        "https://pal.cagdas.io/extensions/browser-tabs/screenshots/1-list.png",
        "https://pal.cagdas.io/extensions/browser-tabs/screenshots/2-audible.png",
        "https://pal.cagdas.io/extensions/browser-tabs/screenshots/3-actions.png",
        "https://pal.cagdas.io/extensions/browser-tabs/screenshots/4-root.png"
      ],
      "has_readme": true
    },
    {
      "name": "calc",
      "kind": "bundled",
      "title": "Calculator",
      "description": "Evaluates what you type: arithmetic, units, currencies, percentages, dates and time zones.",
      "version": "0.2.0",
      "icon": "=",
      "author": "pal",
      "spec": "github:zcag/pal/extensions/calc@pali",
      "source": "https://github.com/zcag/pal/tree/pali/extensions/calc",
      "commit": "716a53dada65ac18ee9aa97b61df7f06cf98b628",
      "manifest": {
        "name": "calc",
        "title": "Calculator",
        "description": "Evaluates what you type: arithmetic, units, currencies, percentages, dates and time zones.",
        "version": "0.2.0",
        "icon": "=",
        "author": "pal",
        "repo": "bundled",
        "license": "MIT",
        "settings": [
          {
            "kind": "number",
            "id": "precision",
            "label": "Precision",
            "description": "Significant digits in a result; integers are never rounded, units and rates show at most 6.",
            "min": 2,
            "max": 20,
            "default": 10
          },
          {
            "kind": "text",
            "id": "locale",
            "label": "Locale",
            "description": "How numbers and dates are written (en: 1,234.5; tr: 1.234,5; de: 1.234,5). Also how a typed number is read.",
            "default": "en"
          },
          {
            "kind": "text",
            "id": "home_currency",
            "label": "Home currency",
            "description": "What a bare amount (12 usd) converts to. Empty: the time zone's currency.",
            "placeholder": "TRY",
            "default": ""
          }
        ],
        "store": {
          "tagline": "Sums, units, currencies, dates and time zones, answered as you type.",
          "category": "productivity",
          "features": [
            "Arithmetic with precedence, percentages, powers, factorials and bases: `2^10`, `15% of 240`, `255 to hex`",
            "Units through mathjs plus the spellings people type: `5 km to miles`, `72 f to c`, `12 gb to mb`, `5 ft 3 in to cm`",
            "The 30 ECB currencies by code, symbol or name (`12 usd to try`, `€12 to $`, `1k usd`), rates fetched once a day and cached",
            "Dates and durations: `today + 3 days`, `days until 2026-12-25`, `weeks between 2025-06-15 and 2026-01-01`",
            "Time zones by city, abbreviation or offset: `10:00 utc to tokyo`, `5pm ldn in sf`, `now in utc`",
            "A second row with the other form: the reverse conversion, a fraction, the hex and binary of an integer, the ISO date"
          ],
          "permissions": [
            "network",
            "accessibility"
          ],
          "platforms": [
            "macos",
            "linux"
          ],
          "screenshots": [
            {
              "file": "1-currency.png",
              "caption": "12 usd to try at the ECB's rate; the reverse conversion is the second row"
            },
            {
              "file": "2-dates.png",
              "caption": "A day count, with the weeks and months on the right"
            },
            {
              "file": "3-timezone.png",
              "caption": "10:00 UTC in Tokyo, the full date there as the second row"
            },
            {
              "file": "4-actions.png",
              "caption": "What a result can do: copy, paste into the app in front, copy without formatting"
            }
          ],
          "actions": [
            {
              "title": "Copy result",
              "description": "The result as shown.",
              "keys": "enter"
            },
            {
              "title": "Paste result",
              "description": "Into the app that was in front.",
              "keys": "cmd+enter"
            },
            {
              "title": "Copy without formatting",
              "description": "No grouping or symbols: 583.68, 1000000.",
              "keys": "cmd+shift+c"
            },
            {
              "title": "Copy expression = result",
              "keys": "cmd+shift+e"
            }
          ]
        },
        "palettes": {
          "calc": {
            "kind": "input",
            "description": "Type an expression; the result is the row.",
            "keys": [
              {
                "keys": "enter",
                "title": "Copy the result"
              },
              {
                "keys": "cmd+enter",
                "title": "Paste the result"
              }
            ]
          }
        }
      },
      "updated_at": "2026-09-16T14:42:34Z",
      "url": "https://pal.cagdas.io/extensions/calc",
      "tagline": "Sums, units, currencies, dates and time zones, answered as you type.",
      "category": "productivity",
      "screenshots": [
        "https://pal.cagdas.io/extensions/calc/screenshots/1-currency.png",
        "https://pal.cagdas.io/extensions/calc/screenshots/2-dates.png",
        "https://pal.cagdas.io/extensions/calc/screenshots/3-timezone.png",
        "https://pal.cagdas.io/extensions/calc/screenshots/4-actions.png"
      ],
      "has_readme": true
    },
    {
      "name": "calendar",
      "kind": "bundled",
      "title": "Calendar",
      "description": "Your next days of events with the current one tagged: join the call, open it in Calendar, copy its details, delete it; a form adds one. EventKit on macOS, khal on Linux.",
      "version": "0.1.0",
      "icon": "󰃭",
      "author": "pal",
      "spec": "github:zcag/pal/extensions/calendar@pali",
      "source": "https://github.com/zcag/pal/tree/pali/extensions/calendar",
      "commit": "716a53dada65ac18ee9aa97b61df7f06cf98b628",
      "manifest": {
        "name": "calendar",
        "title": "Calendar",
        "description": "Your next days of events with the current one tagged: join the call, open it in Calendar, copy its details, delete it; a form adds one. EventKit on macOS, khal on Linux.",
        "version": "0.1.0",
        "icon": "󰃭",
        "author": "pal",
        "repo": "bundled",
        "license": "MIT",
        "settings": [
          {
            "kind": "list",
            "id": "calendars",
            "label": "Calendars",
            "placeholder": "Work",
            "description": "Calendar names (or ids) to show; empty shows every calendar. The filter dropdown narrows further.",
            "default": []
          },
          {
            "kind": "number",
            "id": "days",
            "label": "Days ahead",
            "description": "How many days from today to list.",
            "min": 1,
            "max": 90,
            "step": 1,
            "unit": "days",
            "default": 7
          },
          {
            "kind": "boolean",
            "id": "hide_declined",
            "label": "Hide declined",
            "text": "Leave out invitations you declined",
            "default": true
          }
        ],
        "store": {
          "tagline": "Your schedule in the panel: what is now, what is next, one key to join the call.",
          "category": "productivity",
          "features": [
            "Today, Tomorrow, This week and Later as sections; the current event tagged `now`, the next one `in 12 min`",
            "Every account Calendar.app has (iCloud, Google, Exchange) through EventKit on macOS; `khal` on Linux",
            "`enter` joins the call when the event has a Zoom, Meet, Teams or Webex link (found in the url, the location or the notes, Outlook safelinks unwrapped), else opens it in Calendar",
            "The calendar's colour as the row's dot, the head count and a `Join` tag on the right; a filter per calendar",
            "The detail pane: the notes as markdown, when, where, the organizer, every attendee with their reply, whether it repeats",
            "New event as a form: title, a day in words (`fri`, `next mon`, `20 sep`), start and end, all-day, the calendar, a location, notes",
            "Delete an event, or one occurrence of a repeating one, after a confirmation",
            "Live with a 60 s ttl: the list is fresh on every show without re-reading the store more than once a minute"
          ],
          "permissions": [
            "calendars"
          ],
          "platforms": [
            "macos",
            "linux"
          ],
          "screenshots": [
            {
              "file": "1-schedule.png",
              "caption": "Today and the days after, the running event tagged now, calls tagged Join"
            },
            {
              "file": "2-detail.png",
              "caption": "The detail pane: notes, when, the attendees with their replies"
            },
            {
              "file": "3-new.png",
              "caption": "New event: a day in words, times, the calendar"
            }
          ],
          "actions": [
            {
              "title": "Join call",
              "description": "Opens the meeting link; first when the event has one.",
              "keys": "enter"
            },
            {
              "title": "Open in Calendar",
              "description": "Shows the event in Calendar.app (macOS).",
              "keys": "enter"
            },
            {
              "title": "Copy conference link",
              "keys": "cmd+shift+c"
            },
            {
              "title": "Copy event details",
              "description": "Title, when, where and the link as text.",
              "keys": "cmd+c"
            },
            {
              "title": "Delete event",
              "description": "Asks first; on a repeating event only this occurrence goes (macOS).",
              "keys": "ctrl+x"
            },
            {
              "title": "New event",
              "description": "The form, then the event in the chosen calendar.",
              "keys": "enter"
            },
            {
              "title": "Grant access",
              "description": "On the permission row: the system prompt, or System Settings when it was denied.",
              "keys": "enter"
            }
          ]
        },
        "palettes": {
          "schedule": {
            "title": "My Schedule",
            "kind": "live",
            "ttl": 60,
            "description": "The next days' events in time order, sectioned by day, the current or next one tagged; a New event row at the end.",
            "keys": [
              {
                "keys": "enter",
                "title": "Join the call, else open in Calendar"
              },
              {
                "keys": "cmd+shift+c",
                "title": "Copy the conference link"
              },
              {
                "keys": "cmd+c",
                "title": "Copy the event details"
              },
              {
                "keys": "ctrl+x",
                "title": "Delete the event"
              }
            ]
          }
        }
      },
      "updated_at": "2026-09-16T14:42:34Z",
      "url": "https://pal.cagdas.io/extensions/calendar",
      "tagline": "Your schedule in the panel: what is now, what is next, one key to join the call.",
      "category": "productivity",
      "screenshots": [],
      "has_readme": false
    },
    {
      "name": "clipboard",
      "kind": "bundled",
      "title": "Clipboard",
      "description": "What you copied, searchable, with images; pinned entries first, a filter by kind (text, images, files, links, colors). Enter pastes it back into the app in front.",
      "version": "0.1.0",
      "icon": "⎘",
      "author": "pal",
      "spec": "github:zcag/pal/extensions/clipboard@pali",
      "source": "https://github.com/zcag/pal/tree/pali/extensions/clipboard",
      "commit": "716a53dada65ac18ee9aa97b61df7f06cf98b628",
      "manifest": {
        "name": "clipboard",
        "title": "Clipboard",
        "description": "What you copied, searchable, with images; pinned entries first, a filter by kind (text, images, files, links, colors). Enter pastes it back into the app in front.",
        "version": "0.1.0",
        "icon": "⎘",
        "author": "pal",
        "repo": "bundled",
        "license": "MIT",
        "settings": [
          {
            "kind": "list",
            "id": "exclude_apps",
            "label": "Exclude apps",
            "description": "Bundle ids (com.1password.1password) or names; copies made in these are not recorded, and none already recorded is listed.",
            "placeholder": "com.1password.1password",
            "default": [
              "com.apple.keychainaccess",
              "com.apple.Passwords"
            ]
          },
          {
            "kind": "number",
            "id": "max_entries",
            "label": "Keep entries",
            "description": "How many unpinned entries history keeps; older ones past this are deleted on the next copy.",
            "min": 1,
            "max": 100000,
            "unit": "entries",
            "default": 1000
          },
          {
            "kind": "number",
            "id": "max_age_days",
            "label": "Keep for",
            "description": "Unpinned entries older than this are deleted on the next copy. 0 keeps them until the entry limit.",
            "min": 0,
            "max": 3650,
            "unit": "days",
            "default": 30
          },
          {
            "kind": "select",
            "id": "primary_action",
            "label": "Primary action",
            "description": "What Enter does on an entry.",
            "options": [
              {
                "id": "paste",
                "title": "Paste into the app in front"
              },
              {
                "id": "copy",
                "title": "Copy to the clipboard"
              }
            ],
            "default": "paste"
          }
        ],
        "store": {
          "tagline": "Everything you copied, searchable, with images; Enter pastes it back.",
          "category": "productivity",
          "features": [
            "Text, images and file lists, recorded while pal runs, searched with SQLite full-text search on every keystroke",
            "The detail pane open from the start: the full text, the image, or the file list, with kind, size, source app and time",
            "Pinned entries in a section at the top, never expiring; the rest newest first, kept for `max_age_days` and `max_entries`",
            "Filters: All, Text, Images, Files, Links (text that is one url) and Colors (a `#hex` or `rgb()`, drawn as a swatch)",
            "Paste (`enter`) or copy back (`cmd+enter`), paste as plain text (`cmd+shift+v`), open a link (`cmd+o`), copy an image as a file (`cmd+shift+c`)",
            "Never recorded: what a password manager marks concealed, copies over 10 MB, copies made in an excluded app"
          ],
          "permissions": [
            "accessibility"
          ],
          "platforms": [
            "macos",
            "linux"
          ],
          "screenshots": [
            {
              "file": "1-list.png",
              "caption": "The history with the pane open: pinned first, then newest, the source app and the time on the right"
            },
            {
              "file": "2-image.png",
              "caption": "An image entry: its size and dimensions, the picture in the pane"
            },
            {
              "file": "3-colors.png",
              "caption": "The Colors filter: a copied colour is drawn as its own swatch"
            },
            {
              "file": "4-actions.png",
              "caption": "Paste, Copy, Pin, Delete, Clear history"
            }
          ],
          "actions": [
            {
              "title": "Paste",
              "description": "Hides the panel and pastes the entry into the app that was in front.",
              "keys": "enter"
            },
            {
              "title": "Copy",
              "description": "Puts the entry back on the clipboard.",
              "keys": "cmd+enter"
            },
            {
              "title": "Open link",
              "description": "On an entry that is one url.",
              "keys": "cmd+o"
            },
            {
              "title": "Paste as plain text",
              "keys": "cmd+shift+v"
            },
            {
              "title": "Copy image file",
              "description": "The PNG the recorder keeps, as a file.",
              "keys": "cmd+shift+c"
            },
            {
              "title": "Pin / Unpin",
              "description": "Pinned entries sort first and never expire.",
              "keys": "cmd+p"
            },
            {
              "title": "Delete",
              "description": "Asks first.",
              "keys": "cmd+d"
            },
            {
              "title": "Delete all unpinned",
              "description": "Asks first; pinned entries stay."
            },
            {
              "title": "Clear history",
              "description": "Asks first; pinned entries included.",
              "keys": "cmd+shift+d"
            }
          ]
        },
        "palettes": {
          "history": {
            "kind": "input",
            "description": "Every copy, pinned ones first, then newest.",
            "keys": [
              {
                "keys": "enter",
                "title": "Paste into the app in front"
              },
              {
                "keys": "cmd+enter",
                "title": "Copy back to the clipboard"
              },
              {
                "keys": "cmd+p",
                "title": "Pin"
              },
              {
                "keys": "tab",
                "title": "Text, Images, Files, Links, Colors"
              }
            ]
          }
        }
      },
      "updated_at": "2026-09-16T14:42:34Z",
      "url": "https://pal.cagdas.io/extensions/clipboard",
      "tagline": "Everything you copied, searchable, with images; Enter pastes it back.",
      "category": "productivity",
      "screenshots": [
        "https://pal.cagdas.io/extensions/clipboard/screenshots/1-list.png",
        "https://pal.cagdas.io/extensions/clipboard/screenshots/2-image.png",
        "https://pal.cagdas.io/extensions/clipboard/screenshots/3-colors.png",
        "https://pal.cagdas.io/extensions/clipboard/screenshots/4-actions.png"
      ],
      "has_readme": true
    },
    {
      "name": "colors",
      "kind": "bundled",
      "title": "Colors",
      "description": "Named colours as swatches (CSS names, pal's tokens, Tailwind, Material) with hex, rgb and hsl to copy, and a converter: type any colour and get every notation, the nearest CSS name and its contrast.",
      "version": "0.1.0",
      "icon": "#4F46D6",
      "author": "pal",
      "spec": "github:zcag/pal/extensions/colors@pali",
      "source": "https://github.com/zcag/pal/tree/pali/extensions/colors",
      "commit": "716a53dada65ac18ee9aa97b61df7f06cf98b628",
      "manifest": {
        "name": "colors",
        "title": "Colors",
        "description": "Named colours as swatches (CSS names, pal's tokens, Tailwind, Material) with hex, rgb and hsl to copy, and a converter: type any colour and get every notation, the nearest CSS name and its contrast.",
        "version": "0.1.0",
        "icon": "#4F46D6",
        "author": "pal",
        "repo": "bundled",
        "license": "MIT",
        "settings": [],
        "store": {
          "tagline": "Named colours as swatches to copy, and any colour converted into every notation.",
          "category": "developer",
          "features": [
            "700 named colours as swatch tiles: the 148 CSS names, pal's own tokens, Tailwind 3.4 (`slate 500`) and Material 2014 (`red a200`), one section per set",
            "Search by name, hex (`#64748b`), token spelling (`slate-500`) or set (`tailwind`); the last twelve picked lead in a Recent section",
            "`Enter` copies the hex, `cmd+enter` the `rgb()`, with `hsl()` and the token name behind shortcuts",
            "Convert colour: type `#f80`, `rgb(255 136 0 / 50%)`, `hsl(30 100% 50%)`, `hwb()`, `oklch()` or a CSS name and every notation is a row",
            "The nearest CSS name (tagged close, near or far) and the WCAG contrast ratio on white and on black with its level",
            "A detail pane with a wide swatch, the complementary colour and three lighter and darker steps as coloured tags"
          ],
          "permissions": [],
          "platforms": [
            "macos",
            "linux"
          ],
          "screenshots": [
            {
              "file": "1-grid.png",
              "caption": "The swatch grid: recently picked first, then one section per set"
            },
            {
              "file": "2-convert.png",
              "caption": "Convert colour: rgb(255 136 0) as hex, hsl, hwb, oklch, the nearest CSS name and the contrast ratios"
            },
            {
              "file": "3-detail.png",
              "caption": "The detail pane on a conversion: a wide swatch, every notation, the nearest name, contrast on white and black"
            },
            {
              "file": "4-actions.png",
              "caption": "What a swatch can do: copy the hex, the rgb, the hsl or the token name"
            }
          ],
          "actions": [
            {
              "title": "Copy hex",
              "description": "`#64748b`; on a conversion row, Copy copies that row.",
              "keys": "enter"
            },
            {
              "title": "Copy rgb",
              "description": "`rgb(100, 116, 139)`",
              "keys": "cmd+enter"
            },
            {
              "title": "Copy hsl",
              "description": "`hsl(215, 16%, 47%)`",
              "keys": "cmd+shift+h"
            },
            {
              "title": "Copy name",
              "description": "The token: `slate-500`, `aliceblue`, `tag-blue`.",
              "keys": "cmd+shift+n"
            }
          ]
        },
        "palettes": {
          "colors": {
            "kind": "grid",
            "description": "The bundled palettes as swatch tiles; recently copied colours first.",
            "keys": [
              {
                "keys": "enter",
                "title": "Copy hex"
              },
              {
                "keys": "cmd+enter",
                "title": "Copy rgb"
              },
              {
                "keys": "cmd+shift+h",
                "title": "Copy hsl"
              },
              {
                "keys": "cmd+shift+n",
                "title": "Copy name"
              }
            ],
            "settings": [
              {
                "kind": "number",
                "id": "columns",
                "label": "Columns",
                "description": "Tiles per row in the grid.",
                "min": 4,
                "max": 16,
                "default": 8
              }
            ]
          },
          "convert": {
            "kind": "input",
            "description": "Type a colour in any notation; the rows are its conversions.",
            "keys": [
              {
                "keys": "enter",
                "title": "Copy the row"
              },
              {
                "keys": "cmd+i",
                "title": "Contrast, nearest name, relatives"
              }
            ]
          }
        }
      },
      "updated_at": "2026-09-16T14:42:34Z",
      "url": "https://pal.cagdas.io/extensions/colors",
      "tagline": "Named colours as swatches to copy, and any colour converted into every notation.",
      "category": "developer",
      "screenshots": [
        "https://pal.cagdas.io/extensions/colors/screenshots/1-grid.png",
        "https://pal.cagdas.io/extensions/colors/screenshots/2-convert.png",
        "https://pal.cagdas.io/extensions/colors/screenshots/3-detail.png",
        "https://pal.cagdas.io/extensions/colors/screenshots/4-actions.png"
      ],
      "has_readme": true
    },
    {
      "name": "docker",
      "kind": "bundled",
      "title": "Docker",
      "description": "Containers, images and Compose projects over the docker CLI. Enter starts or stops a container; logs open in the panel, a shell in a terminal.",
      "version": "0.1.0",
      "icon": "󰡨",
      "author": "pal",
      "spec": "github:zcag/pal/extensions/docker@pali",
      "source": "https://github.com/zcag/pal/tree/pali/extensions/docker",
      "commit": "716a53dada65ac18ee9aa97b61df7f06cf98b628",
      "manifest": {
        "name": "docker",
        "title": "Docker",
        "description": "Containers, images and Compose projects over the docker CLI. Enter starts or stops a container; logs open in the panel, a shell in a terminal.",
        "version": "0.1.0",
        "icon": "󰡨",
        "author": "pal",
        "repo": "bundled",
        "license": "MIT",
        "settings": [
          {
            "kind": "text",
            "id": "binary",
            "label": "Binary",
            "description": "The CLI to run: docker, or podman (its docker-compatible commands are what is used).",
            "placeholder": "docker",
            "default": "docker"
          },
          {
            "kind": "number",
            "id": "ttl",
            "label": "Refresh after",
            "description": "Seconds a listing stays good for: the palettes list again on show only once the rows are older than this. Read when the extension loads.",
            "min": 0,
            "max": 3600,
            "unit": "s",
            "default": 10
          },
          {
            "kind": "select",
            "id": "terminal",
            "label": "Terminal (macOS)",
            "description": "Which terminal Shell opens. Auto picks the first installed of kitty, Ghostty, Alacritty, iTerm2, Terminal. On Linux $TERMINAL, else kitty, foot, alacritty, xterm.",
            "options": [
              {
                "id": "auto",
                "title": "Auto"
              },
              {
                "id": "kitty",
                "title": "kitty"
              },
              {
                "id": "Terminal",
                "title": "Terminal"
              },
              {
                "id": "iTerm2",
                "title": "iTerm2"
              },
              {
                "id": "Ghostty",
                "title": "Ghostty"
              },
              {
                "id": "Alacritty",
                "title": "Alacritty"
              }
            ],
            "default": "auto"
          }
        ],
        "store": {
          "tagline": "Containers, images and Compose projects from the panel: start, stop, logs, a shell.",
          "category": "developer",
          "features": [
            "Every container, running ones first: the image under the name, the published ports (`8080:80`), docker's status (`Up 27 hours`) and a coloured state tag on the right",
            "`enter` stops a running container (after a confirm) or starts a stopped one; `cmd+l` opens its last 200 log lines in the panel; `cmd+t` opens a terminal with a shell inside it",
            "Images: `enter` asks for a name and `host:container` ports in a form, then `docker run -d`",
            "Compose projects docker knows of: `up -d`, `down`, `restart`, logs, open the project folder",
            "Podman works through the same commands: set `binary = \"podman\"`",
            "Without the binary, or with the daemon down, one hint row says which; a slow command goes on in the background and the toast says so"
          ],
          "permissions": [
            "automation"
          ],
          "platforms": [
            "macos",
            "linux"
          ],
          "screenshots": [
            {
              "file": "1-containers.png",
              "caption": "Containers, running first, with ports, status and a state tag"
            },
            {
              "file": "2-actions.png",
              "caption": "What a running container can do: stop, logs, shell, restart, remove"
            },
            {
              "file": "3-logs.png",
              "caption": "The last 200 log lines of a container, opened in the panel"
            },
            {
              "file": "4-run.png",
              "caption": "Running an image: the name and the ports, then docker run -d"
            }
          ],
          "actions": [
            {
              "title": "Stop",
              "description": "A running container; asks first.",
              "keys": "enter"
            },
            {
              "title": "Start",
              "description": "A stopped container.",
              "keys": "enter"
            },
            {
              "title": "Logs",
              "description": "The last 200 lines, stdout and stderr, in the panel.",
              "keys": "cmd+l"
            },
            {
              "title": "Shell",
              "description": "A terminal running docker exec (bash when the image has it, sh otherwise).",
              "keys": "cmd+t"
            },
            {
              "title": "Restart",
              "keys": "cmd+shift+r"
            },
            {
              "title": "Remove",
              "description": "docker rm -f, docker rmi or compose down; asks first.",
              "keys": "cmd+d"
            },
            {
              "title": "Copy id",
              "keys": "cmd+c"
            },
            {
              "title": "Run…",
              "description": "An image: a form for the name and ports, then docker run -d.",
              "keys": "enter"
            },
            {
              "title": "Up",
              "description": "A Compose project: compose up -d.",
              "keys": "enter"
            },
            {
              "title": "Down",
              "description": "Stops and removes the project's containers and networks; asks first.",
              "keys": "cmd+d"
            },
            {
              "title": "Open project folder",
              "keys": "cmd+o"
            }
          ]
        },
        "palettes": {
          "docker": {
            "kind": "live",
            "description": "Every container, running first: start, stop, restart, logs, a shell, remove.",
            "keys": [
              {
                "keys": "enter",
                "title": "Stop a running container, start a stopped one"
              },
              {
                "keys": "cmd+l",
                "title": "Logs"
              },
              {
                "keys": "cmd+t",
                "title": "Shell in a terminal"
              },
              {
                "keys": "cmd+d",
                "title": "Remove"
              }
            ]
          },
          "images": {
            "kind": "live",
            "description": "Local images: run one (name and ports asked), remove, copy the id.",
            "keys": [
              {
                "keys": "enter",
                "title": "Run, after a form for the name and ports"
              },
              {
                "keys": "cmd+c",
                "title": "Copy id"
              },
              {
                "keys": "cmd+d",
                "title": "Remove"
              }
            ]
          },
          "compose": {
            "kind": "live",
            "description": "Compose projects docker knows of: up, down, restart, logs.",
            "keys": [
              {
                "keys": "enter",
                "title": "Up"
              },
              {
                "keys": "cmd+l",
                "title": "Logs"
              },
              {
                "keys": "cmd+d",
                "title": "Down"
              },
              {
                "keys": "cmd+o",
                "title": "Open project folder"
              }
            ]
          }
        }
      },
      "updated_at": "2026-09-16T14:42:34Z",
      "url": "https://pal.cagdas.io/extensions/docker",
      "tagline": "Containers, images and Compose projects from the panel: start, stop, logs, a shell.",
      "category": "developer",
      "screenshots": [
        "https://pal.cagdas.io/extensions/docker/screenshots/1-containers.png",
        "https://pal.cagdas.io/extensions/docker/screenshots/2-actions.png",
        "https://pal.cagdas.io/extensions/docker/screenshots/3-logs.png",
        "https://pal.cagdas.io/extensions/docker/screenshots/4-run.png"
      ],
      "has_readme": true
    },
    {
      "name": "emoji",
      "kind": "bundled",
      "title": "Emoji",
      "description": "An emoji picker: a grid of glyphs by category, recently used first, searched by name, keyword and :shortcode:. Copies or pastes the emoji (with your skin tone), or copies its :shortcode:.",
      "version": "0.2.0",
      "icon": "😀",
      "author": "pal",
      "spec": "github:zcag/pal/extensions/emoji@pali",
      "source": "https://github.com/zcag/pal/tree/pali/extensions/emoji",
      "commit": "716a53dada65ac18ee9aa97b61df7f06cf98b628",
      "manifest": {
        "name": "emoji",
        "title": "Emoji",
        "description": "An emoji picker: a grid of glyphs by category, recently used first, searched by name, keyword and :shortcode:. Copies or pastes the emoji (with your skin tone), or copies its :shortcode:.",
        "version": "0.2.0",
        "icon": "😀",
        "author": "pal",
        "repo": "bundled",
        "license": "MIT",
        "settings": [
          {
            "kind": "select",
            "id": "skin_tone",
            "label": "Skin tone",
            "description": "Applied to the emoji that take one (hands, people) when shown, copied and pasted.",
            "options": [
              {
                "id": "none",
                "title": "None (yellow)"
              },
              {
                "id": "light",
                "title": "Light"
              },
              {
                "id": "medium-light",
                "title": "Medium-light"
              },
              {
                "id": "medium",
                "title": "Medium"
              },
              {
                "id": "medium-dark",
                "title": "Medium-dark"
              },
              {
                "id": "dark",
                "title": "Dark"
              }
            ],
            "default": "none"
          },
          {
            "kind": "boolean",
            "id": "paste_by_default",
            "label": "Paste on Enter",
            "text": "Enter pastes the emoji into the app in front; ⌘Enter copies it",
            "description": "Off, Enter copies and ⌘Enter pastes. Pasting needs Accessibility on macOS.",
            "default": false
          }
        ],
        "store": {
          "tagline": "An emoji grid by category, recently used first; copy or paste one, or its :shortcode:.",
          "category": "reference",
          "features": [
            "Every emoji in the bundled list as a grid, Recently used first (the last 24 you copied or pasted), then Unicode's groups from Smileys \u0026 Emotion to Flags",
            "Search by name, keyword or shortcode: `thumbs`, `celebrate`, `:thumbs_up:`",
            "`Enter` copies the emoji, `cmd+enter` pastes it into the app in front; `paste_by_default` swaps the two",
            "`cmd+shift+c` copies the `:shortcode:`",
            "A skin tone setting applied to the 329 emoji that take one, in the tile, on copy and on paste",
            "Live with a 30 s ttl, so the recents follow what you used"
          ],
          "permissions": [
            "accessibility"
          ],
          "platforms": [
            "macos",
            "linux"
          ],
          "screenshots": [
            {
              "file": "1-grid.png",
              "caption": "The grid: Recently used, then Smileys \u0026 Emotion and the other groups"
            },
            {
              "file": "2-search.png",
              "caption": "Searching by keyword narrows the tiles across every group"
            },
            {
              "file": "3-actions.png",
              "caption": "Copy, paste, or copy the :shortcode:"
            }
          ],
          "actions": [
            {
              "title": "Copy emoji",
              "keys": "enter"
            },
            {
              "title": "Paste emoji",
              "description": "Into the app that was in front; needs Accessibility on macOS.",
              "keys": "cmd+enter"
            },
            {
              "title": "Copy shortcode",
              "description": "`:thumbs_up:`",
              "keys": "cmd+shift+c"
            }
          ]
        },
        "palettes": {
          "emoji": {
            "kind": "grid",
            "description": "Every emoji in the bundled list, by category.",
            "keys": [
              {
                "keys": "enter",
                "title": "Copy emoji"
              },
              {
                "keys": "cmd+enter",
                "title": "Paste emoji"
              },
              {
                "keys": "cmd+shift+c",
                "title": "Copy shortcode"
              }
            ],
            "settings": [
              {
                "kind": "number",
                "id": "columns",
                "label": "Columns",
                "description": "Tiles per row in the grid.",
                "min": 4,
                "max": 16,
                "default": 10
              }
            ]
          }
        }
      },
      "updated_at": "2026-09-16T14:42:34Z",
      "url": "https://pal.cagdas.io/extensions/emoji",
      "tagline": "An emoji grid by category, recently used first; copy or paste one, or its :shortcode:.",
      "category": "reference",
      "screenshots": [
        "https://pal.cagdas.io/extensions/emoji/screenshots/1-grid.png",
        "https://pal.cagdas.io/extensions/emoji/screenshots/2-search.png",
        "https://pal.cagdas.io/extensions/emoji/screenshots/3-actions.png"
      ],
      "has_readme": true
    },
    {
      "name": "files",
      "kind": "bundled",
      "title": "Files",
      "description": "Search files by name through the system's index: Spotlight on macOS, fd, locate or find on Linux; the recently used files before you type, and as a palette of their own. Open, open with another app, reveal, Quick Look, copy the path or the file, trash.",
      "version": "0.1.0",
      "icon": "▤",
      "author": "pal",
      "spec": "github:zcag/pal/extensions/files@pali",
      "source": "https://github.com/zcag/pal/tree/pali/extensions/files",
      "commit": "716a53dada65ac18ee9aa97b61df7f06cf98b628",
      "manifest": {
        "name": "files",
        "title": "Files",
        "description": "Search files by name through the system's index: Spotlight on macOS, fd, locate or find on Linux; the recently used files before you type, and as a palette of their own. Open, open with another app, reveal, Quick Look, copy the path or the file, trash.",
        "version": "0.1.0",
        "icon": "▤",
        "author": "pal",
        "repo": "bundled",
        "license": "MIT",
        "settings": [
          {
            "kind": "list",
            "id": "folders",
            "label": "Folders",
            "description": "Where to search. `~` is expanded.",
            "placeholder": "~/Documents",
            "default": [
              "~"
            ]
          },
          {
            "kind": "number",
            "id": "limit",
            "label": "Results",
            "description": "At most this many rows per query.",
            "min": 1,
            "max": 500,
            "unit": "rows",
            "default": 50
          },
          {
            "kind": "boolean",
            "id": "show_hidden",
            "label": "Hidden files",
            "text": "List files and folders whose name starts with a dot",
            "default": false
          },
          {
            "kind": "list",
            "id": "exclude",
            "label": "Exclude",
            "description": "Folders skipped below the search folders, by name (`node_modules`) or a short path (`Library/Caches`).",
            "placeholder": "node_modules",
            "default": [
              "node_modules",
              ".cache",
              "Library/Caches",
              "target"
            ]
          }
        ],
        "store": {
          "tagline": "Files by name through the OS's own index, the recently used ones before you type.",
          "category": "productivity",
          "features": [
            "Spotlight (`mdfind -name`) on macOS; `fd`, else `locate`, else a bounded `find` on Linux, one process per keystroke, killed after 3 s",
            "Exact and prefix name matches first, at most `limit` rows, the folder as the subtitle, size and date on the right",
            "Before you type: the files used in the last seven days; the same rows as the Recent Files palette",
            "Open with… (`cmd+o`) lists the apps the OS registers for the file, the default tagged",
            "Reveal (`cmd+enter`), Quick Look (`cmd+y`), Copy path (`cmd+c`), Copy file (`cmd+shift+c`), Move to Trash (`cmd+d`, asks first)",
            "The detail pane: path, size, modified, kind, and the first 40 lines of a text file"
          ],
          "permissions": [
            "automation"
          ],
          "platforms": [
            "macos",
            "linux"
          ],
          "screenshots": [
            {
              "file": "1-search.png",
              "caption": "Part of a file name typed: the matches under the configured folders, size and date on the right"
            },
            {
              "file": "2-detail.png",
              "caption": "The detail pane on a text file: path, size, modified, kind, and its first lines"
            },
            {
              "file": "3-open-with.png",
              "caption": "Open with…: the apps registered for the file, the default tagged"
            },
            {
              "file": "4-recent.png",
              "caption": "Recent Files: what was used in the last seven days, newest first"
            }
          ],
          "actions": [
            {
              "title": "Open",
              "description": "The system opener.",
              "keys": "enter"
            },
            {
              "title": "Reveal in Finder",
              "description": "Show in file manager on Linux.",
              "keys": "cmd+enter"
            },
            {
              "title": "Quick Look",
              "description": "macOS only.",
              "keys": "cmd+y"
            },
            {
              "title": "Open with…",
              "description": "A level of the apps registered for the file.",
              "keys": "cmd+o"
            },
            {
              "title": "Copy path",
              "keys": "cmd+c"
            },
            {
              "title": "Copy file",
              "description": "The file itself onto the clipboard: a paste in Finder copies it.",
              "keys": "cmd+shift+c"
            },
            {
              "title": "Move to Trash",
              "description": "Asks first.",
              "keys": "cmd+d"
            }
          ]
        },
        "palettes": {
          "files": {
            "kind": "input",
            "description": "Type part of a file name; rows are the matches under the configured folders. Before you type: the recently used files.",
            "keys": [
              {
                "keys": "enter",
                "title": "Open the file"
              },
              {
                "keys": "cmd+enter",
                "title": "Reveal in Finder"
              },
              {
                "keys": "cmd+o",
                "title": "Open with another app"
              },
              {
                "keys": "cmd+i",
                "title": "The path, size and first lines"
              }
            ]
          },
          "recent": {
            "kind": "live",
            "description": "Files used in the last seven days under the configured folders, newest first.",
            "keys": [
              {
                "keys": "enter",
                "title": "Open the file"
              },
              {
                "keys": "cmd+enter",
                "title": "Reveal in Finder"
              }
            ]
          }
        }
      },
      "updated_at": "2026-09-16T14:42:34Z",
      "url": "https://pal.cagdas.io/extensions/files",
      "tagline": "Files by name through the OS's own index, the recently used ones before you type.",
      "category": "productivity",
      "screenshots": [
        "https://pal.cagdas.io/extensions/files/screenshots/1-search.png",
        "https://pal.cagdas.io/extensions/files/screenshots/2-detail.png",
        "https://pal.cagdas.io/extensions/files/screenshots/3-open-with.png",
        "https://pal.cagdas.io/extensions/files/screenshots/4-recent.png"
      ],
      "has_readme": true
    },
    {
      "name": "github",
      "kind": "bundled",
      "title": "GitHub",
      "description": "Your pull requests, issues, repositories and notifications, and a search over all of GitHub. Signs in through the gh CLI or a token.",
      "version": "0.1.0",
      "icon": "⎇",
      "author": "pal",
      "spec": "github:zcag/pal/extensions/github@pali",
      "source": "https://github.com/zcag/pal/tree/pali/extensions/github",
      "commit": "716a53dada65ac18ee9aa97b61df7f06cf98b628",
      "manifest": {
        "name": "github",
        "title": "GitHub",
        "description": "Your pull requests, issues, repositories and notifications, and a search over all of GitHub. Signs in through the gh CLI or a token.",
        "version": "0.1.0",
        "icon": "⎇",
        "author": "pal",
        "repo": "bundled",
        "settings": [
          {
            "kind": "secret",
            "id": "token",
            "label": "Token",
            "description": "A personal access token (repo, notifications, read:org). Leave empty to use the gh CLI's login.",
            "placeholder": "ghp_...",
            "default": ""
          },
          {
            "kind": "text",
            "id": "default_org",
            "label": "Organisation",
            "description": "An organisation whose recently pushed repositories are listed, and an owner the Create Repository form offers.",
            "placeholder": "acme",
            "default": ""
          },
          {
            "kind": "path",
            "id": "repos_root",
            "label": "Clones folder",
            "pick": "folder",
            "description": "Where your clones live (\u003croot\u003e/\u003cname\u003e or \u003croot\u003e/\u003cowner\u003e/\u003cname\u003e): enables Checkout on a pull request and Open in editor on a repository.",
            "placeholder": "~/proj",
            "default": ""
          },
          {
            "kind": "select",
            "id": "clone_protocol",
            "label": "Clone URL",
            "description": "What Copy clone URL copies.",
            "options": [
              {
                "id": "ssh",
                "title": "SSH (git@github.com:...)"
              },
              {
                "id": "https",
                "title": "HTTPS"
              }
            ],
            "default": "ssh"
          },
          {
            "kind": "number",
            "id": "merged_days",
            "label": "Merged within",
            "description": "How far back the Merged list of Pull Requests reaches.",
            "min": 1,
            "max": 90,
            "unit": "days",
            "default": 7
          },
          {
            "kind": "select",
            "id": "merge_method",
            "label": "Merge method",
            "description": "How the Merge action merges.",
            "options": [
              {
                "id": "merge",
                "title": "Merge commit"
              },
              {
                "id": "squash",
                "title": "Squash"
              },
              {
                "id": "rebase",
                "title": "Rebase"
              }
            ],
            "default": "merge"
          }
        ],
        "palettes": {
          "prs": {
            "title": "Pull Requests",
            "description": "Yours, the ones waiting on your review, and what merged lately.",
            "ttl": 300,
            "kind": "list",
            "keys": [
              {
                "keys": "enter",
                "title": "Open the pull request"
              },
              {
                "keys": "cmd+c",
                "title": "Copy its URL"
              },
              {
                "keys": "cmd+shift+o",
                "title": "Checkout the branch"
              },
              {
                "keys": "cmd+shift+m",
                "title": "Merge"
              }
            ]
          },
          "issues": {
            "title": "Issues",
            "description": "Assigned to you, mentioning you, opened by you; Create Issue.",
            "ttl": 300,
            "kind": "list",
            "keys": [
              {
                "keys": "enter",
                "title": "Open the issue"
              },
              {
                "keys": "cmd+c",
                "title": "Copy its URL"
              },
              {
                "keys": "cmd+shift+x",
                "title": "Close it"
              }
            ]
          },
          "repos": {
            "title": "Repositories",
            "description": "Yours, starred, and your organisation's recently pushed.",
            "ttl": 300,
            "kind": "list",
            "keys": [
              {
                "keys": "enter",
                "title": "Open on GitHub"
              },
              {
                "keys": "cmd+e",
                "title": "Open the clone in the editor"
              },
              {
                "keys": "cmd+shift+c",
                "title": "Copy the clone URL"
              }
            ]
          },
          "notifications": {
            "title": "Notifications",
            "description": "Unread, by reason; opening one marks it read.",
            "ttl": 60,
            "kind": "live",
            "keys": [
              {
                "keys": "enter",
                "title": "Mark read and open"
              },
              {
                "keys": "cmd+shift+r",
                "title": "Mark as read"
              },
              {
                "keys": "cmd+shift+a",
                "title": "Mark all as read"
              }
            ]
          },
          "search": {
            "title": "Search GitHub",
            "description": "GitHub's search syntax over issues, pull requests, repositories and users.",
            "kind": "input",
            "keys": [
              {
                "keys": "enter",
                "title": "Open what was found"
              },
              {
                "keys": "cmd+c",
                "title": "Copy its URL"
              },
              {
                "keys": "tab",
                "title": "Everything, Issues and PRs, Repositories, Users"
              }
            ]
          }
        },
        "bar": {
          "notifications": {
            "title": "Notifications",
            "description": "The unread count as a badge, hidden at zero; the newest five and Mark all read in the popover.",
            "refresh": {
              "every": 300,
              "on": [
                "show",
                "wake",
                "network"
              ]
            }
          }
        },
        "license": "MIT",
        "store": {
          "tagline": "Your pull requests, issues, repositories and notifications as rows, and GitHub's search typed into the panel.",
          "category": "developer",
          "features": [
            "Pull Requests: yours, the ones waiting on your review, and what merged this week, with the checks, the review decision and a draft or conflicts tag on the row",
            "The detail pane on a pull request or issue: the body, the latest comments and reviews, every check by name, who approved",
            "Repositories: yours, your organisation's recently pushed and your stars; `cmd+e` opens the local clone in the editor",
            "Notifications by reason, newest first; `enter` marks the thread read and opens it, `cmd+shift+a` marks all read",
            "Search GitHub as you type: `repo:acme/widgets is:pr`, `author:mara`, `label:bug`, results sectioned by kind",
            "Create Issue and Create Repository as forms; Checkout branch and Merge from the row"
          ],
          "permissions": [
            "network"
          ],
          "platforms": [
            "macos",
            "linux"
          ],
          "screenshots": [
            {
              "file": "1-prs.png",
              "caption": "Pull Requests: Mine, Review requested and Merged, with the checks and the review decision on each row"
            },
            {
              "file": "2-pr-detail.png",
              "caption": "The pane a pull request opens with: the body, the latest comments and reviews, every check by name"
            },
            {
              "file": "3-notifications.png",
              "caption": "Notifications by reason, newest first; the first row is the unread count"
            },
            {
              "file": "4-search.png",
              "caption": "Search GitHub: repositories, issues, pull requests and users for one query"
            }
          ],
          "actions": [
            {
              "title": "Open",
              "description": "The pull request, issue, repository, notification or profile on GitHub; a notification is marked read first.",
              "keys": "enter"
            },
            {
              "title": "Copy URL",
              "keys": "cmd+c"
            },
            {
              "title": "Checkout branch",
              "description": "gh pr checkout in the clone under repos_root.",
              "keys": "cmd+shift+o"
            },
            {
              "title": "Copy branch name",
              "keys": "cmd+shift+b"
            },
            {
              "title": "Open checks",
              "keys": "cmd+shift+k"
            },
            {
              "title": "Open files changed",
              "keys": "cmd+shift+f"
            },
            {
              "title": "Copy reference",
              "description": "owner/repo#n."
            },
            {
              "title": "Mark ready for review",
              "description": "On a draft.",
              "keys": "cmd+shift+r"
            },
            {
              "title": "Merge",
              "description": "With merge_method; asks first.",
              "keys": "cmd+shift+m"
            },
            {
              "title": "Close issue",
              "description": "Asks first.",
              "keys": "cmd+shift+x"
            },
            {
              "title": "Create Issue",
              "description": "A form: repository, title, body."
            },
            {
              "title": "Open in editor",
              "description": "The local clone, in code or the system opener.",
              "keys": "cmd+e"
            },
            {
              "title": "Open folder",
              "keys": "cmd+o"
            },
            {
              "title": "Copy clone URL",
              "description": "ssh or https, per clone_protocol.",
              "keys": "cmd+shift+c"
            },
            {
              "title": "Copy owner/name"
            },
            {
              "title": "Open issues"
            },
            {
              "title": "Open pull requests"
            },
            {
              "title": "Create Repository",
              "description": "A form: owner, name, description, private."
            },
            {
              "title": "Mark as read",
              "description": "Without opening.",
              "keys": "cmd+shift+r"
            },
            {
              "title": "Mark all as read",
              "description": "Asks first.",
              "keys": "cmd+shift+a"
            },
            {
              "title": "Open profile",
              "description": "A user found by Search.",
              "keys": "enter"
            },
            {
              "title": "Copy login",
              "keys": "cmd+c"
            },
            {
              "title": "Open repositories"
            }
          ]
        }
      },
      "updated_at": "2026-09-16T14:42:34Z",
      "url": "https://pal.cagdas.io/extensions/github",
      "tagline": "Your pull requests, issues, repositories and notifications as rows, and GitHub's search typed into the panel.",
      "category": "developer",
      "screenshots": [
        "https://pal.cagdas.io/extensions/github/screenshots/1-prs.png",
        "https://pal.cagdas.io/extensions/github/screenshots/2-pr-detail.png",
        "https://pal.cagdas.io/extensions/github/screenshots/3-notifications.png",
        "https://pal.cagdas.io/extensions/github/screenshots/4-search.png"
      ],
      "has_readme": true
    },
    {
      "name": "home-assistant",
      "kind": "bundled",
      "title": "Home Assistant",
      "description": "Your entities at the root with their state: toggle, dim, set a temperature, run a scene; every service as a form; areas as drill-ins. Over the REST API with a long-lived token.",
      "version": "0.1.0",
      "icon": "󰟐",
      "author": "pal",
      "spec": "github:zcag/pal/extensions/home-assistant@pali",
      "source": "https://github.com/zcag/pal/tree/pali/extensions/home-assistant",
      "commit": "716a53dada65ac18ee9aa97b61df7f06cf98b628",
      "manifest": {
        "name": "home-assistant",
        "title": "Home Assistant",
        "description": "Your entities at the root with their state: toggle, dim, set a temperature, run a scene; every service as a form; areas as drill-ins. Over the REST API with a long-lived token.",
        "version": "0.1.0",
        "icon": "󰟐",
        "author": "pal",
        "repo": "bundled",
        "license": "MIT",
        "settings": [
          {
            "kind": "text",
            "id": "url",
            "label": "URL",
            "placeholder": "http://homeassistant.local:8123",
            "description": "Where Home Assistant answers, scheme included; no trailing slash needed.",
            "default": ""
          },
          {
            "kind": "secret",
            "id": "token",
            "label": "Token",
            "placeholder": "keychain:pal/home-assistant-token",
            "description": "A long-lived access token (your profile in HA, Security, Long-lived access tokens). Stored as a keychain: or env: reference.",
            "default": ""
          },
          {
            "kind": "list",
            "id": "domains",
            "label": "Domains",
            "placeholder": "light",
            "description": "Entity domains listed at the root, in this order. A domain filter shows its domain regardless; favourites are listed regardless.",
            "default": [
              "light",
              "switch",
              "climate",
              "media_player",
              "cover",
              "lock",
              "fan",
              "scene",
              "script",
              "automation",
              "sensor",
              "binary_sensor",
              "person",
              "input_boolean"
            ]
          },
          {
            "kind": "list",
            "id": "favorites",
            "label": "Favourites",
            "placeholder": "light.kitchen",
            "description": "Entity ids pinned to the top, in this order.",
            "default": []
          },
          {
            "kind": "number",
            "id": "timeout",
            "label": "Timeout",
            "description": "How long one request may take before the row says Home Assistant did not answer.",
            "min": 1,
            "max": 60,
            "step": 1,
            "unit": "s",
            "default": 5
          }
        ],
        "store": {
          "tagline": "Your Home Assistant entities, services and areas in the panel, over the REST API.",
          "category": "integration",
          "features": [
            "Every entity of the chosen domains at the root with its state as a tag (`on`, `locked`, `playing`) and when it last changed; favourites first, a filter per domain",
            "Actions by domain: Toggle, Turn on, Turn off, Brightness (`cmd+b`) for a light; Set temperature as a form for a thermostat; Open, Close, Stop for a cover; Lock and Unlock (asking first); play, next, volume for a media player; Activate, Run, Trigger for scenes, scripts and automations",
            "`cmd+c` copies the entity id, `cmd+i` lists its attributes, `cmd+o` opens it in Home Assistant",
            "Every service as a form: the target entity as a select, then the service's fields from its description",
            "Areas as drill-ins: `enter` on an area lists its entities",
            "Entity ids are row ids, so an item hotkey can toggle the kitchen light without showing pal"
          ],
          "permissions": [
            "network"
          ],
          "platforms": [
            "macos",
            "linux"
          ],
          "screenshots": [
            {
              "file": "1-entities.png",
              "caption": "Entities with their state and when it last changed, favourites first"
            },
            {
              "file": "2-actions.png",
              "caption": "What a light can do: toggle, on, off, brightness, and the rows every entity has"
            },
            {
              "file": "3-detail.png",
              "caption": "The detail pane: the entity, its state and its attributes"
            },
            {
              "file": "4-service.png",
              "caption": "A service as a form: the target entity, then the fields Home Assistant describes"
            }
          ],
          "actions": [
            {
              "title": "Toggle",
              "description": "Lights, switches, fans, input booleans.",
              "keys": "enter"
            },
            {
              "title": "Turn on / Turn off",
              "keys": "cmd+enter"
            },
            {
              "title": "Brightness",
              "description": "Presets of 10, 25, 50, 75 and 100 % for a light.",
              "keys": "cmd+b"
            },
            {
              "title": "Set temperature",
              "description": "A form with the temperature and the mode of a thermostat.",
              "keys": "enter"
            },
            {
              "title": "Open / Close / Stop",
              "description": "Covers."
            },
            {
              "title": "Lock / Unlock",
              "description": "Both ask first."
            },
            {
              "title": "Play / Pause, Next track, Previous track, Turn off",
              "description": "Media players."
            },
            {
              "title": "Volume",
              "description": "Presets for a media player.",
              "keys": "cmd+u"
            },
            {
              "title": "Activate / Run / Trigger",
              "description": "Scenes, scripts, automations; Enable or Disable for an automation."
            },
            {
              "title": "Press",
              "description": "Buttons."
            },
            {
              "title": "Start / Return to dock",
              "description": "Vacuums."
            },
            {
              "title": "Copy value",
              "description": "Sensors, people and every other domain.",
              "keys": "enter"
            },
            {
              "title": "Copy entity id",
              "keys": "cmd+c"
            },
            {
              "title": "Show attributes",
              "description": "A level with the state and every attribute; each row copies its value.",
              "keys": "cmd+i"
            },
            {
              "title": "Open in Home Assistant",
              "description": "The automation or script editor, the history page for the rest.",
              "keys": "cmd+o"
            },
            {
              "title": "Call",
              "description": "On a service: the form, then the call.",
              "keys": "enter"
            },
            {
              "title": "Copy service id",
              "keys": "cmd+c"
            },
            {
              "title": "Show entities",
              "description": "On an area.",
              "keys": "enter"
            }
          ]
        },
        "palettes": {
          "entities": {
            "kind": "live",
            "description": "Every entity of the chosen domains with its state, favourites first; the domain filters scope it. Actions per domain: toggle, on, off, brightness, temperature, open, close, lock, play, activate, run, trigger, copy value; every row copies its id, shows its attributes, opens in HA.",
            "keys": [
              {
                "keys": "enter",
                "title": "The domain's first action: toggle, activate, run, copy value"
              },
              {
                "keys": "cmd+c",
                "title": "Copy the entity id"
              },
              {
                "keys": "cmd+i",
                "title": "Show the attributes"
              },
              {
                "keys": "cmd+o",
                "title": "Open in Home Assistant"
              }
            ]
          },
          "services": {
            "kind": "list",
            "description": "Every service Home Assistant offers, by domain; Enter opens a form with the target entity and the service's fields, submit calls it.",
            "keys": [
              {
                "keys": "enter",
                "title": "Open the form, then call"
              },
              {
                "keys": "cmd+c",
                "title": "Copy the service id"
              }
            ]
          },
          "areas": {
            "kind": "list",
            "description": "Every area with an entity in it; Enter lists those entities.",
            "keys": [
              {
                "keys": "enter",
                "title": "List the area's entities"
              }
            ]
          }
        }
      },
      "updated_at": "2026-09-16T14:42:34Z",
      "url": "https://pal.cagdas.io/extensions/home-assistant",
      "tagline": "Your Home Assistant entities, services and areas in the panel, over the REST API.",
      "category": "integration",
      "screenshots": [
        "https://pal.cagdas.io/extensions/home-assistant/screenshots/1-entities.png",
        "https://pal.cagdas.io/extensions/home-assistant/screenshots/2-actions.png",
        "https://pal.cagdas.io/extensions/home-assistant/screenshots/3-detail.png",
        "https://pal.cagdas.io/extensions/home-assistant/screenshots/4-service.png"
      ],
      "has_readme": true
    },
    {
      "name": "icons",
      "kind": "bundled",
      "title": "Icons",
      "description": "Every Nerd Font glyph (Material Design, Font Awesome, Codicons, Octicons, Devicons, Seti, Weather, Powerline and the rest) as a grid, searched by name; copies the glyph, its code point, its nf- name or CSS class. A second grid of the freedesktop icon names the app draws.",
      "version": "0.1.0",
      "icon": "󰅑",
      "author": "pal",
      "spec": "github:zcag/pal/extensions/icons@pali",
      "source": "https://github.com/zcag/pal/tree/pali/extensions/icons",
      "commit": "716a53dada65ac18ee9aa97b61df7f06cf98b628",
      "manifest": {
        "name": "icons",
        "title": "Icons",
        "description": "Every Nerd Font glyph (Material Design, Font Awesome, Codicons, Octicons, Devicons, Seti, Weather, Powerline and the rest) as a grid, searched by name; copies the glyph, its code point, its nf- name or CSS class. A second grid of the freedesktop icon names the app draws.",
        "version": "0.1.0",
        "icon": "󰅑",
        "author": "pal",
        "repo": "bundled",
        "license": "MIT",
        "settings": [],
        "store": {
          "tagline": "Every Nerd Font glyph as a grid, by set, with its code point, name and CSS class to copy.",
          "category": "reference",
          "features": [
            "10995 glyphs of the Symbols Nerd Font the app bundles (Nerd Fonts 3.5.1), one section per set: Material Design, Font Awesome, Codicons, Octicons, Devicons, Seti, Weather, Powerline and the rest",
            "Search by the set's name with spaces (`account circle`), the `nf-md-account_circle` name (`md-account`) or the code point (`f0009`)",
            "`Enter` copies the glyph itself, ready as an `icon` for a script or a bar; `cmd+enter` the code point (`U+F0009`)",
            "Copy name (`nf-md-account_circle`) and Copy CSS class (`nf nf-md-account_circle`) from the action panel",
            "The last twelve picked lead in a Recent section",
            "A second grid of the 114 freedesktop icon names pal draws, each with its glyph, for a script's `icon_xdg`"
          ],
          "permissions": [],
          "platforms": [
            "macos",
            "linux"
          ],
          "screenshots": [
            {
              "file": "1-grid.png",
              "caption": "The Nerd Font grid, Recent first, then the sets in order"
            },
            {
              "file": "2-search.png",
              "caption": "Searching `git` across every set: Octicons, Devicons, Material Design and the rest"
            },
            {
              "file": "3-freedesktop.png",
              "caption": "The freedesktop icon names the SDK's xdg() maps to a glyph"
            },
            {
              "file": "4-actions.png",
              "caption": "Copy the glyph, its code point, its nf- name or the CSS class"
            }
          ],
          "actions": [
            {
              "title": "Copy glyph",
              "description": "The character itself.",
              "keys": "enter"
            },
            {
              "title": "Copy code point",
              "description": "`U+F0009`",
              "keys": "cmd+enter"
            },
            {
              "title": "Copy name",
              "description": "`nf-md-account_circle`; on a freedesktop row, `Enter` copies the name."
            },
            {
              "title": "Copy CSS class",
              "description": "`nf nf-md-account_circle`"
            }
          ]
        },
        "palettes": {
          "icons": {
            "title": "Nerd Font icons",
            "kind": "grid",
            "description": "The glyphs of the Symbols Nerd Font the app bundles, by set; recently copied glyphs first.",
            "keys": [
              {
                "keys": "enter",
                "title": "Copy glyph"
              },
              {
                "keys": "cmd+enter",
                "title": "Copy code point"
              },
              {
                "keys": "cmd+k",
                "title": "Copy name, Copy CSS class"
              }
            ],
            "settings": [
              {
                "kind": "number",
                "id": "columns",
                "label": "Columns",
                "description": "Tiles per row in the grid.",
                "min": 4,
                "max": 16,
                "default": 10
              }
            ]
          },
          "freedesktop": {
            "title": "Freedesktop icon names",
            "kind": "grid",
            "description": "The freedesktop icon names pal maps to a glyph (`xdg()` in the SDK), for a script's `icon_xdg`.",
            "keys": [
              {
                "keys": "enter",
                "title": "Copy name"
              },
              {
                "keys": "cmd+enter",
                "title": "Copy glyph"
              }
            ]
          }
        }
      },
      "updated_at": "2026-09-16T14:42:34Z",
      "url": "https://pal.cagdas.io/extensions/icons",
      "tagline": "Every Nerd Font glyph as a grid, by set, with its code point, name and CSS class to copy.",
      "category": "reference",
      "screenshots": [
        "https://pal.cagdas.io/extensions/icons/screenshots/1-grid.png",
        "https://pal.cagdas.io/extensions/icons/screenshots/2-search.png",
        "https://pal.cagdas.io/extensions/icons/screenshots/3-freedesktop.png",
        "https://pal.cagdas.io/extensions/icons/screenshots/4-actions.png"
      ],
      "has_readme": true
    },
    {
      "name": "make",
      "kind": "bundled",
      "title": "Makefile targets",
      "description": "The targets of every Makefile under your project folders. Enter runs one in a terminal (or in the background, with a toast).",
      "version": "0.1.0",
      "icon": "󰣪",
      "author": "pal",
      "spec": "github:zcag/pal/extensions/make@pali",
      "source": "https://github.com/zcag/pal/tree/pali/extensions/make",
      "commit": "716a53dada65ac18ee9aa97b61df7f06cf98b628",
      "manifest": {
        "name": "make",
        "title": "Makefile targets",
        "description": "The targets of every Makefile under your project folders. Enter runs one in a terminal (or in the background, with a toast).",
        "version": "0.1.0",
        "icon": "󰣪",
        "author": "pal",
        "repo": "bundled",
        "license": "MIT",
        "settings": [
          {
            "kind": "list",
            "id": "projects",
            "label": "Project folders",
            "description": "Folders scanned two levels deep for a Makefile, makefile or GNUmakefile. ~ is expanded.",
            "placeholder": "~/proj",
            "default": [
              "~/proj"
            ]
          },
          {
            "kind": "select",
            "id": "terminal",
            "label": "Run in",
            "description": "Where Run puts make. A terminal keeps its window open until you press Enter; background runs it unseen and toasts the exit status (the output opens in the panel when it failed; a run past 8 s is left to finish on its own). On Linux the terminal is $TERMINAL, else kitty, foot, alacritty, xterm.",
            "options": [
              {
                "id": "auto",
                "title": "Terminal (auto)"
              },
              {
                "id": "background",
                "title": "Background"
              },
              {
                "id": "kitty",
                "title": "kitty"
              },
              {
                "id": "Terminal",
                "title": "Terminal"
              },
              {
                "id": "iTerm2",
                "title": "iTerm2"
              },
              {
                "id": "Ghostty",
                "title": "Ghostty"
              },
              {
                "id": "Alacritty",
                "title": "Alacritty"
              }
            ],
            "default": "auto"
          }
        ],
        "store": {
          "tagline": "Every Makefile target under your projects, one Enter from running.",
          "category": "developer",
          "features": [
            "Every target of every Makefile two levels under the `projects` folders, one section per project; `pal test` finds a project's target from the root",
            "Descriptions from `## text` on the rule line or the comment above it, shown after the folder in the subtitle",
            "`enter` opens a terminal in the project folder running `make \u003ctarget\u003e`; the window waits for Enter so a quick target's output stays readable",
            "`terminal = \"background\"` runs it unseen: a toast with the exit status and the last line, the whole output in the panel when it failed",
            "The detail pane shows the recipe; `cmd+l` opens the whole Makefile in the panel, `cmd+c` copies `make -C \u003cdir\u003e \u003ctarget\u003e`"
          ],
          "permissions": [
            "automation"
          ],
          "platforms": [
            "macos",
            "linux"
          ],
          "screenshots": [
            {
              "file": "1-targets.png",
              "caption": "Targets sectioned by project, the description after the folder"
            },
            {
              "file": "2-recipe.png",
              "caption": "The detail pane: the target's recipe, the project and the Makefile"
            },
            {
              "file": "3-makefile.png",
              "caption": "Show Makefile: the whole file in the panel"
            },
            {
              "file": "4-actions.png",
              "caption": "Run, copy the command, open the project, show the Makefile"
            }
          ],
          "actions": [
            {
              "title": "Run",
              "description": "make \u003ctarget\u003e in a terminal in the project folder, or in the background per the setting.",
              "keys": "enter"
            },
            {
              "title": "Copy command",
              "description": "make -C \u003cdir\u003e \u003ctarget\u003e.",
              "keys": "cmd+c"
            },
            {
              "title": "Open project",
              "description": "The project folder in the file manager.",
              "keys": "cmd+o"
            },
            {
              "title": "Show Makefile",
              "description": "The whole file in the panel.",
              "keys": "cmd+l"
            }
          ]
        },
        "palettes": {
          "make": {
            "kind": "list",
            "description": "Every target of every Makefile in the project folders, one section per project.",
            "keys": [
              {
                "keys": "enter",
                "title": "Run the target"
              },
              {
                "keys": "cmd+c",
                "title": "Copy the make command"
              },
              {
                "keys": "cmd+l",
                "title": "Show the Makefile"
              },
              {
                "keys": "cmd+i",
                "title": "The recipe in the detail pane"
              }
            ]
          }
        }
      },
      "updated_at": "2026-09-16T14:42:34Z",
      "url": "https://pal.cagdas.io/extensions/make",
      "tagline": "Every Makefile target under your projects, one Enter from running.",
      "category": "developer",
      "screenshots": [
        "https://pal.cagdas.io/extensions/make/screenshots/1-targets.png",
        "https://pal.cagdas.io/extensions/make/screenshots/2-recipe.png",
        "https://pal.cagdas.io/extensions/make/screenshots/3-makefile.png",
        "https://pal.cagdas.io/extensions/make/screenshots/4-actions.png"
      ],
      "has_readme": true
    },
    {
      "name": "media",
      "kind": "bundled",
      "title": "Now Playing",
      "description": "What is playing in Spotify, Music or any MPRIS player: play, pause, skip.",
      "version": "0.1.0",
      "icon": "󰝚",
      "author": "pal",
      "spec": "github:zcag/pal/extensions/media@pali",
      "source": "https://github.com/zcag/pal/tree/pali/extensions/media",
      "commit": "716a53dada65ac18ee9aa97b61df7f06cf98b628",
      "manifest": {
        "name": "media",
        "title": "Now Playing",
        "description": "What is playing in Spotify, Music or any MPRIS player: play, pause, skip.",
        "version": "0.1.0",
        "icon": "󰝚",
        "author": "pal",
        "repo": "bundled",
        "palettes": {
          "media": {
            "description": "One row per player with the track and its artwork.",
            "kind": "live",
            "keys": [
              {
                "keys": "enter",
                "title": "Play or pause"
              },
              {
                "keys": "cmd+right",
                "title": "Next track"
              },
              {
                "keys": "cmd+left",
                "title": "Previous track"
              },
              {
                "keys": "cmd+c",
                "title": "Copy artist - title"
              }
            ]
          }
        },
        "bar": {
          "now-playing": {
            "title": "Now Playing",
            "description": "The playing track on the strip, hidden while nothing plays; pause and skip from the popover.",
            "refresh": {
              "every": 30,
              "on": [
                "show",
                "wake"
              ]
            }
          }
        },
        "license": "MIT",
        "store": {
          "tagline": "What is playing in Spotify, Music or any MPRIS player: play, pause, skip from the keyboard.",
          "category": "media",
          "features": [
            "One row per running player: the track, artist and album, the artwork, a `playing` / `paused` / `stopped` tag",
            "`enter` plays or pauses and the tag follows; `cmd+right` and `cmd+left` skip",
            "`cmd+c` copies `artist - title`; `cmd+o` opens the track (Spotify's `spotify:track:` link) or the app",
            "Live: the current track is a root result, so its title or artist finds it without opening the palette",
            "A bar item with the playing track and the transport in its popover, refreshed within seconds of a skip"
          ],
          "permissions": [
            "automation"
          ],
          "platforms": [
            "macos",
            "linux"
          ],
          "screenshots": [
            {
              "file": "1-players.png",
              "caption": "One row per player: Spotify playing, Music paused, a browser with nothing loaded"
            },
            {
              "file": "2-actions.png",
              "caption": "The transport on a row: pause, next, previous, copy the track, open it in the player"
            },
            {
              "file": "3-root.png",
              "caption": "The playing track found from the root by its title"
            }
          ],
          "actions": [
            {
              "title": "Play / Pause",
              "description": "Toggles; the row's tag follows.",
              "keys": "enter"
            },
            {
              "title": "Next Track",
              "keys": "cmd+right"
            },
            {
              "title": "Previous Track",
              "keys": "cmd+left"
            },
            {
              "title": "Copy Track",
              "description": "artist - title.",
              "keys": "cmd+c"
            },
            {
              "title": "Open in Spotify / Music",
              "description": "The track's url, else the app on macOS.",
              "keys": "cmd+o"
            }
          ]
        }
      },
      "updated_at": "2026-09-16T14:42:34Z",
      "url": "https://pal.cagdas.io/extensions/media",
      "tagline": "What is playing in Spotify, Music or any MPRIS player: play, pause, skip from the keyboard.",
      "category": "media",
      "screenshots": [
        "https://pal.cagdas.io/extensions/media/screenshots/1-players.png",
        "https://pal.cagdas.io/extensions/media/screenshots/2-actions.png",
        "https://pal.cagdas.io/extensions/media/screenshots/3-root.png"
      ],
      "has_readme": true
    },
    {
      "name": "network",
      "kind": "bundled",
      "title": "Network",
      "description": "This machine's addresses: every interface's IPs (the Wi-Fi one with its SSID), the public IP with its country and ISP, the default gateway, the DNS servers, the Tailscale IP, the hostname. Enter copies the value.",
      "version": "0.1.0",
      "icon": "󰋉",
      "author": "pal",
      "spec": "github:zcag/pal/extensions/network@pali",
      "source": "https://github.com/zcag/pal/tree/pali/extensions/network",
      "commit": "716a53dada65ac18ee9aa97b61df7f06cf98b628",
      "manifest": {
        "name": "network",
        "title": "Network",
        "description": "This machine's addresses: every interface's IPs (the Wi-Fi one with its SSID), the public IP with its country and ISP, the default gateway, the DNS servers, the Tailscale IP, the hostname. Enter copies the value.",
        "version": "0.1.0",
        "icon": "󰋉",
        "author": "pal",
        "repo": "bundled",
        "license": "MIT",
        "settings": [
          {
            "kind": "text",
            "id": "public_ip_url",
            "label": "Public IP endpoint",
            "description": "Fetched with a 3 s timeout and kept 10 minutes; JSON with `ip` (and `city`, `country`, `org` when it has them) or a bare address. Empty: no public IP row.",
            "placeholder": "https://ipinfo.io/json",
            "default": "https://ipinfo.io/json"
          }
        ],
        "store": {
          "tagline": "Every address this machine has right now, one Enter from the clipboard.",
          "category": "system",
          "features": [
            "This machine: each interface's IPv4 and global IPv6 (`en0 · Wi-Fi`, `eth0`), the Tailscale IPv4 and IPv6, the hostname and the Bonjour `.local` name",
            "Internet: the public IP with the city, country and organisation the endpoint gives, fetched once and kept ten minutes",
            "Network: the default gateway with its interface, the DNS servers in resolver order",
            "The value is the row's name, so it reads at a glance; `enter` copies it, `cmd+enter` opens the Network settings",
            "Opens with the detail pane: interface, kind, SSID, security, MAC and status for an address; city, region and organisation for the public IP",
            "Live: listed again when the panel shows and the last listing is over a minute old; `cmd+r` fetches the public IP again"
          ],
          "permissions": [
            "network",
            "location"
          ],
          "platforms": [
            "macos",
            "linux"
          ],
          "screenshots": [
            {
              "file": "1-addresses.png",
              "caption": "Every address in three sections, the detail pane on the Wi-Fi interface"
            },
            {
              "file": "2-public.png",
              "caption": "The public IP with where it is and whose it is"
            },
            {
              "file": "3-search.png",
              "caption": "dns at the root finds the resolvers"
            },
            {
              "file": "4-actions.png",
              "caption": "Copy the value, or open the Network settings"
            }
          ],
          "actions": [
            {
              "title": "Copy",
              "description": "The row's value.",
              "keys": "enter"
            },
            {
              "title": "Open Network settings",
              "description": "System Settings on macOS; gnome-control-center, systemsettings or nm-connection-editor on Linux.",
              "keys": "cmd+enter"
            }
          ]
        },
        "palettes": {
          "network": {
            "kind": "live",
            "description": "Live rows, listed again when the panel shows and the last listing is over a minute old; ⌘R lists now and fetches the public IP again.",
            "keys": [
              {
                "keys": "enter",
                "title": "Copy the value"
              },
              {
                "keys": "cmd+enter",
                "title": "Open Network settings"
              },
              {
                "keys": "cmd+r",
                "title": "List again, public IP included"
              }
            ]
          }
        }
      },
      "updated_at": "2026-09-16T14:42:34Z",
      "url": "https://pal.cagdas.io/extensions/network",
      "tagline": "Every address this machine has right now, one Enter from the clipboard.",
      "category": "system",
      "screenshots": [
        "https://pal.cagdas.io/extensions/network/screenshots/1-addresses.png",
        "https://pal.cagdas.io/extensions/network/screenshots/2-public.png",
        "https://pal.cagdas.io/extensions/network/screenshots/3-search.png",
        "https://pal.cagdas.io/extensions/network/screenshots/4-actions.png"
      ],
      "has_readme": true
    },
    {
      "name": "onepassword",
      "kind": "bundled",
      "title": "1Password",
      "description": "Your 1Password items through the op CLI. Enter copies the password; username, one-time code and the app are in the action panel.",
      "version": "0.1.0",
      "icon": "⚿",
      "author": "pal",
      "spec": "github:zcag/pal/extensions/onepassword@pali",
      "source": "https://github.com/zcag/pal/tree/pali/extensions/onepassword",
      "commit": "716a53dada65ac18ee9aa97b61df7f06cf98b628",
      "manifest": {
        "name": "onepassword",
        "title": "1Password",
        "description": "Your 1Password items through the op CLI. Enter copies the password; username, one-time code and the app are in the action panel.",
        "version": "0.1.0",
        "icon": "⚿",
        "author": "pal",
        "repo": "bundled",
        "license": "MIT",
        "settings": [
          {
            "kind": "text",
            "id": "account",
            "label": "Account",
            "description": "Passed as --account to every op call: a shorthand, sign-in address, account id or user id. Empty uses the CLI's default.",
            "placeholder": "my.1password.com",
            "default": ""
          },
          {
            "kind": "list",
            "id": "vaults",
            "label": "Vaults",
            "description": "Only these vaults are listed, and each becomes a filter in the palette. Empty lists every vault. A change takes effect when the extension host restarts.",
            "placeholder": "Personal",
            "default": []
          },
          {
            "kind": "number",
            "id": "ttl",
            "label": "Refresh after",
            "description": "Seconds the item list is kept before op is asked again. Refresh in the panel asks at once.",
            "min": 0,
            "max": 86400,
            "unit": "seconds",
            "default": 300
          }
        ],
        "store": {
          "tagline": "Your 1Password items through the op CLI: a password, username or one-time code onto the clipboard.",
          "category": "integration",
          "features": [
            "Every item you can see, favourites first, with the vault and username under the title and the website's host on the right",
            "`enter` copies the password, `cmd+u` the username, `cmd+t` the current one-time code, each fetched by one `op item get` at that moment",
            "`cmd+o` opens the item in the 1Password app",
            "Websites, usernames, categories, vaults and tags are keywords, so `github.com` finds the login",
            "No secret is ever in a row, the index or a log; the list is one `op item list` kept for `ttl` seconds",
            "Signed out, or without the CLI, one row says how to sign in or where to install"
          ],
          "permissions": [],
          "platforms": [
            "macos",
            "linux"
          ],
          "screenshots": [
            {
              "file": "1-items.png",
              "caption": "Items with their vault, username and website, favourites first"
            },
            {
              "file": "2-detail.png",
              "caption": "The detail pane: vault, category, username, website, tags, updated"
            },
            {
              "file": "3-actions.png",
              "caption": "Copy the password, the username or the one-time code, or open the app"
            },
            {
              "file": "4-vault.png",
              "caption": "A vault from the settings as a filter"
            }
          ],
          "actions": [
            {
              "title": "Copy password",
              "description": "`op item get --fields label=password --reveal`; \"Copied password\" in the HUD.",
              "keys": "enter"
            },
            {
              "title": "Copy username",
              "keys": "cmd+u"
            },
            {
              "title": "Copy one-time code",
              "description": "The current TOTP.",
              "keys": "cmd+t"
            },
            {
              "title": "Open in 1Password",
              "description": "The app's own view-item link.",
              "keys": "cmd+o"
            }
          ]
        },
        "palettes": {
          "items": {
            "kind": "list",
            "description": "Every item you can see, favourites first.",
            "keys": [
              {
                "keys": "enter",
                "title": "Copy the password"
              },
              {
                "keys": "cmd+u",
                "title": "Copy the username"
              },
              {
                "keys": "cmd+t",
                "title": "Copy the one-time code"
              },
              {
                "keys": "cmd+o",
                "title": "Open in 1Password"
              }
            ]
          }
        }
      },
      "updated_at": "2026-09-16T14:42:34Z",
      "url": "https://pal.cagdas.io/extensions/onepassword",
      "tagline": "Your 1Password items through the op CLI: a password, username or one-time code onto the clipboard.",
      "category": "integration",
      "screenshots": [
        "https://pal.cagdas.io/extensions/onepassword/screenshots/1-items.png",
        "https://pal.cagdas.io/extensions/onepassword/screenshots/2-detail.png",
        "https://pal.cagdas.io/extensions/onepassword/screenshots/3-actions.png",
        "https://pal.cagdas.io/extensions/onepassword/screenshots/4-vault.png"
      ],
      "has_readme": true
    },
    {
      "name": "otp",
      "kind": "bundled",
      "title": "Verification Codes",
      "description": "One-time codes from your recent text messages, newest first. Enter pastes the code into the app in front.",
      "version": "0.1.0",
      "icon": "✉",
      "author": "pal",
      "spec": "github:zcag/pal/extensions/otp@pali",
      "source": "https://github.com/zcag/pal/tree/pali/extensions/otp",
      "commit": "716a53dada65ac18ee9aa97b61df7f06cf98b628",
      "manifest": {
        "name": "otp",
        "title": "Verification Codes",
        "description": "One-time codes from your recent text messages, newest first. Enter pastes the code into the app in front.",
        "version": "0.1.0",
        "icon": "✉",
        "author": "pal",
        "repo": "bundled",
        "settings": [
          {
            "kind": "number",
            "id": "hours",
            "label": "Look back",
            "description": "How many hours of messages to scan for codes.",
            "min": 1,
            "max": 720,
            "unit": "hours",
            "default": 24
          },
          {
            "kind": "list",
            "id": "senders",
            "label": "Ignore senders",
            "description": "Senders whose messages are never listed, as Messages shows them (a shortcode like AKBANK, a number, an email). Case does not matter.",
            "placeholder": "AKBANK",
            "default": []
          },
          {
            "kind": "path",
            "id": "db",
            "label": "Messages database",
            "description": "The chat.db to read. ~ is expanded.",
            "pick": "file",
            "default": "~/Library/Messages/chat.db"
          },
          {
            "kind": "path",
            "id": "contacts",
            "label": "Contacts database",
            "description": "An AddressBook-v22.abcddb whose names replace phone numbers; empty means every source under ~/Library/Application Support/AddressBook.",
            "pick": "file",
            "default": ""
          }
        ],
        "palettes": {
          "otp": {
            "description": "Codes from the last day of messages, Today and Earlier.",
            "kind": "live",
            "keys": [
              {
                "keys": "enter",
                "title": "Paste the code"
              },
              {
                "keys": "cmd+c",
                "title": "Copy the code"
              },
              {
                "keys": "cmd+shift+c",
                "title": "Copy the sender"
              }
            ]
          }
        },
        "bar": {
          "latest-code": {
            "title": "Latest code",
            "description": "The newest verification code on the strip for a minute after it arrives; a click copies it.",
            "refresh": {
              "every": 10
            }
          }
        },
        "license": "MIT",
        "store": {
          "tagline": "The one-time codes in your recent text messages, newest first; enter pastes the code where you were.",
          "category": "integration",
          "features": [
            "Reads Messages' own database (`~/Library/Messages/chat.db`), one read-only query per listing, the last 24 hours by default",
            "A message counts when it names a code (code, kod, şifre, OTP, PIN, verification, `G-123456`) and carries 4 to 8 digits that are not an amount, a date or a phone number",
            "The sender as Messages knows it, a contact's name for a number or email in Contacts, the code as a green tag with how long ago it arrived",
            "Live: the code that just arrived is the first row and a root result; Today and Earlier sections",
            "A bar item that shows the newest code for a minute after it arrives; a click copies it"
          ],
          "permissions": [
            "full-disk-access",
            "accessibility"
          ],
          "platforms": [
            "macos"
          ],
          "screenshots": [
            {
              "file": "1-codes.png",
              "caption": "The codes of the day and earlier: the sender, the message, the code as a tag, when it came"
            },
            {
              "file": "2-detail.png",
              "caption": "The detail pane: the whole message, the code, the sender, when it was received"
            },
            {
              "file": "3-actions.png",
              "caption": "Paste the code into the app in front, copy it, or copy the sender"
            }
          ],
          "actions": [
            {
              "title": "Paste code",
              "description": "Hides, then pastes into the app that was in front.",
              "keys": "enter"
            },
            {
              "title": "Copy code",
              "keys": "cmd+c"
            },
            {
              "title": "Copy sender",
              "description": "As Messages stores it.",
              "keys": "cmd+shift+c"
            }
          ]
        }
      },
      "updated_at": "2026-09-16T14:42:34Z",
      "url": "https://pal.cagdas.io/extensions/otp",
      "tagline": "The one-time codes in your recent text messages, newest first; enter pastes the code where you were.",
      "category": "integration",
      "screenshots": [
        "https://pal.cagdas.io/extensions/otp/screenshots/1-codes.png",
        "https://pal.cagdas.io/extensions/otp/screenshots/2-detail.png",
        "https://pal.cagdas.io/extensions/otp/screenshots/3-actions.png"
      ],
      "has_readme": true
    },
    {
      "name": "processes",
      "kind": "bundled",
      "title": "Processes",
      "description": "What is running, busiest first, with its memory; `:3000` lists what listens on a port. Kill from the action panel, or open the process in Activity Monitor.",
      "version": "0.1.0",
      "icon": "▤",
      "author": "pal",
      "spec": "github:zcag/pal/extensions/processes@pali",
      "source": "https://github.com/zcag/pal/tree/pali/extensions/processes",
      "commit": "716a53dada65ac18ee9aa97b61df7f06cf98b628",
      "manifest": {
        "name": "processes",
        "title": "Processes",
        "description": "What is running, busiest first, with its memory; `:3000` lists what listens on a port. Kill from the action panel, or open the process in Activity Monitor.",
        "version": "0.1.0",
        "icon": "▤",
        "author": "pal",
        "repo": "bundled",
        "license": "MIT",
        "settings": [
          {
            "kind": "boolean",
            "id": "include_system",
            "label": "System processes",
            "text": "List system processes too (pid below 100, and kernel threads on Linux)",
            "default": false
          }
        ],
        "store": {
          "tagline": "What is running, busiest first, with its memory; :3000 lists what listens on a port.",
          "category": "system",
          "features": [
            "One `ps` per keystroke, sorted by CPU then memory; the pid and resident memory on the right, a process above 10% CPU tagged `NN% cpu`",
            "The query matches the name or a pid prefix; `:3000` lists what listens on that TCP port, `:` alone every listener (`lsof` on macOS, `ss` on Linux)",
            "Filters: All, Mine (your own user), Top CPU and Top memory (the 25 busiest or largest)",
            "Kill sends SIGTERM and Force kill (`cmd+shift+k`) SIGKILL, both after a confirm; the palette stays open and lists again",
            "A process in a `.app` bundle gets that app's icon on macOS; Open in Activity Monitor (`cmd+o`) types its pid into the search field",
            "`include_system` lists pids below 100 and kernel threads too"
          ],
          "permissions": [
            "automation",
            "accessibility"
          ],
          "platforms": [
            "macos",
            "linux"
          ],
          "screenshots": [
            {
              "file": "1-list.png",
              "caption": "Processes by CPU then memory; a busy one is tagged with its share"
            },
            {
              "file": "2-port.png",
              "caption": ": lists every TCP listener with its port as a tag; :80 narrows to the ports starting with 80"
            },
            {
              "file": "3-confirm.png",
              "caption": "Kill asks before SIGTERM"
            },
            {
              "file": "4-actions.png",
              "caption": "Kill, Force kill, Copy PID, Open in Activity Monitor"
            }
          ],
          "actions": [
            {
              "title": "Kill",
              "description": "SIGTERM, after a confirm.",
              "keys": "enter"
            },
            {
              "title": "Force kill",
              "description": "SIGKILL, after a confirm.",
              "keys": "cmd+shift+k"
            },
            {
              "title": "Copy PID",
              "keys": "cmd+c"
            },
            {
              "title": "Open in Activity Monitor",
              "description": "macOS: brings Activity Monitor up with the pid in its search field.",
              "keys": "cmd+o"
            }
          ]
        },
        "palettes": {
          "processes": {
            "kind": "input",
            "description": "Every process, by CPU then memory.",
            "keys": [
              {
                "keys": "enter",
                "title": "Kill (asks first)"
              },
              {
                "keys": "cmd+shift+k",
                "title": "Force kill"
              },
              {
                "keys": "cmd+c",
                "title": "Copy the pid"
              },
              {
                "keys": "tab",
                "title": "Next filter: Mine, Top CPU, Top memory"
              }
            ]
          }
        }
      },
      "updated_at": "2026-09-16T14:42:34Z",
      "url": "https://pal.cagdas.io/extensions/processes",
      "tagline": "What is running, busiest first, with its memory; :3000 lists what listens on a port.",
      "category": "system",
      "screenshots": [
        "https://pal.cagdas.io/extensions/processes/screenshots/1-list.png",
        "https://pal.cagdas.io/extensions/processes/screenshots/2-port.png",
        "https://pal.cagdas.io/extensions/processes/screenshots/3-confirm.png",
        "https://pal.cagdas.io/extensions/processes/screenshots/4-actions.png"
      ],
      "has_readme": true
    },
    {
      "name": "quicklinks",
      "kind": "bundled",
      "title": "Quicklinks",
      "description": "Your own links, with a {query} placeholder for search URLs: open one, fill it in, or copy it. Created and edited in the panel; imported and exported as JSON.",
      "version": "0.1.0",
      "icon": "🔗",
      "author": "pal",
      "spec": "github:zcag/pal/extensions/quicklinks@pali",
      "source": "https://github.com/zcag/pal/tree/pali/extensions/quicklinks",
      "commit": "716a53dada65ac18ee9aa97b61df7f06cf98b628",
      "manifest": {
        "name": "quicklinks",
        "title": "Quicklinks",
        "description": "Your own links, with a {query} placeholder for search URLs: open one, fill it in, or copy it. Created and edited in the panel; imported and exported as JSON.",
        "version": "0.1.0",
        "icon": "🔗",
        "author": "pal",
        "repo": "bundled",
        "license": "MIT",
        "settings": [
          {
            "kind": "path",
            "id": "import",
            "label": "Import file",
            "pick": "file",
            "description": "A JSON array of {name, url, keywords?} listed alongside your own links, read-only; empty for none.",
            "default": ""
          }
        ],
        "store": {
          "tagline": "Your own links, with a {query} placeholder for search URLs, kept and edited in the panel.",
          "category": "productivity",
          "features": [
            "Enter opens the link; one with `{query}` in its url (`https://github.com/search?q={query}`) drills in and fills it with what you type, percent-encoded",
            "Create Quicklink is a form (name, url, keywords); Edit (`cmd+e`) opens it filled in, a url with no scheme is refused under the field",
            "Keywords are extra words the search matches; the placeholder shows as a tag, the favicon comes from the site",
            "Raycast's `{argument}` and `{argument name=\"Repo\"}` are read the same way as `{query}`",
            "Import Quicklinks and Export Quicklinks move the list as a JSON array of `{name, url, keywords?}` (Raycast's export is read too)",
            "An `import` file adds read-only links next to your own, read on every listing"
          ],
          "permissions": [],
          "platforms": [
            "macos",
            "linux"
          ],
          "screenshots": [
            {
              "file": "1-list.png",
              "caption": "Every quicklink by name; a {query} link carries the placeholder as a tag"
            },
            {
              "file": "2-query.png",
              "caption": "Drilled into a search link: the input fills the placeholder, Enter opens the filled url"
            },
            {
              "file": "3-actions.png",
              "caption": "Open, Copy URL, Edit, Delete on one of your links"
            },
            {
              "file": "4-form.png",
              "caption": "Create Quicklink: name, url with {query}, keywords"
            }
          ],
          "actions": [
            {
              "title": "Open",
              "description": "Opens the url, or drills in to fill its {query} first.",
              "keys": "enter"
            },
            {
              "title": "Copy URL",
              "description": "The url as stored, placeholder included.",
              "keys": "cmd+c"
            },
            {
              "title": "Edit",
              "description": "The form, filled in.",
              "keys": "cmd+e"
            },
            {
              "title": "Delete",
              "description": "Asks first.",
              "keys": "ctrl+x"
            },
            {
              "title": "Create Quicklink",
              "description": "The form, on the Create row.",
              "keys": "enter"
            },
            {
              "title": "Import…",
              "description": "A JSON file's links, the ones you already have skipped.",
              "keys": "enter"
            },
            {
              "title": "Export…",
              "description": "Your links to a JSON file.",
              "keys": "enter"
            }
          ]
        },
        "palettes": {
          "quicklinks": {
            "kind": "list",
            "description": "Every quicklink by name and keyword, plus Create Quicklink.",
            "keys": [
              {
                "keys": "enter",
                "title": "Open, or fill in the {query}"
              },
              {
                "keys": "cmd+c",
                "title": "Copy the url"
              },
              {
                "keys": "cmd+e",
                "title": "Edit"
              },
              {
                "keys": "ctrl+x",
                "title": "Delete"
              }
            ]
          }
        }
      },
      "updated_at": "2026-09-16T14:42:34Z",
      "url": "https://pal.cagdas.io/extensions/quicklinks",
      "tagline": "Your own links, with a {query} placeholder for search URLs, kept and edited in the panel.",
      "category": "productivity",
      "screenshots": [
        "https://pal.cagdas.io/extensions/quicklinks/screenshots/1-list.png",
        "https://pal.cagdas.io/extensions/quicklinks/screenshots/2-query.png",
        "https://pal.cagdas.io/extensions/quicklinks/screenshots/3-actions.png",
        "https://pal.cagdas.io/extensions/quicklinks/screenshots/4-form.png"
      ],
      "has_readme": true
    },
    {
      "name": "scripts",
      "kind": "bundled",
      "title": "Scripts and data files",
      "description": "Runs v1-style palettes from a pal v1 config: script plugins (run.sh speaking JSON lines) and data files (json, jsonl, toml). The zero-code tier.",
      "version": "0.1.0",
      "icon": "$",
      "author": "pal",
      "spec": "github:zcag/pal/extensions/scripts@pali",
      "source": "https://github.com/zcag/pal/tree/pali/extensions/scripts",
      "commit": "716a53dada65ac18ee9aa97b61df7f06cf98b628",
      "manifest": {
        "name": "scripts",
        "title": "Scripts and data files",
        "description": "Runs v1-style palettes from a pal v1 config: script plugins (run.sh speaking JSON lines) and data files (json, jsonl, toml). The zero-code tier.",
        "version": "0.1.0",
        "icon": "$",
        "author": "pal",
        "repo": "bundled",
        "license": "MIT",
        "settings": [
          {
            "kind": "path",
            "id": "config",
            "label": "v1 config",
            "description": "A pal v1 config.toml; every [palette.\u003cname\u003e] in it becomes a palette here.",
            "pick": "file",
            "placeholder": "~/.config/pal/config.toml",
            "default": "~/.config/pal/config.toml"
          },
          {
            "kind": "list",
            "id": "skip",
            "label": "Skip",
            "description": "v1 palette names not to load, because a native extension covers them.",
            "placeholder": "calc",
            "default": [
              "combine",
              "pals",
              "apps",
              "bookmarks",
              "calc",
              "emoji",
              "clipboard"
            ]
          },
          {
            "kind": "path",
            "id": "v1_repo",
            "label": "v1 checkout",
            "description": "The v1 checkout: where github:zcag/pal/... bases resolve when v1's plugin cache (~/.local/share/pal) has no copy, and where a base under a v1 checkout missing on this box is looked up. ~/proj/pal is tried when this path has no plugins.",
            "pick": "folder",
            "default": "~/proj/pal-v1"
          },
          {
            "kind": "number",
            "id": "timeout",
            "label": "Script timeout",
            "description": "A list or pick script still running after this is killed.",
            "min": 1,
            "max": 300,
            "unit": "s",
            "default": 30
          },
          {
            "kind": "number",
            "id": "preview_max",
            "label": "Previews at once",
            "description": "An item's preview command runs when the detail pane rests on it; at most this many run at the same time. 0 turns previews off.",
            "min": 0,
            "max": 32,
            "unit": "runs",
            "default": 4
          },
          {
            "kind": "number",
            "id": "ttl",
            "label": "Listing lifetime",
            "description": "A palette that declares no ttl keeps its last listing across restarts and shows for this long before its script runs again; a palette's own ttl wins, and a live palette is exempt (it relists on every show unless it sets its own). Default an hour: scripts are the slow tier, and the root answers from the kept listing meanwhile. 0 runs every script on every start.",
            "min": 0,
            "max": 604800,
            "unit": "s",
            "default": 3600
          }
        ],
        "store": {
          "tagline": "A palette from a shell script or a data file, no TypeScript: one TOML table each.",
          "category": "developer",
          "features": [
            "Every `[palette.\u003cname\u003e]` table of a v1-style config becomes a palette, `scripts-\u003cname\u003e` in the settings",
            "A data-file palette: `auto_list = true` and a `data` file (JSON array, JSON lines or TOML), each row an item with `name`, `subtitle`, `keywords`, `url`, `section`, `accessories`, `detail`",
            "A script palette: a `run.sh` answering `list` with JSON lines and `pick` with a result envelope (`clipboard`, `open`, `toast`, `show`, `palette` to drill in, `reload`)",
            "Actions per table or per row: `copy`, `open`, `cmd`, `type`, or `pick` back into the script, with a shortcut, a confirm and `reload`",
            "`input` palettes list on every keystroke with the query on stdin, `live` ones on every show, `filter` gives a scope dropdown, `view = \"grid\"` tiles",
            "`preview`: a shell command run lazily for the detail pane; a `ttl` keeps a listing across restarts so a slow script is not run on every start"
          ],
          "permissions": [
            "accessibility"
          ],
          "platforms": [
            "macos",
            "linux"
          ],
          "screenshots": [
            {
              "file": "1-data-file.png",
              "caption": "A data-file palette: six rows from links.json, sectioned, the table's icon unless a row has its own"
            },
            {
              "file": "2-script.png",
              "caption": "A script palette: the rows run.sh printed as JSON lines, with sections and tags"
            },
            {
              "file": "3-root.png",
              "caption": "A script palette's rows at the root: deploy finds both deploy commands"
            },
            {
              "file": "4-actions.png",
              "caption": "The table's actions on a row: Open and Copy link"
            }
          ],
          "actions": [
            {
              "title": "Open",
              "description": "An `open` action on the row's url.",
              "keys": "enter"
            },
            {
              "title": "Copy link",
              "description": "A `copy` action on a row field.",
              "keys": "cmd+c"
            },
            {
              "title": "Select",
              "description": "The default of a script palette without actions: run.sh pick with the row in the environment.",
              "keys": "enter"
            }
          ]
        },
        "palettes": {}
      },
      "updated_at": "2026-09-16T14:42:34Z",
      "url": "https://pal.cagdas.io/extensions/scripts",
      "tagline": "A palette from a shell script or a data file, no TypeScript: one TOML table each.",
      "category": "developer",
      "screenshots": [
        "https://pal.cagdas.io/extensions/scripts/screenshots/1-data-file.png",
        "https://pal.cagdas.io/extensions/scripts/screenshots/2-script.png",
        "https://pal.cagdas.io/extensions/scripts/screenshots/3-root.png",
        "https://pal.cagdas.io/extensions/scripts/screenshots/4-actions.png"
      ],
      "has_readme": true
    },
    {
      "name": "services",
      "kind": "bundled",
      "title": "Services",
      "description": "systemd units on Linux (user and system), launchd agents on macOS: start, stop, restart, enable, logs.",
      "version": "0.1.0",
      "icon": "󰒓",
      "author": "pal",
      "spec": "github:zcag/pal/extensions/services@pali",
      "source": "https://github.com/zcag/pal/tree/pali/extensions/services",
      "commit": "716a53dada65ac18ee9aa97b61df7f06cf98b628",
      "manifest": {
        "name": "services",
        "title": "Services",
        "description": "systemd units on Linux (user and system), launchd agents on macOS: start, stop, restart, enable, logs.",
        "version": "0.1.0",
        "icon": "󰒓",
        "author": "pal",
        "repo": "bundled",
        "license": "MIT",
        "settings": [
          {
            "kind": "number",
            "id": "ttl",
            "label": "Refresh after",
            "description": "Seconds a listing stays good for: the palette lists again on show only once the rows are older than this. Read when the extension loads.",
            "min": 0,
            "max": 3600,
            "unit": "s",
            "default": 10
          },
          {
            "kind": "boolean",
            "id": "confirm_user",
            "label": "Confirm user units",
            "text": "Ask before stopping or restarting a user unit too (system units always ask)",
            "default": false
          },
          {
            "kind": "list",
            "id": "agent_dirs",
            "label": "Agent folders (macOS)",
            "description": "Where the launchd agent plists are read from; the first is yours, the second every user's.",
            "default": [
              "~/Library/LaunchAgents",
              "/Library/LaunchAgents"
            ]
          }
        ],
        "store": {
          "tagline": "The OS's service manager in the panel: systemd units on Linux, launchd jobs on macOS.",
          "category": "system",
          "features": [
            "Linux: every systemd unit of the user and the system manager, filters User, System, Failed and Running; the unit file's state (`enabled`) and a coloured active-state tag (`running` green, `failed/failed` red) on the right",
            "`enter` stops an active unit or starts an inactive one; a system unit asks first and goes through `systemctl`, then `sudo -n`, then `pkexec`, whichever is allowed",
            "`cmd+l` opens `journalctl -u \u003cunit\u003e -n 200` in the panel; `cmd+e` enables or disables the unit file",
            "macOS: the agent plists in `~/Library/LaunchAgents` and `/Library/LaunchAgents`, everything `launchctl list` knows, and the jobs with a pid, tagged `running`, `loaded`, `exit N` or `not loaded`",
            "`enter` unloads a loaded job (`launchctl bootout`, after a confirm) or loads one from its plist (`bootstrap`); `cmd+shift+r` kickstarts it; `cmd+l` shows the plist as XML",
            "Live: listed again when the panel shows once the rows are older than `ttl`"
          ],
          "permissions": [],
          "platforms": [
            "macos",
            "linux"
          ],
          "screenshots": [
            {
              "file": "1-units.png",
              "caption": "systemd units under the User filter, the unit file's state and the active state on the right"
            },
            {
              "file": "2-failed.png",
              "caption": "The Failed filter: units of both managers, in a User and a System section"
            },
            {
              "file": "3-logs.png",
              "caption": "journalctl for a unit, the last 200 lines in the panel"
            },
            {
              "file": "4-agents.png",
              "caption": "macOS: launchd agents by folder, with pid and state"
            }
          ],
          "actions": [
            {
              "title": "Stop",
              "description": "systemctl stop on an active unit; a system unit asks first.",
              "keys": "enter"
            },
            {
              "title": "Start",
              "description": "systemctl start on an inactive unit.",
              "keys": "enter"
            },
            {
              "title": "Logs",
              "description": "journalctl -u \u003cunit\u003e -n 200 in the panel.",
              "keys": "cmd+l"
            },
            {
              "title": "Restart",
              "description": "systemctl restart, or launchctl kickstart -k on macOS.",
              "keys": "cmd+shift+r"
            },
            {
              "title": "Enable",
              "description": "systemctl enable on a disabled unit file.",
              "keys": "cmd+e"
            },
            {
              "title": "Disable",
              "description": "systemctl disable; a system unit asks first.",
              "keys": "cmd+e"
            },
            {
              "title": "Copy unit name",
              "description": "name.service.",
              "keys": "cmd+c"
            },
            {
              "title": "Unload",
              "description": "macOS: launchctl bootout; asks first.",
              "keys": "enter"
            },
            {
              "title": "Load",
              "description": "macOS: launchctl bootstrap from the plist.",
              "keys": "enter"
            },
            {
              "title": "Show plist",
              "description": "macOS: the plist as XML in the panel.",
              "keys": "cmd+l"
            },
            {
              "title": "Open plist file",
              "keys": "cmd+o"
            },
            {
              "title": "Copy label",
              "keys": "cmd+c"
            }
          ]
        },
        "palettes": {
          "services": {
            "kind": "live",
            "description": "Every service unit (Linux) or launchd job (macOS), with its state.",
            "keys": [
              {
                "keys": "enter",
                "title": "Stop or start (unload or load on macOS)"
              },
              {
                "keys": "cmd+l",
                "title": "Logs (the plist on macOS)"
              },
              {
                "keys": "cmd+shift+r",
                "title": "Restart"
              },
              {
                "keys": "tab",
                "title": "Next filter: User, System, Failed, Running"
              }
            ]
          }
        }
      },
      "updated_at": "2026-09-16T14:42:34Z",
      "url": "https://pal.cagdas.io/extensions/services",
      "tagline": "The OS's service manager in the panel: systemd units on Linux, launchd jobs on macOS.",
      "category": "system",
      "screenshots": [
        "https://pal.cagdas.io/extensions/services/screenshots/1-units.png",
        "https://pal.cagdas.io/extensions/services/screenshots/2-failed.png",
        "https://pal.cagdas.io/extensions/services/screenshots/3-logs.png",
        "https://pal.cagdas.io/extensions/services/screenshots/4-agents.png"
      ],
      "has_readme": true
    },
    {
      "name": "snippets",
      "kind": "bundled",
      "title": "Snippets",
      "description": "Short texts by keyword: Enter pastes one into the app in front, with {clipboard}, {date}, {time} and {uuid} filled in. Created and edited in the panel; imported and exported as JSON.",
      "version": "0.1.0",
      "icon": "✂",
      "author": "pal",
      "spec": "github:zcag/pal/extensions/snippets@pali",
      "source": "https://github.com/zcag/pal/tree/pali/extensions/snippets",
      "commit": "716a53dada65ac18ee9aa97b61df7f06cf98b628",
      "manifest": {
        "name": "snippets",
        "title": "Snippets",
        "description": "Short texts by keyword: Enter pastes one into the app in front, with {clipboard}, {date}, {time} and {uuid} filled in. Created and edited in the panel; imported and exported as JSON.",
        "version": "0.1.0",
        "icon": "✂",
        "author": "pal",
        "repo": "bundled",
        "license": "MIT",
        "store": {
          "tagline": "Short texts by name and keyword, pasted into the app in front with the date, the clipboard or a UUID filled in.",
          "category": "productivity",
          "features": [
            "Enter pastes the snippet into the app that was in front; `cmd+c` copies it instead",
            "`{clipboard}`, `{date}`, `{time}`, `{datetime}` and `{uuid}` are filled in on paste or copy; other braces stay, so code keeps its braces",
            "The keyword is a row keyword (typing `sig` finds the signature) and shows as a tag; a snippet with placeholders is tagged dynamic",
            "Create Snippet is a form (name, keyword, text); Edit (`cmd+e`) opens it filled in, a keyword with a space is refused",
            "The whole text is in the detail pane (`cmd+i`), the first line is the subtitle",
            "Import Snippets and Export Snippets move the list as a JSON array of `{name, text, keyword?}`; Raycast's export is read"
          ],
          "permissions": [
            "accessibility"
          ],
          "platforms": [
            "macos",
            "linux"
          ],
          "screenshots": [
            {
              "file": "1-list.png",
              "caption": "Snippets by name, the keyword as a tag, the first line as the subtitle"
            },
            {
              "file": "2-detail.png",
              "caption": "The whole text in the detail pane, with its keyword and length"
            },
            {
              "file": "3-actions.png",
              "caption": "Paste, Copy, Edit and Delete on a snippet"
            },
            {
              "file": "4-form.png",
              "caption": "Create Snippet: name, keyword and the text with its placeholders"
            }
          ],
          "actions": [
            {
              "title": "Paste",
              "description": "Hides, then pastes the filled text into the app in front.",
              "keys": "enter"
            },
            {
              "title": "Copy",
              "description": "The filled text onto the clipboard.",
              "keys": "cmd+c"
            },
            {
              "title": "Edit",
              "description": "The form, filled in.",
              "keys": "cmd+e"
            },
            {
              "title": "Delete",
              "description": "Asks first.",
              "keys": "ctrl+x"
            },
            {
              "title": "Create Snippet",
              "description": "The form, on the Create row.",
              "keys": "enter"
            },
            {
              "title": "Import…",
              "description": "A JSON file's snippets, the ones you already have skipped.",
              "keys": "enter"
            },
            {
              "title": "Export…",
              "description": "Your snippets to a JSON file.",
              "keys": "enter"
            }
          ]
        },
        "palettes": {
          "snippets": {
            "kind": "list",
            "description": "Every snippet by name and keyword, plus Create Snippet.",
            "keys": [
              {
                "keys": "enter",
                "title": "Paste into the app in front"
              },
              {
                "keys": "cmd+c",
                "title": "Copy"
              },
              {
                "keys": "cmd+e",
                "title": "Edit"
              },
              {
                "keys": "ctrl+x",
                "title": "Delete"
              }
            ]
          }
        }
      },
      "updated_at": "2026-09-16T14:42:34Z",
      "url": "https://pal.cagdas.io/extensions/snippets",
      "tagline": "Short texts by name and keyword, pasted into the app in front with the date, the clipboard or a UUID filled in.",
      "category": "productivity",
      "screenshots": [
        "https://pal.cagdas.io/extensions/snippets/screenshots/1-list.png",
        "https://pal.cagdas.io/extensions/snippets/screenshots/2-detail.png",
        "https://pal.cagdas.io/extensions/snippets/screenshots/3-actions.png",
        "https://pal.cagdas.io/extensions/snippets/screenshots/4-form.png"
      ],
      "has_readme": true
    },
    {
      "name": "ssh",
      "kind": "bundled",
      "title": "SSH Hosts",
      "description": "The hosts in ~/.ssh/config (and its Include files, one section per file). Enter opens a terminal running ssh; copy the command (with -J for a host behind a ProxyJump), or ping the host.",
      "version": "0.1.0",
      "icon": "󰒋",
      "author": "pal",
      "spec": "github:zcag/pal/extensions/ssh@pali",
      "source": "https://github.com/zcag/pal/tree/pali/extensions/ssh",
      "commit": "716a53dada65ac18ee9aa97b61df7f06cf98b628",
      "manifest": {
        "name": "ssh",
        "title": "SSH Hosts",
        "description": "The hosts in ~/.ssh/config (and its Include files, one section per file). Enter opens a terminal running ssh; copy the command (with -J for a host behind a ProxyJump), or ping the host.",
        "version": "0.1.0",
        "icon": "󰒋",
        "author": "pal",
        "repo": "bundled",
        "license": "MIT",
        "settings": [
          {
            "kind": "path",
            "id": "config",
            "label": "Config file",
            "description": "The ssh config to read; Include lines in it are followed one level.",
            "pick": "file",
            "default": "~/.ssh/config"
          },
          {
            "kind": "boolean",
            "id": "include_known_hosts",
            "label": "Known hosts",
            "text": "List the names in ~/.ssh/known_hosts too, in a second section",
            "description": "Only hosts you have connected to by name; hashed and numeric entries are skipped.",
            "default": false
          },
          {
            "kind": "select",
            "id": "terminal",
            "label": "Terminal (macOS)",
            "description": "Which terminal Connect opens. Auto picks the first installed of kitty, Ghostty, Alacritty, iTerm2, Terminal. On Linux $TERMINAL, else kitty, foot, alacritty, xterm.",
            "options": [
              {
                "id": "auto",
                "title": "Auto"
              },
              {
                "id": "kitty",
                "title": "kitty"
              },
              {
                "id": "Terminal",
                "title": "Terminal"
              },
              {
                "id": "iTerm2",
                "title": "iTerm2"
              },
              {
                "id": "Ghostty",
                "title": "Ghostty"
              },
              {
                "id": "Alacritty",
                "title": "Alacritty"
              }
            ],
            "default": "auto"
          }
        ],
        "store": {
          "tagline": "Your ssh config's hosts, one Enter from a terminal running ssh.",
          "category": "developer",
          "features": [
            "Every named `Host` in `~/.ssh/config`, `Include` files followed one level, one section per file (`.ssh/config`, `.ssh/conf.d/work.conf`)",
            "`HostName` under the name and searchable, `User` and `:port` on the right, a `via \u003cjump\u003e` tag for a `ProxyJump` host",
            "`enter` opens a terminal window running `ssh \u003chost\u003e`: kitty, Ghostty, Alacritty, iTerm2 or Terminal on macOS, `$TERMINAL` on Linux",
            "`cmd+shift+c` copies `ssh \u003chost\u003e`, `cmd+shift+j` the `ssh -J \u003cjump\u003e \u003chost\u003e` form for a machine without your config",
            "`cmd+p` pings the host once and toasts the round trip (`web-1.example.com: 3 ms`), or why it did not answer",
            "Optionally the names in `known_hosts` as a last section"
          ],
          "permissions": [
            "automation"
          ],
          "platforms": [
            "macos",
            "linux"
          ],
          "screenshots": [
            {
              "file": "1-hosts.png",
              "caption": "Hosts sectioned by the file they came from, user and port on the right, a jump host tagged"
            },
            {
              "file": "2-search.png",
              "caption": "The real host name finds the alias from the root"
            },
            {
              "file": "3-actions.png",
              "caption": "Connect, copy the host or the command, the -J form, ping"
            },
            {
              "file": "4-ping.png",
              "caption": "Ping: one echo, the round trip as a toast"
            }
          ],
          "actions": [
            {
              "title": "Connect",
              "description": "A terminal window running ssh \u003chost\u003e.",
              "keys": "enter"
            },
            {
              "title": "Copy host",
              "keys": "cmd+c"
            },
            {
              "title": "Copy ssh command",
              "description": "ssh \u003chost\u003e.",
              "keys": "cmd+shift+c"
            },
            {
              "title": "Copy ssh -J command",
              "description": "ssh -J \u003cjump\u003e \u003chost\u003e, on a host with a ProxyJump.",
              "keys": "cmd+shift+j"
            },
            {
              "title": "Ping",
              "description": "One echo to the HostName; the round trip as a toast.",
              "keys": "cmd+p"
            }
          ]
        },
        "palettes": {
          "ssh": {
            "kind": "list",
            "description": "Every Host in your ssh config, and what it connects to.",
            "keys": [
              {
                "keys": "enter",
                "title": "Connect in a terminal"
              },
              {
                "keys": "cmd+c",
                "title": "Copy the host name"
              },
              {
                "keys": "cmd+shift+c",
                "title": "Copy the ssh command"
              },
              {
                "keys": "cmd+p",
                "title": "Ping"
              }
            ]
          }
        }
      },
      "updated_at": "2026-09-16T14:42:34Z",
      "url": "https://pal.cagdas.io/extensions/ssh",
      "tagline": "Your ssh config's hosts, one Enter from a terminal running ssh.",
      "category": "developer",
      "screenshots": [
        "https://pal.cagdas.io/extensions/ssh/screenshots/1-hosts.png",
        "https://pal.cagdas.io/extensions/ssh/screenshots/2-search.png",
        "https://pal.cagdas.io/extensions/ssh/screenshots/3-actions.png",
        "https://pal.cagdas.io/extensions/ssh/screenshots/4-ping.png"
      ],
      "has_readme": true
    },
    {
      "name": "system",
      "kind": "bundled",
      "title": "System",
      "description": "Sleep, lock, log out, restart, shut down, empty the trash, dark mode, volume, brightness, do not disturb, eject, show desktop, keep awake.",
      "version": "0.1.0",
      "icon": "⏻",
      "author": "pal",
      "spec": "github:zcag/pal/extensions/system@pali",
      "source": "https://github.com/zcag/pal/tree/pali/extensions/system",
      "commit": "716a53dada65ac18ee9aa97b61df7f06cf98b628",
      "manifest": {
        "name": "system",
        "title": "System",
        "description": "Sleep, lock, log out, restart, shut down, empty the trash, dark mode, volume, brightness, do not disturb, eject, show desktop, keep awake.",
        "version": "0.1.0",
        "icon": "⏻",
        "author": "pal",
        "repo": "bundled",
        "license": "MIT",
        "settings": [
          {
            "kind": "boolean",
            "id": "confirm_destructive",
            "label": "Ask first",
            "text": "Confirm before logging out, restarting, shutting down or emptying the trash",
            "default": true
          }
        ],
        "store": {
          "tagline": "Sleep, lock, log out, restart, shut down, empty the trash, dark mode, volume, brightness, do not disturb, keep awake.",
          "category": "system",
          "features": [
            "Indexed rows with keywords, so `mute`, `sleep` or `power off` at the root finds the command",
            "Only what this machine can run is listed: Brightness needs the `brightness` CLI on macOS, Do Not Disturb a Shortcut named \"Toggle Do Not Disturb\"",
            "Empty Trash shows what is in the Trash on the right (`3 items`, `empty`); Toggle Dark Mode carries the current appearance as a tag",
            "Keep Awake runs `caffeinate` (or `systemd-inhibit`) detached and the row flips to Allow Sleep while it runs",
            "Log Out, Restart, Shut Down and Empty Trash ask first, unless `confirm_destructive` is off",
            "pal hides before running, so the command lands on the desktop, not on pal; a failure keeps the panel open with the tool's message"
          ],
          "permissions": [
            "automation",
            "full-disk-access"
          ],
          "platforms": [
            "macos",
            "linux"
          ],
          "screenshots": [
            {
              "file": "1-list.png",
              "caption": "The commands this machine can run; the appearance and the Trash count on the right"
            },
            {
              "file": "2-root.png",
              "caption": "sleep at the root: the rows are indexed with their keywords"
            },
            {
              "file": "3-confirm.png",
              "caption": "A destructive command asks first"
            }
          ],
          "actions": [
            {
              "title": "Run",
              "description": "The command; Log Out, Restart, Shut Down and Empty Trash ask first.",
              "keys": "enter"
            }
          ]
        },
        "palettes": {
          "system": {
            "kind": "live",
            "description": "What this machine can do from here.",
            "keys": [
              {
                "keys": "enter",
                "title": "Run the command"
              }
            ]
          }
        }
      },
      "updated_at": "2026-09-16T14:42:34Z",
      "url": "https://pal.cagdas.io/extensions/system",
      "tagline": "Sleep, lock, log out, restart, shut down, empty the trash, dark mode, volume, brightness, do not disturb, keep awake.",
      "category": "system",
      "screenshots": [
        "https://pal.cagdas.io/extensions/system/screenshots/1-list.png",
        "https://pal.cagdas.io/extensions/system/screenshots/2-root.png",
        "https://pal.cagdas.io/extensions/system/screenshots/3-confirm.png"
      ],
      "has_readme": true
    },
    {
      "name": "timer",
      "kind": "bundled",
      "title": "Timer",
      "description": "Named countdown timers over the `timer` CLI: the soonest one on the bar with a fill and a red alarm when it lands, the list, pause, resume and stop in the palette.",
      "version": "0.1.0",
      "icon": "󰔛",
      "author": "pal",
      "spec": "github:zcag/pal/extensions/timer@pali",
      "source": "https://github.com/zcag/pal/tree/pali/extensions/timer",
      "commit": "716a53dada65ac18ee9aa97b61df7f06cf98b628",
      "manifest": {
        "name": "timer",
        "title": "Timer",
        "description": "Named countdown timers over the `timer` CLI: the soonest one on the bar with a fill and a red alarm when it lands, the list, pause, resume and stop in the palette.",
        "version": "0.1.0",
        "icon": "󰔛",
        "author": "pal",
        "repo": "bundled",
        "settings": [
          {
            "kind": "path",
            "id": "command",
            "label": "timer command",
            "description": "The timer CLI (a name on PATH or a path). It keeps the timers; pal only reads and asks.",
            "pick": "file",
            "default": "timer"
          },
          {
            "kind": "path",
            "id": "dir",
            "label": "State directory",
            "description": "Where the CLI keeps one file per timer (its TIMER_DIR). ~ is expanded.",
            "pick": "folder",
            "default": "~/.local/share/timer"
          }
        ],
        "palettes": {
          "timers": {
            "title": "Timers",
            "description": "Every timer with what is left; New timer asks for a duration and a name.",
            "kind": "live",
            "keys": [
              {
                "keys": "enter",
                "title": "Pause, resume or dismiss"
              },
              {
                "keys": "cmd++",
                "title": "Add five minutes"
              },
              {
                "keys": "cmd+backspace",
                "title": "Stop"
              }
            ]
          }
        },
        "bar": {
          "timer": {
            "title": "Timer",
            "description": "The soonest timer's remaining time with a fill; an alarm once it lands; hidden with none running.",
            "refresh": {
              "every": 10,
              "on": [
                "wake"
              ]
            }
          }
        },
        "license": "MIT",
        "store": {
          "tagline": "Named countdown timers over the timer CLI: what is left, pause, resume, add five minutes, and a bar item that rings red when one lands.",
          "category": "productivity",
          "features": [
            "One row per timer, most urgent first: `3:12 left, done at 04:41 PM`, `Paused at 41:05`, `Landed 1:35 ago`, with a state tag",
            "New timer is a form: `25m`, `90s`, `1h30m` or a bare number of minutes, an optional name, and a checkbox to ring the phone when it lands",
            "`enter` pauses, resumes or dismisses; `cmd++` adds five minutes; `cmd+backspace` stops",
            "The CLI keeps the timers, so one started in a terminal and one started here are the same list",
            "A bar item with the soonest timer's countdown and a fill, blue to amber to red, an alarm once it lands; hidden with none"
          ],
          "permissions": [],
          "platforms": [
            "macos",
            "linux"
          ],
          "screenshots": [
            {
              "file": "1-timers.png",
              "caption": "Every timer with what is left: a landed one, two running, one paused, and New timer last"
            },
            {
              "file": "2-new.png",
              "caption": "New timer: a duration, an optional name, ring the phone when it lands"
            },
            {
              "file": "3-actions.png",
              "caption": "Pause, add five minutes, or stop a running timer"
            }
          ],
          "actions": [
            {
              "title": "Pause / Resume / Dismiss",
              "description": "Pause a running timer, resume a paused one, dismiss a landed one.",
              "keys": "enter"
            },
            {
              "title": "Add 5 minutes",
              "keys": "cmd++"
            },
            {
              "title": "Stop",
              "description": "The timer is gone.",
              "keys": "cmd+backspace"
            },
            {
              "title": "New timer",
              "description": "A form: duration, name, ring the phone.",
              "keys": "enter"
            }
          ]
        }
      },
      "updated_at": "2026-09-16T14:42:34Z",
      "url": "https://pal.cagdas.io/extensions/timer",
      "tagline": "Named countdown timers over the timer CLI: what is left, pause, resume, add five minutes, and a bar item that rings red when one lands.",
      "category": "productivity",
      "screenshots": [
        "https://pal.cagdas.io/extensions/timer/screenshots/1-timers.png",
        "https://pal.cagdas.io/extensions/timer/screenshots/2-new.png",
        "https://pal.cagdas.io/extensions/timer/screenshots/3-actions.png"
      ],
      "has_readme": true
    },
    {
      "name": "unicode",
      "kind": "bundled",
      "title": "Unicode characters",
      "description": "A grid of arrows, math, currency, punctuation, keyboard symbols, box drawing, Greek, accented letters and other characters one pastes; searched by name, alias, HTML entity, LaTeX name or code point.",
      "version": "0.1.0",
      "icon": "Ω",
      "author": "pal",
      "spec": "github:zcag/pal/extensions/unicode@pali",
      "source": "https://github.com/zcag/pal/tree/pali/extensions/unicode",
      "commit": "716a53dada65ac18ee9aa97b61df7f06cf98b628",
      "manifest": {
        "name": "unicode",
        "title": "Unicode characters",
        "description": "A grid of arrows, math, currency, punctuation, keyboard symbols, box drawing, Greek, accented letters and other characters one pastes; searched by name, alias, HTML entity, LaTeX name or code point.",
        "version": "0.1.0",
        "icon": "Ω",
        "author": "pal",
        "repo": "bundled",
        "license": "MIT",
        "settings": [],
        "store": {
          "tagline": "The characters one pastes rather than types: arrows, math, currency, dashes, keyboard glyphs, box drawing.",
          "category": "reference",
          "features": [
            "1795 characters as a grid, one section per block: arrows, math, Greek, currency, quotes and dashes, spaces, superscripts and fractions, accented Latin letters, the Mac keyboard glyphs (⌘ ⌥ ⇧ ⌃), check marks, box drawing, shapes, dingbats, enclosed numbers",
            "Search by name, code point (`2192`, `u+2192`), HTML entity (`rarr`, `nbsp`), LaTeX command (`\\rightarrow`, `\\alpha`), Unicode 1.0 name (`command key`) or a plain word (`cmd`, `turkish`, `tick`, `eur`)",
            "`Enter` copies the character, `cmd+enter` pastes it into the app in front",
            "Copy the code point (`U+2192`), the HTML entity (`\u0026rarr;`) or the numeric reference (`\u0026#x2192;`) behind shortcuts",
            "A detail pane with the glyph large, the block, the code point, both HTML forms, the UTF-8 bytes, the LaTeX command and the aliases",
            "The last twelve copied lead in a Recent section"
          ],
          "permissions": [
            "accessibility"
          ],
          "platforms": [
            "macos",
            "linux"
          ],
          "screenshots": [
            {
              "file": "1-grid.png",
              "caption": "The grid by block, the cursor on an arrow"
            },
            {
              "file": "2-search.png",
              "caption": "Searching `arrow`: the matches across the arrows, keyboard and other blocks"
            },
            {
              "file": "3-actions.png",
              "caption": "Copy, paste, or copy the code point, the entity or the numeric reference"
            }
          ],
          "actions": [
            {
              "title": "Copy character",
              "keys": "enter"
            },
            {
              "title": "Paste",
              "description": "Into the app that was in front; needs Accessibility on macOS.",
              "keys": "cmd+enter"
            },
            {
              "title": "Copy code point",
              "description": "`U+2192`",
              "keys": "cmd+shift+u"
            },
            {
              "title": "Copy HTML entity",
              "description": "`\u0026rarr;`, or `\u0026#x2192;` for a character without a named entity.",
              "keys": "cmd+shift+e"
            },
            {
              "title": "Copy numeric reference",
              "description": "`\u0026#x2192;`",
              "keys": "cmd+shift+n"
            }
          ]
        },
        "palettes": {
          "unicode": {
            "kind": "grid",
            "description": "The bundled character table, by block; recently copied characters first.",
            "keys": [
              {
                "keys": "enter",
                "title": "Copy character"
              },
              {
                "keys": "cmd+enter",
                "title": "Paste"
              },
              {
                "keys": "cmd+shift+u",
                "title": "Copy code point"
              },
              {
                "keys": "cmd+shift+e",
                "title": "Copy HTML entity"
              }
            ],
            "settings": [
              {
                "kind": "number",
                "id": "columns",
                "label": "Columns",
                "description": "Tiles per row in the grid.",
                "min": 4,
                "max": 16,
                "default": 10
              }
            ]
          }
        }
      },
      "updated_at": "2026-09-16T14:42:34Z",
      "url": "https://pal.cagdas.io/extensions/unicode",
      "tagline": "The characters one pastes rather than types: arrows, math, currency, dashes, keyboard glyphs, box drawing.",
      "category": "reference",
      "screenshots": [
        "https://pal.cagdas.io/extensions/unicode/screenshots/1-grid.png",
        "https://pal.cagdas.io/extensions/unicode/screenshots/2-search.png",
        "https://pal.cagdas.io/extensions/unicode/screenshots/3-actions.png"
      ],
      "has_readme": true
    },
    {
      "name": "wifi",
      "kind": "bundled",
      "title": "Wi-Fi",
      "description": "The current network, the saved ones and what is in range: join, forget, copy the password, turn Wi-Fi off.",
      "version": "0.1.0",
      "icon": "󰖩",
      "author": "pal",
      "spec": "github:zcag/pal/extensions/wifi@pali",
      "source": "https://github.com/zcag/pal/tree/pali/extensions/wifi",
      "commit": "716a53dada65ac18ee9aa97b61df7f06cf98b628",
      "manifest": {
        "name": "wifi",
        "title": "Wi-Fi",
        "description": "The current network, the saved ones and what is in range: join, forget, copy the password, turn Wi-Fi off.",
        "version": "0.1.0",
        "icon": "󰖩",
        "author": "pal",
        "repo": "bundled",
        "license": "MIT",
        "store": {
          "tagline": "Join, forget and inspect Wi-Fi networks, and turn the radio off, from the keyboard.",
          "category": "system",
          "features": [
            "Sections Current, Known and Available: the current network with its IP, channel, security and signal (`▂▄▆█ 92%`), saved networks tagged `in range` when a scan sees them",
            "`enter` joins: a saved or open network at once, a secured new one after a password form",
            "`cmd+shift+c` copies a saved network's password (the keychain prompts on macOS)",
            "`ctrl+x` forgets a network, after a confirm; `cmd+c` copies the IP or the network's name",
            "A Scan for Networks row on macOS, where a scan takes seconds; a Wi-Fi row turns the radio off or on",
            "Live: read again on every show"
          ],
          "permissions": [
            "location"
          ],
          "platforms": [
            "macos",
            "linux"
          ],
          "screenshots": [
            {
              "file": "1-networks.png",
              "caption": "The current network with its address and signal, the saved ones, what is in range"
            },
            {
              "file": "2-join.png",
              "caption": "A secured network that is not saved asks for its password"
            },
            {
              "file": "3-actions.png",
              "caption": "A known network: join, copy its password, forget it"
            },
            {
              "file": "4-forget.png",
              "caption": "Forget asks first; the password goes with it"
            }
          ],
          "actions": [
            {
              "title": "Join",
              "description": "A saved or open network joins at once; a secured new one asks for its password.",
              "keys": "enter"
            },
            {
              "title": "Copy Password",
              "description": "The saved password; the macOS keychain prompts.",
              "keys": "cmd+shift+c"
            },
            {
              "title": "Copy IP",
              "description": "On the current row.",
              "keys": "cmd+c"
            },
            {
              "title": "Copy Name",
              "description": "On an available row.",
              "keys": "cmd+c"
            },
            {
              "title": "Forget",
              "description": "Removes the saved network, after a confirm.",
              "keys": "ctrl+x"
            },
            {
              "title": "Scan",
              "description": "On the Scan for Networks row: a fresh scan, then the list again.",
              "keys": "enter"
            },
            {
              "title": "Turn Off / Turn On",
              "description": "On the Wi-Fi row: the radio.",
              "keys": "enter"
            }
          ]
        },
        "palettes": {
          "wifi": {
            "kind": "live",
            "description": "Current, known and available networks with their signal.",
            "keys": [
              {
                "keys": "enter",
                "title": "Join"
              },
              {
                "keys": "cmd+shift+c",
                "title": "Copy the password"
              },
              {
                "keys": "ctrl+x",
                "title": "Forget"
              }
            ]
          }
        }
      },
      "updated_at": "2026-09-16T14:42:34Z",
      "url": "https://pal.cagdas.io/extensions/wifi",
      "tagline": "Join, forget and inspect Wi-Fi networks, and turn the radio off, from the keyboard.",
      "category": "system",
      "screenshots": [
        "https://pal.cagdas.io/extensions/wifi/screenshots/1-networks.png",
        "https://pal.cagdas.io/extensions/wifi/screenshots/2-join.png",
        "https://pal.cagdas.io/extensions/wifi/screenshots/3-actions.png",
        "https://pal.cagdas.io/extensions/wifi/screenshots/4-forget.png"
      ],
      "has_readme": true
    },
    {
      "name": "window-management",
      "kind": "bundled",
      "title": "Window Management",
      "description": "Halves, thirds, quarters, maximize, center, the other display, restore: move and resize the focused window, or any window, from the keyboard.",
      "version": "0.1.0",
      "icon": "◧",
      "author": "pal",
      "spec": "github:zcag/pal/extensions/window-management@pali",
      "source": "https://github.com/zcag/pal/tree/pali/extensions/window-management",
      "commit": "716a53dada65ac18ee9aa97b61df7f06cf98b628",
      "manifest": {
        "name": "window-management",
        "title": "Window Management",
        "description": "Halves, thirds, quarters, maximize, center, the other display, restore: move and resize the focused window, or any window, from the keyboard.",
        "version": "0.1.0",
        "icon": "◧",
        "author": "pal",
        "repo": "bundled",
        "license": "MIT",
        "settings": [
          {
            "kind": "number",
            "id": "gap",
            "label": "Gap",
            "description": "Pixels between a window and the screen edge, and between two windows of a split.",
            "min": 0,
            "max": 128,
            "step": 1,
            "unit": "px",
            "default": 0
          },
          {
            "kind": "number",
            "id": "almost_maximize_percent",
            "label": "Almost Maximize",
            "description": "How much of the screen Almost Maximize fills, centred.",
            "min": 10,
            "max": 100,
            "step": 1,
            "unit": "%",
            "default": 90
          },
          {
            "kind": "number",
            "id": "reasonable_size_percent",
            "label": "Reasonable Size",
            "description": "How much of the screen Reasonable Size fills, centred.",
            "min": 10,
            "max": 100,
            "step": 1,
            "unit": "%",
            "default": 60
          }
        ],
        "store": {
          "tagline": "Halves, thirds, quarters, maximize, center, the other display and restore, applied to the focused window from the keyboard.",
          "category": "productivity",
          "features": [
            "Twenty layouts as rows: Left Half, Right Third, Top Left Quarter, Maximize, Almost Maximize, Center, Reasonable Size, Next Display, Restore",
            "Enter applies the layout to the window you were in: pal hides first, so the window behind the panel is the one moved, and the HUD names the layout",
            "Apply to… (`cmd+enter`) picks a window from the open ones first; Arrange Window goes the other way round, a window then its layout",
            "Restore puts the window back where it was before a run of layouts; moving it by hand in between starts a new run",
            "`gap` keeps pixels between windows and the screen edge; the halves, thirds and quarters are equal cells with the gap between them",
            "Per-layout global hotkeys in `[palettes.window-management.item_hotkeys]` move the focused window without showing pal"
          ],
          "permissions": [
            "accessibility"
          ],
          "platforms": [
            "macos",
            "linux"
          ],
          "screenshots": [
            {
              "file": "1-layouts.png",
              "caption": "One row per layout; Enter applies it to the focused window"
            },
            {
              "file": "2-search.png",
              "caption": "Typing narrows by name and keyword: quarter, third, screen"
            },
            {
              "file": "3-arrange.png",
              "caption": "Arrange Window: pick a window first, then the layout for it"
            },
            {
              "file": "4-target.png",
              "caption": "The layouts again, with the picked window as the subtitle"
            }
          ],
          "actions": [
            {
              "title": "Apply",
              "description": "The layout on the focused window.",
              "keys": "enter"
            },
            {
              "title": "Apply to…",
              "description": "Pick a window from the open ones, then the layout goes on that one.",
              "keys": "cmd+enter"
            },
            {
              "title": "Arrange",
              "description": "In Arrange Window: the layouts for the picked window.",
              "keys": "enter"
            }
          ]
        },
        "palettes": {
          "window-management": {
            "kind": "list",
            "description": "One row per layout; Enter applies it to the window you were in.",
            "keys": [
              {
                "keys": "enter",
                "title": "Apply to the focused window"
              },
              {
                "keys": "cmd+enter",
                "title": "Apply to a window you pick"
              }
            ]
          },
          "arrange": {
            "kind": "input",
            "description": "Pick a window first, then the layout.",
            "keys": [
              {
                "keys": "enter",
                "title": "Pick the window, then its layout"
              }
            ]
          }
        }
      },
      "updated_at": "2026-09-16T14:42:34Z",
      "url": "https://pal.cagdas.io/extensions/window-management",
      "tagline": "Halves, thirds, quarters, maximize, center, the other display and restore, applied to the focused window from the keyboard.",
      "category": "productivity",
      "screenshots": [
        "https://pal.cagdas.io/extensions/window-management/screenshots/1-layouts.png",
        "https://pal.cagdas.io/extensions/window-management/screenshots/2-search.png",
        "https://pal.cagdas.io/extensions/window-management/screenshots/3-arrange.png",
        "https://pal.cagdas.io/extensions/window-management/screenshots/4-target.png"
      ],
      "has_readme": true
    },
    {
      "name": "windows",
      "kind": "bundled",
      "title": "Windows",
      "description": "Every open window, with its app's icon, grouped by app. Enter switches to it; close, minimise, close or minimise all of the app, and hide the app from the action panel.",
      "version": "0.1.0",
      "icon": "▣",
      "author": "pal",
      "spec": "github:zcag/pal/extensions/windows@pali",
      "source": "https://github.com/zcag/pal/tree/pali/extensions/windows",
      "commit": "716a53dada65ac18ee9aa97b61df7f06cf98b628",
      "manifest": {
        "name": "windows",
        "title": "Windows",
        "description": "Every open window, with its app's icon, grouped by app. Enter switches to it; close, minimise, close or minimise all of the app, and hide the app from the action panel.",
        "version": "0.1.0",
        "icon": "▣",
        "author": "pal",
        "repo": "bundled",
        "license": "MIT",
        "settings": [
          {
            "kind": "boolean",
            "id": "include_minimized",
            "label": "Minimised windows",
            "text": "List minimised windows too",
            "description": "Focusing a minimised window restores it.",
            "default": true
          }
        ],
        "store": {
          "tagline": "Every open window with its app's icon, grouped by app; Enter switches to it.",
          "category": "productivity",
          "features": [
            "Live: listed again every time the panel shows, so window titles are root results and the order is the desktop's, front to back",
            "A section per app; the app name is the subtitle and a keyword, the bundle id or window class a keyword too",
            "A minimised window carries a `minimized` tag, one on another space `other space` or `ws 3`, and the monitor when known",
            "Close (`cmd+w`) and Minimize (`cmd+m`) keep the palette open and list again; Hide app (`cmd+h`) hides the whole app",
            "Minimize all (`cmd+shift+m`) and Close all (`cmd+shift+w`, asks first) act on every window of the app",
            "Hyprland, Sway and X11 (wmctrl) on Linux, detected rather than configured"
          ],
          "permissions": [
            "accessibility",
            "automation"
          ],
          "platforms": [
            "macos",
            "linux"
          ],
          "screenshots": [
            {
              "file": "1-list.png",
              "caption": "Open windows in a section per app; a minimised one is tagged"
            },
            {
              "file": "2-actions.png",
              "caption": "Focus, Close, Minimize, Hide app, and the whole app's windows at once"
            },
            {
              "file": "3-root.png",
              "caption": "Window titles and app names are root results: chrome finds its three windows"
            },
            {
              "file": "4-confirm.png",
              "caption": "Close all of this app asks first"
            }
          ],
          "actions": [
            {
              "title": "Focus",
              "description": "Hides the panel, then raises the window, restoring it if minimised.",
              "keys": "enter"
            },
            {
              "title": "Close",
              "description": "The palette stays open and lists again.",
              "keys": "cmd+w"
            },
            {
              "title": "Minimize",
              "description": "Not offered on a window that already is.",
              "keys": "cmd+m"
            },
            {
              "title": "Hide app",
              "description": "macOS: hides the window's process through System Events.",
              "keys": "cmd+h"
            },
            {
              "title": "Minimize all of this app",
              "description": "On an app with more than one window.",
              "keys": "cmd+shift+m"
            },
            {
              "title": "Close all of this app",
              "description": "Asks first.",
              "keys": "cmd+shift+w"
            }
          ]
        },
        "palettes": {
          "windows": {
            "kind": "live",
            "description": "What is open right now, front to back.",
            "keys": [
              {
                "keys": "enter",
                "title": "Focus the window"
              },
              {
                "keys": "cmd+w",
                "title": "Close it"
              },
              {
                "keys": "cmd+m",
                "title": "Minimize it"
              },
              {
                "keys": "cmd+h",
                "title": "Hide the app"
              }
            ]
          }
        }
      },
      "updated_at": "2026-09-16T14:42:34Z",
      "url": "https://pal.cagdas.io/extensions/windows",
      "tagline": "Every open window with its app's icon, grouped by app; Enter switches to it.",
      "category": "productivity",
      "screenshots": [
        "https://pal.cagdas.io/extensions/windows/screenshots/1-list.png",
        "https://pal.cagdas.io/extensions/windows/screenshots/2-actions.png",
        "https://pal.cagdas.io/extensions/windows/screenshots/3-root.png",
        "https://pal.cagdas.io/extensions/windows/screenshots/4-confirm.png"
      ],
      "has_readme": true
    }
  ],
  "synced_at": "2026-09-16T14:42:34Z"
}
