{"adoption": {"forks": 408, "observed_at": "2026-08-28T04:04:58.318184+00:00", "stars": 1525}, "canonical_url": "https://ross.abutalabs.com/products/git-webhook", "card": {"archived": false, "artifact_type": "service", "description": ":octocat: 使用 Python Flask + SQLAchemy + Celery + Redis + React 开发的用于迅速搭建并使用  WebHook 进行自动化部署和运维，支持 Github / GitLab / Gogs / GitOsc。", "domain": ["developer-tools", "self-hosted", "version-control"], "enriched": true, "function": ["webhook", "deployment", "workflow-automation", "web-framework", "http-server", "ssh"], "health_score": 20, "homepage": "https://webhook.hust.cc/", "language": "Python", "license": "MIT", "license_family": "permissive", "maturity": "maintenance", "member_repos": ["NetEaseGame/git-webhook"], "name": "NetEaseGame/git-webhook", "platform": ["python", "self-hosted"], "pushed_at": "2020-12-29T05:50:42+00:00", "repo": "NetEaseGame/git-webhook", "stars": 1525, "tags": ["git-webhook", "continuous-deployment", "celery", "flask", "react", "github", "gitlab", "gogs", "automated-ops", "devops", "automation", "docker", "web-server", "linux"], "topics": ["git-webhook", "gogs", "gitlab", "docker", "github", "webhook"], "urls": [], "use_cases": ["automatically deploy my app when I push to GitHub", "run shell commands on my server when a git webhook fires", "set up continuous deployment from GitLab pushes", "manage webhooks for multiple git repositories in one place", "trigger ops scripts from Gogs or Gitee push events", "view history of webhook-triggered deployments"], "what_it_is": "A self-hosted web application built with Python Flask, SQLAlchemy, Celery, Redis, and React for quickly setting up Git webhooks to automate deployment and operations tasks. It supports GitHub, GitLab, Gogs, and GitOsc, and executes shell commands on servers via SSH when webhooks fire.", "when_to_avoid": ["you need a lightweight CLI-only webhook runner (consider webhookit instead)", "you require a production-grade, actively maintained CI/CD platform", "you cannot host the service on an internal network, since it stores SSH private keys and passwords"], "when_to_choose": ["you want a self-hosted UI to manage git webhooks across GitHub, GitLab, Gogs, or GitOsc", "you need push-to-deploy automation with SSH execution on internal servers", "you want a simple, hackable Python codebase to extend for deployment automation"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/git-webhook", "repo": "NetEaseGame/git-webhook", "role": "main", "score": 32}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:04:58.318184+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T04:31:38.526397+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "149ebd00f19c6d381793417afde459e25ae86c685b769368cdc13e6332f6c038", "fetched_at": "2026-08-28T04:04:58.318184+00:00", "kind": "readme", "missing": false, "url": "https://github.com/NetEaseGame/git-webhook"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:04:58.318184+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T04:31:38.526397+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "149ebd00f19c6d381793417afde459e25ae86c685b769368cdc13e6332f6c038", "fetched_at": "2026-08-28T04:04:58.318184+00:00", "kind": "readme", "missing": false, "url": "https://github.com/NetEaseGame/git-webhook"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T04:31:38.526397+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "149ebd00f19c6d381793417afde459e25ae86c685b769368cdc13e6332f6c038", "fetched_at": "2026-08-28T04:04:58.318184+00:00", "kind": "readme", "missing": false, "url": "https://github.com/NetEaseGame/git-webhook"}], "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:04:58.318184+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:04:58.318184+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:04:58.318184+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T04:31:38.526397+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "149ebd00f19c6d381793417afde459e25ae86c685b769368cdc13e6332f6c038", "fetched_at": "2026-08-28T04:04:58.318184+00:00", "kind": "readme", "missing": false, "url": "https://github.com/NetEaseGame/git-webhook"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:04:58.318184+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:04:58.318184+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T04:31:38.526397+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "149ebd00f19c6d381793417afde459e25ae86c685b769368cdc13e6332f6c038", "fetched_at": "2026-08-28T04:04:58.318184+00:00", "kind": "readme", "missing": false, "url": "https://github.com/NetEaseGame/git-webhook"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:04:58.318184+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:04:58.318184+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:04:58.318184+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T04:31:38.526397+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "149ebd00f19c6d381793417afde459e25ae86c685b769368cdc13e6332f6c038", "fetched_at": "2026-08-28T04:04:58.318184+00:00", "kind": "readme", "missing": false, "url": "https://github.com/NetEaseGame/git-webhook"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:04:58.318184+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:04:58.318184+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T04:31:38.526397+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "149ebd00f19c6d381793417afde459e25ae86c685b769368cdc13e6332f6c038", "fetched_at": "2026-08-28T04:04:58.318184+00:00", "kind": "readme", "missing": false, "url": "https://github.com/NetEaseGame/git-webhook"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T04:31:38.526397+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "149ebd00f19c6d381793417afde459e25ae86c685b769368cdc13e6332f6c038", "fetched_at": "2026-08-28T04:04:58.318184+00:00", "kind": "readme", "missing": false, "url": "https://github.com/NetEaseGame/git-webhook"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T04:31:38.526397+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "149ebd00f19c6d381793417afde459e25ae86c685b769368cdc13e6332f6c038", "fetched_at": "2026-08-28T04:04:58.318184+00:00", "kind": "readme", "missing": false, "url": "https://github.com/NetEaseGame/git-webhook"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T04:31:38.526397+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "149ebd00f19c6d381793417afde459e25ae86c685b769368cdc13e6332f6c038", "fetched_at": "2026-08-28T04:04:58.318184+00:00", "kind": "readme", "missing": false, "url": "https://github.com/NetEaseGame/git-webhook"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 0, "longevity": 100, "rhythm": 35}, "computed_at": "2026-09-02T17:46:02.011165+00:00", "flags": ["no_releases"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 3625, "days_push": 2073, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 32, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}