{"id":32161177,"url":"https://github.com/cuedo/github-webhooks","last_synced_at":"2025-10-21T13:51:35.367Z","repository":{"id":44844255,"uuid":"114437869","full_name":"cuedo/github-webhooks","owner":"cuedo","description":"Haskell types and instances for decoding GitHub webhook payloads.","archived":false,"fork":false,"pushed_at":"2025-09-12T00:59:30.000Z","size":946,"stargazers_count":37,"open_issues_count":10,"forks_count":17,"subscribers_count":2,"default_branch":"develop","last_synced_at":"2025-10-04T18:41:55.586Z","etag":null,"topics":["api","ci","cicd","continuous-integration","github","github-api","github-webhooks","haskell","haskell-lang","haskell-language","scotty","servant","warp","webhooks"],"latest_commit_sha":null,"homepage":"https://hackage.haskell.org/package/github-webhooks","language":"Haskell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cuedo.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":".github/SECURITY.md","support":null,"governance":null,"roadmap":"ROADMAP.md","authors":"AUTHORS","dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"custom":"https://cuedo.com.au/contact"}},"created_at":"2017-12-16T06:01:27.000Z","updated_at":"2025-09-30T14:39:30.000Z","dependencies_parsed_at":"2025-09-03T08:00:48.716Z","dependency_job_id":null,"html_url":"https://github.com/cuedo/github-webhooks","commit_stats":{"total_commits":72,"total_committers":13,"mean_commits":5.538461538461538,"dds":0.4444444444444444,"last_synced_commit":"0c71309a6a9f4270c307bd6a9587661747978c5d"},"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/cuedo/github-webhooks","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cuedo%2Fgithub-webhooks","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cuedo%2Fgithub-webhooks/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cuedo%2Fgithub-webhooks/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cuedo%2Fgithub-webhooks/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cuedo","download_url":"https://codeload.github.com/cuedo/github-webhooks/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cuedo%2Fgithub-webhooks/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":280272338,"owners_count":26302260,"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","status":"online","status_checked_at":"2025-10-21T02:00:06.614Z","response_time":58,"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":["api","ci","cicd","continuous-integration","github","github-api","github-webhooks","haskell","haskell-lang","haskell-language","scotty","servant","warp","webhooks"],"created_at":"2025-10-21T13:51:33.793Z","updated_at":"2025-10-21T13:51:35.351Z","avatar_url":"https://github.com/cuedo.png","language":"Haskell","readme":"![github-webhooks Mascot](./doc/github-webhooks-mascot-248.svg) \\\ngithub-webhooks\n---------------\n\n![GitHub release (latest by date)](https://img.shields.io/github/v/release/cuedo/github-webhooks)\n[![Hackage](https://img.shields.io/hackage/v/github-webhooks.svg)](https://hackage.haskell.org/package/github-webhooks)\n[![License](https://img.shields.io/github/license/cuedo/github-webhooks.svg)](#license)\n\nComplete Haskell types and instances for decoding GitHub API [webhook payloads].\n\n### Build Status\n\n|             | `release` | `develop` |\n|-------------|---------|----------|\n| Lints  | [![scan-code](https://github.com/cuedo/github-webhooks/actions/workflows/scan-code.yml/badge.svg?branch=release)](https://github.com/cuedo/github-webhooks/actions/workflows/scan-code.yml) | [![scan-code](https://github.com/cuedo/github-webhooks/actions/workflows/scan-code.yml/badge.svg?branch=develop)](https://github.com/cuedo/github-webhooks/actions/workflows/scan-code.yml) |\n| Ubuntu | [![test-ubuntu-latest](https://github.com/cuedo/github-webhooks/actions/workflows/test-ubuntu-latest.yml/badge.svg?branch=release)](https://github.com/cuedo/github-webhooks/actions/workflows/test-ubuntu-latest.yml) | [![test-ubuntu-latest](https://github.com/cuedo/github-webhooks/actions/workflows/test-ubuntu-latest.yml/badge.svg?branch=develop)](https://github.com/cuedo/github-webhooks/actions/workflows/test-ubuntu-latest.yml) |\n| Mac OS | [![test-macos-latest](https://github.com/cuedo/github-webhooks/actions/workflows/test-macos-latest.yml/badge.svg?branch=release)](https://github.com/cuedo/github-webhooks/actions/workflows/test-macos-latest.yml) | [![test-macos-latest](https://github.com/cuedo/github-webhooks/actions/workflows/test-macos-latest.yml/badge.svg?branch=develop)](https://github.com/cuedo/github-webhooks/actions/workflows/test-macos-latest.yml) |\n| Windows | [![test-windows-latest](https://github.com/cuedo/github-webhooks/actions/workflows/test-windows-latest.yml/badge.svg?branch=release)](https://github.com/cuedo/github-webhooks/actions/workflows/test-windows-latest.yml) | [![test-windows-latest](https://github.com/cuedo/github-webhooks/actions/workflows/test-windows-latest.yml/badge.svg?branch=develop)](https://github.com/cuedo/github-webhooks/actions/workflows/test-windows-latest.yml) |\n\n### Table of Contents\n\n* [Features](#features)\n* [Installation](#installation)\n* [Examples](#examples)\n* [Changelog](#changelog)\n* [Roadmap](#roadmap)\n* [Authors](#authors)\n* [Support](#support)\n* [License](#license)\n\n## Features\n`github-webhooks` comes with all the bells and whistles:\n\n* **Best-in-class JSON Decoding via `Aeson`**\n\n  This library uses the [aeson] package, a fast and widely adopted Haskell library for working with JSON data. It ensures best-in-class JSON decoding, enabling you to parse GitHub webhooks payloads with high performance and accuracy.\n\n* **i18n/Unicode String Support via `Text`**\n\n  `github-webhooks` has first-class support for Unicode strings in all functions via the [text] package. This ensures that the library can handle any i18n text data in the payloads correctly, regardless of the character set.\n\n* **Suitable for Large Data Payloads using `Vector`**\n\n  This library uses the [vector] package to handle large data payloads efficiently. This means it is suitable for big data workloads and capable of processing large amounts of data without excessive CPU or memory usage.\n\n* **Type-safe Encoding of Optional Data**\n\n  Optional data in the payloads are encoded in a type-safe manner (i.e. using `Maybe`). This ensures that your application will not encounter runtime errors due to missing or unexpected data and provides valuable signals during development where you should implement fault handling.\n\n* **Type-safe Event Action Encodings with Support for Future API Changes**\n\n  This library encodes event actions in a type-safe manner that does not require the payload to be fully decoded. Thus, applications built using this library will generally be forward-compatible with future changes to the GitHub API and continue to work even if GitHub makes changes to the webhooks API.\n\n* **Instances for `Typeable`, `Data`, `Generic` and `NFData`**\n\n  The data types in this library have instances for `Typeable`, `Data`, `Generic`, and `NFData`. This ensures compatibility with a wide range of Haskell libraries and metaprogramming tools.\n\n* **Strongly Typed Utility Classes `EventHasSender`, `EventHasRepo` et al.**\n\n  This library provides strongly typed utility classes such as `EventHasSender` and `EventHasRepo` to make it easier to work with the different event types and their associated data. You can define webhook event handlers that work on multiple events.\n\n* **Strict Data Types Suitable for High Performance Streaming Operations**\n\n  The data types in this library are strict, making them suitable for high-performance streaming operations. This ensures that your application can process large streams of webhook events efficiently and without space leaks.\n\n* **Full Support for Webhook Event Types**\n\n  `github-webhooks` provides full support for [all the GitHub webhook event types](https://developer.github.com/v3/activity/events/types/#event-types--payloads). This means you can handle any event sent by GitHub without having to implement custom parsing or processing logic.\n\n## Installation\n`github-webhooks` is available via installation on [Hackage](https://hackage.haskell.org/package/github-webhooks) and [Stackage](https://www.stackage.org/package/github-webhooks).\n\n## Examples\n\n### Minimal interactive example:\n\nShell:\n```hs\n$ stack ghci bytestring aeson github-webhooks\nimport qualified Data.ByteString.Lazy as BSL\nimport           Data.Aeson           ( eitherDecode' )\n\njson \u003c- BSL.readFile \"fixtures/watch-event.json\"\neitherDecode' json :: Either String WatchEvent\n```\n\nOutput:\n```\nRight (WatchEvent {\n  evWatchAction = WatchStartedAction,\n  evWatchRepo = HookRepository {\n    whRepoId = 35129377,\n    whRepoNodeId = \"MDg6Q2hlY2tSdW4xMjg2MjAyMjg=\",\n    whRepoName = \"public-repo\",\n    whRepoFullName = \"baxterthehacker/public-repo\",\n    whRepoOwner = Right (HookUser {\n      whUserLogin = \"baxterthehacker\",\n      whUserId = 6752317,\n      whUserNodeId = \"MDg6Q2hlY2tSdW4xMjg2MjAyMjg=\",\n      whUserAvatarUrl = URL \"https://avatars.githubusercontent.com/u/6752317?v=3\",\n...\n```\n[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/cuedo/github-webhooks)\n\n### Getting started quickly\nThere are some turnkey integration tutorials in this repository:\n\n* **[Servant Integration (Simple)](./examples/servant-simple#readme)**\n\n  Minimal working example of integrating this package with [servant] and [servant-github-webhook].\n\n* **[Servant Integration (Typical)](./examples/servant#readme)**\n\n  This example demonstrates more advanced use-cases with [servant] by decoding multiple different types of payloads on the same endpoint.\n\n* **[Scotty Integration](./examples/scotty#readme)**\n\n  Minimal working example of integrating this package with [scotty].\n\n## Changelog\nSee [CHANGELOG.md](./CHANGELOG.md) for a summary of changes in each release.\n\n## Roadmap\nSee [ROADMAP.md](./ROADMAP.md) for the project timeline and feature estimation of future releases.\n\n## Authors\nSee [AUTHORS](./AUTHORS) for a list of significant authors.\n\n## Support\nThe best way to get free community support is to raise a well-written issue in this repository and one of the maintainers will endeavour to respond to it quickly.\n\nIf you are using a plugin i.e. [servant-github-webhook](https://github.com/tsani/servant-github-webhook), you might be able to get better support if you raise your issue against that project instead.\n\nFor enterprise support, you can write us: [foss@cuedo.com.au](mailto:foss@cuedo.com.au).\n\n## License\n`github-webhooks` is free open source software, however you must use it according to the MIT-style [LICENSE](./LICENSE).\n\n    MIT License\n\n    Copyright (c) 2017-2023 CUEDO CONTROLS P/L (https://cuedo.com.au)\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE.\n\nFree open source software, sponsored by CUEDO CONTROLS P/L ([cuedo.com.au](https://cuedo.com.au)). \\\n\\\n\u003ca href=\"https://cuedo.com.au\" rel=\"sponsor\"\u003e![CUEDO CONTROLS PTY LTD](./doc/cuedo-color-256.svg)\u003c/a\u003e\n\n**Software defined mobility, just-so.**\n\n[webhook payloads]: https://developer.github.com/webhooks/\n[aeson]: https://www.stackage.org/package/aeson\n[text]: https://www.stackage.org/package/text\n[vector]: https://www.stackage.org/package/vector\n[servant]: https://www.stackage.org/package/github-webhooks\n[servant-github-webhook]: https://www.stackage.org/package/servant-github-webhook\n[scotty]: https://www.stackage.org/package/scotty\n","funding_links":["https://cuedo.com.au/contact"],"categories":["Haskell"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcuedo%2Fgithub-webhooks","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcuedo%2Fgithub-webhooks","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcuedo%2Fgithub-webhooks/lists"}