{"adoption": {"forks": 148, "observed_at": "2026-08-28T04:08:10.770991+00:00", "stars": 3574}, "canonical_url": "https://ross.abutalabs.com/products/morphdom", "card": {"archived": false, "artifact_type": "library", "description": "Fast and lightweight DOM diffing/patching (no virtual DOM needed)", "domain": ["web-development", "frontend", "developer-tools"], "enriched": true, "function": ["ui-components", "frontend-framework"], "health_score": 58, "homepage": null, "language": "JavaScript", "license": "MIT", "license_family": "permissive", "maturity": "stable", "member_repos": ["patrick-steele-idem/morphdom"], "name": "patrick-steele-idem/morphdom", "platform": ["browser"], "pushed_at": "2026-01-24T05:16:21+00:00", "repo": "patrick-steele-idem/morphdom", "stars": 3574, "tags": ["dom-diffing", "dom-patching", "no-virtual-dom", "rerendering", "lightweight", "nodejs"], "topics": [], "urls": [], "use_cases": ["update the DOM after rerendering a UI component without losing input focus or scroll position", "morph an existing DOM tree to match new HTML from any templating language", "apply minimal DOM patches instead of replacing innerHTML wholesale", "diff and patch the real DOM against a virtual DOM tree", "efficiently sync server-rendered HTML into a live page"], "what_it_is": "morphdom is a lightweight JavaScript library that efficiently morphs an existing real DOM node tree to match a target DOM tree with minimal changes, without requiring a virtual DOM. It preserves internal DOM state like scroll positions, input caret positions, and CSS transition states during updates.", "when_to_avoid": ["you are building a large app that benefits from a full framework with state management and components", "you need fine-grained reactive updates rather than full-tree rerendering", "you need to diff non-DOM data structures"], "when_to_choose": ["you rerender HTML strings or templates and want minimal, state-preserving DOM updates", "you want DOM diffing without adopting a full virtual DOM framework", "your code manually manipulates the DOM and you need updates to stay compatible", "you need a small, fast, dependency-free browser library"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/morphdom", "repo": "patrick-steele-idem/morphdom", "role": "main", "score": 61}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:08:10.770991+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-29T18:34:04.388479+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3af7765ddeee6cd663db6cce6386342c4118b5e6ed486459c5c06a4f91a2c2f2", "fetched_at": "2026-08-28T04:08:10.770991+00:00", "kind": "readme", "missing": false, "url": "https://github.com/patrick-steele-idem/morphdom"}, {"content_hash": "ee524926ba2bd3f90aa580f2a7d82c5076cafa4454afc7c1f986b74867f174c4", "fetched_at": "2026-08-29T09:27:54.400988+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/morphdom"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:08:10.770991+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-29T18:34:04.388479+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3af7765ddeee6cd663db6cce6386342c4118b5e6ed486459c5c06a4f91a2c2f2", "fetched_at": "2026-08-28T04:08:10.770991+00:00", "kind": "readme", "missing": false, "url": "https://github.com/patrick-steele-idem/morphdom"}, {"content_hash": "ee524926ba2bd3f90aa580f2a7d82c5076cafa4454afc7c1f986b74867f174c4", "fetched_at": "2026-08-29T09:27:54.400988+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/morphdom"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-29T18:34:04.388479+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3af7765ddeee6cd663db6cce6386342c4118b5e6ed486459c5c06a4f91a2c2f2", "fetched_at": "2026-08-28T04:08:10.770991+00:00", "kind": "readme", "missing": false, "url": "https://github.com/patrick-steele-idem/morphdom"}, {"content_hash": "ee524926ba2bd3f90aa580f2a7d82c5076cafa4454afc7c1f986b74867f174c4", "fetched_at": "2026-08-29T09:27:54.400988+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/morphdom"}], "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:08:10.770991+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:08:10.770991+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:08:10.770991+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-29T18:34:04.388479+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3af7765ddeee6cd663db6cce6386342c4118b5e6ed486459c5c06a4f91a2c2f2", "fetched_at": "2026-08-28T04:08:10.770991+00:00", "kind": "readme", "missing": false, "url": "https://github.com/patrick-steele-idem/morphdom"}, {"content_hash": "ee524926ba2bd3f90aa580f2a7d82c5076cafa4454afc7c1f986b74867f174c4", "fetched_at": "2026-08-29T09:27:54.400988+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/morphdom"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:08:10.770991+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:08:10.770991+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-29T18:34:04.388479+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3af7765ddeee6cd663db6cce6386342c4118b5e6ed486459c5c06a4f91a2c2f2", "fetched_at": "2026-08-28T04:08:10.770991+00:00", "kind": "readme", "missing": false, "url": "https://github.com/patrick-steele-idem/morphdom"}, {"content_hash": "ee524926ba2bd3f90aa580f2a7d82c5076cafa4454afc7c1f986b74867f174c4", "fetched_at": "2026-08-29T09:27:54.400988+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/morphdom"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:08:10.770991+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:08:10.770991+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:08:10.770991+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-29T18:34:04.388479+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3af7765ddeee6cd663db6cce6386342c4118b5e6ed486459c5c06a4f91a2c2f2", "fetched_at": "2026-08-28T04:08:10.770991+00:00", "kind": "readme", "missing": false, "url": "https://github.com/patrick-steele-idem/morphdom"}, {"content_hash": "ee524926ba2bd3f90aa580f2a7d82c5076cafa4454afc7c1f986b74867f174c4", "fetched_at": "2026-08-29T09:27:54.400988+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/morphdom"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:08:10.770991+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:08:10.770991+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-29T18:34:04.388479+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3af7765ddeee6cd663db6cce6386342c4118b5e6ed486459c5c06a4f91a2c2f2", "fetched_at": "2026-08-28T04:08:10.770991+00:00", "kind": "readme", "missing": false, "url": "https://github.com/patrick-steele-idem/morphdom"}, {"content_hash": "ee524926ba2bd3f90aa580f2a7d82c5076cafa4454afc7c1f986b74867f174c4", "fetched_at": "2026-08-29T09:27:54.400988+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/morphdom"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-29T18:34:04.388479+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3af7765ddeee6cd663db6cce6386342c4118b5e6ed486459c5c06a4f91a2c2f2", "fetched_at": "2026-08-28T04:08:10.770991+00:00", "kind": "readme", "missing": false, "url": "https://github.com/patrick-steele-idem/morphdom"}, {"content_hash": "ee524926ba2bd3f90aa580f2a7d82c5076cafa4454afc7c1f986b74867f174c4", "fetched_at": "2026-08-29T09:27:54.400988+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/morphdom"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-29T18:34:04.388479+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3af7765ddeee6cd663db6cce6386342c4118b5e6ed486459c5c06a4f91a2c2f2", "fetched_at": "2026-08-28T04:08:10.770991+00:00", "kind": "readme", "missing": false, "url": "https://github.com/patrick-steele-idem/morphdom"}, {"content_hash": "ee524926ba2bd3f90aa580f2a7d82c5076cafa4454afc7c1f986b74867f174c4", "fetched_at": "2026-08-29T09:27:54.400988+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/morphdom"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-29T18:34:04.388479+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3af7765ddeee6cd663db6cce6386342c4118b5e6ed486459c5c06a4f91a2c2f2", "fetched_at": "2026-08-28T04:08:10.770991+00:00", "kind": "readme", "missing": false, "url": "https://github.com/patrick-steele-idem/morphdom"}, {"content_hash": "ee524926ba2bd3f90aa580f2a7d82c5076cafa4454afc7c1f986b74867f174c4", "fetched_at": "2026-08-29T09:27:54.400988+00:00", "kind": "registry_npm", "missing": false, "url": "https://registry.npmjs.org/morphdom"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 64, "longevity": 100, "rhythm": 35}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": ["no_releases"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 4087, "days_push": 221, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 61, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}