{"id":37230283,"url":"https://github.com/powerdot/telegram-manual-approval","last_synced_at":"2026-01-15T03:37:39.428Z","repository":{"id":209644644,"uuid":"724598963","full_name":"powerdot/telegram-manual-approval","owner":"powerdot","description":"Allows for manual approval of workflows via Telegram, offering a quick, secure way to control critical operations from within chat.","archived":false,"fork":false,"pushed_at":"2026-01-10T07:21:16.000Z","size":140,"stargazers_count":7,"open_issues_count":1,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-11T02:06:54.206Z","etag":null,"topics":["continuous-deployment","continuous-integration","telegram-bot"],"latest_commit_sha":null,"homepage":"","language":"Shell","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/powerdot.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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-11-28T12:12:49.000Z","updated_at":"2026-01-10T07:19:56.000Z","dependencies_parsed_at":"2024-01-15T20:05:55.613Z","dependency_job_id":"ebe2ae82-5854-4c2a-ac75-6500f1605c0c","html_url":"https://github.com/powerdot/telegram-manual-approval","commit_stats":null,"previous_names":["powerdot/tg-approval-test-action"],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/powerdot/telegram-manual-approval","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/powerdot%2Ftelegram-manual-approval","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/powerdot%2Ftelegram-manual-approval/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/powerdot%2Ftelegram-manual-approval/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/powerdot%2Ftelegram-manual-approval/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/powerdot","download_url":"https://codeload.github.com/powerdot/telegram-manual-approval/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/powerdot%2Ftelegram-manual-approval/sbom","scorecard":{"id":742442,"data":{"date":"2025-08-11","repo":{"name":"github.com/powerdot/telegram-manual-approval","commit":"376a1257151534de3ed87b84712f0fc9b9fd9ee3"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.6,"checks":[{"name":"Code-Review","score":0,"reason":"Found 1/26 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 2 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-22T17:49:02.849Z","repository_id":209644644,"created_at":"2025-08-22T17:49:02.849Z","updated_at":"2025-08-22T17:49:02.849Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28442300,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-15T00:55:22.719Z","status":"online","status_checked_at":"2026-01-15T02:00:08.019Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["continuous-deployment","continuous-integration","telegram-bot"],"created_at":"2026-01-15T03:37:38.869Z","updated_at":"2026-01-15T03:37:39.421Z","avatar_url":"https://github.com/powerdot.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Telegram Manual Approval\n\n[@viz-A-viz](https://github.com/viz-A-viz) 🤜🤛 [@powerdot](https://github.com/powerdot)\n\nObtain manual approval for GitHub Actions workflows through Telegram messages. This action pauses a workflow and requires a manual response via Telegram to continue.\n\nThis action is particularly useful for deployment workflows where you want an extra layer of control before proceeding with sensitive operations like production deployment.\n\n![Concept](about.png)\n\n## How it works\n\n1. When the workflow reaches the `telegram-manual-approval` step, it sends a customisable message containing approval and rejection buttons to a specified Telegram chat.\n2. A user with appropriate permissions can click on the approval or rejection button within Telegram to continue or halt the workflow.\n3. On approval, the workflow proceeds, and on rejection, the workflow fails and stops.\n\n## Usage\n\nTo use this action, add the following step to your GitHub Actions workflow:\n\n```yaml\nsteps:\n  - uses: powerdot/telegram-manual-approval@main\n    with:\n      TELEGRAM_KEY: ${{ secrets.TELEGRAM_KEY }}\n      TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }}\n```\n\nConfigure the inputs to customize the Telegram message:\n- `TELEGRAM_KEY`: Your Telegram Bot key. (*This should be stored securely in your repository secrets*)\n- `TELEGRAM_CHAT_ID`: The Telegram chat ID where approval requests will be sent.\n- `APPROVAL_TEXT`: Custom message text prompting for approval.\n- `APPROVAL_BUTTON`: Text for the approval button.\n- `REJECT_BUTTON`: Text for the rejection button.\n- `APPROVED_TEXT`: Message to indicate successful approval.\n- `REJECTED_TEXT`: Message to indicate successful rejection.\n- `TIMEOUT_TEXT`: Message to indicate a timeout if no response is received.\n- `UPDATE_REQUESTS`: The number of update requests the action will make to check for manual approval or rejection via Telegram. This is not a strict timeout but rather a count of checks, with each request occurring approximately every 1 to 2 seconds.\n\nYou can also set a timeout limit for the approval step using `timeout-minutes` in your workflow file:\n\n```yaml\nsteps:\n  - uses: powerdot/telegram-manual-approval@main\n    timeout-minutes: 10\n    with:\n      ...\n```\n\nPlease note that the `TIMEOUT_TEXT` message is specifically related to the `UPDATE_REQUESTS` input and will only be sent if the maximum number of update requests is reached before a manual approval or rejection is received via Telegram. It does not correspond to the `timeout-minutes` parameter of the workflow step.\n\nThe `timeout-minutes` parameter in your workflow determines the maximum duration that the action will wait for an approval response before the step times out. If this workflow step timeout is reached without an approval or rejection, the action will simply cease to operate and will not send the `TIMEOUT_TEXT` message.\n\nAdditionally, the `UPDATE_REQUESTS` input is not a direct timeout setting but rather represents the limit of update checks the action will perform. It is set to a default of 60, which typically corresponds to a duration of 60 to 120 seconds depending on network conditions and server response times, as each update request is expected to occur roughly every 1 to 2 seconds. Adjust the `UPDATE_REQUESTS` value according to how long you want the action to wait for a response in Telegram before considering it a timeout situation and sending the `TIMEOUT_TEXT` message.\n\n### Permissions\n\nEnsure that the GitHub token used by the action has permissions to send messages via Telegram Bot API. You may not need to set any special permissions in your GitHub workflow for this action unless your workflow requires additional steps that interact with the GitHub environment.\n\n### Quick example\n```yaml\nname: My job\non:\n  push:\n    branches: [ \"main\" ]\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Echo\n        run: |\n            echo \"Hello World\"\n      - uses: powerdot/telegram-manual-approval@main\n        with:\n          TELEGRAM_KEY: \"${{ secrets.TELEGRAM_KEY }}\"\n          TELEGRAM_CHAT_ID: \"${{ secrets.TELEGRAM_CHAT_ID }}\"\n      - name: Echo2\n        run: |\n          echo \"Hello World2\"\n```\n\n## Development and Contribution\nWe welcome contributions and improvements from the community!\n\n---\nThis GitHub Action is provided \"as is\" with no warranty. Usage of this action is at your own risk. For complete instructions on how to create and configure Telegram bots, please refer to the [official Telegram Bot documentation](https://core.telegram.org/bots).\n\nFor support and contributions, feel free to open an issue or a pull request in the [repository](https://github.com/powerdot/telegram-manual-approval).\n\nGood luck with automating your workflows!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpowerdot%2Ftelegram-manual-approval","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpowerdot%2Ftelegram-manual-approval","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpowerdot%2Ftelegram-manual-approval/lists"}