{"adoption": {"forks": 309, "observed_at": "2026-08-28T04:06:37.852561+00:00", "stars": 2332}, "canonical_url": "https://ross.abutalabs.com/products/unwrap", "card": {"archived": false, "artifact_type": "application", "description": "Learn Swift interactively on your iPhone.", "domain": ["education", "programming-languages", "mobile-development", "apple-ecosystem"], "enriched": true, "function": ["gui", "developer-tools"], "health_score": 75, "homepage": "https://www.hackingwithswift.com", "language": "Swift", "license": "NOASSERTION", "license_family": "other", "maturity": "maintenance", "member_repos": ["twostraws/Unwrap"], "name": "twostraws/Unwrap", "platform": [], "pushed_at": "2026-07-14T21:38:27+00:00", "repo": "twostraws/Unwrap", "stars": 2332, "tags": ["swift-learning", "interactive-tutorials", "ios-app", "open-source-app", "hacking-with-swift", "education", "ios", "swift", "mobile"], "topics": ["swift", "xcode", "iphone", "ipad", "ios"], "urls": [], "use_cases": ["learn swift on my iphone", "interactive swift tutorials for beginners", "practice writing swift code on ipad", "daily swift coding challenges", "study how an ios app is structured in swift", "free app to learn swift fundamentals"], "what_it_is": "Unwrap is a free iOS app by Paul Hudson that teaches the Swift programming language through nearly 100 video lessons, interactive reviews, and daily coding challenges. Its source code is open so developers can study how the app is structured and contribute improvements.", "when_to_avoid": ["you need to learn SwiftUI or UIKit app development rather than the Swift language itself", "you want a desktop or web-based learning environment", "you need redistributable assets - the code is MIT licensed but assets are not"], "when_to_choose": ["you want to learn Swift fundamentals interactively on an iPhone or iPad", "you prefer video lessons paired with hands-on coding practice", "you want to study the source code of a real, well-documented iOS app"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/unwrap", "repo": "twostraws/Unwrap", "role": "main", "score": 74}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:06:37.852561+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T02:37:57.685467+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "81a97a810e64941df73ce20359bbe8fe2635e64b791eb7926c2f5fcb505be6da", "fetched_at": "2026-08-28T04:06:37.852561+00:00", "kind": "readme", "missing": false, "url": "https://github.com/twostraws/Unwrap"}, {"content_hash": "2d9e02e583e09f927896bf17902406d3f7b10009200f0257bda528402e6974a5", "fetched_at": "2026-08-29T10:18:23.266839+00:00", "kind": "homepage", "missing": false, "url": "https://www.hackingwithswift.com"}, {"content_hash": "06265cc51cf9b02c71b4f7ff48a4faf14c0e14cdd62bafca431fb1c962e981b8", "fetched_at": "2026-08-29T10:18:23.271590+00:00", "kind": "site_page", "missing": false, "url": "https://www.hackingwithswift.com/about"}, {"content_hash": "42e8003985d219926687f15522c798cc3ea1abd59b32a1bcaf7efd321337410c", "fetched_at": "2026-08-29T10:18:23.273544+00:00", "kind": "site_page", "missing": false, "url": "https://www.hackingwithswift.com/articles/283/how-to-install-and-use-ai-agent-skills-in-xcode"}, {"content_hash": "6bf188bbb1af687a22cc5f1435fd93cfdb01d28b5a2ca41b5a188676e859020d", "fetched_at": "2026-08-29T10:18:23.269700+00:00", "kind": "site_page", "missing": false, "url": "https://www.hackingwithswift.com/faq"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:06:37.852561+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T02:37:57.685467+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "81a97a810e64941df73ce20359bbe8fe2635e64b791eb7926c2f5fcb505be6da", "fetched_at": "2026-08-28T04:06:37.852561+00:00", "kind": "readme", "missing": false, "url": "https://github.com/twostraws/Unwrap"}, {"content_hash": "2d9e02e583e09f927896bf17902406d3f7b10009200f0257bda528402e6974a5", "fetched_at": "2026-08-29T10:18:23.266839+00:00", "kind": "homepage", "missing": false, "url": "https://www.hackingwithswift.com"}, {"content_hash": "06265cc51cf9b02c71b4f7ff48a4faf14c0e14cdd62bafca431fb1c962e981b8", "fetched_at": "2026-08-29T10:18:23.271590+00:00", "kind": "site_page", "missing": false, "url": "https://www.hackingwithswift.com/about"}, {"content_hash": "42e8003985d219926687f15522c798cc3ea1abd59b32a1bcaf7efd321337410c", "fetched_at": "2026-08-29T10:18:23.273544+00:00", "kind": "site_page", "missing": false, "url": "https://www.hackingwithswift.com/articles/283/how-to-install-and-use-ai-agent-skills-in-xcode"}, {"content_hash": "6bf188bbb1af687a22cc5f1435fd93cfdb01d28b5a2ca41b5a188676e859020d", "fetched_at": "2026-08-29T10:18:23.269700+00:00", "kind": "site_page", "missing": false, "url": "https://www.hackingwithswift.com/faq"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T02:37:57.685467+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "81a97a810e64941df73ce20359bbe8fe2635e64b791eb7926c2f5fcb505be6da", "fetched_at": "2026-08-28T04:06:37.852561+00:00", "kind": "readme", "missing": false, "url": "https://github.com/twostraws/Unwrap"}, {"content_hash": "2d9e02e583e09f927896bf17902406d3f7b10009200f0257bda528402e6974a5", "fetched_at": "2026-08-29T10:18:23.266839+00:00", "kind": "homepage", "missing": false, "url": "https://www.hackingwithswift.com"}, {"content_hash": "06265cc51cf9b02c71b4f7ff48a4faf14c0e14cdd62bafca431fb1c962e981b8", "fetched_at": "2026-08-29T10:18:23.271590+00:00", "kind": "site_page", "missing": false, "url": "https://www.hackingwithswift.com/about"}, {"content_hash": "42e8003985d219926687f15522c798cc3ea1abd59b32a1bcaf7efd321337410c", "fetched_at": "2026-08-29T10:18:23.273544+00:00", "kind": "site_page", "missing": false, "url": "https://www.hackingwithswift.com/articles/283/how-to-install-and-use-ai-agent-skills-in-xcode"}, {"content_hash": "6bf188bbb1af687a22cc5f1435fd93cfdb01d28b5a2ca41b5a188676e859020d", "fetched_at": "2026-08-29T10:18:23.269700+00:00", "kind": "site_page", "missing": false, "url": "https://www.hackingwithswift.com/faq"}], "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:06:37.852561+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:06:37.852561+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:06:37.852561+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T02:37:57.685467+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "81a97a810e64941df73ce20359bbe8fe2635e64b791eb7926c2f5fcb505be6da", "fetched_at": "2026-08-28T04:06:37.852561+00:00", "kind": "readme", "missing": false, "url": "https://github.com/twostraws/Unwrap"}, {"content_hash": "2d9e02e583e09f927896bf17902406d3f7b10009200f0257bda528402e6974a5", "fetched_at": "2026-08-29T10:18:23.266839+00:00", "kind": "homepage", "missing": false, "url": "https://www.hackingwithswift.com"}, {"content_hash": "06265cc51cf9b02c71b4f7ff48a4faf14c0e14cdd62bafca431fb1c962e981b8", "fetched_at": "2026-08-29T10:18:23.271590+00:00", "kind": "site_page", "missing": false, "url": "https://www.hackingwithswift.com/about"}, {"content_hash": "42e8003985d219926687f15522c798cc3ea1abd59b32a1bcaf7efd321337410c", "fetched_at": "2026-08-29T10:18:23.273544+00:00", "kind": "site_page", "missing": false, "url": "https://www.hackingwithswift.com/articles/283/how-to-install-and-use-ai-agent-skills-in-xcode"}, {"content_hash": "6bf188bbb1af687a22cc5f1435fd93cfdb01d28b5a2ca41b5a188676e859020d", "fetched_at": "2026-08-29T10:18:23.269700+00:00", "kind": "site_page", "missing": false, "url": "https://www.hackingwithswift.com/faq"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:06:37.852561+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:06:37.852561+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T02:37:57.685467+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "81a97a810e64941df73ce20359bbe8fe2635e64b791eb7926c2f5fcb505be6da", "fetched_at": "2026-08-28T04:06:37.852561+00:00", "kind": "readme", "missing": false, "url": "https://github.com/twostraws/Unwrap"}, {"content_hash": "2d9e02e583e09f927896bf17902406d3f7b10009200f0257bda528402e6974a5", "fetched_at": "2026-08-29T10:18:23.266839+00:00", "kind": "homepage", "missing": false, "url": "https://www.hackingwithswift.com"}, {"content_hash": "06265cc51cf9b02c71b4f7ff48a4faf14c0e14cdd62bafca431fb1c962e981b8", "fetched_at": "2026-08-29T10:18:23.271590+00:00", "kind": "site_page", "missing": false, "url": "https://www.hackingwithswift.com/about"}, {"content_hash": "42e8003985d219926687f15522c798cc3ea1abd59b32a1bcaf7efd321337410c", "fetched_at": "2026-08-29T10:18:23.273544+00:00", "kind": "site_page", "missing": false, "url": "https://www.hackingwithswift.com/articles/283/how-to-install-and-use-ai-agent-skills-in-xcode"}, {"content_hash": "6bf188bbb1af687a22cc5f1435fd93cfdb01d28b5a2ca41b5a188676e859020d", "fetched_at": "2026-08-29T10:18:23.269700+00:00", "kind": "site_page", "missing": false, "url": "https://www.hackingwithswift.com/faq"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:06:37.852561+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:06:37.852561+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:06:37.852561+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T02:37:57.685467+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "81a97a810e64941df73ce20359bbe8fe2635e64b791eb7926c2f5fcb505be6da", "fetched_at": "2026-08-28T04:06:37.852561+00:00", "kind": "readme", "missing": false, "url": "https://github.com/twostraws/Unwrap"}, {"content_hash": "2d9e02e583e09f927896bf17902406d3f7b10009200f0257bda528402e6974a5", "fetched_at": "2026-08-29T10:18:23.266839+00:00", "kind": "homepage", "missing": false, "url": "https://www.hackingwithswift.com"}, {"content_hash": "06265cc51cf9b02c71b4f7ff48a4faf14c0e14cdd62bafca431fb1c962e981b8", "fetched_at": "2026-08-29T10:18:23.271590+00:00", "kind": "site_page", "missing": false, "url": "https://www.hackingwithswift.com/about"}, {"content_hash": "42e8003985d219926687f15522c798cc3ea1abd59b32a1bcaf7efd321337410c", "fetched_at": "2026-08-29T10:18:23.273544+00:00", "kind": "site_page", "missing": false, "url": "https://www.hackingwithswift.com/articles/283/how-to-install-and-use-ai-agent-skills-in-xcode"}, {"content_hash": "6bf188bbb1af687a22cc5f1435fd93cfdb01d28b5a2ca41b5a188676e859020d", "fetched_at": "2026-08-29T10:18:23.269700+00:00", "kind": "site_page", "missing": false, "url": "https://www.hackingwithswift.com/faq"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:06:37.852561+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:06:37.852561+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T02:37:57.685467+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "81a97a810e64941df73ce20359bbe8fe2635e64b791eb7926c2f5fcb505be6da", "fetched_at": "2026-08-28T04:06:37.852561+00:00", "kind": "readme", "missing": false, "url": "https://github.com/twostraws/Unwrap"}, {"content_hash": "2d9e02e583e09f927896bf17902406d3f7b10009200f0257bda528402e6974a5", "fetched_at": "2026-08-29T10:18:23.266839+00:00", "kind": "homepage", "missing": false, "url": "https://www.hackingwithswift.com"}, {"content_hash": "06265cc51cf9b02c71b4f7ff48a4faf14c0e14cdd62bafca431fb1c962e981b8", "fetched_at": "2026-08-29T10:18:23.271590+00:00", "kind": "site_page", "missing": false, "url": "https://www.hackingwithswift.com/about"}, {"content_hash": "42e8003985d219926687f15522c798cc3ea1abd59b32a1bcaf7efd321337410c", "fetched_at": "2026-08-29T10:18:23.273544+00:00", "kind": "site_page", "missing": false, "url": "https://www.hackingwithswift.com/articles/283/how-to-install-and-use-ai-agent-skills-in-xcode"}, {"content_hash": "6bf188bbb1af687a22cc5f1435fd93cfdb01d28b5a2ca41b5a188676e859020d", "fetched_at": "2026-08-29T10:18:23.269700+00:00", "kind": "site_page", "missing": false, "url": "https://www.hackingwithswift.com/faq"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T02:37:57.685467+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "81a97a810e64941df73ce20359bbe8fe2635e64b791eb7926c2f5fcb505be6da", "fetched_at": "2026-08-28T04:06:37.852561+00:00", "kind": "readme", "missing": false, "url": "https://github.com/twostraws/Unwrap"}, {"content_hash": "2d9e02e583e09f927896bf17902406d3f7b10009200f0257bda528402e6974a5", "fetched_at": "2026-08-29T10:18:23.266839+00:00", "kind": "homepage", "missing": false, "url": "https://www.hackingwithswift.com"}, {"content_hash": "06265cc51cf9b02c71b4f7ff48a4faf14c0e14cdd62bafca431fb1c962e981b8", "fetched_at": "2026-08-29T10:18:23.271590+00:00", "kind": "site_page", "missing": false, "url": "https://www.hackingwithswift.com/about"}, {"content_hash": "42e8003985d219926687f15522c798cc3ea1abd59b32a1bcaf7efd321337410c", "fetched_at": "2026-08-29T10:18:23.273544+00:00", "kind": "site_page", "missing": false, "url": "https://www.hackingwithswift.com/articles/283/how-to-install-and-use-ai-agent-skills-in-xcode"}, {"content_hash": "6bf188bbb1af687a22cc5f1435fd93cfdb01d28b5a2ca41b5a188676e859020d", "fetched_at": "2026-08-29T10:18:23.269700+00:00", "kind": "site_page", "missing": false, "url": "https://www.hackingwithswift.com/faq"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T02:37:57.685467+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "81a97a810e64941df73ce20359bbe8fe2635e64b791eb7926c2f5fcb505be6da", "fetched_at": "2026-08-28T04:06:37.852561+00:00", "kind": "readme", "missing": false, "url": "https://github.com/twostraws/Unwrap"}, {"content_hash": "2d9e02e583e09f927896bf17902406d3f7b10009200f0257bda528402e6974a5", "fetched_at": "2026-08-29T10:18:23.266839+00:00", "kind": "homepage", "missing": false, "url": "https://www.hackingwithswift.com"}, {"content_hash": "06265cc51cf9b02c71b4f7ff48a4faf14c0e14cdd62bafca431fb1c962e981b8", "fetched_at": "2026-08-29T10:18:23.271590+00:00", "kind": "site_page", "missing": false, "url": "https://www.hackingwithswift.com/about"}, {"content_hash": "42e8003985d219926687f15522c798cc3ea1abd59b32a1bcaf7efd321337410c", "fetched_at": "2026-08-29T10:18:23.273544+00:00", "kind": "site_page", "missing": false, "url": "https://www.hackingwithswift.com/articles/283/how-to-install-and-use-ai-agent-skills-in-xcode"}, {"content_hash": "6bf188bbb1af687a22cc5f1435fd93cfdb01d28b5a2ca41b5a188676e859020d", "fetched_at": "2026-08-29T10:18:23.269700+00:00", "kind": "site_page", "missing": false, "url": "https://www.hackingwithswift.com/faq"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T02:37:57.685467+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "81a97a810e64941df73ce20359bbe8fe2635e64b791eb7926c2f5fcb505be6da", "fetched_at": "2026-08-28T04:06:37.852561+00:00", "kind": "readme", "missing": false, "url": "https://github.com/twostraws/Unwrap"}, {"content_hash": "2d9e02e583e09f927896bf17902406d3f7b10009200f0257bda528402e6974a5", "fetched_at": "2026-08-29T10:18:23.266839+00:00", "kind": "homepage", "missing": false, "url": "https://www.hackingwithswift.com"}, {"content_hash": "06265cc51cf9b02c71b4f7ff48a4faf14c0e14cdd62bafca431fb1c962e981b8", "fetched_at": "2026-08-29T10:18:23.271590+00:00", "kind": "site_page", "missing": false, "url": "https://www.hackingwithswift.com/about"}, {"content_hash": "42e8003985d219926687f15522c798cc3ea1abd59b32a1bcaf7efd321337410c", "fetched_at": "2026-08-29T10:18:23.273544+00:00", "kind": "site_page", "missing": false, "url": "https://www.hackingwithswift.com/articles/283/how-to-install-and-use-ai-agent-skills-in-xcode"}, {"content_hash": "6bf188bbb1af687a22cc5f1435fd93cfdb01d28b5a2ca41b5a188676e859020d", "fetched_at": "2026-08-29T10:18:23.269700+00:00", "kind": "site_page", "missing": false, "url": "https://www.hackingwithswift.com/faq"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 92, "longevity": 100, "rhythm": 35}, "computed_at": "2026-09-03T02:20:16.233290+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": 2946, "days_push": 50, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 74, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}