{"adoption": {"forks": 301, "observed_at": "2026-08-28T04:06:39.149373+00:00", "stars": 2343}, "canonical_url": "https://ross.abutalabs.com/products/mahjong-helper", "card": {"archived": false, "artifact_type": "application", "description": "日本麻将助手：牌效+防守+记牌（支持雀魂、天凤）", "domain": ["gaming-tools", "cross-platform"], "enriched": true, "function": ["game", "developer-tools", "cli", "gui"], "health_score": 20, "homepage": null, "language": "Go", "license": "MIT", "license_family": "permissive", "maturity": "maintenance", "member_repos": ["EndlessCheng/mahjong-helper"], "name": "EndlessCheng/mahjong-helper", "platform": ["cross-platform", "browser", "cli", "go"], "pushed_at": "2022-06-23T01:11:42+00:00", "repo": "EndlessCheng/mahjong-helper", "stars": 2343, "tags": ["riichi-mahjong", "majsoul", "tenhou", "tile-efficiency", "defense-assistant", "game-assistant", "browser-extension-integration"], "topics": ["tenhou", "majsoul", "mahjong", "mahjong-algorithm", "golang", "mahjongsoul", "riichi-mahjong"], "urls": [], "use_cases": ["get discard recommendations for riichi mahjong hands", "analyze tile efficiency and shanten in majsoul", "see which tiles are safe when an opponent calls riichi", "review tenhou game logs move by move", "track opponents' tsumogiri and tedashi discards", "play three-player mahjong with assistant support"], "what_it_is": "A Riichi (Japanese) mahjong assistant written in Go that analyzes hands in real time for the online platforms Majsoul and Tenhou. It recommends discards based on tile efficiency and expected value, shows tile danger levels when opponents call riichi, tracks opponents' discards, and can review game logs suggesting attack/defense choices.", "when_to_avoid": ["you play other mahjong variants or platforms not supported by the tool", "you need a mobile app or standalone game rather than a browser-integrated assistant", "you are unwilling to install a browser extension and enable localhost certificate flags", "you need actively maintained software - the latest release dates to 2022"], "when_to_choose": ["you play riichi mahjong on Majsoul or Tenhou in a browser and want real-time hand analysis", "you want combined tile-efficiency, expected-value, and safety guidance rather than just tile counting", "you want a self-hosted local helper that works with both 4-player and 3-player mahjong"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/mahjong-helper", "repo": "EndlessCheng/mahjong-helper", "role": "main", "score": 23}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:06:39.149373+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T02:37:13.677786+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "eb5277cbdade79949e26ee1612ead78ea073667c645eec6f2b5905e640bd8c09", "fetched_at": "2026-08-28T04:06:39.149373+00:00", "kind": "readme", "missing": false, "url": "https://github.com/EndlessCheng/mahjong-helper"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:06:39.149373+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T02:37:13.677786+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "eb5277cbdade79949e26ee1612ead78ea073667c645eec6f2b5905e640bd8c09", "fetched_at": "2026-08-28T04:06:39.149373+00:00", "kind": "readme", "missing": false, "url": "https://github.com/EndlessCheng/mahjong-helper"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T02:37:13.677786+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "eb5277cbdade79949e26ee1612ead78ea073667c645eec6f2b5905e640bd8c09", "fetched_at": "2026-08-28T04:06:39.149373+00:00", "kind": "readme", "missing": false, "url": "https://github.com/EndlessCheng/mahjong-helper"}], "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:06:39.149373+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:06:39.149373+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:06:39.149373+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T02:37:13.677786+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "eb5277cbdade79949e26ee1612ead78ea073667c645eec6f2b5905e640bd8c09", "fetched_at": "2026-08-28T04:06:39.149373+00:00", "kind": "readme", "missing": false, "url": "https://github.com/EndlessCheng/mahjong-helper"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:06:39.149373+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:06:39.149373+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T02:37:13.677786+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "eb5277cbdade79949e26ee1612ead78ea073667c645eec6f2b5905e640bd8c09", "fetched_at": "2026-08-28T04:06:39.149373+00:00", "kind": "readme", "missing": false, "url": "https://github.com/EndlessCheng/mahjong-helper"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:06:39.149373+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:06:39.149373+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:06:39.149373+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T02:37:13.677786+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "eb5277cbdade79949e26ee1612ead78ea073667c645eec6f2b5905e640bd8c09", "fetched_at": "2026-08-28T04:06:39.149373+00:00", "kind": "readme", "missing": false, "url": "https://github.com/EndlessCheng/mahjong-helper"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:06:39.149373+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:06:39.149373+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T02:37:13.677786+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "eb5277cbdade79949e26ee1612ead78ea073667c645eec6f2b5905e640bd8c09", "fetched_at": "2026-08-28T04:06:39.149373+00:00", "kind": "readme", "missing": false, "url": "https://github.com/EndlessCheng/mahjong-helper"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T02:37:13.677786+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "eb5277cbdade79949e26ee1612ead78ea073667c645eec6f2b5905e640bd8c09", "fetched_at": "2026-08-28T04:06:39.149373+00:00", "kind": "readme", "missing": false, "url": "https://github.com/EndlessCheng/mahjong-helper"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T02:37:13.677786+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "eb5277cbdade79949e26ee1612ead78ea073667c645eec6f2b5905e640bd8c09", "fetched_at": "2026-08-28T04:06:39.149373+00:00", "kind": "readme", "missing": false, "url": "https://github.com/EndlessCheng/mahjong-helper"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T02:37:13.677786+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "eb5277cbdade79949e26ee1612ead78ea073667c645eec6f2b5905e640bd8c09", "fetched_at": "2026-08-28T04:06:39.149373+00:00", "kind": "readme", "missing": false, "url": "https://github.com/EndlessCheng/mahjong-helper"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 0, "longevity": 100, "rhythm": 8}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 2900, "days_push": 1533, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 23, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}