{"id":21052375,"url":"https://github.com/emacs-slack/emacs-slack","last_synced_at":"2025-05-14T16:02:11.252Z","repository":{"id":37271261,"uuid":"44824065","full_name":"emacs-slack/emacs-slack","owner":"emacs-slack","description":"slack client for emacs","archived":false,"fork":false,"pushed_at":"2025-04-29T00:17:26.000Z","size":2778,"stargazers_count":1164,"open_issues_count":3,"forks_count":120,"subscribers_count":34,"default_branch":"master","last_synced_at":"2025-05-06T06:03:18.207Z","etag":null,"topics":["emacs","slack"],"latest_commit_sha":null,"homepage":"","language":"Emacs Lisp","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/emacs-slack.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":"yuya373","patreon":"yuya373","open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null}},"created_at":"2015-10-23T16:13:08.000Z","updated_at":"2025-05-05T16:00:23.000Z","dependencies_parsed_at":"2024-01-14T10:03:04.113Z","dependency_job_id":"4b490544-124f-4a7a-8af0-2cb39c509d2d","html_url":"https://github.com/emacs-slack/emacs-slack","commit_stats":{"total_commits":2162,"total_committers":48,"mean_commits":"45.041666666666664","dds":0.1424606845513413,"last_synced_commit":"8ac6cff38db26166e8f224580f9131dc776d037e"},"previous_names":["emacs-slack/emacs-slack"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emacs-slack%2Femacs-slack","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emacs-slack%2Femacs-slack/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emacs-slack%2Femacs-slack/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emacs-slack%2Femacs-slack/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/emacs-slack","download_url":"https://codeload.github.com/emacs-slack/emacs-slack/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253418946,"owners_count":21905334,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["emacs","slack"],"created_at":"2024-11-19T16:00:58.695Z","updated_at":"2025-05-14T16:02:09.834Z","avatar_url":"https://github.com/emacs-slack.png","language":"Emacs Lisp","funding_links":["https://github.com/sponsors/yuya373","https://patreon.com/yuya373"],"categories":["Emacs Lisp"],"sub_categories":[],"readme":"\u003cp\u003e\n  \u003ca href=\"https://melpa.org/#/slack\"\u003e\u003cimg alt=\"MELPA\" src=\"https://melpa.org/packages/slack-badge.svg\"/\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/yuya373/emacs-slack/assets/assets/slack-logo.svg?sanitize=true\" width=300 height=126/\u003e\u003c/p\u003e\n\u003cp align=\"center\"\u003e\u003cb\u003eEmacs Slack\u003c/b\u003e\u003c/p\u003e\n\u003cp align=\"center\"\u003eGNU Emacs client for \u003ca href=\"https://slack.com/\"\u003eSlack\u003c/a\u003e.\u003c/p\u003e\n\n---\n\n## Preview\n\nYou can see some gifs on the [wiki](https://github.com/emacs-slack/emacs-slack/wiki/ScreenShots).\n\n## Configuration\n\n[How to get token and cookie](#how-to-get-token-and-cookie)\n\nIf your token expires, you can use `slack-refresh-token` for a way to refresh interactively.\n\n```elisp\n(use-package emacs-slack\n  :bind ((\"C-c S K\" . slack-stop)\n         (\"C-c S c\" . slack-select-rooms)\n         (\"C-c S u\" . slack-select-unread-rooms)\n         (\"C-c S U\" . slack-user-select)\n         (\"C-c S s\" . slack-search-from-messages)\n         (\"C-c S J\" . slack-jump-to-browser)\n         (\"C-c S j\" . slack-jump-to-app)\n         (\"C-c S e\" . slack-insert-emoji)\n         (\"C-c S E\" . slack-message-edit)\n         (\"C-c S r\" . slack-message-add-reaction)\n         (\"C-c S t\" . slack-thread-show-or-create)\n         (\"C-c S g\" . slack-message-redisplay)\n         (\"C-c S G\" . slack-conversations-list-update-quick)\n         (\"C-c S q\" . slack-quote-and-reply)\n         (\"C-c S Q\" . slack-quote-and-reply-with-link)\n         (:map slack-mode-map\n               ((\"@\" . slack-message-embed-mention)\n                (\"#\" . slack-message-embed-channel)))\n         (:map slack-thread-message-buffer-mode-map\n               ((\"C-c '\" . slack-message-write-another-buffer)\n                (\"@\" . slack-message-embed-mention)\n                (\"#\" . slack-message-embed-channel)))\n         (:map slack-message-buffer-mode-map\n               ((\"C-c '\" . slack-message-write-another-buffer)))\n         (:map slack-message-compose-buffer-mode-map\n               ((\"C-c '\" . slack-message-send-from-buffer)))\n         )\n  :custom\n  (slack-extra-subscribed-channels (mapcar 'intern (list \"some-channel\")))\n  :config\n  (slack-register-team\n     :name \"clojurians\"\n     :token \"xoxc-sssssssssss-88888888888-hhhhhhhhhhh-jjjjjjjjjj\"\n     :cookie \"xoxd-sssssssssss-88888888888-hhhhhhhhhhh-jjjjjjjjjj; d-s=888888888888; lc=888888888888\"\n     :full-and-display-names t\n     :default t\n     :subscribed-channels nil ;; using slack-extra-subscribed-channels because I can change it dynamically\n     ))\n\n(use-package alert\n  :commands (alert)\n  :init\n  (setq alert-default-style 'notifier))\n\n```\n\n## How to get token and cookie\n\nUse the interactive command `slack-refresh-token` because it has the\nmost complete instructions to get token and cookies required for emacs-slack to work.\n\nFor further explanation, see the documentation for the emojme project:\n[(github.com/jackellenberger/emojme)](https://github.com/jackellenberger/emojme#slack-for-web)\n\nNote that it is only possible to obtain the cookie manually, not through\nclient-side javascript, due to it being set as `HttpOnly` and `Secure`. See\n[OWASP HttpOnly](https://owasp.org/www-community/HttpOnly#Browsers_Supporting_HttpOnly).\n\n## How to secure your token\n\nIf someone steals your token they can use the token to impersonate\nyou, reading and posting to Slack as if they were you.  It's important\nto take reasonable precautions to secure your token.\n\nOne way to do this is by using the Emacs `auth-source` library. Read\nthe [auth-source\ndocumentation](https://www.gnu.org/software/emacs/manual/html_node/auth/index.html)\nto learn how to use it to store login information for remote services.\n\nThen configure the `auth-sources` variable to select a \"backend\"\nstore. The default backend is `~/.authinfo` file, which is simple but\nalso un-encrypted. A more complex option is to encrypt that\n`.~/authinfo` file with `gnupg` and configure `auth-sources` to use\n`~/.authinfo.gpg` as the source for all passwords and secrets. Other\nbackends exist beyond these; read the documentation for details.\n\nHow to store your slack tokens in your `auth-source` backend will vary\ndepending which backend you chose. See documentation for details. The\n\"host\" and \"user\" fields can be whatever you like as long as they are\nunique; as a suggestion use \"myslackteam.slack.com\" for host, and use\nyour email address for user. The \"secret\" or \"password\" field should\ncontain the token you obtained earlier ([How to get\ntoken and cookie](#how-to-get-token-and-cookie)).\n\nDo the same for the cookie, however for the \"user\" field append `^cookie`, so if\nfor the token you picked `user@email.com` then for the cookie use\n`user@email.com^cookie`.\n\nThen finally, in your Emacs init read the token from your\n`auth-source`:\n\n``` elisp\n(slack-register-team\n :name \"myslackteam\"\n :token (auth-source-pick-first-password\n         :host \"myslackteam.slack.com\"\n         :user \"me@example.com\")\n :subscribed-channels '((channel1 channel2)))\n```\n\nIf your token starts with `xoxc` you'll also need to manually obtain the cookie\nas described in [How to get token and cookie](#how-to-get-token-and-cookie) and\nmake sure the \"user\" has `^cookie` in it as described above in [How to secure\nyour token](#how-to-secure-your-token):\n\n``` elisp\n(slack-register-team\n :name \"myslackteam\"\n :token (auth-source-pick-first-password\n         :host \"myslackteam.slack.com\"\n         :user \"me@example.com\")\n :cookie (auth-source-pick-first-password\n         :host \"myslackteam.slack.com\"\n         :user \"me@example.com^cookie\")\n :subscribed-channels '((channel1 channel2)))\n```\n\nIf you do not specify `:cookie` then you'll automatically be prompted for one if\nyou are using an `xoxc` token.\n\n## How to use\n\nI recommend to chat with slackbot for tutorial using `slack-im-select`.\n\nSome terminology in the `slack-` functions:\n- `im`: An IM (instant message) is a direct message between you and exactly one other Slack user.\n- `channel`: A channel is a Slack channel which you are a member of\n- `group`. Any chat (direct message or channel) which isn't an IM is a group.\n\n- `slack-register-team`\n  - set team configuration and create team.\n  - :name and :token are required\n- `slack-change-current-team`\n  - change `slack-current-team` var\n- `slack-start`\n  - do authorize and initialize\n- `slack-ws-close`\n  - turn off websocket connection\n- `slack-group-select`\n  - select group from list\n- `slack-im-select`\n  - select direct message from list\n- `slack-channel-select`\n  - select channel from list\n- `slack-group-list-update`\n  - update group list\n- `slack-im-list-update`\n  - update direct message list\n- `slack-channel-list-update`\n  - update channel list\n- `slack-message-embed-mention`\n  - use to mention to user\n- `slack-message-embed-channel`\n  - use to mention to channel\n- `slack-file-upload`\n  - uploads a file\n  - the command allows to choose many channels via select loop. In order to finish the loop input an empty string. For helm that's \u003ckbd\u003eC+RET\u003c/kbd\u003e or \u003ckbd\u003eM+TET\u003c/kbd\u003e. In case of Ivy it's \u003ckbd\u003eC+M+j\u003c/kbd\u003e.\n\n### Tip\n\nIf your Slack team has a huge number of public channels, you may find\nyou hit your token rate limit. If that happens, set `(setq\nslack-quick-update t)`: it will avoid the hit of rate limiting at\nexpense of functionality (like you will not have all public channel\navailable and search will not display room names when it doesn't know\nabout them).\n\n## Notification\n\nSee [alert](https://github.com/jwiegley/alert).\n\n## Extensions\n\n- [helm-slack](https://github.com/yuya373/helm-slack)\n- [ol-emacs-slack](https://github.com/ag91/ol-emacs-slack) \n  I use this to add slack messages to my Org Agenda\n## How to debug\n\nPlease set `(setq slack-log-level 'debug)` to see useful messages that\nmay help pin point your issue. If you plan to add that to an issue,\nmake sure to edit out credentials. \n\nYou can also use `(setq slack-log-level 'trace)`, but that only if you\nneed it because it will overwhelm your minibuffer with messages.\n\n## Contributing\n\nPlease open an issue or better pull request for things that trouble you. \n## Dependencies\n\n- [Alert](https://github.com/jwiegley/alert)\n- [circe](https://github.com/jorgenschaefer/circe) (for the Linewise User\n  Interface library).\n- [Emojify](https://github.com/iqbalansari/emacs-emojify) (optional)\n- [Oauth2](https://github.com/emacsmirror/oauth2/blob/master/oauth2.el)\n  - do `package install`\n- [request](https://github.com/tkf/emacs-request)\n- [websocket](https://github.com/ahyatt/emacs-websocket)\n\n## Similar projects\n\n- https://github.com/wee-slack/wee-slack\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Femacs-slack%2Femacs-slack","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Femacs-slack%2Femacs-slack","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Femacs-slack%2Femacs-slack/lists"}