{"id":13819816,"url":"https://github.com/mercari/tfnotify","last_synced_at":"2026-02-21T17:29:24.867Z","repository":{"id":31601405,"uuid":"128383825","full_name":"mercari/tfnotify","owner":"mercari","description":"A CLI command to parse Terraform execution result and notify it to GitHub","archived":false,"fork":false,"pushed_at":"2026-02-10T07:35:28.000Z","size":13916,"stargazers_count":640,"open_issues_count":28,"forks_count":92,"subscribers_count":26,"default_branch":"master","last_synced_at":"2026-02-10T09:53:21.423Z","etag":null,"topics":["circleci","github","golang","slack","terraform","travis-ci"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mercari.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2018-04-06T11:02:00.000Z","updated_at":"2026-02-10T07:33:12.000Z","dependencies_parsed_at":"2025-11-05T21:09:43.819Z","dependency_job_id":null,"html_url":"https://github.com/mercari/tfnotify","commit_stats":null,"previous_names":[],"tags_count":49,"template":false,"template_full_name":null,"purl":"pkg:github/mercari/tfnotify","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mercari%2Ftfnotify","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mercari%2Ftfnotify/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mercari%2Ftfnotify/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mercari%2Ftfnotify/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mercari","download_url":"https://codeload.github.com/mercari/tfnotify/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mercari%2Ftfnotify/sbom","scorecard":{"id":636821,"data":{"date":"2025-08-11","repo":{"name":"github.com/mercari/tfnotify","commit":"ddb68efbd4f73aedb473b9e1acf9b648a4a0473f"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.1,"checks":[{"name":"Code-Review","score":10,"reason":"all changesets reviewed","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":"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":"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":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/release.yml:1","Warn: no topLevel permission defined: .github/workflows/reviewdog.yml:1","Warn: no topLevel permission defined: .github/workflows/test.yml:1","Info: no jobLevel write permissions found"],"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":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/mercari/tfnotify/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/mercari/tfnotify/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/mercari/tfnotify/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/reviewdog.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/mercari/tfnotify/reviewdog.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/reviewdog.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/mercari/tfnotify/reviewdog.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/mercari/tfnotify/test.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/mercari/tfnotify/test.yml/master?enable=pin","Info:   0 out of   5 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 third-party GitHubAction dependencies pinned"],"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"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":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v0.8.0 not signed: https://api.github.com/repos/mercari/tfnotify/releases/85979609","Warn: release artifact v0.7.5 not signed: https://api.github.com/repos/mercari/tfnotify/releases/59986410","Warn: release artifact v0.7.4 not signed: https://api.github.com/repos/mercari/tfnotify/releases/58449788","Warn: release artifact v0.7.3 not signed: https://api.github.com/repos/mercari/tfnotify/releases/57659976","Warn: release artifact v0.7.2 not signed: https://api.github.com/repos/mercari/tfnotify/releases/57645078","Warn: release artifact v0.8.0 does not have provenance: https://api.github.com/repos/mercari/tfnotify/releases/85979609","Warn: release artifact v0.7.5 does not have provenance: https://api.github.com/repos/mercari/tfnotify/releases/59986410","Warn: release artifact v0.7.4 does not have provenance: https://api.github.com/repos/mercari/tfnotify/releases/58449788","Warn: release artifact v0.7.3 does not have provenance: https://api.github.com/repos/mercari/tfnotify/releases/57659976","Warn: release artifact v0.7.2 does not have provenance: https://api.github.com/repos/mercari/tfnotify/releases/57645078"],"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 'master'"],"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 30 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"}},{"name":"Vulnerabilities","score":0,"reason":"12 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GO-2022-0969 / GHSA-69cg-p879-7622","Warn: Project is vulnerable to: GO-2023-1495 / GHSA-fxg5-wq6x-vr4w","Warn: Project is vulnerable to: GO-2022-1144 / GHSA-xrjj-mj9h-534m","Warn: Project is vulnerable to: GO-2023-1571 / GHSA-vvpx-j8f3-3w6h","Warn: Project is vulnerable to: GO-2023-1988 / GHSA-2wrh-6pvc-2jm9","Warn: Project is vulnerable to: GO-2023-2102 / GHSA-4374-p667-p6c8","Warn: Project is vulnerable to: GHSA-qppj-fm5r-hxr3","Warn: Project is vulnerable to: GO-2024-2687 / GHSA-4v7x-pqxf-cx7m","Warn: Project is vulnerable to: GO-2024-3333","Warn: Project is vulnerable to: GO-2025-3503 / GHSA-qxp5-gwg8-xv66","Warn: Project is vulnerable to: GO-2025-3595 / GHSA-vvgc-356p-c3xw","Warn: Project is vulnerable to: GO-2025-3488 / GHSA-6v2p-p543-phr9"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-21T09:24:55.671Z","repository_id":31601405,"created_at":"2025-08-21T09:24:55.671Z","updated_at":"2025-08-21T09:24:55.671Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29688236,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-21T15:51:39.154Z","status":"ssl_error","status_checked_at":"2026-02-21T15:49:03.425Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5: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":["circleci","github","golang","slack","terraform","travis-ci"],"created_at":"2024-08-04T08:00:53.384Z","updated_at":"2026-02-21T17:29:24.861Z","avatar_url":"https://github.com/mercari.png","language":"Go","readme":"tfnotify\n========\n\n[![][release-svg]][release] [![][test-svg]][test] [![][goreportcard-svg]][goreportcard]\n\n[release]: https://github.com/mercari/tfnotify/actions?query=workflow%3Arelease\n[release-svg]: https://github.com/mercari/tfnotify/workflows/release/badge.svg\n[test]: https://github.com/mercari/tfnotify/actions?query=workflow%3Atest\n[test-svg]: https://github.com/mercari/tfnotify/workflows/test/badge.svg\n[goreportcard]: https://goreportcard.com/report/github.com/mercari/tfnotify\n[goreportcard-svg]: https://goreportcard.com/badge/github.com/mercari/tfnotify\n\nTfnotify is a Go-based template engine that creates comments on Terraform operations. It pipes commands directly and captures operation outputs, including exit codes and error details and offers to post them as a Github Comment, with AI summaries and analysis based on custom templates.\n\n## Motivation\n\nThere are commands such as `plan` and `apply` on Terraform command, but many developers think they would like to check if the execution of those commands succeeded.\nTerraform commands are often executed via CI like Cloudbuild CI/Github Actions, but in that case you need to go to the CI page to check it.\nThis is very troublesome. It is very efficient if you can check it with the supported CI.\n\n### Key Features:\n\n- **Flexible Templating**: Go template system with custom functions for formatting notifications\n- **Intelligent Parsing**: Regex-based engine that extracts meaningful information from Terraform plan and apply outputs.\n- **Multi-Platform Support**: Integrates with GitHub, CircleCI, Cloudbuild.\n- **CI/CD Awareness**: Automatically detects and integrates with 9+ CI/CD platforms\n- **Label Management**: Automatically creates and manages GitHub labels based on plan results\n- **AI-Powered Summaries**: Generates optional AI summaries of infrastructure changes using multiple providers\n- **Security Features**: Built-in masking system prevents sensitive data exposure\n- **Comment Management**: Updates existing comments instead of creating duplicates\n\n## Installation\n\nGrab the binary from GitHub Releases (Recommended)\n\nor\n\n```console\n$ go get -u github.com/mercari/tfnotify\n```\n\n### Supported Platforms\n\nTfnotify supports the following platforms:\n\n- CI\n    - CircleCI\n    - CodeBuild\n    - CloudBuild\n    - GitHub Actions\n- Notifier\n    - GitHub\n\n\n### Basic\n\ntfnotify is just CLI command. So you can run it from your local after grabbing the binary.\n\nBasically tfnotify waits for the input from Stdin. So tfnotify needs to pipe the output of Terraform command like the following:\n\n```console\n$ tfnotify plan\n```\n\nFor `plan` command, you also need to specify `plan` as the argument of tfnotify. In the case of `apply`, you need to do `apply`. Currently supported commands can be checked with `tfnotify --help`.\n\n### Configurations\n\nWhen running tfnotify, you can specify the configuration path via `--config` option (if it's omitted, it defaults to `{.,}tfnotify.y{,a}ml`).\n\nThe example settings of GitHub and GitHub Enterprise. Incidentally, there is no need to replace TOKEN string such as `$GITHUB_TOKEN` with the actual token. Instead, it must be defined as environment variables in CI settings.\n\n[template](https://golang.org/pkg/text/template/) of Go can be used for `template`. The templates can be used in `tfnotify.yaml` are as follows:\n\nPlaceholder | Usage\n---|---\n`{{ .Title }}` | Like `## Plan result`\n`{{ .Message }}` | A string that can be set from CLI with `--message` option\n`{{ .Result }}` | Matched result by parsing like `Plan: 1 to add` or `No changes`\n`{{ .Body }}` | The entire of Terraform execution result\n`{{ .Link }}` | The link of the build page on CI\n\nOn GitHub, tfnotify can also put a warning message if the plan result contains resource deletion (optional).\n\n#### Template Examples\n\n\u003cdetails\u003e\n\u003csummary\u003eFor GitHub\u003c/summary\u003e\n\n```yaml\n---\nci: circleci\nnotifier:\n  github:\n    token: $GITHUB_TOKEN\n    repository:\n      owner: \"mercari\"\n      name: \"tfnotify\"\nterraform:\n  fmt:\n    template: |\n      {{ .Title }}\n\n      {{ .Message }}\n\n      {{ .Result }}\n\n      {{ .Body }}\n  plan:\n    template: |\n      {{ .Title }} \u003csup\u003e[CI link]( {{ .Link }} )\u003c/sup\u003e\n      {{ .Message }}\n      {{if .Result}}\n      \u003cpre\u003e\u003ccode\u003e{{ .Result }}\n      \u003c/pre\u003e\u003c/code\u003e\n      {{end}}\n      \u003cdetails\u003e\u003csummary\u003eDetails (Click me)\u003c/summary\u003e\n\n      \u003cpre\u003e\u003ccode\u003e{{ .Body }}\n      \u003c/pre\u003e\u003c/code\u003e\u003c/details\u003e\n  apply:\n    template: |\n      {{ .Title }}\n      {{ .Message }}\n      {{if .Result}}\n      \u003cpre\u003e\u003ccode\u003e{{ .Result }}\n      \u003c/pre\u003e\u003c/code\u003e\n      {{end}}\n      \u003cdetails\u003e\u003csummary\u003eDetails (Click me)\u003c/summary\u003e\n\n      \u003cpre\u003e\u003ccode\u003e{{ .Body }}\n      \u003c/pre\u003e\u003c/code\u003e\u003c/details\u003e\n```\n\nIf you would like to let tfnotify warn the resource deletion, add `when_destroy` configuration as below.\n\n```yaml\n---\n# ...\nterraform:\n  # ...\n  plan:\n    template: |\n      {{ .Title }} \u003csup\u003e[CI link]( {{ .Link }} )\u003c/sup\u003e\n      {{ .Message }}\n      {{if .Result}}\n      \u003cpre\u003e\u003ccode\u003e{{ .Result }}\n      \u003c/pre\u003e\u003c/code\u003e\n      {{end}}\n      \u003cdetails\u003e\u003csummary\u003eDetails (Click me)\u003c/summary\u003e\n\n      \u003cpre\u003e\u003ccode\u003e{{ .Body }}\n      \u003c/pre\u003e\u003c/code\u003e\u003c/details\u003e\n    when_destroy:\n      template: |\n        ## :warning: WARNING: Resource Deletion will happen :warning:\n\n        This plan contains **resource deletion**. Please check the plan result very carefully!\n  # ...\n```\n\nYou can also let tfnotify add a label to PRs depending on the `terraform plan` output result. Currently, this feature is for Github labels only.\n\n```yaml\n---\n# ...\nterraform:\n  # ...\n  plan:\n    template: |\n      {{ .Title }} \u003csup\u003e[CI link]( {{ .Link }} )\u003c/sup\u003e\n      {{ .Message }}\n      {{if .Result}}\n      \u003cpre\u003e\u003ccode\u003e{{ .Result }}\n      \u003c/pre\u003e\u003c/code\u003e\n      {{end}}\n      \u003cdetails\u003e\u003csummary\u003eDetails (Click me)\u003c/summary\u003e\n\n      \u003cpre\u003e\u003ccode\u003e{{ .Body }}\n      \u003c/pre\u003e\u003c/code\u003e\u003c/details\u003e\n    when_add_or_update_only:\n      label: \"add-or-update\"\n    when_destroy:\n      label: \"destroy\"\n    when_no_changes:\n      label: \"no-changes\"\n    when_plan_error:\n      label: \"error\"\n  # ...\n```\n\nSometimes you may want not to HTML-escape Terraform command outputs.\nFor example, when you use code block to print command output, it's better to use raw characters instead of character references (e.g. `-/+` -\u003e `-/\u0026#43;`, `\"` -\u003e `\u0026#34;`).\n\nYou can disable HTML escape by adding `use_raw_output: true` configuration.\nWith this configuration, Terraform doesn't HTML-escape any Terraform output.\n\n~~~yaml\n---\n# ...\nterraform:\n  use_raw_output: true\n  # ...\n  plan:\n    template: |\n      {{ .Title }} \u003csup\u003e[CI link]( {{ .Link }} )\u003c/sup\u003e\n      {{ .Message }}\n      {{if .Result}}\n      ```\n      {{ .Result }}\n      ```\n      {{end}}\n      \u003cdetails\u003e\u003csummary\u003eDetails (Click me)\u003c/summary\u003e\n\n      ```\n      {{ .Body }}\n      ```\n  # ...\n~~~\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eFor GitHub Enterprise\u003c/summary\u003e\n\n```yaml\n---\nci: circleci\nnotifier:\n  github:\n    token: $GITHUB_TOKEN\n    base_url: $GITHUB_BASE_URL # Example: https://github.example.com/api/v3\n    repository:\n      owner: \"mercari\"\n      name: \"tfnotify\"\nterraform:\n  fmt:\n    template: |\n      {{ .Title }}\n\n      {{ .Message }}\n\n      {{ .Result }}\n\n      {{ .Body }}\n  plan:\n    template: |\n      {{ .Title }} \u003csup\u003e[CI link]( {{ .Link }} )\u003c/sup\u003e\n      {{ .Message }}\n      {{if .Result}}\n      \u003cpre\u003e\u003ccode\u003e{{ .Result }}\n      \u003c/pre\u003e\u003c/code\u003e\n      {{end}}\n      \u003cdetails\u003e\u003csummary\u003eDetails (Click me)\u003c/summary\u003e\n\n      \u003cpre\u003e\u003ccode\u003e{{ .Body }}\n      \u003c/pre\u003e\u003c/code\u003e\u003c/details\u003e\n  apply:\n    template: |\n      {{ .Title }}\n      {{ .Message }}\n      {{if .Result}}\n      \u003cpre\u003e\u003ccode\u003e{{ .Result }}\n      \u003c/pre\u003e\u003c/code\u003e\n      {{end}}\n      \u003cdetails\u003e\u003csummary\u003eDetails (Click me)\u003c/summary\u003e\n\n      \u003cpre\u003e\u003ccode\u003e{{ .Body }}\n      \u003c/pre\u003e\u003c/code\u003e\u003c/details\u003e\n```\n\n\u003c/details\u003e\n\n\n### Google Cloud Build Considerations\n\n- These environment variables are needed to be set using [substitutions](https://cloud.google.com/cloud-build/docs/configuring-builds/substitute-variable-values)\n  - `COMMIT_SHA`\n  - `BUILD_ID`\n  - `PROJECT_ID`\n  - `_PR_NUMBER`\n  - `_REGION`\n- Recommended trigger events\n  - `terraform plan`: Pull request\n  - `terraform apply`: Push to branch\n\n## Contribution\n\nPlease read the CLA below carefully before submitting your contribution.\n\nhttps://www.mercari.com/cla/\n\n## License\n\nLicensed under the MIT License.\nSee [LICENSE](LICENSE) for details.\n\nCopyright © 2018 Mercari, Inc.\n\nThis project includes substantial portions of code from [suzuki-shunsuke/tfcmt](https://github.com/suzuki-shunsuke/tfcmt).\n\nCopyright © 2020 Shunsuke Suzuki\n","funding_links":[],"categories":["Go"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmercari%2Ftfnotify","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmercari%2Ftfnotify","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmercari%2Ftfnotify/lists"}