{"adoption": {"forks": 193, "observed_at": "2026-08-28T04:05:30.023470+00:00", "stars": 1738}, "canonical_url": "https://ross.abutalabs.com/products/ip-sentinel", "card": {"archived": false, "artifact_type": "service", "description": "IP-Sentinel 是一款轻量化、模块化的分布式 VPS 资产养护系统，通过地理位置信号锚定与高拟真本土流量注入，精准解决 IP 定位偏移（IP送中）及风控分过高的痛点，并配合 Telegram 实现全球多节点“低功耗、拟真、无人值守”的自动化资产养护。", "domain": ["networking", "self-hosted", "security", "privacy"], "enriched": true, "function": ["monitoring", "networking", "workflow-automation", "scheduling", "security", "self-hosted", "developer-tools"], "health_score": 100, "homepage": null, "language": "Shell", "license": "AGPL-3.0", "license_family": "copyleft", "maturity": "active", "member_repos": ["hotyue/IP-Sentinel"], "name": "hotyue/IP-Sentinel", "platform": ["cli", "self-hosted", "python"], "pushed_at": "2026-08-26T08:04:36+00:00", "repo": "hotyue/IP-Sentinel", "stars": 1738, "tags": ["vps-management", "ip-geolocation", "ip-reputation", "master-agent", "telegram-bot", "proxy-detection", "scamalytics", "abuseipdb", "streaming-unlock", "warp-detection", "hmac-authentication", "ota-updates", "shell-scripts", "sqlite", "automation", "devops", "linux", "docker"], "topics": [], "urls": [], "use_cases": ["fix VPS IP geolocated to wrong country", "check if my VPS IP is flagged as proxy or VPN", "monitor IP fraud score across many servers", "improve IP reputation for streaming unlock", "manage a fleet of VPS nodes via Telegram", "detect IP pollution trends on my servers", "automate unattended VPS IP maintenance"], "what_it_is": "IP-Sentinel is a lightweight, modular Master-Agent distributed system for maintaining VPS IP assets. It detects IP geolocation misclassification (e.g., IPs flagged as China/Hong Kong), aggregates fraud-score data from services like Scamalytics and AbuseIPDB, injects realistic local traffic to improve IP reputation, and is controlled remotely via a Telegram bot.", "when_to_avoid": ["you need a GUI dashboard or web console for IP monitoring", "you want a general-purpose server monitoring or uptime tool rather than IP-specific maintenance", "your environment is not Linux or lacks Python 3", "you are uncomfortable with tools that simulate user traffic to influence IP reputation databases"], "when_to_choose": ["you operate multiple VPS nodes and need centralized IP health monitoring", "your server IP is misgeolocated to China/Hong Kong and hurts search or streaming results", "you want Telegram-based remote control and alerting for a distributed server fleet", "you need a dependency-free, pure-Python/Shell agent for minimal VPS footprint"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/ip-sentinel", "repo": "hotyue/IP-Sentinel", "role": "main", "score": 81}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:05:30.023470+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T03:30:36.361078+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "be6e8ee7c23b282622057a0bd76cfcc831d18e5e039978d30a13e90b654e2962", "fetched_at": "2026-08-28T04:05:30.023470+00:00", "kind": "readme", "missing": false, "url": "https://github.com/hotyue/IP-Sentinel"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:05:30.023470+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T03:30:36.361078+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "be6e8ee7c23b282622057a0bd76cfcc831d18e5e039978d30a13e90b654e2962", "fetched_at": "2026-08-28T04:05:30.023470+00:00", "kind": "readme", "missing": false, "url": "https://github.com/hotyue/IP-Sentinel"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T03:30:36.361078+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "be6e8ee7c23b282622057a0bd76cfcc831d18e5e039978d30a13e90b654e2962", "fetched_at": "2026-08-28T04:05:30.023470+00:00", "kind": "readme", "missing": false, "url": "https://github.com/hotyue/IP-Sentinel"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:05:30.023470+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:05:30.023470+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:05:30.023470+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T03:30:36.361078+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "be6e8ee7c23b282622057a0bd76cfcc831d18e5e039978d30a13e90b654e2962", "fetched_at": "2026-08-28T04:05:30.023470+00:00", "kind": "readme", "missing": false, "url": "https://github.com/hotyue/IP-Sentinel"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:05:30.023470+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:05:30.023470+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T03:30:36.361078+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "be6e8ee7c23b282622057a0bd76cfcc831d18e5e039978d30a13e90b654e2962", "fetched_at": "2026-08-28T04:05:30.023470+00:00", "kind": "readme", "missing": false, "url": "https://github.com/hotyue/IP-Sentinel"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:05:30.023470+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:05:30.023470+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:05:30.023470+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T03:30:36.361078+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "be6e8ee7c23b282622057a0bd76cfcc831d18e5e039978d30a13e90b654e2962", "fetched_at": "2026-08-28T04:05:30.023470+00:00", "kind": "readme", "missing": false, "url": "https://github.com/hotyue/IP-Sentinel"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:05:30.023470+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:05:30.023470+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T03:30:36.361078+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "be6e8ee7c23b282622057a0bd76cfcc831d18e5e039978d30a13e90b654e2962", "fetched_at": "2026-08-28T04:05:30.023470+00:00", "kind": "readme", "missing": false, "url": "https://github.com/hotyue/IP-Sentinel"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T03:30:36.361078+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "be6e8ee7c23b282622057a0bd76cfcc831d18e5e039978d30a13e90b654e2962", "fetched_at": "2026-08-28T04:05:30.023470+00:00", "kind": "readme", "missing": false, "url": "https://github.com/hotyue/IP-Sentinel"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T03:30:36.361078+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "be6e8ee7c23b282622057a0bd76cfcc831d18e5e039978d30a13e90b654e2962", "fetched_at": "2026-08-28T04:05:30.023470+00:00", "kind": "readme", "missing": false, "url": "https://github.com/hotyue/IP-Sentinel"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T03:30:36.361078+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "be6e8ee7c23b282622057a0bd76cfcc831d18e5e039978d30a13e90b654e2962", "fetched_at": "2026-08-28T04:05:30.023470+00:00", "kind": "readme", "missing": false, "url": "https://github.com/hotyue/IP-Sentinel"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 99, "longevity": 10, "rhythm": 99}, "computed_at": "2026-09-02T17:46:02.011165+00:00", "flags": ["young"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 152, "days_push": 7, "days_rel": 7, "gap_med": 0, "n_releases_24m": 60}, "score": 81, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}