{"id":24319634,"url":"https://github.com/ryym/gharry","last_synced_at":"2025-07-02T22:36:31.670Z","repository":{"id":37669402,"uuid":"407563636","full_name":"ryym/gharry","owner":"ryym","description":null,"archived":false,"fork":false,"pushed_at":"2023-11-09T06:34:34.000Z","size":80,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-01-17T15:47:29.984Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Rust","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/ryym.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}},"created_at":"2021-09-17T14:07:24.000Z","updated_at":"2021-10-20T02:23:52.000Z","dependencies_parsed_at":"2025-01-17T15:37:23.863Z","dependency_job_id":"3ae0c5bf-65f9-4512-8773-b38cb721ac1f","html_url":"https://github.com/ryym/gharry","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryym%2Fgharry","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryym%2Fgharry/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryym%2Fgharry/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryym%2Fgharry/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ryym","download_url":"https://codeload.github.com/ryym/gharry/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":242926219,"owners_count":20207754,"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":[],"created_at":"2025-01-17T15:34:14.465Z","updated_at":"2025-03-10T20:41:43.037Z","avatar_url":"https://github.com/ryym.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🎠 Gharry\n\nGharry is a GitHub email notification resender optimized for **my** daily work.\n\n## What I am doing\n\n1. Configure GitHub to send notificaition emails to Slack's muted channel.\n2. Run Gharry which scans email notifications via Slack API periodically.\n3. Filter, parse and re-send notifications to Slack's unmuted channel.\n\n```\nGitHub -[email]-\u003e Slack -[Gharry]-\u003e Slack\n```\n\n## Why???\n\n- Implementing my own notifier allows me to customize its behavior completely for my work. For example,\n    - I want to unsubscribe some notifications automatically.\n    - I want to change a notification level (presence or absense of `@mention`) per notification.\n- I wanted to write something in Rust for the first time in a while.\n\n## Implementation\n\n- Do simple polling instead of event driven approach.\n    - I don't have a permission to install webhooks to my organization.\n    - The GitHub's notifications API cannot be used since it ignores review state changes.\n- Do everything in a single thread with blocking. No asynchronous IO.\n    - This is enough for this program.\n\n## Screenshot\n\nA sample image of notifications from `facebook/react` when I'm watching the repository:\n\n![Slack screenshot](https://raw.githubusercontent.com/ryym/i/master/gharry/slack-sample.png)\n\n## Usage\n\n1. Slack setup\n    - Create a bot to use Slack API.\n    - Create two channels.\n    - Configure email app and get an email address.\n2. GitHub setup\n    - Configure to send notifications to the email address created by Slack.\n    - Generate an access token (scope: repo, notifications).\n3. Gharry configuration\n    - Put a config file in `~/.gharry/config.toml`.\n\n    ```toml\n    slack_oauth_bot_token = \"...\"\n    slack_mail_channel_id = \"...\"\n    slack_dest_channel_id = \"...\"\n    github_access_token = \"...\"\n    github_login_name = \"ryym\"\n    ```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fryym%2Fgharry","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fryym%2Fgharry","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fryym%2Fgharry/lists"}