{
  "name": "slack",
  "kind": "registry",
  "title": "Slack",
  "description": "What Slack is holding for you: direct messages, mentions and thread replies with who sent them, your channels, search, and your status and Do Not Disturb. Signs in through the Slack desktop app you already use, or a token.",
  "version": "0.1.0",
  "icon": {
    "tile": {
      "glyph": "󰒱",
      "bg": "violet"
    }
  },
  "author": "pal",
  "spec": "github:zcag/pal/extensions/slack@v0.9.1",
  "source": "https://github.com/zcag/pal/tree/HEAD/extensions/slack",
  "commit": "63287e180ce349dac3aa87c68ce4c80bc42ad409",
  "manifest": {
    "name": "slack",
    "title": "Slack",
    "description": "What Slack is holding for you: direct messages, mentions and thread replies with who sent them, your channels, search, and your status and Do Not Disturb. Signs in through the Slack desktop app you already use, or a token.",
    "version": "0.1.0",
    "multi": true,
    "icon": {
      "tile": {
        "glyph": "󰒱",
        "bg": "violet"
      }
    },
    "author": "pal",
    "repo": "bundled",
    "license": "MIT",
    "settings": [
      {
        "kind": "select",
        "id": "auth",
        "label": "Sign in",
        "description": "app reads the desktop app's own session (its token from Local Storage and its cookie from the cookie jar, decrypted with the Safe Storage password in the keychain), so it sees exactly your inbox; token uses a user token from a Slack app of your own.",
        "options": [
          {
            "id": "app",
            "title": "The Slack desktop app's session"
          },
          {
            "id": "token",
            "title": "A user token"
          }
        ],
        "default": "app"
      },
      {
        "kind": "secret",
        "id": "token",
        "required": true,
        "label": "Token",
        "only": {
          "auth": "token"
        },
        "description": "A user token (xoxp-...) with channels:read, groups:read, im:read, mpim:read, channels:history, groups:history, im:history, mpim:history, users:read, chat:write, search:read, users.profile:write, users:write, dnd:write. Only with Sign in set to token.",
        "placeholder": "xoxp-...",
        "default": ""
      },
      {
        "kind": "text",
        "id": "workspace",
        "scope": "instance",
        "label": "Workspace",
        "description": "The workspace to use when the app is signed in to several, by id (T...) or domain (acme for acme.slack.com); empty lists every signed-in one, with status and search on the first.",
        "placeholder": "acme",
        "default": ""
      },
      {
        "kind": "list",
        "id": "statuses",
        "label": "Status presets",
        "description": "One per line as :emoji: text (expiry); the expiry is 30m, 2h, 1d or today, or left out for no expiry.",
        "placeholder": ":coffee: Coffee break (15m)",
        "default": [
          ":spiral_calendar_pad: In a meeting (1h)",
          ":knife_fork_plate: Lunch (1h)",
          ":headphones: Focus time (2h)",
          ":house_with_garden: Working from home (today)",
          ":palm_tree: Out of office"
        ]
      },
      {
        "kind": "boolean",
        "id": "presence",
        "label": "Presence dots",
        "text": "A dot on each direct message row: green while the person is active, grey while away",
        "description": "One users.getPresence per person among the unread direct messages, remembered a minute; off makes no such call, for a workspace where many direct messages are open at once.",
        "default": true
      }
    ],
    "palettes": {
      "unreads": {
        "title": "Unreads",
        "description": "Direct messages, mentions and threads addressed to you, then the channels that are only unread; each row with who said what and how long ago.",
        "kind": "live",
        "lazy": true,
        "keys": [
          {
            "keys": "enter",
            "title": "Open the conversation in Slack"
          },
          {
            "keys": "cmd+enter",
            "title": "Reply with the message typed in the bar"
          },
          {
            "keys": "cmd+shift+r",
            "title": "Mark as read"
          },
          {
            "keys": "cmd+shift+o",
            "title": "Open in the browser"
          },
          {
            "keys": "cmd+c",
            "title": "Copy the link"
          }
        ]
      },
      "channels": {
        "title": "Channels",
        "description": "Every channel, group and direct message you are in, with the topic and the member count; a message typed in the bar is sent with cmd+shift+r.",
        "kind": "list",
        "lazy": true,
        "ttl": 3600,
        "tier": "catalog",
        "keys": [
          {
            "keys": "enter",
            "title": "Open in Slack"
          },
          {
            "keys": "cmd+shift+r",
            "title": "Send the message typed in the bar"
          },
          {
            "keys": "cmd+shift+o",
            "title": "Open in the browser"
          },
          {
            "keys": "cmd+c",
            "title": "Copy the link"
          }
        ]
      },
      "search": {
        "title": "Search Slack",
        "description": "Slack's message search as you type, its syntax passed through: from:@name, in:#channel, has:link, before:yesterday.",
        "kind": "input",
        "keys": [
          {
            "keys": "enter",
            "title": "Open the message in Slack"
          },
          {
            "keys": "cmd+shift+o",
            "title": "Open in the browser"
          },
          {
            "keys": "cmd+c",
            "title": "Copy the text"
          }
        ]
      },
      "status": {
        "title": "Status",
        "description": "Your status, presence and Do Not Disturb as the first rows; set a status from the presets or type one (text, emoji, expiry in the search bar), clear it, snooze notifications for 30 minutes, an hour, until tomorrow or for the minutes you type, go away or active.",
        "kind": "live",
        "lazy": true,
        "keys": [
          {
            "keys": "enter",
            "title": "Set it; Set a status… and Do Not Disturb for… take their values from the bar's fields"
          }
        ]
      }
    },
    "states": {
      "attention": {
        "description": "Direct messages, mentions and thread replies addressed to you",
        "kind": "number"
      },
      "dm": {
        "description": "Unread direct messages",
        "kind": "number"
      },
      "channels": {
        "description": "Channels merely unread",
        "kind": "number"
      }
    },
    "bar": {
      "unreads": {
        "title": "Unreads",
        "description": "What is addressed to you (direct messages, mentions, thread replies) as a count, hidden at zero, red while a direct message waits; the popover lists them with the sender, the message and the time, the channels that are only unread, and replies, marks read and opens from the keys.",
        "refresh": {
          "every": 120,
          "on": [
            "show",
            "wake",
            "network"
          ]
        },
        "settings": [
          {
            "kind": "number",
            "id": "refresh",
            "label": "Refresh",
            "description": "Seconds between refreshes of the item; it also refreshes when the panel shows, after a wake and when the network is back.",
            "min": 10,
            "max": 3600,
            "unit": "s",
            "default": 120
          }
        ],
        "mocks": {
          "mentions": {
            "title": "Mentions and thread replies",
            "item": {
              "icon": "󰒱",
              "badge": 3,
              "urgent": false,
              "tooltip": "2 mentions, 1 thread reply; 4 channels unread"
            }
          },
          "dm": {
            "title": "A direct message waits",
            "item": {
              "icon": "󰒱",
              "badge": 2,
              "urgent": true,
              "tooltip": "1 direct message, 1 mention"
            }
          },
          "one": {
            "title": "One mention",
            "item": {
              "icon": "󰒱",
              "badge": 1,
              "urgent": false,
              "tooltip": "1 mention"
            }
          },
          "channels": {
            "title": "Only channels unread, kept on the bar (Bar item: unread)",
            "item": {
              "icon": "󰒱",
              "color": "muted",
              "tooltip": "4 channels unread"
            }
          },
          "clear": {
            "title": "Nothing addressed to you",
            "item": {
              "hidden": true,
              "empty": {
                "icon": "󰒱",
                "tooltip": "Nothing unread"
              }
            }
          },
          "out": {
            "title": "Signed out",
            "item": {
              "hidden": true
            }
          }
        },
        "keys": [
          {
            "keys": "enter",
            "title": "Open the row in Slack"
          },
          {
            "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"
          },
          {
            "keys": "m",
            "title": "Mark the row read"
          },
          {
            "keys": "a",
            "title": "Mark all read (cmd+shift+a too)"
          },
          {
            "keys": "o",
            "title": "Open Slack"
          },
          {
            "keys": "p",
            "title": "Open the Unreads palette"
          },
          {
            "keys": "cmd+shift+o",
            "title": "Open the row in the browser"
          },
          {
            "keys": "cmd+c",
            "title": "Copy the row's link"
          }
        ],
        "rules": [
          {
            "id": "quiet",
            "when": "slack.attention == 0",
            "description": "Nothing addressed to you: off the strip (narrow it to `slack.attention == 0 and slack.channels == 0` to keep the glyph for channels merely unread), muted for anyone who keeps it.",
            "hidden": true,
            "color": "muted"
          },
          {
            "id": "dm",
            "when": "slack.dm \u003e 0",
            "description": "A direct message waits.",
            "urgent": true
          }
        ]
      }
    },
    "store": {
      "tagline": "Your Slack messages and mentions, in the panel and on the bar",
      "category": "integration",
      "features": [
        "Direct messages, mentions and thread replies with avatars and the message; unread channels under them",
        "`enter` opens the message in Slack; reply or mark as read without leaving the panel",
        "A bar item that counts only what is addressed to you, red while a direct message waits",
        "Every channel and conversation you are in, with the topic and member count",
        "Search as you type with Slack's own filters: `from:@name`, `in:#channel`, `has:link`",
        "Set your status, presence and Do Not Disturb from the panel"
      ],
      "permissions": [
        "network",
        "keychain"
      ],
      "platforms": [
        "macos",
        "linux"
      ],
      "screenshots": [
        {
          "file": "1-unreads.png",
          "caption": "Unreads: direct messages, mentions and threads addressed to you, then the channels that are only unread"
        },
        {
          "file": "2-unread-detail.png",
          "caption": "The pane: the unread run of the conversation, oldest first"
        },
        {
          "file": "3-status.png",
          "caption": "Status: what is set now, then the presets, Do Not Disturb and presence"
        },
        {
          "file": "4-search.png",
          "caption": "Search Slack: Slack's syntax typed into the panel"
        },
        {
          "file": "bar-menubar.png",
          "caption": "On the menu bar: the Slack glyph with the count of what is addressed to you, red while a direct message waits",
          "kind": "bar"
        },
        {
          "file": "bar-popover.png",
          "caption": "A click opens the popover: direct messages, mentions and thread replies with the sender, the message and the time, the channels also unread, the keys",
          "kind": "bar",
          "box": [
            434,
            64,
            840,
            960
          ]
        },
        {
          "file": "bar-popover-reply.png",
          "caption": "r turns the search row into a reply field; Enter posts it to the conversation",
          "kind": "bar",
          "box": [
            434,
            64,
            840,
            960
          ]
        },
        {
          "file": "bar-sketchybar.png",
          "caption": "On sketchybar: the glyph and the count, red while a direct message waits",
          "kind": "bar"
        }
      ],
      "actions": [
        {
          "title": "Open",
          "description": "The conversation in the Slack app, at the message when one is known.",
          "keys": "enter"
        },
        {
          "title": "Reply",
          "description": "The message typed in the bar (the row's argument) posts to the conversation (into the thread for a threaded mention); a one-field form when picked without it.",
          "keys": "cmd+enter"
        },
        {
          "title": "Send a message",
          "description": "In Channels: the message typed in the bar posts to the conversation; a form when picked without it.",
          "keys": "cmd+shift+r"
        },
        {
          "title": "Mark as read",
          "description": "Up to the latest message; the count falls at the next refresh.",
          "keys": "cmd+shift+r"
        },
        {
          "title": "Open in browser",
          "description": "The web client's archive page.",
          "keys": "cmd+shift+o"
        },
        {
          "title": "Copy link",
          "keys": "cmd+c"
        },
        {
          "title": "Copy text",
          "description": "A found message's text.",
          "keys": "cmd+c"
        },
        {
          "title": "Set status",
          "description": "A preset, with its expiry; on Set a status…, the text, emoji and expiry typed in the bar."
        },
        {
          "title": "Clear status"
        },
        {
          "title": "Do Not Disturb",
          "description": "30 minutes, 1 hour, until tomorrow, or the minutes typed in the bar; End Do Not Disturb while it is on."
        },
        {
          "title": "Set away / Set active"
        }
      ]
    }
  },
  "playable": false,
  "updated_at": "2026-09-30T01:45:08Z",
  "url": "https://pal.cagdas.io/extensions/slack",
  "tagline": "Your Slack messages and mentions, in the panel and on the bar",
  "category": "integration",
  "screenshots": [
    "https://pal.cagdas.io/extensions/slack/screenshots/1-unreads-dark.png",
    "https://pal.cagdas.io/extensions/slack/screenshots/1-unreads.png",
    "https://pal.cagdas.io/extensions/slack/screenshots/2-unread-detail-dark.png",
    "https://pal.cagdas.io/extensions/slack/screenshots/2-unread-detail.png",
    "https://pal.cagdas.io/extensions/slack/screenshots/3-status-dark.png",
    "https://pal.cagdas.io/extensions/slack/screenshots/3-status.png",
    "https://pal.cagdas.io/extensions/slack/screenshots/4-search-dark.png",
    "https://pal.cagdas.io/extensions/slack/screenshots/4-search.png",
    "https://pal.cagdas.io/extensions/slack/screenshots/bar-menubar-dark.png",
    "https://pal.cagdas.io/extensions/slack/screenshots/bar-menubar.png",
    "https://pal.cagdas.io/extensions/slack/screenshots/bar-popover-dark.png",
    "https://pal.cagdas.io/extensions/slack/screenshots/bar-popover-reply-dark.png",
    "https://pal.cagdas.io/extensions/slack/screenshots/bar-popover-reply.png",
    "https://pal.cagdas.io/extensions/slack/screenshots/bar-popover.png",
    "https://pal.cagdas.io/extensions/slack/screenshots/bar-sketchybar-dark.png",
    "https://pal.cagdas.io/extensions/slack/screenshots/bar-sketchybar.png"
  ],
  "panel_screenshots": [
    "https://pal.cagdas.io/extensions/slack/screenshots/1-unreads.png",
    "https://pal.cagdas.io/extensions/slack/screenshots/2-unread-detail.png",
    "https://pal.cagdas.io/extensions/slack/screenshots/3-status.png",
    "https://pal.cagdas.io/extensions/slack/screenshots/4-search.png"
  ],
  "bar_screenshots": [
    "https://pal.cagdas.io/extensions/slack/screenshots/bar-menubar.png",
    "https://pal.cagdas.io/extensions/slack/screenshots/bar-popover-reply.png",
    "https://pal.cagdas.io/extensions/slack/screenshots/bar-popover.png",
    "https://pal.cagdas.io/extensions/slack/screenshots/bar-sketchybar.png"
  ],
  "panel_screenshots_dark": [
    "https://pal.cagdas.io/extensions/slack/screenshots/1-unreads-dark.png",
    "https://pal.cagdas.io/extensions/slack/screenshots/2-unread-detail-dark.png",
    "https://pal.cagdas.io/extensions/slack/screenshots/3-status-dark.png",
    "https://pal.cagdas.io/extensions/slack/screenshots/4-search-dark.png"
  ],
  "bar_screenshots_dark": [
    "https://pal.cagdas.io/extensions/slack/screenshots/bar-menubar-dark.png",
    "https://pal.cagdas.io/extensions/slack/screenshots/bar-popover-reply-dark.png",
    "https://pal.cagdas.io/extensions/slack/screenshots/bar-popover-dark.png",
    "https://pal.cagdas.io/extensions/slack/screenshots/bar-sketchybar-dark.png"
  ],
  "has_bar": true,
  "bar_items": [
    {
      "id": "unreads",
      "title": "Unreads",
      "description": "What is addressed to you (direct messages, mentions, thread replies) as a count, hidden at zero, red while a direct message waits; the popover lists them with the sender, the message and the time, the channels that are only unread, and replies, marks read and opens 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": false,
  "links": [],
  "multi": true,
  "has_readme": true
}
