{"adoption": {"forks": 319, "observed_at": "2026-08-28T04:07:23.593488+00:00", "stars": 2809}, "canonical_url": "https://ross.abutalabs.com/products/ejecta", "card": {"archived": false, "artifact_type": "framework", "description": "A Fast, Open Source JavaScript, Canvas & Audio Implementation for iOS", "domain": ["mobile-development", "web-development", "cross-platform"], "enriched": true, "function": ["interpreter", "graphics", "audio-processing", "game-engine"], "health_score": 20, "homepage": null, "language": "Objective-C", "license": null, "license_family": "other", "maturity": "maintenance", "member_repos": ["phoboslab/Ejecta"], "name": "phoboslab/Ejecta", "platform": ["cross-platform"], "pushed_at": "2021-06-22T17:04:00+00:00", "repo": "phoboslab/Ejecta", "stars": 2809, "tags": ["javascriptcore", "canvas", "webgl", "html5-games", "objective-c", "tvos", "browser-like-runtime", "game-development", "ios", "mobile"], "topics": [], "urls": [], "use_cases": ["run html5 canvas games as native ios apps", "package a javascript game for iphone or ipad without uiwebview", "deploy webgl games to apple tv", "execute javascript with canvas and audio apis natively on ios", "port an impactjs game to the app store", "avoid webview performance overhead for canvas apps"], "what_it_is": "Ejecta is an open source runtime for iOS and tvOS that provides a fast JavaScript (JavaScriptCore), Canvas 2D, WebGL, and audio environment for HTML5-style applications. It acts like a browser that only displays a canvas element, letting canvas games and apps run as native apps without a WebView.", "when_to_avoid": ["you need full DOM, CSS, or general web page rendering - use a WebView or a modern alternative like Capacitor", "you target platforms other than iOS/tvOS", "you need a project with active development, recent releases, or a clearly defined license"], "when_to_choose": ["you have an existing canvas or WebGL game written in JavaScript and want to ship it on iOS or tvOS", "you need better canvas/WebGL performance than a WebView can provide", "your app only needs canvas, audio, and basic JavaScript APIs without full DOM support"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/ejecta", "repo": "phoboslab/Ejecta", "role": "main", "score": 32}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:07:23.593488+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T08:14:25.703631+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "dd8f7034ebab531102efb804c8fec2701bc1e387d5c64427cf54d6fc28de4d92", "fetched_at": "2026-08-28T04:07:23.593488+00:00", "kind": "readme", "missing": false, "url": "https://github.com/phoboslab/Ejecta"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:07:23.593488+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T08:14:25.703631+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "dd8f7034ebab531102efb804c8fec2701bc1e387d5c64427cf54d6fc28de4d92", "fetched_at": "2026-08-28T04:07:23.593488+00:00", "kind": "readme", "missing": false, "url": "https://github.com/phoboslab/Ejecta"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T08:14:25.703631+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "dd8f7034ebab531102efb804c8fec2701bc1e387d5c64427cf54d6fc28de4d92", "fetched_at": "2026-08-28T04:07:23.593488+00:00", "kind": "readme", "missing": false, "url": "https://github.com/phoboslab/Ejecta"}], "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:07:23.593488+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:07:23.593488+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:07:23.593488+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T08:14:25.703631+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "dd8f7034ebab531102efb804c8fec2701bc1e387d5c64427cf54d6fc28de4d92", "fetched_at": "2026-08-28T04:07:23.593488+00:00", "kind": "readme", "missing": false, "url": "https://github.com/phoboslab/Ejecta"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:07:23.593488+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:07:23.593488+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T08:14:25.703631+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "dd8f7034ebab531102efb804c8fec2701bc1e387d5c64427cf54d6fc28de4d92", "fetched_at": "2026-08-28T04:07:23.593488+00:00", "kind": "readme", "missing": false, "url": "https://github.com/phoboslab/Ejecta"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:07:23.593488+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:07:23.593488+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:07:23.593488+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T08:14:25.703631+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "dd8f7034ebab531102efb804c8fec2701bc1e387d5c64427cf54d6fc28de4d92", "fetched_at": "2026-08-28T04:07:23.593488+00:00", "kind": "readme", "missing": false, "url": "https://github.com/phoboslab/Ejecta"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:07:23.593488+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:07:23.593488+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T08:14:25.703631+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "dd8f7034ebab531102efb804c8fec2701bc1e387d5c64427cf54d6fc28de4d92", "fetched_at": "2026-08-28T04:07:23.593488+00:00", "kind": "readme", "missing": false, "url": "https://github.com/phoboslab/Ejecta"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T08:14:25.703631+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "dd8f7034ebab531102efb804c8fec2701bc1e387d5c64427cf54d6fc28de4d92", "fetched_at": "2026-08-28T04:07:23.593488+00:00", "kind": "readme", "missing": false, "url": "https://github.com/phoboslab/Ejecta"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T08:14:25.703631+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "dd8f7034ebab531102efb804c8fec2701bc1e387d5c64427cf54d6fc28de4d92", "fetched_at": "2026-08-28T04:07:23.593488+00:00", "kind": "readme", "missing": false, "url": "https://github.com/phoboslab/Ejecta"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T08:14:25.703631+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "dd8f7034ebab531102efb804c8fec2701bc1e387d5c64427cf54d6fc28de4d92", "fetched_at": "2026-08-28T04:07:23.593488+00:00", "kind": "readme", "missing": false, "url": "https://github.com/phoboslab/Ejecta"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 0, "longevity": 100, "rhythm": 35}, "computed_at": "2026-09-02T17:46:02.011165+00:00", "flags": ["no_releases", "no_license"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 5090, "days_push": 1898, "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}}