{
  "name": "whatsapp",
  "kind": "registry",
  "title": "WhatsApp",
  "description": "Your WhatsApp chats in the panel through a self-hosted OpenWA gateway: recent chats with the unread ones first, full-text search over your whole history, and your contacts. Reading is always on; sending and reacting only if you turn it on.",
  "version": "0.1.0",
  "icon": {
    "tile": {
      "svg": "M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413Z",
      "box": 24,
      "bg": "#25D366"
    }
  },
  "author": "pal",
  "spec": "github:zcag/pal/extensions/whatsapp@v0.9.1",
  "source": "https://github.com/zcag/pal/tree/HEAD/extensions/whatsapp",
  "commit": "63287e180ce349dac3aa87c68ce4c80bc42ad409",
  "manifest": {
    "name": "whatsapp",
    "title": "WhatsApp",
    "description": "Your WhatsApp chats in the panel through a self-hosted OpenWA gateway: recent chats with the unread ones first, full-text search over your whole history, and your contacts. Reading is always on; sending and reacting only if you turn it on.",
    "keywords": [
      "wa"
    ],
    "version": "0.1.0",
    "icon": {
      "tile": {
        "svg": "M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413Z",
        "box": 24,
        "bg": "#25D366"
      }
    },
    "author": "pal",
    "repo": "bundled",
    "license": "MIT",
    "settings": [
      {
        "kind": "text",
        "id": "base_url",
        "label": "OpenWA URL",
        "description": "Where the OpenWA gateway answers (its /api is under it). The owner's runs at http://wp.lan; a generic install is http://localhost:3000.",
        "placeholder": "http://wp.lan",
        "default": "http://wp.lan"
      },
      {
        "kind": "secret",
        "id": "api_key",
        "required": true,
        "label": "API key",
        "description": "A key from OpenWA's Settings, API keys, sent as x-api-key. Kept in the OS keychain; the file holds a reference.",
        "placeholder": "owa_...",
        "default": ""
      },
      {
        "kind": "text",
        "id": "session",
        "label": "Session",
        "description": "The OpenWA session's name (the UUID it resolves to is cached); the one your phone is linked to.",
        "placeholder": "main",
        "default": "main"
      },
      {
        "kind": "boolean",
        "id": "send",
        "label": "Send",
        "text": "Send messages, reply and react from pal",
        "description": "Off (the default) leaves WhatsApp read and mark-read only: no message field, no reply, no reaction, whatever the key could do. On adds Send a message (the text typed in the bar, or a form) and React to a chat row and the reply field to the bar popover; nothing is sent without your text.",
        "default": false
      },
      {
        "kind": "select",
        "id": "open",
        "label": "Open chats in",
        "description": "auto opens the desktop app when it is installed (macOS) and the web client otherwise. A group has no link of its own, so it opens WhatsApp at the top either way.",
        "options": [
          {
            "id": "auto",
            "title": "The desktop app when installed, else the web client"
          },
          {
            "id": "app",
            "title": "The desktop app (whatsapp://)"
          },
          {
            "id": "web",
            "title": "The web client (web.whatsapp.com)"
          }
        ],
        "default": "auto"
      }
    ],
    "palettes": {
      "chats": {
        "title": "Chats",
        "description": "Every chat, unread first then newest first, with the picture, the newest message and who sent it, the unread count, the time; the pane is the last twenty messages as a conversation.",
        "kind": "live",
        "lazy": true,
        "tier": "primary",
        "rank": 10,
        "keys": [
          {
            "keys": "enter",
            "title": "Open the chat (a group opens WhatsApp at the top)"
          },
          {
            "keys": "cmd+enter",
            "title": "Mark as read (Mark as unread on a read chat)"
          },
          {
            "keys": "cmd+shift+r",
            "title": "Send a message typed in the bar (send on)"
          },
          {
            "keys": "cmd+shift+e",
            "title": "React to the latest message (send on)"
          },
          {
            "keys": "cmd+shift+o",
            "title": "Open in the web client"
          },
          {
            "keys": "cmd+c",
            "title": "Copy the number (the name of a group)"
          }
        ]
      },
      "unread": {
        "title": "Unread",
        "description": "Only the chats with something unread, direct messages then groups; the same rows and keys as Chats.",
        "kind": "live",
        "lazy": true,
        "keys": [
          {
            "keys": "enter",
            "title": "Open the chat"
          },
          {
            "keys": "cmd+enter",
            "title": "Mark as read"
          },
          {
            "keys": "cmd+shift+r",
            "title": "Send a message typed in the bar (send on)"
          },
          {
            "keys": "cmd+shift+e",
            "title": "React to the latest message (send on)"
          },
          {
            "keys": "cmd+shift+o",
            "title": "Open in the web client"
          },
          {
            "keys": "cmd+c",
            "title": "Copy the number (the name of a group)"
          }
        ]
      },
      "search": {
        "title": "Search WhatsApp",
        "description": "Full-text search over the archive (every message back to the first chat): the matching line, who said it where, and when.",
        "kind": "input",
        "keys": [
          {
            "keys": "enter",
            "title": "Open the chat"
          },
          {
            "keys": "cmd+c",
            "title": "Copy the message"
          },
          {
            "keys": "cmd+shift+o",
            "title": "Open the chat in the web client"
          }
        ]
      },
      "contacts": {
        "title": "Contacts",
        "description": "Every saved contact with the number; open a chat, copy the number, copy a vCard.",
        "kind": "list",
        "lazy": true,
        "ttl": 3600,
        "tier": "catalog",
        "keys": [
          {
            "keys": "enter",
            "title": "Open a chat with the contact"
          },
          {
            "keys": "cmd+c",
            "title": "Copy the number"
          },
          {
            "keys": "cmd+shift+c",
            "title": "Copy as a vCard"
          },
          {
            "keys": "cmd+shift+o",
            "title": "Open the chat in the web client"
          }
        ]
      }
    },
    "states": {
      "unread": {
        "description": "Chats with unread messages",
        "kind": "number"
      },
      "direct": {
        "description": "Direct chats among them",
        "kind": "number"
      }
    },
    "bar": {
      "unread": {
        "title": "Unread",
        "description": "The number of unread chats as a badge, hidden at zero, red while a direct chat waits; the popover lists them with the picture, the newest message and the time, opens, marks read and (send on) replies from the keys.",
        "refresh": {
          "every": 120,
          "on": [
            "show",
            "wake",
            "network"
          ]
        },
        "mocks": {
          "groups": {
            "title": "Unread groups only",
            "item": {
              "icon": "󰖣",
              "badge": 2,
              "urgent": false,
              "tooltip": "2 chats unread: 2 groups"
            }
          },
          "direct": {
            "title": "A direct chat waits",
            "item": {
              "icon": "󰖣",
              "badge": 3,
              "urgent": true,
              "tooltip": "3 chats unread: 1 direct message, 2 groups"
            }
          },
          "one": {
            "title": "One unread chat",
            "item": {
              "icon": "󰖣",
              "badge": 1,
              "urgent": true,
              "tooltip": "1 chat unread: 1 direct message"
            }
          },
          "clear": {
            "title": "Nothing unread",
            "item": {
              "hidden": true,
              "empty": {
                "icon": "󰖣",
                "tooltip": "Nothing unread"
              }
            }
          },
          "out": {
            "title": "No gateway key",
            "item": {
              "hidden": true
            }
          }
        },
        "keys": [
          {
            "keys": "enter",
            "title": "Open the row's chat"
          },
          {
            "keys": "up",
            "title": "Move the cursor (down, j, k too; a click sets it)"
          },
          {
            "keys": "r",
            "title": "Reply: the search row becomes the field, Enter sends (send on)"
          },
          {
            "keys": "m",
            "title": "Mark the row read"
          },
          {
            "keys": "a",
            "title": "Mark all read (cmd+shift+a too)"
          },
          {
            "keys": "o",
            "title": "Open WhatsApp"
          },
          {
            "keys": "p",
            "title": "Open the Unread palette"
          },
          {
            "keys": "cmd+shift+o",
            "title": "Open the row's chat in the web client"
          }
        ],
        "rules": [
          {
            "id": "quiet",
            "when": "whatsapp.unread == 0",
            "description": "Nothing unread: off the strip, muted for anyone who keeps it.",
            "hidden": true,
            "color": "muted"
          },
          {
            "id": "dm",
            "when": "whatsapp.direct \u003e 0",
            "description": "A direct message waits.",
            "urgent": true
          }
        ]
      }
    },
    "links": {
      "open": {
        "description": "Open a chat",
        "params": {
          "chat": {
            "description": "A chat id (…@c.us, …@lid, …@g.us), a phone number, or a name from the chats or the contacts",
            "required": true
          }
        }
      },
      "search": {
        "description": "Search the archive",
        "params": {
          "q": {
            "description": "Words from any message",
            "required": true
          }
        }
      }
    },
    "store": {
      "tagline": "Your WhatsApp chats, search and contacts in the panel",
      "category": "integration",
      "features": [
        "Chats newest first, unread on top, with the latest message, who sent it and the unread count",
        "`enter` opens the chat in WhatsApp, `cmd+enter` marks it read; the side pane shows the last twenty messages",
        "Full-text search across your whole archive, with who said it, where and when",
        "Contacts with their numbers: open a chat, copy the number or a vCard",
        "A bar item counting unread chats, hidden at zero and red while a direct chat waits",
        "Sending, replying and reacting stay off until you turn them on; your chats go only to your own gateway"
      ],
      "permissions": [
        "network",
        "token"
      ],
      "platforms": [
        "macos",
        "linux"
      ],
      "screenshots": [
        {
          "file": "1-chats.png",
          "caption": "Chats: unread first, the picture, the newest message and who sent it, the count, the time"
        },
        {
          "file": "2-detail.png",
          "caption": "The pane: the last messages as a conversation, a quoted reply indented, a photo as [photo]"
        },
        {
          "file": "3-unread.png",
          "caption": "Unread: direct messages then groups, the same keys"
        },
        {
          "file": "4-search.png",
          "caption": "Search WhatsApp: the matching line, who said it where, when"
        },
        {
          "file": "5-contacts.png",
          "caption": "Contacts: each name with its number, a number alone when it has none; copy it or a vCard"
        },
        {
          "file": "6-message.png",
          "caption": "Send a message (send on): a form for the text, the latest message there to quote"
        },
        {
          "file": "bar-menubar.png",
          "caption": "On the menu bar: the WhatsApp glyph with the count of unread chats, red while a direct message waits",
          "kind": "bar"
        },
        {
          "file": "bar-popover.png",
          "caption": "A click opens the popover: direct messages then groups with the picture, the newest message and the time, the keys",
          "kind": "bar",
          "box": [
            434,
            64,
            840,
            692
          ]
        },
        {
          "file": "bar-popover-reply.png",
          "caption": "r turns the search row into a message field (send on); Enter sends it",
          "kind": "bar",
          "box": [
            434,
            64,
            840,
            692
          ]
        },
        {
          "file": "bar-sketchybar.png",
          "caption": "On sketchybar: the glyph and the count",
          "kind": "bar"
        }
      ],
      "actions": [
        {
          "title": "Open chat",
          "description": "In the desktop app (whatsapp://send?phone=) or the web client; a group opens WhatsApp at the top.",
          "keys": "enter"
        },
        {
          "title": "Mark as read",
          "description": "Mark as unread on a read chat; works on marked rows too.",
          "keys": "cmd+enter"
        },
        {
          "title": "Send a message",
          "description": "The text typed in the bar (the row's argument), a Reply choice quoting the latest message; a form when picked without it; send on only.",
          "keys": "cmd+shift+r"
        },
        {
          "title": "React to the latest message",
          "description": "One of WhatsApp's six quick reactions, or remove yours; send on only.",
          "keys": "cmd+shift+e"
        },
        {
          "title": "Open in the web client",
          "keys": "cmd+shift+o"
        },
        {
          "title": "Copy number",
          "description": "Copy name on a group.",
          "keys": "cmd+c"
        },
        {
          "title": "Copy message",
          "description": "On a search hit.",
          "keys": "cmd+c"
        },
        {
          "title": "Copy as vCard",
          "description": "On a contact.",
          "keys": "cmd+shift+c"
        },
        {
          "title": "Open WhatsApp settings",
          "description": "On a hint row: the extension's settings."
        }
      ]
    }
  },
  "playable": false,
  "updated_at": "2026-09-30T01:45:08Z",
  "url": "https://pal.cagdas.io/extensions/whatsapp",
  "tagline": "Your WhatsApp chats, search and contacts in the panel",
  "category": "integration",
  "screenshots": [
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/1-chats-dark.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/1-chats.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/2-detail-dark.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/2-detail.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/3-unread-dark.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/3-unread.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/4-search-dark.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/4-search.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/5-contacts-dark.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/5-contacts.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/6-message-dark.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/6-message.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/bar-menubar-dark.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/bar-menubar.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/bar-popover-dark.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/bar-popover-reply-dark.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/bar-popover-reply.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/bar-popover.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/bar-sketchybar-dark.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/bar-sketchybar.png"
  ],
  "panel_screenshots": [
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/1-chats.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/2-detail.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/3-unread.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/4-search.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/5-contacts.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/6-message.png"
  ],
  "bar_screenshots": [
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/bar-menubar.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/bar-popover-reply.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/bar-popover.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/bar-sketchybar.png"
  ],
  "panel_screenshots_dark": [
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/1-chats-dark.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/2-detail-dark.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/3-unread-dark.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/4-search-dark.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/5-contacts-dark.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/6-message-dark.png"
  ],
  "bar_screenshots_dark": [
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/bar-menubar-dark.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/bar-popover-reply-dark.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/bar-popover-dark.png",
    "https://pal.cagdas.io/extensions/whatsapp/screenshots/bar-sketchybar-dark.png"
  ],
  "has_bar": true,
  "bar_items": [
    {
      "id": "unread",
      "title": "Unread",
      "description": "The number of unread chats as a badge, hidden at zero, red while a direct chat waits; the popover lists them with the picture, the newest message and the time, opens, marks read and (send on) replies from the keys.",
      "refresh": {
        "every": 120,
        "on": [
          "show",
          "wake",
          "network"
        ]
      },
      "refresh_words": "every 2 min, when the panel shows, on wake, when the network is back"
    }
  ],
  "has_links": true,
  "links": [
    {
      "route": "open",
      "url": "pal://whatsapp/open?chat=\u003cchat\u003e",
      "cli": "pal call whatsapp/open chat=\u003cchat\u003e",
      "description": "Open a chat",
      "params": [
        {
          "name": "chat",
          "description": "A chat id (…@c.us, …@lid, …@g.us), a phone number, or a name from the chats or the contacts",
          "required": true
        }
      ]
    },
    {
      "route": "search",
      "url": "pal://whatsapp/search?q=\u003cq\u003e",
      "cli": "pal call whatsapp/search q=\u003cq\u003e",
      "description": "Search the archive",
      "params": [
        {
          "name": "q",
          "description": "Words from any message",
          "required": true
        }
      ]
    }
  ],
  "multi": false,
  "has_readme": true
}
