{"id":18539314,"url":"https://github.com/broady/pager","last_synced_at":"2025-07-22T06:04:10.417Z","repository":{"id":12826332,"uuid":"15501607","full_name":"broady/pager","owner":"broady","description":"Flexible pager system","archived":false,"fork":false,"pushed_at":"2014-12-03T03:53:13.000Z","size":143,"stargazers_count":3,"open_issues_count":0,"forks_count":1,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-06-09T16:06:57.557Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","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/broady.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":null,"security":null,"support":null}},"created_at":"2013-12-29T01:10:38.000Z","updated_at":"2017-09-25T16:58:34.000Z","dependencies_parsed_at":"2022-09-07T22:22:02.459Z","dependency_job_id":null,"html_url":"https://github.com/broady/pager","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/broady/pager","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/broady%2Fpager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/broady%2Fpager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/broady%2Fpager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/broady%2Fpager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/broady","download_url":"https://codeload.github.com/broady/pager/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/broady%2Fpager/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266437369,"owners_count":23928235,"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-22T02:00:09.085Z","response_time":66,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"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":[],"created_at":"2024-11-06T19:48:04.366Z","updated_at":"2025-07-22T06:04:10.397Z","avatar_url":"https://github.com/broady.png","language":"Go","readme":"# pager\n\nFlexible pager system, written in Go running on AppEngine. E-mails are received via `alias+tag@my-pager.appspotmail.com`. The config for that alias is looked up and a series of pagers are alerted until acknowledeged.\n\nFeatures:\n\n  * Filtering over tag (e.g. \"cpu\" in `chris+cpu@`)\n  * Filtering by sender\n  * Filtering over subject line\n  * Filtering over body\n  * Substring and regex filters\n  * Filtering by time of day\n  * Page via e-mail (SMS or phone call coming)\n  * Fall-through pager configs (if one channel doesn't acknowledge the alert, the next one will be alerted).\n\n## Configuration\n\nConfiguration is currently via text files baked into the binary. The configuration language is the protobuf text format.\n\nThere are two sets of configuration: matchers and pagers. Matchers define a set of rules for the incoming message. Pagers are a definition of a series of communication channels (e.g. email, phone, sms) with associated timeouts.\n\nExample:\n\n    # File: matchers/example\n    \n    rule: \u003c\n      # Always send urgent pagers straight to phone.\n      # Looks for \"URGENT\" anywhere in the subject line.\n      subject: \u003c\n        substring: \"URGENT\"\n      \u003e\n      pager: \"phone\"\n    \u003e\n    \n    rule: \u003c\n      # Always send urgent pagers straight to phone.\n      # Matches `example+urgent@`\n      tag: \u003c\n        substring: \"urgent\"\n      \u003e\n      pager: \"phone\"\n    \u003e\n    \n    rule: \u003c\n      # During the day, except during lunch, send pagers via e-mail, escalating to phone.\n      time: \u003c\n        from: 800\n        to: 1130\n      \u003e\n      time: \u003c\n        from: 1330\n        to: 2000\n      \u003e\n      # E-mail first, then SMS, then phone.\n      pager: \"email\"\n      pager: \"sms_then_phone\"\n    \u003e\n    \n    rule: \u003c\n      # Everything else, only e-mail.\n      pager: \"email\"\n    \u003e\n    \nExample pager configs:\n\n    # File: pagers/phone\n    \n    contact: \u003c\n      phone: \"+15551234567\"\n    \u003e\n\n    # File: pagers/sms_then_phone\n    \n    contact: \u003c\n      # Wait 5 minutes for an ACK, then call the phone.\n      timeout: 300\n      sms: \"+15551234567\"\n    \u003e\n    contact: \u003c\n      phone: \"+15551234567\"\n    \u003e\n\n    # File: pagers/email\n    \n    contact: \u003c\n      # Wait 5 minutes for an ACK.\n      timeout: 300\n      email: \"foo@example.com\"\n    \u003e\n\n## Behaviour/notes\n\n  * A rule set is matched when all of the matchers evaluate to true\n  * Rules like subject/sender/time of day may have multiple conditions - these are OR'd\n  * If multiple rule sets are defined in a matcher file, the first one to match wins.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbroady%2Fpager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbroady%2Fpager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbroady%2Fpager/lists"}