{"id":32143359,"url":"https://github.com/jaywcjlove/storekithelper","last_synced_at":"2026-04-24T07:04:20.784Z","repository":{"id":282523381,"uuid":"943949174","full_name":"jaywcjlove/StoreKitHelper","owner":"jaywcjlove","description":"A lightweight StoreKit2 wrapper designed specifically for SwiftUI, making it easier to implement in-app purchases.","archived":false,"fork":false,"pushed_at":"2025-10-01T12:59:24.000Z","size":96,"stargazers_count":130,"open_issues_count":0,"forks_count":9,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-10-21T07:58:47.241Z","etag":null,"topics":["apple","iap","in-app-purchase","ios","ios-swift","jaywcjlove","macos","payment","purchase","receipt","storekit","storekit2","swift","swift-app","swift-application","swiftui","swiftui-app","swiftui-application"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jaywcjlove.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"ko_fi":"jaywcjlove","buy_me_a_coffee":"jaywcjlove","custom":["https://www.paypal.me/kennyiseeyou","https://jaywcjlove.github.io/#/sponsor"]}},"created_at":"2025-03-06T14:33:55.000Z","updated_at":"2025-10-18T19:59:40.000Z","dependencies_parsed_at":"2025-03-15T07:24:09.855Z","dependency_job_id":"e6e3e925-a60c-46b0-9cbb-ad8ed6538f5a","html_url":"https://github.com/jaywcjlove/StoreKitHelper","commit_stats":null,"previous_names":["jaywcjlove/storekithelper"],"tags_count":32,"template":false,"template_full_name":null,"purl":"pkg:github/jaywcjlove/StoreKitHelper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jaywcjlove%2FStoreKitHelper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jaywcjlove%2FStoreKitHelper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jaywcjlove%2FStoreKitHelper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jaywcjlove%2FStoreKitHelper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jaywcjlove","download_url":"https://codeload.github.com/jaywcjlove/StoreKitHelper/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jaywcjlove%2FStoreKitHelper/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":280225809,"owners_count":26293888,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-21T02:00:06.614Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["apple","iap","in-app-purchase","ios","ios-swift","jaywcjlove","macos","payment","purchase","receipt","storekit","storekit2","swift","swift-app","swift-application","swiftui","swiftui-app","swiftui-application"],"created_at":"2025-10-21T07:59:02.098Z","updated_at":"2026-04-24T07:04:20.776Z","avatar_url":"https://github.com/jaywcjlove.png","language":"Swift","funding_links":["https://ko-fi.com/jaywcjlove","https://buymeacoffee.com/jaywcjlove","https://www.paypal.me/kennyiseeyou","https://jaywcjlove.github.io/#/sponsor"],"categories":[],"sub_categories":[],"readme":"\u003cdiv markdown=\"1\"\u003e\n  \u003csup\u003eUsing \u003ca href=\"https://wangchujiang.com/#/app\" target=\"_blank\"\u003emy apps\u003c/a\u003e is also a way to \u003ca href=\"https://wangchujiang.com/#/sponsor\" target=\"_blank\"\u003esupport\u003c/a\u003e me:\u003c/sup\u003e\n  \u003cbr\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6758053530\" title=\"Scap: Screenshot \u0026 Markup Edit for macOS\"\u003e\u003cimg alt=\"Scap: Screenshot \u0026 Markup Edit\" height=\"52\" src=\"https://wangchujiang.com/appicon/scap.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6757317079\" title=\"Screen Test for macOS\"\u003e\u003cimg alt=\"Screen Test\" height=\"52\" src=\"https://wangchujiang.com/appicon/screen-test.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6755948110\" title=\"Deskmark for macOS\"\u003e\u003cimg alt=\"Deskmark\" height=\"52\" src=\"https://wangchujiang.com/appicon/deskmark.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6500434773\" title=\"Keyzer for macOS\"\u003e\u003cimg alt=\"Keyzer\" height=\"52\" src=\"https://wangchujiang.com/appicon/keyzer.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://github.com/jaywcjlove/vidwall-hub\" title=\"Vidwall Hub for macOS\"\u003e\u003cimg alt=\"Vidwall Hub\" height=\"52\" src=\"https://wangchujiang.com/appicon/vidwall-hub.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6752624705\" title=\"VidCrop for macOS\"\u003e\u003cimg alt=\"VidCrop\" height=\"52\" src=\"https://wangchujiang.com/appicon/vidcrop.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6747587746\" title=\"Vidwall for macOS\"\u003e\u003cimg alt=\"Vidwall\" height=\"52\" src=\"https://wangchujiang.com/appicon/vidwall.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://wangchujiang.com/mousio-hint/\" title=\"Mousio Hint for macOS\"\u003e\u003cimg alt=\"Mousio Hint\" height=\"52\" src=\"https://wangchujiang.com/appicon/mousio-hint.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6746747327\" title=\"Mousio for macOS\"\u003e\u003cimg alt=\"Mousio\" height=\"52\" src=\"https://wangchujiang.com/appicon/mousio.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6745227444\" title=\"Musicer for macOS\"\u003e\u003cimg alt=\"Musicer\" height=\"52\" src=\"https://wangchujiang.com/appicon/musicer.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6743841447\" title=\"Audioer for macOS\"\u003e\u003cimg alt=\"Audioer\" height=\"52\" src=\"https://wangchujiang.com/appicon/audioer.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6744690194\" title=\"FileSentinel for macOS\"\u003e\u003cimg alt=\"FileSentinel\" height=\"52\" src=\"https://wangchujiang.com/appicon/file-sentinel.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6743495172\" title=\"FocusCursor for macOS\"\u003e\u003cimg alt=\"FocusCursor\" height=\"52\" src=\"https://wangchujiang.com/appicon/focus-cursor.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6742680573\" title=\"Videoer for macOS\"\u003e\u003cimg alt=\"Videoer\" height=\"52\" src=\"https://wangchujiang.com/appicon/videoer.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6740425504\" title=\"KeyClicker for macOS\"\u003e\u003cimg alt=\"KeyClicker\" height=\"52\" src=\"https://wangchujiang.com/appicon/key-clicker.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6739052447\" title=\"DayBar for macOS\"\u003e\u003cimg alt=\"DayBar\" height=\"52\" src=\"https://wangchujiang.com/appicon/daybar.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6739444407\" title=\"Iconed for macOS\"\u003e\u003cimg alt=\"Iconed\" height=\"52\" src=\"https://wangchujiang.com/appicon/iconed.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6737160756\" title=\"Menuist for macOS\"\u003e\u003cimg alt=\"Menuist\" height=\"52\" src=\"https://wangchujiang.com/appicon/rightmenu-master.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6723903021\" title=\"Paste Quick for macOS\"\u003e\u003cimg alt=\"Quick RSS\" height=\"52\" src=\"https://wangchujiang.com/appicon/paste-quick.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6670696072\u0026platform=mac\" title=\"Quick RSS for macOS/iOS\"\u003e\u003cimg alt=\"Quick RSS\" height=\"52\" src=\"https://wangchujiang.com/appicon/quick-rss.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6670167443\" title=\"Web Serve for macOS\"\u003e\u003cimg alt=\"Web Serve\" height=\"52\" src=\"https://wangchujiang.com/appicon/web-serve.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6503953628\u0026platform=mac\" title=\"Copybook Generator for macOS/iOS\"\u003e\u003cimg alt=\"Copybook Generator\" height=\"52\" src=\"https://wangchujiang.com/appicon/copybook-generator.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6471227008\u0026platform=mac\" title=\"DevTutor for macOS/iOS\"\u003e\u003cimg alt=\"DevTutor for SwiftUI\" height=\"52\" src=\"https://wangchujiang.com/appicon/devtutor.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6479819388\u0026platform=mac\" title=\"RegexMate for macOS/iOS\"\u003e\u003cimg alt=\"RegexMate\" height=\"52\" src=\"https://wangchujiang.com/appicon/regex-mate.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6479194014\u0026platform=mac\" title=\"Time Passage for macOS/iOS\"\u003e\u003cimg alt=\"Time Passage\" height=\"52\" src=\"https://wangchujiang.com/appicon/time-passage.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6478772538\" title=\"IconizeFolder for macOS\"\u003e\u003cimg alt=\"Iconize Folder\" height=\"52\" src=\"https://wangchujiang.com/appicon/iconize-folder.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6478511402\u0026platform=mac\" title=\"Textsound Saver for macOS/iOS\"\u003e\u003cimg alt=\"Textsound Saver\" height=\"52\" src=\"https://wangchujiang.com/appicon/textsound-saver.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6476924627\" title=\"Create Custom Symbols for macOS\"\u003e\u003cimg alt=\"Create Custom Symbols\" height=\"52\" src=\"https://wangchujiang.com/appicon/create-custom-symbols.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6476452351\" title=\"DevHub for macOS\"\u003e\u003cimg alt=\"DevHub\" height=\"52\" src=\"https://wangchujiang.com/appicon/devhub.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6476400184\" title=\"Resume Revise for macOS\"\u003e\u003cimg alt=\"Resume Revise\" height=\"52\" src=\"https://wangchujiang.com/appicon/resume-revise.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6472593276\" title=\"Palette Genius for macOS\"\u003e\u003cimg alt=\"Palette Genius\" height=\"52\" src=\"https://wangchujiang.com/appicon/palette-genius.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6470879005\" title=\"Symbol Scribe for macOS\"\u003e\u003cimg alt=\"Symbol Scribe\" height=\"52\" src=\"https://wangchujiang.com/appicon/symbol-scribe.png\"\u003e\u003c/a\u003e\n\u003c/div\u003e\n\u003chr\u003e\n\nStoreKit Helper\n===\n\n[中文](./README.zh.md)\n\nA lightweight StoreKit2 wrapper designed specifically for SwiftUI, making in-app purchases implementation simpler and more intuitive.\n\n![StoreKit Helper](https://github.com/user-attachments/assets/d0d27552-9d2d-4a09-8d8d-b96b3b3648a9)\n\n## Documentation\n\nPlease refer to the detailed `StoreKitHelper` [documentation](https://github.com/jaywcjlove/devtutor) in [DevTutor](https://github.com/jaywcjlove/devtutor), which includes multiple quick start examples, custom payment interface examples, and API references, providing comprehensive examples and guidance.\n\n## Features\n\n- 🚀 **SwiftUI Native**: Designed specifically for SwiftUI with `@ObservableObject` and `@EnvironmentObject` support\n- 💡 **Simple API**: Clean and intuitive interface for managing in-app purchases\n- 🔄 **Automatic Updates**: Real-time transaction monitoring and status updates\n- ✅ **Type Safe**: Protocol-based product definitions with compile-time safety\n- 🧪 **Testable**: Fully testable architecture with comprehensive test case coverage [ExampleTests.swift](https://github.com/jaywcjlove/StoreKitHelper/blob/main/Example/ExampleTests/ExampleTests.swift)/[StoreKitHelperTests.swift](https://github.com/jaywcjlove/StoreKitHelper/blob/main/Tests/StoreKitHelperTests/StoreKitHelperTests.swift)\n\n## Usage\n\nCreate and inject a `StoreContext` instance at your SwiftUI app's entry point, which is responsible for loading the product list and tracking purchase status.\n\n```swift\nimport StoreKitHelper\n\nenum AppProduct: String, InAppProduct {\n    case lifetime = \"focuscursor.lifetime\"\n    case monthly = \"focuscursor.monthly\"\n    var id: String { rawValue }\n}\n\n@main struct DevTutorApp: App {\n    @StateObject var store = StoreContext(products: AppProduct.allCases)\n    var body: some Scene {\n        WindowGroup {\n            ContentView().environmentObject(store)\n        }\n    }\n}\n```\n\n`StoreContext` exposes a tri-state purchase status. At app launch, `purchaseStatus` starts as `.loading` until `Transaction.currentEntitlements` finishes its first sync. During this stage, `hasPurchased` and `hasNotPurchased` both return `false`, so startup code will not accidentally treat the user as \"not purchased\".\n\n```swift\nswitch store.purchaseStatus {\ncase .loading:\n    // Purchase state is still being resolved\ncase .purchased:\n    // ✅ User has active purchases\ncase .notPurchased:\n    // 🧾 User has no active purchases\n}\n```\n\nRecommended usage:\n\n```swift\n@EnvironmentObject var store: StoreContext\n\nvar body: some View {\n    switch store.purchaseStatus {\n    case .loading:\n        ProgressView(\"Checking purchases...\")\n    case .purchased:\n        // ✅ User has purchased - show full functionality\n    case .notPurchased:\n        // 🧾 User hasn't purchased - show limited content or purchase prompt\n    }\n}\n```\n\nThe default purchase call remains unchanged:\n\n```swift\nawait store.purchase(product)\n```\n\nIf you need StoreKit purchase options, you can now pass them through directly:\n\n```swift\nawait store.purchase(product, options: [\n    .appAccountToken(appAccountToken)\n])\n```\n\nCompatible legacy usage:\n\n```swift\n@EnvironmentObject var store: StoreContext\n\nvar body: some View {\n    if store.hasResolvedPurchaseStatus == false {\n        ProgressView(\"Checking purchases...\")\n    } else if store.hasNotPurchased == true {\n        // 🧾 User hasn't purchased - show limited content or purchase prompt\n    } else if store.hasPurchased == true {\n        // ✅ User has purchased - show full functionality\n    }\n}\n```\n\n## Localization\n\nIf you need to read localization strings from `StoreKitHelper` outside the package, use `StoreKitHelperL18n.localized(...)`.\n\nThis API resolves strings from the package resource bundle and avoids symbol conflicts with custom `String` extensions in the host app.\n\n```swift\nimport StoreKitHelper\n\nlet locale = Locale(identifier: Locale.preferredLanguages.first ?? \"en\")\nlet title = StoreKitHelperL18n.localized(\n    key: \"purchase_failed\",\n    locale: locale\n)\n```\n\n## StoreKitHelperView\n\nUse `StoreKitHelperView` to directly display in-app purchase popup views and configure various parameters through a chainable API.\n\n```swift\nstruct PurchaseContent: View {\n    @EnvironmentObject var store: StoreContext\n    var body: some View {\n        let locale: Locale = Locale(identifier: Locale.preferredLanguages.first ?? \"en\")\n        StoreKitHelperView()\n            .environment(\\.locale, .init(identifier: locale.identifier))\n            .environment(\\.pricingContent, { AnyView(PricingContent()) })\n            .environment(\\.popupDismissHandle, {\n                // Triggered when the popup is dismissed \n                // (e.g., user clicks the close button)\n                store.isShowingPurchasePopup = false\n            })\n            .environment(\\.termsOfServiceHandle, {\n                // Action triggered when the [Terms of Service] button is clicked\n            })\n            .environment(\\.privacyPolicyHandle, {\n                // Action triggered when the [Privacy Policy] button is clicked\n            })\n            .frame(maxWidth: 300)\n            .frame(minWidth: 260)\n    }\n}\n```\n\nClick to open the paid product list interface.\n\n```swift\nstruct ContentView: View {\n    @EnvironmentObject var store: StoreContext\n    var body: some View {\n        if store.hasNotPurchased == true, store.isLoading == false {\n            PurchasePopupButton()\n                .sheet(isPresented: $store.isShowingPurchasePopup) {\n                    PurchaseContent()\n                }\n        }\n    }\n}\n```\n\n## StoreKitHelperSelectionView\n\nSimilar to `StoreKitHelperView`, but for selecting purchase items to make payments.\n\n```swift\nstruct PurchaseContent: View {\n    @EnvironmentObject var store: StoreContext\n    var body: some View {\n        let locale: Locale = Locale(identifier: Locale.preferredLanguages.first ?? \"en\")\n        StoreKitHelperSelectionView()\n            .environment(\\.locale, .init(identifier: locale.identifier))\n            .environment(\\.pricingContent, { AnyView(PricingContent()) })\n            .environment(\\.popupDismissHandle, {\n                // Triggered when the popup is dismissed \n                // (e.g., user clicks the close button)\n                store.isShowingPurchasePopup = false\n            })\n            .environment(\\.termsOfServiceHandle, {\n                // Action triggered when the [Terms of Service] button is clicked\n            })\n            .environment(\\.privacyPolicyHandle, {\n                // Action triggered when the [Privacy Policy] button is clicked\n            })\n            .frame(maxWidth: 300)\n            .frame(minWidth: 260)\n    }\n}\n```\n\n## API Reference\n\n### InAppProduct Protocol\n\n```swift\nprotocol InAppProduct: CaseIterable {\n    var id: String { get }\n}\n```\n\n### PurchaseStatus\n\n```swift\nenum PurchaseStatus {\n    case loading\n    case purchased\n    case notPurchased\n}\n```\n\n### StoreContext Properties\n\n- `products: [Product]` - Available products from the App Store\n- `purchasedProductIDs: Set\u003cString\u003e` - Set of purchased product identifiers\n- `purchaseStatus: PurchaseStatus` - Current purchase state: `.loading`, `.purchased`, or `.notPurchased`\n- `hasResolvedPurchaseStatus: Bool` - Whether the initial purchase state sync has completed\n- `hasNotPurchased: Bool` - Whether the user hasn't purchased any products after purchase state resolution\n- `hasPurchased: Bool` - Whether the user has purchased any products after purchase state resolution\n- `isLoading: Bool` - Whether products are currently loading\n- `errorMessage: String?` - Current error message, if any\n\n### StoreContext Methods\n\n- `purchase(_ product: Product, options: Set\u003cProduct.PurchaseOption\u003e = [])` - Purchase a specific product, optionally forwarding StoreKit purchase options\n- `restorePurchases()` - Restore previous purchases\n- `isPurchased(_ productID: ProductID) -\u003e Bool` - Check if a product is purchased by ID\n- `isPurchased(_ product: InAppProduct) -\u003e Bool` - Check if a product is purchased\n- `product(for productID: ProductID) -\u003e Product?` - Get product by ID\n- `product(for product: InAppProduct) -\u003e Product?` - Get product by InAppProduct\n\n## License\n\nLicensed under the MIT License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjaywcjlove%2Fstorekithelper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjaywcjlove%2Fstorekithelper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjaywcjlove%2Fstorekithelper/lists"}