{"adoption": {"forks": 545, "observed_at": "2026-08-28T04:09:01.960697+00:00", "stars": 4890}, "canonical_url": "https://ross.abutalabs.com/products/tiann-hapi", "card": {"archived": false, "artifact_type": "application", "description": "App for Codex / Claude Code / Pi / OpenCode / Kimi Code / Grok Build, vibe coding anytime, anywhere", "domain": ["developer-tools", "artificial-intelligence", "self-hosted"], "enriched": true, "function": ["developer-tools", "chat-interface", "terminal-ui", "webhook", "self-hosted"], "health_score": 100, "homepage": "https://hapi.run", "language": "TypeScript", "license": "AGPL-3.0", "license_family": "copyleft", "maturity": "active", "member_repos": ["tiann/hapi"], "name": "tiann/hapi", "platform": ["cross-platform", "cli", "windows"], "pushed_at": "2026-08-26T01:37:58+00:00", "repo": "tiann/hapi", "stars": 4890, "tags": ["claude-code", "codex", "remote-control", "pwa", "telegram-mini-app", "ai-coding-agents", "remote-terminal", "voice-control", "e2e-encryption", "ai-agents", "command-line", "web-server", "nodejs", "macos", "linux", "ios", "android"], "topics": ["app", "claude-code", "codex", "gemini-cli", "opencode", "remote-control"], "urls": [], "use_cases": ["approve claude code permission requests from my phone", "control codex agent remotely while away from desk", "run terminal commands on my dev machine from mobile", "monitor ai coding agent sessions over telegram", "vibe code on the go without losing session context", "self-host a remote gateway for ai coding agents"], "what_it_is": "HAPI is a local-first app that wraps AI coding agents like Claude Code, Codex, and OpenCode, letting you control them remotely via a Web/PWA or Telegram Mini App. It provides seamless handoff between local and remote sessions, remote terminal access, voice control, and one-tap approval of agent requests from your phone.", "when_to_avoid": ["you only use browser-based AI coding tools with no terminal agent", "you need a fully managed cloud service rather than self-hosting a hub", "you require native iOS/Android apps today (they are still in development)"], "when_to_choose": ["you use Claude Code, Codex, or similar terminal AI agents and want mobile/remote control", "you want a local-first, self-hosted alternative to Happy with E2E encryption", "you need to approve agent actions or run commands while AFK"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/tiann-hapi", "repo": "tiann/hapi", "role": "main", "score": 78}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:09:01.960697+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-29T18:18:12.042157+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8ac0ad5a50526450de79a9e45a51ce8b873f465e8de63f27511f4fbb957f1b66", "fetched_at": "2026-08-28T04:09:01.960697+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tiann/hapi"}, {"content_hash": "d03b8c1bf67a993f10cce597fa636c07f706ef594892bdc6892829f52bd44b52", "fetched_at": "2026-08-29T09:00:50.409140+00:00", "kind": "homepage", "missing": false, "url": "https://hapi.run"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:09:01.960697+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-29T18:18:12.042157+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8ac0ad5a50526450de79a9e45a51ce8b873f465e8de63f27511f4fbb957f1b66", "fetched_at": "2026-08-28T04:09:01.960697+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tiann/hapi"}, {"content_hash": "d03b8c1bf67a993f10cce597fa636c07f706ef594892bdc6892829f52bd44b52", "fetched_at": "2026-08-29T09:00:50.409140+00:00", "kind": "homepage", "missing": false, "url": "https://hapi.run"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-29T18:18:12.042157+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8ac0ad5a50526450de79a9e45a51ce8b873f465e8de63f27511f4fbb957f1b66", "fetched_at": "2026-08-28T04:09:01.960697+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tiann/hapi"}, {"content_hash": "d03b8c1bf67a993f10cce597fa636c07f706ef594892bdc6892829f52bd44b52", "fetched_at": "2026-08-29T09:00:50.409140+00:00", "kind": "homepage", "missing": false, "url": "https://hapi.run"}], "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:09:01.960697+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:09:01.960697+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:09:01.960697+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-29T18:18:12.042157+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8ac0ad5a50526450de79a9e45a51ce8b873f465e8de63f27511f4fbb957f1b66", "fetched_at": "2026-08-28T04:09:01.960697+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tiann/hapi"}, {"content_hash": "d03b8c1bf67a993f10cce597fa636c07f706ef594892bdc6892829f52bd44b52", "fetched_at": "2026-08-29T09:00:50.409140+00:00", "kind": "homepage", "missing": false, "url": "https://hapi.run"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:09:01.960697+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:09:01.960697+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-29T18:18:12.042157+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8ac0ad5a50526450de79a9e45a51ce8b873f465e8de63f27511f4fbb957f1b66", "fetched_at": "2026-08-28T04:09:01.960697+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tiann/hapi"}, {"content_hash": "d03b8c1bf67a993f10cce597fa636c07f706ef594892bdc6892829f52bd44b52", "fetched_at": "2026-08-29T09:00:50.409140+00:00", "kind": "homepage", "missing": false, "url": "https://hapi.run"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:09:01.960697+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:09:01.960697+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:09:01.960697+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-29T18:18:12.042157+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8ac0ad5a50526450de79a9e45a51ce8b873f465e8de63f27511f4fbb957f1b66", "fetched_at": "2026-08-28T04:09:01.960697+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tiann/hapi"}, {"content_hash": "d03b8c1bf67a993f10cce597fa636c07f706ef594892bdc6892829f52bd44b52", "fetched_at": "2026-08-29T09:00:50.409140+00:00", "kind": "homepage", "missing": false, "url": "https://hapi.run"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:09:01.960697+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:09:01.960697+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-29T18:18:12.042157+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8ac0ad5a50526450de79a9e45a51ce8b873f465e8de63f27511f4fbb957f1b66", "fetched_at": "2026-08-28T04:09:01.960697+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tiann/hapi"}, {"content_hash": "d03b8c1bf67a993f10cce597fa636c07f706ef594892bdc6892829f52bd44b52", "fetched_at": "2026-08-29T09:00:50.409140+00:00", "kind": "homepage", "missing": false, "url": "https://hapi.run"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-29T18:18:12.042157+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8ac0ad5a50526450de79a9e45a51ce8b873f465e8de63f27511f4fbb957f1b66", "fetched_at": "2026-08-28T04:09:01.960697+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tiann/hapi"}, {"content_hash": "d03b8c1bf67a993f10cce597fa636c07f706ef594892bdc6892829f52bd44b52", "fetched_at": "2026-08-29T09:00:50.409140+00:00", "kind": "homepage", "missing": false, "url": "https://hapi.run"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-29T18:18:12.042157+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8ac0ad5a50526450de79a9e45a51ce8b873f465e8de63f27511f4fbb957f1b66", "fetched_at": "2026-08-28T04:09:01.960697+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tiann/hapi"}, {"content_hash": "d03b8c1bf67a993f10cce597fa636c07f706ef594892bdc6892829f52bd44b52", "fetched_at": "2026-08-29T09:00:50.409140+00:00", "kind": "homepage", "missing": false, "url": "https://hapi.run"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-29T18:18:12.042157+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "8ac0ad5a50526450de79a9e45a51ce8b873f465e8de63f27511f4fbb957f1b66", "fetched_at": "2026-08-28T04:09:01.960697+00:00", "kind": "readme", "missing": false, "url": "https://github.com/tiann/hapi"}, {"content_hash": "d03b8c1bf67a993f10cce597fa636c07f706ef594892bdc6892829f52bd44b52", "fetched_at": "2026-08-29T09:00:50.409140+00:00", "kind": "homepage", "missing": false, "url": "https://hapi.run"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 99, "longevity": 18, "rhythm": 86}, "computed_at": "2026-09-03T02:39:23.370411+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 252, "days_push": 8, "days_rel": 14, "gap_med": 2, "n_releases_24m": 74}, "score": 78, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}