{"adoption": {"forks": 40, "observed_at": "2026-08-28T04:03:34.964584+00:00", "stars": 1099}, "canonical_url": "https://ross.abutalabs.com/products/aeastr-portal", "card": {"archived": false, "artifact_type": "library", "description": "Portal is a SwiftUI package for element transitions across navigation contexts, scroll-based flowing headers, and advanced view mirroring capabilities.", "domain": ["mobile-development", "frontend", "cross-platform"], "enriched": true, "function": ["animation", "ui-components", "mobile-framework"], "health_score": 99, "homepage": null, "language": "Swift", "license": "MIT", "license_family": "permissive", "maturity": "active", "member_repos": ["Aeastr/Portal"], "name": "Aeastr/Portal", "platform": [], "pushed_at": "2026-08-14T18:21:53+00:00", "repo": "Aeastr/Portal", "stars": 1099, "tags": ["swiftui", "element-transitions", "shared-element", "flowing-headers", "view-mirroring", "swift-package", "ios", "swift", "mobile"], "topics": [], "urls": [], "use_cases": ["animate a shared element between a list and a full-screen detail view in SwiftUI", "create hero transitions across sheets, navigation stacks, and tabs", "build scroll-based headers that flow into the navigation bar like Apple Music or Photos", "mirror a live view instance across two places in the view hierarchy", "add polished app-store-quality transitions to an iOS app"], "what_it_is": "Portal is a Swift package offering SwiftUI modules for element transitions across navigation contexts, scroll-based flowing headers, and true view mirroring via Apple's private _UIPortalView API. It targets iOS 17+ (with a legacy branch for iOS 15/16) and is distributed via Swift Package Manager under the MIT license.", "when_to_avoid": ["you need cross-platform (Android, web) transitions rather than iOS-only", "your app must avoid private APIs for App Store safety and you need true view mirroring", "you target iOS below 17 and cannot pin to the legacy branch", "you need transitions in UIKit rather than SwiftUI"], "when_to_choose": ["you are building an iOS app with SwiftUI and want shared-element or hero-style transitions", "you need Music/Photos-style collapsing scroll headers with minimal code", "you want a pure SwiftUI solution using standard APIs for transitions"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/aeastr-portal", "repo": "Aeastr/Portal", "role": "main", "score": 85}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:03:34.964584+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T06:45:56.661238+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3c4fc61bf50ce68a34b924fe0efba25f83c3642c456802c269c4d5549f3d3d28", "fetched_at": "2026-08-28T04:03:34.964584+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Aeastr/Portal"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:03:34.964584+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T06:45:56.661238+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3c4fc61bf50ce68a34b924fe0efba25f83c3642c456802c269c4d5549f3d3d28", "fetched_at": "2026-08-28T04:03:34.964584+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Aeastr/Portal"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T06:45:56.661238+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3c4fc61bf50ce68a34b924fe0efba25f83c3642c456802c269c4d5549f3d3d28", "fetched_at": "2026-08-28T04:03:34.964584+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Aeastr/Portal"}], "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:34.964584+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:03:34.964584+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:03:34.964584+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T06:45:56.661238+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3c4fc61bf50ce68a34b924fe0efba25f83c3642c456802c269c4d5549f3d3d28", "fetched_at": "2026-08-28T04:03:34.964584+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Aeastr/Portal"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:03:34.964584+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:03:34.964584+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T06:45:56.661238+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3c4fc61bf50ce68a34b924fe0efba25f83c3642c456802c269c4d5549f3d3d28", "fetched_at": "2026-08-28T04:03:34.964584+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Aeastr/Portal"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:03:34.964584+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:03:34.964584+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:03:34.964584+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T06:45:56.661238+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3c4fc61bf50ce68a34b924fe0efba25f83c3642c456802c269c4d5549f3d3d28", "fetched_at": "2026-08-28T04:03:34.964584+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Aeastr/Portal"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:03:34.964584+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:03:34.964584+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T06:45:56.661238+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3c4fc61bf50ce68a34b924fe0efba25f83c3642c456802c269c4d5549f3d3d28", "fetched_at": "2026-08-28T04:03:34.964584+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Aeastr/Portal"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T06:45:56.661238+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3c4fc61bf50ce68a34b924fe0efba25f83c3642c456802c269c4d5549f3d3d28", "fetched_at": "2026-08-28T04:03:34.964584+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Aeastr/Portal"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T06:45:56.661238+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3c4fc61bf50ce68a34b924fe0efba25f83c3642c456802c269c4d5549f3d3d28", "fetched_at": "2026-08-28T04:03:34.964584+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Aeastr/Portal"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T06:45:56.661238+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "3c4fc61bf50ce68a34b924fe0efba25f83c3642c456802c269c4d5549f3d3d28", "fetched_at": "2026-08-28T04:03:34.964584+00:00", "kind": "readme", "missing": false, "url": "https://github.com/Aeastr/Portal"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 97, "longevity": 35, "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": 499, "days_push": 19, "days_rel": 19, "gap_med": 1, "n_releases_24m": 20}, "score": 85, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}