{"id":15779497,"url":"https://github.com/aldaviva/freshpager","last_synced_at":"2025-07-31T23:07:08.284Z","repository":{"id":246816713,"uuid":"821037417","full_name":"Aldaviva/FreshPager","owner":"Aldaviva","description":"📟 Trigger a PagerDuty incident when Freshping detects that a service is down.","archived":false,"fork":false,"pushed_at":"2025-07-14T09:01:29.000Z","size":164,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-07-26T13:50:38.926Z","etag":null,"topics":["downtime","freshping","freshworks","monitoring","outage","pagerduty","ping"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Aldaviva.png","metadata":{"files":{"readme":"Readme.md","changelog":null,"contributing":null,"funding":null,"license":"License.txt","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},"funding":{"custom":["https://paypal.me/aldaviva"]}},"created_at":"2024-06-27T17:21:58.000Z","updated_at":"2025-06-12T03:27:32.000Z","dependencies_parsed_at":null,"dependency_job_id":"5377d9e0-80a9-481c-af27-c8aeae08c833","html_url":"https://github.com/Aldaviva/FreshPager","commit_stats":null,"previous_names":["aldaviva/freshpager"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/Aldaviva/FreshPager","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Aldaviva%2FFreshPager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Aldaviva%2FFreshPager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Aldaviva%2FFreshPager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Aldaviva%2FFreshPager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Aldaviva","download_url":"https://codeload.github.com/Aldaviva/FreshPager/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Aldaviva%2FFreshPager/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":268134056,"owners_count":24201378,"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-07-31T02:00:08.723Z","response_time":66,"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":["downtime","freshping","freshworks","monitoring","outage","pagerduty","ping"],"created_at":"2024-10-04T18:20:19.144Z","updated_at":"2025-07-31T23:07:08.256Z","avatar_url":"https://github.com/Aldaviva.png","language":"C#","funding_links":["https://paypal.me/aldaviva"],"categories":[],"sub_categories":[],"readme":"\u003cimg src=\"FreshPager/freshping.ico\" alt=\"Freshping\" height=\"24\" /\u003e FreshPager\n===\n\n[![GitHub Actions](https://img.shields.io/github/actions/workflow/status/Aldaviva/FreshPager/dotnet.yml?branch=master\u0026logo=github)](https://github.com/Aldaviva/FreshPager/actions/workflows/dotnet.yml) [![Testspace](https://img.shields.io/testspace/tests/Aldaviva/Aldaviva:FreshPager/master?passed_label=passing\u0026failed_label=failing\u0026logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA4NTkgODYxIj48cGF0aCBkPSJtNTk4IDUxMy05NCA5NCAyOCAyNyA5NC05NC0yOC0yN3pNMzA2IDIyNmwtOTQgOTQgMjggMjggOTQtOTQtMjgtMjh6bS00NiAyODctMjcgMjcgOTQgOTQgMjctMjctOTQtOTR6bTI5My0yODctMjcgMjggOTQgOTQgMjctMjgtOTQtOTR6TTQzMiA4NjFjNDEuMzMgMCA3Ni44My0xNC42NyAxMDYuNS00NFM1ODMgNzUyIDU4MyA3MTBjMC00MS4zMy0xNC44My03Ni44My00NC41LTEwNi41UzQ3My4zMyA1NTkgNDMyIDU1OWMtNDIgMC03Ny42NyAxNC44My0xMDcgNDQuNXMtNDQgNjUuMTctNDQgMTA2LjVjMCA0MiAxNC42NyA3Ny42NyA0NCAxMDdzNjUgNDQgMTA3IDQ0em0wLTU1OWM0MS4zMyAwIDc2LjgzLTE0LjgzIDEwNi41LTQ0LjVTNTgzIDE5Mi4zMyA1ODMgMTUxYzAtNDItMTQuODMtNzcuNjctNDQuNS0xMDdTNDczLjMzIDAgNDMyIDBjLTQyIDAtNzcuNjcgMTQuNjctMTA3IDQ0cy00NCA2NS00NCAxMDdjMCA0MS4zMyAxNC42NyA3Ni44MyA0NCAxMDYuNVMzOTAgMzAyIDQzMiAzMDJ6bTI3NiAyODJjNDIgMCA3Ny42Ny0xNC44MyAxMDctNDQuNXM0NC02NS4xNyA0NC0xMDYuNWMwLTQyLTE0LjY3LTc3LjY3LTQ0LTEwN3MtNjUtNDQtMTA3LTQ0Yy00MS4zMyAwLTc2LjY3IDE0LjY3LTEwNiA0NHMtNDQgNjUtNDQgMTA3YzAgNDEuMzMgMTQuNjcgNzYuODMgNDQgMTA2LjVTNjY2LjY3IDU4NCA3MDggNTg0em0tNTU3IDBjNDIgMCA3Ny42Ny0xNC44MyAxMDctNDQuNXM0NC02NS4xNyA0NC0xMDYuNWMwLTQyLTE0LjY3LTc3LjY3LTQ0LTEwN3MtNjUtNDQtMTA3LTQ0Yy00MS4zMyAwLTc2LjgzIDE0LjY3LTEwNi41IDQ0UzAgMzkxIDAgNDMzYzAgNDEuMzMgMTQuODMgNzYuODMgNDQuNSAxMDYuNVMxMDkuNjcgNTg0IDE1MSA1ODR6IiBmaWxsPSIjZmZmIi8%2BPC9zdmc%2B)](https://aldaviva.testspace.com/spaces/283429) [![Coveralls](https://img.shields.io/coveralls/github/Aldaviva/FreshPager?logo=coveralls)](https://coveralls.io/github/Aldaviva/FreshPager?branch=master)\n\nWhen Freshping detects an outage, trigger an alert in PagerDuty (and resolve when it's up again).\n\nThis is helpful because Freshping's only built-in notification system is email, and the Gmail Android app is extremely slow to notify you of new messages: notifications are often hours late. PagerDuty, on the other hand, has realtime alerting with SMS messages and mobile app push notifications for Android and iOS.\n\nThis is a free, open-source, no sign-up, self-hostable alternative to the [Zapier Freshping + PagerDuty integration](https://zapier.com/apps/freshping/integrations/pagerduty/1146377/trigger-new-incidents-in-pagerduty-for-new-freshping-alerts).\n\n\u003c!-- MarkdownTOC autolink=\"true\" bracket=\"round\" autoanchor=\"false\" levels=\"1,2,3\" bullets=\"1.,-,-,-\" --\u003e\n\n1. [Prerequisites](#prerequisites)\n1. [Installation](#installation)\n1. [Configuration](#configuration)\n1. [Execution](#execution)\n1. [Signal Flow](#signal-flow)\n\n\u003c!-- /MarkdownTOC --\u003e\n\n## Prerequisites\n- [.NET Runtime 8 or later](https://dotnet.microsoft.com/en-us/download)\n- [Freshping account](https://freshping.io/)\n    - ⛔ [Freshworks disabled the ability to sign up for new Freshping accounts](https://support.freshping.io/en/support/solutions/articles/50000006524-suspension-of-new-signups-faqs) in 2023, so if you don't already have an account, you can't create one anymore.\n    - All billing plans are compatible: Sprout (free, 5 integrations), Blossom (10 integrations), and Garden (15 integrations)\n- Ability to listen on a public WAN TCP port for incoming HTTP requests from Freshping without being blocked by a NAT or firewall\n- [PagerDuty account](https://www.pagerduty.com/sign-up/) (the [free plan](https://www.pagerduty.com/sign-up-free/?type=free) is sufficient)\n\n## Installation\n1. Download the ZIP file for your operating system and CPU architecture from the [latest release page](https://github.com/Aldaviva/FreshPager/releases/latest).\n1. Extract the ZIP file to a directory of your choice, such as `C:\\Program Files\\FreshPager\\` or `/opt/freshpager/`.\n    - When installing updates, don't overwrite `appsettings.json`.\n1. Install the service so it will start automatically when your computer boots.\n    - Windows: `\u0026 '.\\Install service.ps1'`\n        - If this PowerShell script doesn't run, try removing the Mark of the Web by unblocking the file or calling `Set-ExecutionPolicy RemoteSigned`.\n    - Linux with systemd:\n        ```sh\n        sudo cp freshpager.service /etc/systemd/system/\n        sudo systemctl daemon-reload\n        sudo systemctl enable freshpager.service\n        ```\n        - If the installation directory is not `/opt/freshpager/`, make sure to edit `freshpager.service` to match.\n\n## Configuration\n1. Create an Integration in PagerDuty and get its Integration Key.\n    1. Sign into your [PagerDuty account](https://app.pagerduty.com/).\n    1. Go to Services › Service Directory.\n    1. Select an existing Service for which you want to publish events, or create a new Service.\n    1. In the Integrations tab of the Service, add a new Integration.\n    1. Under Most popular integrations, select Events API V2, then click Add.\n    1. Expand the newly-created Integration and copy its **Integration Key**, which will be used to authorize this program to send Events to the correct Service.\n1. Edit the `appsettings.json` configuration file.\n    |Key|Example Value|Description|\n    |-|-|-|\n    |`pagerDutyIntegrationKeysByFreshpingCheckId`|\u003cpre lang=\"json\"\u003e{ \"123\": \"abc…\" }\u003c/pre\u003e|Object where each key is the numeric ID of a check in Freshping (go to a Report page and copy the value of the \u003ccode\u003echeck_id\u003c/code\u003e query parameter), and its value is the Integration Key you created for the matching PagerDuty Service in Step 1.|\n    |`kestrel.endpoints.https.url`|`http://0.0.0.0:37374`|URI specifying the hostname and TCP port on which to listen for HTTP requests from the Freshping webhook client. Must be publicly accessible on the WAN.|\n1. Create a Webhook integration in Freshping.\n    1. Sign into your [Freshworks account](https://login.freshworks.com/email-login).\n    1. Go to your Freshping Dashboard.\n    1. Go to Settings › Integrations.\n    1. Under Webhook, select **+ Create Integration**.\n    1. Set the Webook Name to any name you want.\n    1. Set the Event Type to Up/Down.\n    1. Select the Checks that should trigger the alert.\n    1. Set the Callback URL to the location of your FreshPager server, such as `http://myserver.example.com:37374/`.\n    1. Leave the request body set to Simple.\n    1. Click Save.\n\n## Execution\n1. Start the service.\n    - Windows: `Restart-Service Freshpager`\n    - Linux with systemd: `sudo systemctl restart freshpager.service`\n\n## Signal Flow\n1. \u003cimg src=\"FreshPager/freshping.ico\" alt=\"Freshping\" height=\"12\" /\u003e Freshping detects and confirms that a Check is down.\n1. \u003cimg src=\"FreshPager/freshping.ico\" alt=\"Freshping\" height=\"12\" /\u003e Freshping sends an HTTP POST request to each Webhook integration subscribed to Up/Down events on that Check.\n1. Your \u003cimg src=\"https://gravatar.com/avatar/53218ea2108534d012156993e92f2e35?size=12\" alt=\"Aldaviva\" height=\"12\" /\u003e FreshPager server receives the HTTP POST request from \u003cimg src=\"FreshPager/freshping.ico\" alt=\"Freshping\" height=\"12\" /\u003e Freshping.\n1. \u003cimg src=\"https://gravatar.com/avatar/53218ea2108534d012156993e92f2e35?size=12\" alt=\"Aldaviva\" height=\"12\" /\u003e FreshPager looks up the Integration Key in its configuration based on the Check ID from the request body.\n1. \u003cimg src=\"https://gravatar.com/avatar/53218ea2108534d012156993e92f2e35?size=12\" alt=\"Aldaviva\" height=\"12\" /\u003e FreshPager sends an Events API V2 request to \u003cimg src=\"https://raw.githubusercontent.com/Aldaviva/PagerDuty/master/PagerDuty/icon.png\" alt=\"PagerDuty\" height=\"12\" /\u003e PagerDuty to trigger an alert on the Service that contains the Integration Key.\n1. \u003cimg src=\"https://raw.githubusercontent.com/Aldaviva/PagerDuty/master/PagerDuty/icon.png\" alt=\"PagerDuty\" height=\"12\" /\u003e PagerDuty creates a new incident for this alert, and returns a unique key for this alert, which \u003cimg src=\"https://gravatar.com/avatar/53218ea2108534d012156993e92f2e35?size=12\" alt=\"Aldaviva\" height=\"12\" /\u003e FreshPager stores in memory.\n1. When \u003cimg src=\"FreshPager/freshping.ico\" alt=\"Freshping\" height=\"12\" /\u003e Freshping detects that the Check is up again, it sends another POST request to \u003cimg src=\"https://gravatar.com/avatar/53218ea2108534d012156993e92f2e35?size=12\" alt=\"Aldaviva\" height=\"12\" /\u003e FreshPager, which resolves the previously-created \u003cimg src=\"https://raw.githubusercontent.com/Aldaviva/PagerDuty/master/PagerDuty/icon.png\" alt=\"PagerDuty\" height=\"12\" /\u003e PagerDuty alert using the same unique key.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faldaviva%2Ffreshpager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faldaviva%2Ffreshpager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faldaviva%2Ffreshpager/lists"}