{"id":39696115,"url":"https://github.com/maxhayim/meshmonitor-carrier-outage","last_synced_at":"2026-01-27T02:01:03.146Z","repository":{"id":332992152,"uuid":"1135855026","full_name":"maxhayim/meshmonitor-carrier-outage","owner":"maxhayim","description":"A MeshMonitor user script that monitors the health of major mobile carriers, ISPs and landline providers, and core cloud/CDN/DNS infrastructure. It correlates signals across multiple nodes to determine whether an issue is local to a site or part of a broader provider-level outage, using confidence scoring, severity levels, and scope detection.","archived":false,"fork":false,"pushed_at":"2026-01-16T21:27:05.000Z","size":52,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-17T06:07:04.080Z","etag":null,"topics":["javascript","meshmonitor","meshtastic","outage-monitor","outages"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/maxhayim.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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-16T17:30:01.000Z","updated_at":"2026-01-16T21:19:55.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/maxhayim/meshmonitor-carrier-outage","commit_stats":null,"previous_names":["maxhayim/meshmonitor-carrier-outage"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/maxhayim/meshmonitor-carrier-outage","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxhayim%2Fmeshmonitor-carrier-outage","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxhayim%2Fmeshmonitor-carrier-outage/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxhayim%2Fmeshmonitor-carrier-outage/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxhayim%2Fmeshmonitor-carrier-outage/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/maxhayim","download_url":"https://codeload.github.com/maxhayim/meshmonitor-carrier-outage/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxhayim%2Fmeshmonitor-carrier-outage/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28796961,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-27T01:07:07.743Z","status":"online","status_checked_at":"2026-01-27T02:00:07.755Z","response_time":168,"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":["javascript","meshmonitor","meshtastic","outage-monitor","outages"],"created_at":"2026-01-18T10:13:06.210Z","updated_at":"2026-01-27T02:01:03.140Z","avatar_url":"https://github.com/maxhayim.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://nodejs.org/\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Node.js-18%2B-brightgreen\" alt=\"Node.js Version\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://opensource.org/licenses/MIT\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/License-MIT-green\" alt=\"License\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n# 📡 Carrier Outage\n\n**Carrier Outage** is a [**MeshMonitor**](https://github.com/Yeraze/MeshMonitor) script that detects **major provider outages** across mobile carriers, ISP / landline providers, and core cloud/CDN/DNS infrastructure using conservative public reachability signals.\n\nThe intent is operational and practical:\n\n\u003e “Is the problem local to my node or ISP, or is there a wider provider-level event?”\n\n---\n\n## What it monitors\n\nProviders are grouped into three classes:\n\n- **Mobile**  \n  Examples: AT\u0026T, Verizon, T-Mobile\n\n- **ISP / Landline**  \n  Examples: Comcast/Xfinity, Spectrum, AT\u0026T Fiber, Verizon Fios  \n  (optionally including transit/backbone providers)\n\n- **Cloud / Core Internet**  \n  Examples: Cloudflare, AWS, Google, Microsoft Azure\n\nProviders can be added, removed, or customized by editing the JSON files in the `providers/` directory.\n\n---\n\n## How detection works\n\nEach provider is evaluated using multiple **signals**:\n\n- HTTP GET probes to public endpoints  \n- Optional DNS resolution checks  \n- **Control probes** (known-good endpoints) used to determine whether the local host’s Internet is the problem\n\nThe script applies conservative logic to avoid false positives:\n\n- A provider outage is **not** declared if control probes are failing.\n- Multiple failed signals are required before transitioning to DEGRADED or MAJOR_OUTAGE.\n- **Persistence** (consecutive runs) is required to change states, preventing flapping.\n\n---\n\n## Outputs\n\nThe script supports multiple output methods:\n\n- **Console summary** (always enabled)\n- **Structured JSON event** to stdout (optional)\n- **MQTT publish** (optional; requires the mqtt package)\n\n---\n\n## Quick start\n\n1. Copy the project folder to the system running MeshMonitor (or wherever you execute scripts).\n\n2. Create and edit the configuration file:\n\n   cp config.example.json config.json  \n   nano config.json\n\n3. Run once to verify:\n\n   node index.js\n\n4. Schedule execution (recommended):\n\n- Run every **1–5 minutes** using your preferred scheduler:\n  - cron\n  - systemd timer\n  - MeshMonitor’s scheduler\n  - or another task runner\n\n---\n\n## MQTT (optional)\n\nIf MQTT publishing is enabled in config.json, install the dependency:\n\n   npm install mqtt\n\nIf mqtt.enabled is set to true but the module is not installed, the script will log a warning and continue running without MQTT output.\n\n---\n\n## Configuration\n\nKey fields in config.json:\n\n- region – label included in output (e.g., mia, us-east)\n- timeoutMs – per-request timeout in milliseconds\n- consecutiveFailForMajor – runs required before MAJOR_OUTAGE\n- consecutiveOkForRecovery – runs required before RECOVERED\n- controlProbes – endpoints used to confirm local Internet health\n- providers – paths to provider definition JSON files\n- mqtt – optional MQTT configuration\n\n---\n\n## Provider lists\n\nProvider definitions live in:\n\n- providers/mobile.json\n- providers/isp.json\n- providers/cloud.json\n\nEach provider supports the following structure:\n\n    {\n      \"name\": \"cloudflare\",\n      \"type\": \"cloud\",\n      \"probes\": [\n        \"https://www.cloudflare.com/\",\n        \"https://1.1.1.1/\"\n      ],\n      \"dns\": [\n        \"cloudflare.com\",\n        \"one.one.one.one\"\n      ]\n    }\n\n---\n\n## Event schema\n\nWhen emitJson is enabled, the script outputs a structured event:\n\n    {\n      \"type\": \"carrier_outage\",\n      \"provider\": \"cloudflare\",\n      \"providerType\": \"cloud\",\n      \"state\": \"MAJOR_OUTAGE\",\n      \"confidence\": 0.88,\n      \"region\": \"us-east\",\n      \"signals\": [\n        {\"name\": \"control:https://example.com\", \"ok\": true, \"ms\": 123},\n        {\"name\": \"probe:https://www.cloudflare.com/\", \"ok\": false, \"detail\": \"timeout\"}\n      ],\n      \"firstSeen\": \"2026-01-16T03:10:00Z\",\n      \"lastSeen\": \"2026-01-16T03:14:00Z\"\n    }\n\nStates:\n\n- OK\n- DEGRADED\n- MAJOR_OUTAGE\n- RECOVERED\n\n---\n\n## Operational notes\n\n- This script cannot prove **tower-level** or **neighborhood-level** cellular failures.\n- For higher confidence, run it from **two or more locations** and correlate results.\n\n---\n\n## License\n\nMIT License\n\n---\n\n## Acknowledgments\n\n- MeshMonitor built by Yeraze (https://github.com/Yeraze)  \n- Discover other community-contributed Auto Responder scripts for MeshMonitor at https://meshmonitor.org/user-scripts.html\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxhayim%2Fmeshmonitor-carrier-outage","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmaxhayim%2Fmeshmonitor-carrier-outage","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxhayim%2Fmeshmonitor-carrier-outage/lists"}