{"adoption": {"forks": 123, "observed_at": "2026-08-28T04:03:12.344155+00:00", "stars": 1007}, "canonical_url": "https://ross.abutalabs.com/products/akagi", "card": {"archived": false, "artifact_type": "application", "description": "支持雀魂、天鳳、麻雀一番街、天月麻將，能夠使用自定義的AI模型實時分析對局並給出建議，內建Mortal AI作為示例。 Supports Majsoul, Tenhou, Riichi City, Amatsuki, with the ability to use custom AI models to analyze games in real time and provide suggestions. Comes with Mortal AI as a built-in example.", "domain": ["gaming-tools", "machine-learning"], "enriched": true, "function": ["game", "machine-learning", "gui", "websocket"], "health_score": 100, "homepage": "https://akagi.shinkuan.me/", "language": "Rust", "license": "Apache-2.0", "license_family": "permissive", "maturity": "active", "member_repos": ["shinkuan/Akagi"], "name": "shinkuan/Akagi", "platform": ["windows", "rust"], "pushed_at": "2026-08-25T03:51:54+00:00", "repo": "shinkuan/Akagi", "stars": 1007, "tags": ["mahjong", "mahjong-ai", "riichi-mahjong", "majsoul", "tenhou", "mjai", "game-assistant", "real-time-analysis", "tauri", "hud-overlay", "real-time", "desktop", "macos", "linux"], "topics": ["game-ai", "japanese-mahjong", "mahjong", "mahjong-ai", "mahjong-bot", "majsoul", "majsoul-ai", "majsoul-plus", "riichi-mahjong"], "urls": [], "use_cases": ["get real-time discard suggestions while playing riichi mahjong", "analyze my Mahjong Soul games live with an AI", "see shanten, waits, and deal-in risk during a match", "improve at riichi mahjong by learning from AI recommendations", "run a custom mjai bot against live mahjong games", "review three- and four-player mahjong games with AI analysis"], "what_it_is": "Akagi is a real-time mahjong AI assistant desktop app (Rust + Tauri) that observes game connections from Mahjong Soul, Tenhou, Riichi City, and Amatsuki, rebuilds the table state, and shows shanten, waits, deal-in risk, and AI discard recommendations in a HUD. It ships with the Mortal AI built in and supports custom mjai-compatible bots and optional cloud inference.", "when_to_avoid": ["you plan to use it in ranked or competitive play - it may violate the games' terms of service and risk account bans", "you play mahjong clients not on the supported list", "you need offline batch analysis of game logs rather than live assistance", "you need a fully open AI model - the strongest inference options may be cloud-based"], "when_to_choose": ["you play on Mahjong Soul, Tenhou, Riichi City, or Amatsuki and want live in-game analysis", "you want a single desktop app with a built-in AI (Mortal) and no complex setup", "you want to plug in your own mjai-compatible bot or stronger cloud inference", "you want a passive observer that reads game data without modifying the game client"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/akagi", "repo": "shinkuan/Akagi", "role": "main", "score": 93}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:03:12.344155+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T07:12:41.905770+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "38294342f41ff16051d36308b982e2725cec2423e6dca76d147893520aee5c9d", "fetched_at": "2026-08-28T04:03:12.344155+00:00", "kind": "readme", "missing": false, "url": "https://github.com/shinkuan/Akagi"}, {"content_hash": "5f39b0501c968421c107ae755ed6ecfe7d38dec13b8890f6ffa880764ac4d2e0", "fetched_at": "2026-08-29T13:12:36.168997+00:00", "kind": "homepage", "missing": false, "url": "https://akagi.shinkuan.me/"}, {"content_hash": "8031d91b2bd68d96c910d00bfc362647efc4ea0953ea3b602ff87f764f6312c3", "fetched_at": "2026-08-29T13:12:36.178851+00:00", "kind": "site_page", "missing": false, "url": "https://akagi.shinkuan.me/docs"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:03:12.344155+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T07:12:41.905770+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "38294342f41ff16051d36308b982e2725cec2423e6dca76d147893520aee5c9d", "fetched_at": "2026-08-28T04:03:12.344155+00:00", "kind": "readme", "missing": false, "url": "https://github.com/shinkuan/Akagi"}, {"content_hash": "5f39b0501c968421c107ae755ed6ecfe7d38dec13b8890f6ffa880764ac4d2e0", "fetched_at": "2026-08-29T13:12:36.168997+00:00", "kind": "homepage", "missing": false, "url": "https://akagi.shinkuan.me/"}, {"content_hash": "8031d91b2bd68d96c910d00bfc362647efc4ea0953ea3b602ff87f764f6312c3", "fetched_at": "2026-08-29T13:12:36.178851+00:00", "kind": "site_page", "missing": false, "url": "https://akagi.shinkuan.me/docs"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T07:12:41.905770+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "38294342f41ff16051d36308b982e2725cec2423e6dca76d147893520aee5c9d", "fetched_at": "2026-08-28T04:03:12.344155+00:00", "kind": "readme", "missing": false, "url": "https://github.com/shinkuan/Akagi"}, {"content_hash": "5f39b0501c968421c107ae755ed6ecfe7d38dec13b8890f6ffa880764ac4d2e0", "fetched_at": "2026-08-29T13:12:36.168997+00:00", "kind": "homepage", "missing": false, "url": "https://akagi.shinkuan.me/"}, {"content_hash": "8031d91b2bd68d96c910d00bfc362647efc4ea0953ea3b602ff87f764f6312c3", "fetched_at": "2026-08-29T13:12:36.178851+00:00", "kind": "site_page", "missing": false, "url": "https://akagi.shinkuan.me/docs"}], "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:03:12.344155+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:03:12.344155+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:03:12.344155+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T07:12:41.905770+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "38294342f41ff16051d36308b982e2725cec2423e6dca76d147893520aee5c9d", "fetched_at": "2026-08-28T04:03:12.344155+00:00", "kind": "readme", "missing": false, "url": "https://github.com/shinkuan/Akagi"}, {"content_hash": "5f39b0501c968421c107ae755ed6ecfe7d38dec13b8890f6ffa880764ac4d2e0", "fetched_at": "2026-08-29T13:12:36.168997+00:00", "kind": "homepage", "missing": false, "url": "https://akagi.shinkuan.me/"}, {"content_hash": "8031d91b2bd68d96c910d00bfc362647efc4ea0953ea3b602ff87f764f6312c3", "fetched_at": "2026-08-29T13:12:36.178851+00:00", "kind": "site_page", "missing": false, "url": "https://akagi.shinkuan.me/docs"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:03:12.344155+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:03:12.344155+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T07:12:41.905770+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "38294342f41ff16051d36308b982e2725cec2423e6dca76d147893520aee5c9d", "fetched_at": "2026-08-28T04:03:12.344155+00:00", "kind": "readme", "missing": false, "url": "https://github.com/shinkuan/Akagi"}, {"content_hash": "5f39b0501c968421c107ae755ed6ecfe7d38dec13b8890f6ffa880764ac4d2e0", "fetched_at": "2026-08-29T13:12:36.168997+00:00", "kind": "homepage", "missing": false, "url": "https://akagi.shinkuan.me/"}, {"content_hash": "8031d91b2bd68d96c910d00bfc362647efc4ea0953ea3b602ff87f764f6312c3", "fetched_at": "2026-08-29T13:12:36.178851+00:00", "kind": "site_page", "missing": false, "url": "https://akagi.shinkuan.me/docs"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:03:12.344155+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:03:12.344155+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:03:12.344155+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T07:12:41.905770+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "38294342f41ff16051d36308b982e2725cec2423e6dca76d147893520aee5c9d", "fetched_at": "2026-08-28T04:03:12.344155+00:00", "kind": "readme", "missing": false, "url": "https://github.com/shinkuan/Akagi"}, {"content_hash": "5f39b0501c968421c107ae755ed6ecfe7d38dec13b8890f6ffa880764ac4d2e0", "fetched_at": "2026-08-29T13:12:36.168997+00:00", "kind": "homepage", "missing": false, "url": "https://akagi.shinkuan.me/"}, {"content_hash": "8031d91b2bd68d96c910d00bfc362647efc4ea0953ea3b602ff87f764f6312c3", "fetched_at": "2026-08-29T13:12:36.178851+00:00", "kind": "site_page", "missing": false, "url": "https://akagi.shinkuan.me/docs"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:03:12.344155+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:03:12.344155+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T07:12:41.905770+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "38294342f41ff16051d36308b982e2725cec2423e6dca76d147893520aee5c9d", "fetched_at": "2026-08-28T04:03:12.344155+00:00", "kind": "readme", "missing": false, "url": "https://github.com/shinkuan/Akagi"}, {"content_hash": "5f39b0501c968421c107ae755ed6ecfe7d38dec13b8890f6ffa880764ac4d2e0", "fetched_at": "2026-08-29T13:12:36.168997+00:00", "kind": "homepage", "missing": false, "url": "https://akagi.shinkuan.me/"}, {"content_hash": "8031d91b2bd68d96c910d00bfc362647efc4ea0953ea3b602ff87f764f6312c3", "fetched_at": "2026-08-29T13:12:36.178851+00:00", "kind": "site_page", "missing": false, "url": "https://akagi.shinkuan.me/docs"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T07:12:41.905770+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "38294342f41ff16051d36308b982e2725cec2423e6dca76d147893520aee5c9d", "fetched_at": "2026-08-28T04:03:12.344155+00:00", "kind": "readme", "missing": false, "url": "https://github.com/shinkuan/Akagi"}, {"content_hash": "5f39b0501c968421c107ae755ed6ecfe7d38dec13b8890f6ffa880764ac4d2e0", "fetched_at": "2026-08-29T13:12:36.168997+00:00", "kind": "homepage", "missing": false, "url": "https://akagi.shinkuan.me/"}, {"content_hash": "8031d91b2bd68d96c910d00bfc362647efc4ea0953ea3b602ff87f764f6312c3", "fetched_at": "2026-08-29T13:12:36.178851+00:00", "kind": "site_page", "missing": false, "url": "https://akagi.shinkuan.me/docs"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T07:12:41.905770+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "38294342f41ff16051d36308b982e2725cec2423e6dca76d147893520aee5c9d", "fetched_at": "2026-08-28T04:03:12.344155+00:00", "kind": "readme", "missing": false, "url": "https://github.com/shinkuan/Akagi"}, {"content_hash": "5f39b0501c968421c107ae755ed6ecfe7d38dec13b8890f6ffa880764ac4d2e0", "fetched_at": "2026-08-29T13:12:36.168997+00:00", "kind": "homepage", "missing": false, "url": "https://akagi.shinkuan.me/"}, {"content_hash": "8031d91b2bd68d96c910d00bfc362647efc4ea0953ea3b602ff87f764f6312c3", "fetched_at": "2026-08-29T13:12:36.178851+00:00", "kind": "site_page", "missing": false, "url": "https://akagi.shinkuan.me/docs"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T07:12:41.905770+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "38294342f41ff16051d36308b982e2725cec2423e6dca76d147893520aee5c9d", "fetched_at": "2026-08-28T04:03:12.344155+00:00", "kind": "readme", "missing": false, "url": "https://github.com/shinkuan/Akagi"}, {"content_hash": "5f39b0501c968421c107ae755ed6ecfe7d38dec13b8890f6ffa880764ac4d2e0", "fetched_at": "2026-08-29T13:12:36.168997+00:00", "kind": "homepage", "missing": false, "url": "https://akagi.shinkuan.me/"}, {"content_hash": "8031d91b2bd68d96c910d00bfc362647efc4ea0953ea3b602ff87f764f6312c3", "fetched_at": "2026-08-29T13:12:36.178851+00:00", "kind": "site_page", "missing": false, "url": "https://akagi.shinkuan.me/docs"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 99, "longevity": 69, "rhythm": 99}, "computed_at": "2026-09-02T17:46:02.011165+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 971, "days_push": 8, "days_rel": 8, "gap_med": 2, "n_releases_24m": 46}, "score": 93, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}