{"id":28377961,"url":"https://github.com/bnjns/rich-slack-statuses","last_synced_at":"2026-04-29T10:34:02.496Z","repository":{"id":60147193,"uuid":"540158881","full_name":"bnjns/rich-slack-statuses","owner":"bnjns","description":"Customise your Slack status, including the text, emoji, DND and presence, based on your calendar","archived":false,"fork":false,"pushed_at":"2025-04-14T09:37:06.000Z","size":3397,"stargazers_count":1,"open_issues_count":8,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-26T21:44:07.847Z","etag":null,"topics":["google-calendar","slack"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bnjns.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"license.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-09-22T20:29:47.000Z","updated_at":"2025-01-27T10:12:24.000Z","dependencies_parsed_at":"2024-04-22T11:25:02.351Z","dependency_job_id":"39c0aa49-9936-4c51-b970-9a82c22cf3ec","html_url":"https://github.com/bnjns/rich-slack-statuses","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/bnjns/rich-slack-statuses","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bnjns%2Frich-slack-statuses","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bnjns%2Frich-slack-statuses/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bnjns%2Frich-slack-statuses/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bnjns%2Frich-slack-statuses/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bnjns","download_url":"https://codeload.github.com/bnjns/rich-slack-statuses/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bnjns%2Frich-slack-statuses/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32421953,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-29T06:29:02.080Z","status":"ssl_error","status_checked_at":"2026-04-29T06:29:00.631Z","response_time":110,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["google-calendar","slack"],"created_at":"2025-05-30T01:34:59.442Z","updated_at":"2026-04-29T10:34:02.490Z","avatar_url":"https://github.com/bnjns.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch3 align=\"center\"\u003eRich Slack Statuses\u003c/h3\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n  [![Status](https://img.shields.io/github/actions/workflow/status/bnjns/rich-slack-statuses/test.yml?branch=main\u0026style=flat-square)](https://github.com/bnjns/rich-slack-statuses/actions/workflows/test.yml) \n  [![GitHub Issues](https://img.shields.io/github/issues/bnjns/rich-slack-statuses?style=flat-square)](https://github.com/bnjns/rich-slack-statuses/issues)\n  [![GitHub Pull Requests](https://img.shields.io/github/issues-pr/bnjns/rich-slack-statuses?style=flat-square)](https://github.com/bnjns/rich-slack-statuses/pulls)\n  [![License](https://img.shields.io/github/license/bnjns/rich-slack-statuses?style=flat-square)](/license.txt)\n\n\u003c/div\u003e\n\n---\n\n\n\u003cp align=\"center\"\u003e Allows you to automatically configure rich Slack statuses, including the emoji, text, and do not disturb and away settings.\n    \u003cbr\u003e\n\u003c/p\u003e\n\n\u003e [!WARNING]\n\u003e This app has been deprecated and is no longer under active development. See \u003chttps://github.com/bnjns/rich-chat-statuses\u003e as an alternative.\n\n## 🧐 About\n\nFor companies that use Slack for communication, your status is an extremely powerful tool to help let others know your\navailability and set expectations on how quickly you might reply. However, manually maintaining an accurate status in a\nbusy working environment is practically impossible. While there are existing integrations for syncing your status to a\ncalendar (eg, the Google Calendar app), these are quite limited as they do not let you customise your status.\n\nWith Rich Slack Statuses, you can customise all aspects of your Slack status using a standard Calendar:\n\n- Status text\n- Status emoji\n- Do not disturb (aka snooze) setting\n- Presence (away/online) setting\n\nThis works by finding all active events and parsing the title:\n\n- The status emoji is set by specifying the emoji name in the event summary, surrounded by `:` (eg, `:no_entry:`). If no\n  emoji is found, this defaults to `calendar`.\n- Enter the `[DND]` flag to enable Do Not Disturb (snooze). This will also automatically set the emoji to `:no_entry:`,\n  unless another emoji is explicitly provided.\n- Enter the `[AWAY]` flag to set the presence to `away`, otherwise the presence is set to `auto` which uses your\n  activity to mark you as online/away.\n- The event summary is used to set the status text, with any parsed info (eg, emoji, flags) removed.\n\nThe active event is currently determined by finding all events that are currently occurring, and selecting the event\nwhich started last and then ends first. If you wish to override the selected event, prefix the summary with `!`.\n\n## 🏁 Getting Started\n\n### Prerequisites\n\n- Node.js 20\n- Yarn 1\n- GCP service account (required to read from a Google Calendar)\n- [Slack app](#slack-app)\n\n### Installing\n\nClone the repository:\n\n```sh\ngit clone git@github.com:bnjns/rich-slack-statuses.git\n```\n\nInstall dependencies:\n\n```sh\nyarn install\n```\n\n### Configuring\n\nThere are 2 types of properties that can be configured:\n\n- **Normal:** Configured via environment variables; the value of the config property is the value of the environment\n  variable.\n- **Secret:** For sensitive values (eg, credentials). Instead of containing the value, the environment variable will\n  contain the location of the secret (eg, for AWS Secrets Manager it would contain the ARN of the secret).\n  See [Secrets](#secrets) for more details.\n\n| Config Property      |  Type  | Required | Default     | Description                                                                                                                  |\n|:---------------------|:------:|:--------:|:------------|:-----------------------------------------------------------------------------------------------------------------------------|\n| `SECRET_TYPE`        | Normal |    N     | `env`       | The system to use to resolve secrets. See [Secrets](#secrets).                                                               |\n| `CALENDAR_TYPE`      | Normal |    N     | `google`    | The type of calendar to use to determine the status. See [Calendars](#calendars).                                            |\n| `CALENDAR_ID`        | Normal |    Y     | N/A         | The ID of the calendar to determine the status from.                                                                         |\n| `SLACK_TOKEN`        | Secret |    Y     | N/A         | The _User OAuth Token_ of the [Slack app](#slack-app) installed on your workspace.                                           |\n| `GOOGLE_CREDENTIALS` | Secret |    N     | N/A         | The JSON credentials of the GCP service account, if reading from Google. Alternatively, use the `gcp-credentials.json` file. |\n| `AWS_REGION`         | Normal |    N     | `eu-west-1` | If using an AWS system for storing secrets, use this to configure the region the client is configured in.                    |\n\n### Running the tests\n\nSimply run the tests using the yarn script:\n\n```sh\nyarn test\n```\n\nYou can also watch for changes and automatically with:\n\n```sh\nyarn test:watch\n```\n\nView the current test coverage:\n\n```sh\nyarn test:coverage\n```\n\n### Running manually\n\nYou can run the application manually using\n\n```sh\nyarn run:local \u003ccommand\u003e [...\u003coptions\u003e]\n```\n\nwith any of the following commands:\n\n- `clear-status`: Clear your Slack status.\n- `execute`: Run the entire app flow, from reading the calendar to updating Slack.\n- `get-events`: Prints the currently active events. The calendar ID can be provided as a 2nd argument, or use\n  the `CALENDAR_ID` environment variable.\n- `set-status`: Set your Slack status, with an optional event title as a 2nd argument. For example,\n  ```sh\n  yarn run:local set-status ':calendar: [DND] An example event'\n  ```\n\n### Building\n\nTo transpile the Typescript into CommonJS (will be written to `./dist`):\n\n```sh\nyarn build\n```\n\nTo build this into a zip which includes all dependencies:\n\n```sh\nyarn build:lambda\n```\n\nYou can also build this into an executable (eg, if you wish to run locally on a cron job):\n\n```sh\nyarn build:package\n```\n\n\u003e This requires that you have [pkg](https://github.com/vercel/pkg) and a valid Node.js runtime installed.\n\n## 🎈 Features\n\n### Slack app\n\nAt the moment, you will need to create your own Slack app within your workspace; simply head\nto \u003chttps://api.slack.com/apps\u003e, and click _Create New App_. You can use the [included manifest](slack_manifest.yaml) to\nsimply the process.\n\nOnce created, you will need to install it to the workspace; go to _Settings \u003e Install App_ and press _Install to\nWorkspace_. This may require administrator approval, depending on your workspace settings.\n\nOnce installed, you can configure the `SLACK_TOKEN` variable with your _User OAuth Token_.\n\n\u003e **Note:** The _User OAuth Token_ is specific to a user; each user wishing to use this application will need to install\n\u003e it themselves.\n\n### Calendars\n\nThis can currently read calendars from the following:\n\n- `google`: Google Calendar\n\nSelect the desired calendar with the `CALENDAR_TYPE` environment variable (defaults to `google`).\n\n#### Google Calendar\n\nEnsure you have a GCP service account which has read access to the desired calendar, and set the JSON credentials in\neither the `GOOGLE_CREDENTIALS` secret or a `gcp-credentials.json` file.\n\n- _Settings and sharing_ \u003e _Share with specific people_\n- Add the service account email with the _See all event details_ permission\n\nThe calendar can then be configured by setting the `CALENDAR_ID` environment variable.\n\n### Secrets\n\nThis app has different methods for retrieving secrets, such as the Slack token, depending on your desired config and\ndeployment method; simply set the `SECRET_TYPE` environment variable to the desired method:\n\n- `env`: Use environment variables. The secret value is the environment variable name. Not recommended in production.\n- `aws-ssm`: Use AWS Systems Manager Parameter Store to store secrets. The environment variable should contain the\n  parameter name.\n- `aws-secrets`: Use AWS Secrets Manager to store secrets. The environment variable can contain either the name or ARN\n  of the secret.\n\n### Predefined configurations\n\nTo make it easier to configure your status, this comes with a series of \"predefined\" configurations, which match on the\nevent summary text (case-insensitive) to automatically set the emoji:\n\n| Text         |     Emoji     |\n|:-------------|:-------------:|\n| 1:1          |  `no_entry`   |\n| A/L          | `palm_tree `  |\n| Bank holiday | `palm_tree `  |\n| Focus time   |  `no_entry`   |\n| Interview    | `interview`\\^ |\n| Jira         |   `jira2`\\^   |\n| Out of hours |     `zzz`     |\n| Travelling   |     `car`     |\n\n^ This is a custom emoji\n\n\u003e **Note:** You can still override the emoji by specifying it in the event summary.\n\n## 🚀 Deploying\n\n### Deploying in the cloud\n\nThis application is designed to be deployed in a cloud serverless environment (eg, AWS Lambda) as a CommonJS module, and\ncan simply be run using a CRON schedule (eg, every minute). You can build this into a zip using the included script:\n\n```sh\nyarn build:lambda\n```\n\nYou can then configure the handler based on the deployment platform chosen:\n\n| Platform   | Handler                                                              |\n|:-----------|:---------------------------------------------------------------------|\n| AWS Lambda | `entrypoints/aws-lambda.default` or `entrypoints/aws-lambda.handler` |\n\n### Deploying locally\n\nIf you do not wish to deploy to a cloud service you can also run this locally, using something like crontab. Simply\nconfigure the cron job to run `yarn run:local execute`, or use `yarn build:package` to build an executable.\n\n## ⛏️ Built Using\n\n- [Google Calendar API](https://github.com/googleapis/google-api-nodejs-client)\n- [Slack Web API](https://github.com/slackapi/node-slack-sdk)\n- [Luxon](https://github.com/moment/luxon)\n- [Winston](https://github.com/winstonjs/winston)\n- [pkg](https://github.com/vercel/pkg)\n\n## ✍️ Authors\n\n- [@bnjns](https://github.com/bnjns)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbnjns%2Frich-slack-statuses","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbnjns%2Frich-slack-statuses","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbnjns%2Frich-slack-statuses/lists"}