{"adoption": {"forks": 85, "observed_at": "2026-08-28T04:03:21.014484+00:00", "stars": 1043}, "canonical_url": "https://ross.abutalabs.com/products/chatlayout", "card": {"archived": false, "artifact_type": "library", "description": "ChatLayout is an alternative solution to MessageKit. It uses custom UICollectionViewLayout to provide you full control over the presentation as well as all the tools available in UICollectionView. It supports dynamic cells and supplementary view sizes.", "domain": ["mobile-development", "messaging-platforms", "chatbots"], "enriched": true, "function": ["ui-components", "frontend-framework"], "health_score": 99, "homepage": null, "language": "Swift", "license": "MIT", "license_family": "permissive", "maturity": "active", "member_repos": ["ekazaev/ChatLayout"], "name": "ekazaev/ChatLayout", "platform": [], "pushed_at": "2026-08-18T19:51:44+00:00", "repo": "ekazaev/ChatLayout", "stars": 1043, "tags": ["chat-ui", "uicollectionviewlayout", "messagekit-alternative", "messenger", "swift", "ios", "mobile"], "topics": ["chat", "chat-application", "messaging", "messenger", "uicollectionviewlayout", "collectionview", "collectionviewlayout", "swift", "uicollectionview", "custom-uicollectionviewlayout", "messagekit", "differencekit", "chatui"], "urls": [], "use_cases": ["build a chat interface in an iOS app", "replace MessageKit with a more customizable chat UI", "display messages with dynamically sized cells in UICollectionView", "implement a messenger screen with animated message insertions and deletions", "create sticky headers or footers in a chat feed", "precisely scroll to a specific message in a conversation"], "what_it_is": "ChatLayout is a Swift library providing a custom UICollectionViewLayout for building chat interfaces on iOS, positioned as an alternative to MessageKit. It offers full control over message presentation with dynamic cell sizes, animated updates, and sticky header/footer cells.", "when_to_avoid": ["you want a batteries-included chat UI with prebuilt message cells and input bar", "your project is not iOS/Swift based", "you prefer a simpler drop-in solution over building custom collection view items"], "when_to_choose": ["you need full control over chat message layout beyond what MessageKit offers", "your chat requires dynamic cell sizes and animated item updates", "you want to leverage native UICollectionView tools in a messaging UI", "you need pinned/sticky cells behaving like headers or footers in a chat"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/chatlayout", "repo": "ekazaev/ChatLayout", "role": "main", "score": 98}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:03:21.014484+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T07:02:29.887136+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2979df96b92ef2884b7f9d385802952a74c0094dccd1d8df0538730ba574e19c", "fetched_at": "2026-08-28T04:03:21.014484+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ekazaev/ChatLayout"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:03:21.014484+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T07:02:29.887136+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2979df96b92ef2884b7f9d385802952a74c0094dccd1d8df0538730ba574e19c", "fetched_at": "2026-08-28T04:03:21.014484+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ekazaev/ChatLayout"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T07:02:29.887136+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2979df96b92ef2884b7f9d385802952a74c0094dccd1d8df0538730ba574e19c", "fetched_at": "2026-08-28T04:03:21.014484+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ekazaev/ChatLayout"}], "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:21.014484+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:03:21.014484+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:03:21.014484+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T07:02:29.887136+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2979df96b92ef2884b7f9d385802952a74c0094dccd1d8df0538730ba574e19c", "fetched_at": "2026-08-28T04:03:21.014484+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ekazaev/ChatLayout"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:03:21.014484+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:03:21.014484+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T07:02:29.887136+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2979df96b92ef2884b7f9d385802952a74c0094dccd1d8df0538730ba574e19c", "fetched_at": "2026-08-28T04:03:21.014484+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ekazaev/ChatLayout"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:03:21.014484+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:03:21.014484+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:03:21.014484+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T07:02:29.887136+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2979df96b92ef2884b7f9d385802952a74c0094dccd1d8df0538730ba574e19c", "fetched_at": "2026-08-28T04:03:21.014484+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ekazaev/ChatLayout"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:03:21.014484+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:03:21.014484+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T07:02:29.887136+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2979df96b92ef2884b7f9d385802952a74c0094dccd1d8df0538730ba574e19c", "fetched_at": "2026-08-28T04:03:21.014484+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ekazaev/ChatLayout"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T07:02:29.887136+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2979df96b92ef2884b7f9d385802952a74c0094dccd1d8df0538730ba574e19c", "fetched_at": "2026-08-28T04:03:21.014484+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ekazaev/ChatLayout"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T07:02:29.887136+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2979df96b92ef2884b7f9d385802952a74c0094dccd1d8df0538730ba574e19c", "fetched_at": "2026-08-28T04:03:21.014484+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ekazaev/ChatLayout"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T07:02:29.887136+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "2979df96b92ef2884b7f9d385802952a74c0094dccd1d8df0538730ba574e19c", "fetched_at": "2026-08-28T04:03:21.014484+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ekazaev/ChatLayout"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 98, "longevity": 100, "rhythm": 98}, "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": 2249, "days_push": 15, "days_rel": 15, "gap_med": 15, "n_releases_24m": 16}, "score": 98, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}