{"id":13314775,"url":"https://github.com/prof18/kmp-fatframework-cocoa","last_synced_at":"2026-01-14T03:23:10.737Z","repository":{"id":71273017,"uuid":"332324991","full_name":"prof18/kmp-fatframework-cocoa","owner":"prof18","description":"A Gradle plugin to generate and publish an iOs FatFramework or XCFramework on Kotlin Multiplatform projects.","archived":true,"fork":false,"pushed_at":"2022-07-24T18:23:07.000Z","size":252,"stargazers_count":27,"open_issues_count":1,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-10T21:38:32.130Z","etag":null,"topics":["cocoapod","cocoapods","gradle-plugin","kotlin-multiplatform","xcframework"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/prof18.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},"funding":{"custom":"https://www.paypal.me/MarcoGomiero"}},"created_at":"2021-01-23T22:57:24.000Z","updated_at":"2023-05-15T08:04:47.000Z","dependencies_parsed_at":null,"dependency_job_id":"9c392b79-a898-4e7f-8720-3fa59c014b60","html_url":"https://github.com/prof18/kmp-fatframework-cocoa","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/prof18/kmp-fatframework-cocoa","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prof18%2Fkmp-fatframework-cocoa","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prof18%2Fkmp-fatframework-cocoa/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prof18%2Fkmp-fatframework-cocoa/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prof18%2Fkmp-fatframework-cocoa/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/prof18","download_url":"https://codeload.github.com/prof18/kmp-fatframework-cocoa/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prof18%2Fkmp-fatframework-cocoa/sbom","scorecard":{"id":745995,"data":{"date":"2025-08-11","repo":{"name":"github.com/prof18/kmp-fatframework-cocoa","commit":"0fbd5dfcac4de2d317b982e9e190e915c654f308"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.9,"checks":[{"name":"Binary-Artifacts","score":9,"reason":"binaries present in source code","details":["Warn: binary detected: gradle/wrapper/gradle-wrapper.jar:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Maintained","score":0,"reason":"project is archived","details":["Warn: Repository is archived."],"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}}]},"last_synced_at":"2025-08-22T18:44:37.743Z","repository_id":71273017,"created_at":"2025-08-22T18:44:37.743Z","updated_at":"2025-08-22T18:44:37.743Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28408828,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T01:52:23.358Z","status":"online","status_checked_at":"2026-01-14T02:00:06.678Z","response_time":107,"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":["cocoapod","cocoapods","gradle-plugin","kotlin-multiplatform","xcframework"],"created_at":"2024-07-29T18:12:08.632Z","updated_at":"2026-01-14T03:23:10.732Z","avatar_url":"https://github.com/prof18.png","language":"Kotlin","funding_links":["https://www.paypal.me/MarcoGomiero"],"categories":[],"sub_categories":[],"readme":"This plugin has been archived in favour of [KMP Framework Bundler](https://github.com/prof18/kmp-framework-bundler). You can find a migration guide [here](https://github.com/prof18/kmp-framework-bundler#migration-from-kmp-fatframework-cocoa)\n\n# KMP FatFramework Cocoa\n\n[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.prof18.kmp.fatframework.cocoa/com.prof18.kmp.fatframework.cocoa.gradle.plugin/badge.svg)](https://search.maven.org/artifact/com.prof18.kmp.fatframework.cocoa/com.prof18.kmp.fatframework.cocoa.gradle.plugin/)\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)\n\n**KMP FatFramework Cocoa** is a Gradle plugin for Kotlin Multiplatform projects that generates a **FatFramework** for iOS targets, or a **XCFramework**\nfor Apple targets and manages the publishing process in a CocoaPod Repository.\n\n## Installation\n\nThe library is uploaded on MavenCentral, so you can easily add the dependency on the `plugins` block:\n\n```kotlin\nplugins {\n    id(\"com.prof18.kmp.fatframework.cocoa\") version \"\u003clatest-version\u003e\"\n}\n```\n\n## Usage\n\nThe plugin adds five Gradle tasks to your project.\n\n- `buildDebugIosFatFramework` that creates a **FatFramework** with the `Debug` target.\n\n\n- `buildDebugXCFramework` that creates a **XCFramework** with the `Debug` target.\n\n\n- `buildReleaseIosFatFramework` that creates a **FatFramework** with the `Release` target.\n\n\n- `buildReleaseXCFramework` that creates a **XCFramework** with the `Release` target.\n\n\n- `generateCocoaPodRepo` that generates a CocoaPod repository ready to host the Framework.\n\n\n- `publishDebugIosFatFramework` that publishes the `Debug` version of the **FatFramework** in the CocoaPod repository.\n\n\n- `publishDebugXCFramework` that publishes the `Debug` version of the **XCFramework** in the CocoaPod repository.\n  \u003cbr\u003e\u003cbr\u003e\n  The \"publishDebug\" task (for both the type of frameworks) takes care of everything:\n  - changing the working branch from main/master to develop;\n  - building the debug framework;\n  - updating the version name inside the Podspec file;\n  - committing the changes;\n  - and publishing to remote.\n\n  In this way, in the iOS project, you can use the latest changes published on the develop branch:\n\n  ```ruby\n  pod '\u003cyour-library-name\u003e', :git =\u003e \"git@github.com:\u003cgit-username\u003e/\u003crepo-name\u003e.git\", :branch =\u003e 'develop'\n  ```\n  To run this task, the output path provided in the [configuration](#configuration) must be a git repository.\n\n\n- `publishReleaseIosFatFramework` that publishes the `Release` version of the **FatFramework** in the CocoaPod repository.\n\n\n- `publishReleaseXCFramework` that publishes the `Release` version of the **XCFramework** in the CocoaPod repository.\n  \u003cbr\u003e\u003cbr\u003e\n  The \"publishRelease\" task (for both the type of frameworks) takes care of everything:\n  - changing the working branch from develop to main/master;\n  - building the release framework;\n  - updating the version name inside the Podspec file;\n  - committing the changes;\n  - tagging the commit;\n  - and publishing to remote.\n\n  In this way, in the iOS project, you have to specify a version:\n\n  ```ruby\n  pod '\u003cyour-library-name\u003e', :git =\u003e \"git@github.com:\u003cgit-username\u003e/\u003crepo-name\u003e.git\", :tag =\u003e '\u003cversion-number\u003e'\n  ```\n\n  To run this task, the output path provided in the [configuration](#configuration) must be a git repository.\n\n## Configuration\n\nYou can configure the plugin with the `fatFrameworkCocoaConfig` block in your `build.gradle[.kts]`.\n\nThe mandatory fields are three:\n\n- the name of the FatFramework\n- the output path\n- the version name\n- For XCFramework support, you need to set the `useXCFramework` flag. When the flag is set, only the XCFramework task can be called.\n\n```kotlin\nfatFrameworkCocoaConfig {\n    frameworkName = \"LibraryName\"\n    outputPath = \"$rootDir/../test-dest\"\n    versionName = \"1.0\"\n    useXCFramework = true\n}\n```\n\nWhen using a FatFramework, only iOS targets can be packed together. With XCFramework you can pack together all the Apple families: iOS, macOS, etc.\n\nIf you want to run the `generateCocoaPodRepo` task to generate a CocoaPod repository, you have to\nprovide the mandatory fields mentioned above and some other parameters in the `cocoaPodRepoInfo` block:\n\n- a summary of the library\n- the homepage of the library\n- the license of the library\n- the authors of the library\n- the url of the git repository that hosts the CocoaPod repo.\n\n```kotlin\nfatFrameworkCocoaConfig {\n    frameworkName = \"LibraryName\"\n    outputPath = \"$rootDir/../test-dest\"\n    versionName = \"1.0\"\n\n    cocoaPodRepoInfo {\n        summary = \"This is a test KMP framework\"\n        homepage = \"https://github.com/prof18/ccoca-repo-test\"\n        license = \"Apache\"\n        authors = \"\\\"Marco Gomiero\\\" =\u003e \\\"mg@mail.it\\\"\"\n        gitUrl = \"git@github.com:prof18/ccoca-repo-test.git\"\n    }\n}\n```\n\n## Changelog\n\n- The version `0.2.1` introduce some breaking changes to better support XCFrameworks. Give a look to the [0.2.1 release notes](https://github.com/prof18/kmp-fatframework-cocoa/releases/tag/0.2.1).\n\n## Sample Project\n\nTo see the plugin in action, I've published [a little sample project](https://github.com/prof18/kmp-fatframework-test-project).\n\n## Further Readings\n\nThis plugin is born from a set of unbundled Gradle tasks that I was copying between every Kotlin Multiplatform project.\nI've written about these\ntasks [in an article on my website](https://www.marcogomiero.com/posts/2021/kmp-existing-project/).\n\nFor more info about CocoaPod repo, I suggest reading the following resources:\n\n- https://guides.cocoapods.org/making/private-cocoapods.html\n- https://guides.cocoapods.org/\n\n## License\n\n```\n   Copyright 2021 Marco Gomiero\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprof18%2Fkmp-fatframework-cocoa","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fprof18%2Fkmp-fatframework-cocoa","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprof18%2Fkmp-fatframework-cocoa/lists"}