{"id":17901743,"url":"https://github.com/mogelbrod/github-to-favro","last_synced_at":"2026-04-26T12:32:37.100Z","repository":{"id":136533999,"uuid":"546946129","full_name":"mogelbrod/github-to-favro","owner":"mogelbrod","description":"A Cloudflare worker that posts Favro card comments in response to receiving various Github webhook requests","archived":false,"fork":false,"pushed_at":"2022-10-12T08:01:18.000Z","size":71,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-03T05:29:03.688Z","etag":null,"topics":["cloudflare-workers","favro","github"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/mogelbrod.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":"2022-10-06T22:54:37.000Z","updated_at":"2022-10-26T07:28:25.000Z","dependencies_parsed_at":null,"dependency_job_id":"e1fb9c25-a627-4055-9c3a-634ee048d240","html_url":"https://github.com/mogelbrod/github-to-favro","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/mogelbrod/github-to-favro","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mogelbrod%2Fgithub-to-favro","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mogelbrod%2Fgithub-to-favro/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mogelbrod%2Fgithub-to-favro/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mogelbrod%2Fgithub-to-favro/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mogelbrod","download_url":"https://codeload.github.com/mogelbrod/github-to-favro/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mogelbrod%2Fgithub-to-favro/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32297894,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-26T09:34:17.070Z","status":"ssl_error","status_checked_at":"2026-04-26T09:34:00.993Z","response_time":129,"last_error":"SSL_read: 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":["cloudflare-workers","favro","github"],"created_at":"2024-10-28T16:03:22.947Z","updated_at":"2026-04-26T12:32:37.083Z","avatar_url":"https://github.com/mogelbrod.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# github-to-favro\n\nA [Cloudflare worker](https://developers.cloudflare.com/workers/) that posts\n[Favro card comments](https://favro.com/developer/) in response to receiving various\n[Github webhook](https://docs.github.com/en/developers/webhooks-and-events/webhooks/) requests.\n\nInspects incoming webhook requests for references to Favro card IDs (`ABC-123` or similar).\nIf any are detected the worker will then attempt to post a comment to the corresponding\nFavro card with a link to the commit/issue/PR/etc. which referenced it.\n\n\u003cimg width=\"393\" alt=\"Screenshot of Favro card with comment posted by worker\" src=\"https://user-images.githubusercontent.com/150084/194759250-4b714388-71cc-4f49-9154-ef4e6b74f816.png\"\u003e\n\n## Getting started\n\nYou'll need [`node`](https://nodejs.org/en/download/) and\n`npm` (or another compatible package manager) first.\n\n```shell\ngit clone git@github.com:mogelbrod/github-to-favro.git\ncd github-to-favro\nnpm install # installs the `wrangler` CLI together with remaining dependencies\n```\n\nInstalling `wrangler` via NPM on ARM Macs is not supported as of October 2022,\ninstead follow the instructions in\n[the wrangler repository](https://github.com/cloudflare/wrangler#installation).\n\n### Authenticate `wrangler`\n\nIf you do not yet have a Cloudflare account you can sign up for free on\n\u003chttps://dash.cloudflare.com/sign-up/workers\u003e.\n\nOnce you have a Cloudflare account you need to login using the `wrangler` CLI:\n```shell\nwrangler login\n```\n\nIf you're having trouble with the CLI never retrieving the token\n(stuck in infinite polling after issuing the command), then log\nout of cloudflare from the web and retry `wrangler login`,\nor follow [these instructions](https://github.com/cloudflare/wrangler/issues/1703#issuecomment-754219928).\n\nYou can verify that the auth succeeded using `wrangler whoami`.\n\n### Create the worker\n\nUse `wrangler` to create the worker (same command as updating an existing worker):\n\n```shell\nwrangler publish\n```\n\nNote down the URL of the created worker - you'll need to provide it when setting\nup each Github webhook.\n\n### Worker secrets\n\nThe worker requires these environment variables to be defined to function:\n\n- `FAVRO_PREFIX`: The Favro card ID prefix used to identify cards:\u003cbr\u003e\n  `ABC` if card IDs follow the pattern `ABC-123`\n- `FAVRO_ORG`: The Favro organization ID, can be determined from the Favro web URL:\u003cbr\u003e\n  `https://favro.com/organization/{FAVRO_ORG}/...`\n- `FAVRO_AUTH`: Favro API Authentication header for the user to impersonate, including\n  either password (`email:password`) or Favro access token (`email:access-token`)\n- `GITHUB_WEBHOOK_SECRET`: An arbitrary string used to authenticate the incoming\n  Github webhooks\n\nThese can quickly be saved to Cloudflare using `wrangler`:\n\n```shell\nwrangler secret put FAVRO_PREFIX\nwrangler secret put FAVRO_ORG\nwrangler secret put FAVRO_AUTH\nwrangler secret put GITHUB_WEBHOOK_SECRET\n```\n\n## Configure Github webhook(s)\n\nOnce the worker is online you'll need to set up a webhook for each Github\nrepository that you wish to subscribe to.  This can be done from the Github web\nUI by navigating to\n\u003chttps://github.com/OWNER/REPO/settings/hooks/new\u003e (replace `OWNER` \u0026 `REPO`).\n\nEnter the following in the form:\n\n* Payload URL: URL to the published Cloudflare worker (output when running `wrangler publish`)\n* Content type: `application/json`\n* Secret: The value of the `GITHUB_WEBHOOK_SECRET` chosen in [Worker secrets](#worker-secrets)\n* Events to trigger the webhook: _everything_, or the individual events you're interested in, typically:\u003cbr\u003e\n  pushes, branch/tag creation, all commit/discussion/issue/pull request events, project cards \u0026 releases\n\nOnce the webhook has been created everything should be set up.  You can now try\nout the integration by pushing a commit that references an existing Favro card\nin the `FAVRO_ORG` that is accessible to `FAVRO_AUTH`. If everything works then\nthe worker should post a comment to the card in question within seconds after\nthe commit is pushed.\n\n## Developing\n\nThe worker is written in TypeScript, and is built \u0026 published through `wrangler`.\n\n* `wrangler dev` starts up a locally served version of the worker that is\n  reloaded on local file changes. *It actually runs on cloudflares servers*, and so\n  has full access to all features (such as secrets and KV namespaces).\n* `wrangler publish` will generate a production build of the worker and then deploy it.\n* `wrangler tail` will stream logs from the published (live) worker to your terminal.\n* `npm start` - alias for `wrangler dev`\n* `npm run deploy` - alias for `wrangler publish`\n* `npm run deploy:watch` - watches for changes to `src/**`, re-running `wrangler dev \u0026\u0026 wrangler tail`\n* `npm test` - runs local \"test suite\"\n* `npm test:watch` - runs local \"test suite\" whenever `src/**` changes\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmogelbrod%2Fgithub-to-favro","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmogelbrod%2Fgithub-to-favro","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmogelbrod%2Fgithub-to-favro/lists"}