{"id":25144428,"url":"https://github.com/openmf/kmp-project-template","last_synced_at":"2026-03-08T22:32:37.964Z","repository":{"id":264907210,"uuid":"878606241","full_name":"openMF/kmp-project-template","owner":"openMF","description":"The Kotlin Multiplatform Multi-module Template generator simplifies cross-platform development by enabling shared business logic and UI components across Android, iOS, Desktop, and Web, while retaining native platform functionality.","archived":false,"fork":false,"pushed_at":"2026-03-01T05:06:06.000Z","size":7147,"stargazers_count":58,"open_issues_count":9,"forks_count":36,"subscribers_count":4,"default_branch":"dev","last_synced_at":"2026-03-06T13:44:16.583Z","etag":null,"topics":["compose-multiplatform","kmp","kmp-template","kmp-wizard","kotlin-multiplatform","wizard"],"latest_commit_sha":null,"homepage":"https://openmf.github.io/kmp-project-template/","language":"Kotlin","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/openMF.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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}},"created_at":"2024-10-25T17:47:36.000Z","updated_at":"2026-03-03T11:56:29.000Z","dependencies_parsed_at":"2025-01-01T03:16:47.020Z","dependency_job_id":"eca7e54b-e073-4d26-8e00-0e7473b28809","html_url":"https://github.com/openMF/kmp-project-template","commit_stats":null,"previous_names":["openmf/mobile-cmp-template","openmf/kmp-project-template"],"tags_count":36,"template":true,"template_full_name":null,"purl":"pkg:github/openMF/kmp-project-template","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openMF%2Fkmp-project-template","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openMF%2Fkmp-project-template/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openMF%2Fkmp-project-template/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openMF%2Fkmp-project-template/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/openMF","download_url":"https://codeload.github.com/openMF/kmp-project-template/tar.gz/refs/heads/dev","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openMF%2Fkmp-project-template/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30275546,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-08T20:45:49.896Z","status":"ssl_error","status_checked_at":"2026-03-08T20:45:49.525Z","response_time":56,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["compose-multiplatform","kmp","kmp-template","kmp-wizard","kotlin-multiplatform","wizard"],"created_at":"2025-02-08T19:46:15.631Z","updated_at":"2026-03-08T22:32:37.937Z","avatar_url":"https://github.com/openMF.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"https://github.com/user-attachments/assets/ab2f5bf9-5b88-4fee-90e9-741e3b3f7a26\" alt=\"Project Logo\" width=\"150\" style=\"margin-right: 20px;\" /\u003e\n\n\u003ch1\u003eKMP Multi-Module Project Generator\u003c/h1\u003e\n\n\u003cp\u003e 🚀 The Ultimate Kotlin Multiplatform Project Generator with Production-Ready Setup\u003c/p\u003e\n\n![Kotlin](https://img.shields.io/badge/Kotlin-7f52ff?style=flat-square\u0026logo=kotlin\u0026logoColor=white)\n![Kotlin Multiplatform](https://img.shields.io/badge/Kotlin%20Multiplatform-4c8d3f?style=flat-square\u0026logo=kotlin\u0026logoColor=white)\n![Compose Multiplatform](https://img.shields.io/badge/Jetpack%20Compose%20Multiplatform-000000?style=flat-square\u0026logo=android\u0026logoColor=white)\n\n![badge-android](http://img.shields.io/badge/platform-android-6EDB8D.svg?style=flat)\n![badge-ios](http://img.shields.io/badge/platform-ios-CDCDCD.svg?style=flat)\n![badge-desktop](http://img.shields.io/badge/platform-desktop-DB413D.svg?style=flat)\n![badge-js](http://img.shields.io/badge/platform-web-FDD835.svg?style=flat)\n\n[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)\n[![GitHub license](https://img.shields.io/github/license/Naereen/StrapDown.js.svg)](https://github.com/openMF/kmp-project-template/blob/development/LICENSE)\n[![GitHub release](https://img.shields.io/github/release/Naereen/StrapDown.js.svg)](https://github.com/openMF/kmp-project-template/releases/)\n[![GitHub issues](https://img.shields.io/github/issues/Naereen/StrapDown.js.svg)](https://github.com/openMF/kmp-project-template/issues/)\n\n[![Pr Checks](https://github.com/openMF/kmp-project-template/actions/workflows/pr-check.yml/badge.svg)](https://github.com/openMF/kmp-project-template/actions/workflows/pr-check.yml)\n[![Slack](https://img.shields.io/badge/Slack-4A154B?style=flat-square\u0026logo=slack\u0026logoColor=white)](https://join.slack.com/t/mifos/shared_invite/zt-2wvi9t82t-DuSBdqdQVOY9fsqsLjkKPA)\n[![Jira](https://img.shields.io/badge/jira-%230A0FFF.svg?style=flat-square\u0026logo=jira\u0026logoColor=white)](https://mifosforge.jira.com/jira/software/c/projects/KMPPT/boards/63)\n\n\u003c/div\u003e\n\n\n\u003e \\[!Note]\n\u003e\n\u003e This branch is designed for partial customized projects. Running the `customizer.sh` script\n\u003e doesn't rename any application module, instead it'll change all `core` and `feature` module\n\u003e namespaces, packages, and other related configurations accordingly.\n\u003e and change your android and desktop application id and namespace in `libs.versions.toml` file.\n\u003e\n\u003e For full customization, please use the `full-customizable` branch instead.\n\n## 🌟 Key Features\n\n### 📱 Cross-Platform Support\n\n- **Android**: Native Android app with Jetpack Compose\n- **iOS**: Native iOS app with SwiftUI integration\n- **Desktop**: JVM-based desktop application\n- **Web**: Kotlin/JS with Compose Web\n- **Shared Logic**: Common business logic across all platforms\n\n### 🏗️ Architecture \u0026 Structure\n\n- **Multi-Module Design**: Organized, scalable architecture\n- **Clean Architecture**: Separation of concerns with domain, data, and presentation layers\n- **Feature-First Modularization**: Independent feature modules for better maintainability\n- **Shared UI Components**: Reusable Compose Multiplatform components\n- **Platform-Specific Optimizations**: Native capabilities while maximizing code sharing\n\n### 🛠️ Development Tools\n\n- **Gradle Kotlin DSL**: Modern build configuration\n- **Version Catalogs**: Centralized dependency management\n- **Type-Safe Accessors**: Improved build script maintainability\n- **Custom Gradle Plugins**: Streamlined build process\n- **Run Configurations**: Pre-configured for all platforms\n\n### 🔍 Code Quality\n\n- **Static Analysis**: Detekt for code quality checks\n- **Code Formatting**: Spotless integration\n- **Git Hooks**: Automated pre-commit checks\n- **Style Guide Enforcement**: Consistent coding standards\n- **Automated Testing**: Unit and integration test setup\n\n### 📦 CI/CD Integration\n\n- **GitHub Actions**: Automated build and test workflows\n- **PR Checks**: Automated pull request validation\n- **Fastlane Integration**: Automated deployment for Android and iOS\n- **Dynamic Versioning**: Automated version management\n- **Release Notes Generation**: Automated changelog creation\n\n### 🎨 UI/UX Components\n\n- **Design System**: Consistent styling across platforms\n- **Theme Support**: Light/dark mode compatibility\n- **UI Components**: Pre-built, customizable widgets\n- **Resources Management**: Efficient asset handling\n- **Accessibility**: Built-in accessibility support\n\n### 💾 Data Management\n\n- **DataStore Integration**: Efficient local storage\n- **Network Layer**: API client setup\n- **Caching Strategy**: Optimized data caching\n- **Analytics Integration**: Ready-to-use analytics setup\n- **Error Handling**: Comprehensive error management\n\n### 🔄 Sync Capabilities\n\n- **Enhanced Directory Sync**: Comprehensive sync system for all project components\n- **GitHub Actions Integration**: Automated weekly sync workflow with PR generation\n- **Advanced Sync Script**: Feature-rich bash script with safety measures\n- **Comprehensive Sync Coverage**: Syncs the following components:\n    - **Applications**: cmp-android, cmp-desktop, cmp-ios, cmp-web\n    - **Build System**: build-logic\n    - **Tools**: fastlane, scripts\n    - **Configuration**: config, .github, .run\n    - **Core Files**: Gemfile, Gemfile.lock, ci-prepush scripts\n- **Safety Features**: Automatic backups, error handling, and dry-run mode\n- **Change Validation**: Smart detection of necessary updates\n\n## 🚀 Quick Start\n\n### Prerequisites\n\n- Bash 4.0+\n- Unix-like environment (macOS, Linux) or Git Bash on Windows\n- Android Studio/IntelliJ IDEA\n- Xcode (for iOS development)\n- Node.js (for web development)\n\n### Installation\n\n1. **Clone the Repository**\n\n    ```bash\n    git clone https://github.com/openMF/kmp-project-template.git\n    cd kmp-project-template\n    ```\n\n2. **Run the Customizer**\n\n    ```bash\n    ./customizer.sh org.example.myapp MyKMPProject\n    ```\n\n3. **Build and Run**\n\n    ```bash\n    ./gradlew build\n    ```\n\n### Fastlane Configuration\n\n- **Version Generation**: Supports git, Firebase, and Play Store-based versioning\n- **Release Notes Generation**: Simple and full release notes generation\n- **CI/CD Integration**: GitHub Actions and GitLab CI examples\n- **Best Practices**: Securely manage sensitive data in CI/CD\n- **Automated Deployment**: Firebase and Play Store deployment scripts\n- **Testing**: Automated testing and deployment in staging environment\n- **Dependency Management**: Keep Fastlane and plugins updated\n- **Staging Environment**: Test deployment scripts in a staging environment\n- **Configuration**: Update platform specific configurations in `fastlane-config` directory\n\n### Using the Sync System\n\n#### Manual Sync with Advanced Options\n\n```bash\n# Basic sync\n./sync-dirs.sh\n\n# Dry run to preview changes\n./sync-dirs.sh --dry-run\n\n# Force sync without prompts\n./sync-dirs.sh --force\n\n# Both dry run and force mode\n./sync-dirs.sh --dry-run --force\n```\n\n#### Script Features\n\n- **Backup System**: Automatic backup of existing files before modification\n- **Error Handling**: Comprehensive error detection and recovery\n- **Progress Indication**: Visual feedback during sync operations\n- **Logging**: Detailed logs of all operations\n- **Dry Run Mode**: Preview changes without applying them\n- **Force Mode**: Non-interactive operation for automation\n\n#### Automated GitHub Workflow\n\nThe repository includes an enhanced GitHub workflow (`sync-dirs.yml`) that:\n\n- Runs automatically every Monday at midnight UTC\n- Supports manual triggering from GitHub Actions UI\n- Creates detailed pull requests for review\n- Includes comprehensive change logs\n- Handles all sync components safely\n- Maintains proper git history\n\n#### Required Workflow Permissions Setup\n\n1. Go to your repository's **Settings**\n2. Navigate to **Actions** \u003e **General** in the left sidebar\n3. Scroll down to **Workflow permissions**\n4. Enable the following permissions:\n\n    - ✅ Select \"**Read and write permissions**\"\n    - ✅ Check \"**Allow GitHub Actions to create and approve pull requests**\"\n\n5. Click \"**Save**\" to apply the changes\n\n![Workflow Permissions](https://github.com/user-attachments/assets/ca16a700-8838-4d6f-9ac3-c681107a2ce0)\n\n---\n\n#### How to Create a PAT Token and Save It as a Repository or Organization Secret\n\nTo use the `sync-dirs.yml` workflow effectively, follow these steps to create a Personal Access\nToken (PAT) with the required scopes and save it as a secret:\n\n---\n\n#### 1. **Create a Personal Access Token (PAT)**\n\n1. Log in to your GitHub account.\n2. Go to your [Developer Settings \u003e Personal Access Tokens](https://github.com/settings/tokens).\n3. Click **Generate new token (classic)** or select **Fine-grained tokens** if classic tokens are\n   deprecated.\n4. Fill in the following details:\n    - **Note**: Add a meaningful name like `Sync Workflow Token`.\n    - **Expiration**: Choose an expiration period (e.g., 30 or 90 days). For long-term usage,\n      select \"No\n      Expiration,\" but ensure the token is rotated periodically.\n    - **Scopes**:\n        - ✅ `repo` – Full control of private repositories (for accessing the repository).\n        - ✅ `workflow` – To manage and trigger workflows.\n        - ✅ `write:packages` – To publish and write packages (if applicable).\n\n5. Click **Generate token**.\n6. Copy the token immediately and save it securely. You won’t be able to view it again.\n\n---\n\n#### 2. **Save the PAT Token as a Secret**\n\n##### **For a Repository**:\n\n1. Navigate to the repository where the workflow resides.\n2. Go to **Settings** \u003e **Secrets and variables** \u003e **Actions**.\n3. Click **New repository secret**.\n4. Enter the following details:\n    - **Name**: `PAT_TOKEN`\n    - **Value**: Paste the PAT token you copied earlier.\n5. Click **Add secret**.\n\n##### **For an Organization**:\n\n1. Navigate to the organization settings.\n2. Go to **Settings** \u003e **Secrets and variables** \u003e **Actions**.\n3. Click **New organization secret**.\n4. Enter the following details:\n    - **Name**: `PAT_TOKEN`\n    - **Value**: Paste the PAT token you copied earlier.\n\n5. Choose the repositories where this secret will be available.\n6. Click **Add secret**.\n\n---\n\n## 📁 Project Structure\n\n### Core Modules\n\n```\ncore/\n├── analytics/    # Analytics and tracking\n├── common/       # Shared utilities and extensions\n├── data/         # Data layer implementation\n├── datastore/    # Local storage management\n├── domain/       # Business logic and use cases\n├── model/        # Data models and entities\n├── network/      # Network communication\n├── ui/           # Shared UI components\n└── designsystem/ # Design system components\n```\n\n### Feature Modules\n\n```\nfeature/\n├── home/        # Home screen features\n├── profile/     # User profile management\n└── settings/    # App settings\n```\n\n### Platform-Specific\n\n```\ncmp-android/     # Android app\ncmp-ios/         # iOS app\ncmp-desktop/     # Desktop app\ncmp-web/         # Web app\ncmp-shared/      # Shared code\ncmp-navigation/  # Navigation components\n```\n\n## 🔄 Module Dependencies\n\n```mermaid\ngraph TD\n    A[Project Root] --\u003e B[buildLogic]\n    A --\u003e C[core]\n    A --\u003e D[feature]\n    A --\u003e E[Platform Modules]\n    C --\u003e C1[common]\n    C --\u003e C2[model]\n    C --\u003e C3[data]\n    C --\u003e C4[network]\n    C --\u003e C5[domain]\n    C --\u003e C6[ui]\n    C --\u003e C7[designsystem]\n    C --\u003e C8[datastore]\n    D --\u003e D1[home]\n    D --\u003e D2[profile]\n    D --\u003e D3[settings]\n    E --\u003e E1[cmp-android]\n    E --\u003e E2[cmp-ios]\n    E --\u003e E3[cmp-desktop]\n    E --\u003e E4[cmp-web]\n    E --\u003e E5[cmp-shared]\n    E --\u003e E6[cmp-navigation]\n```\n\n## 🔄 Staying in Sync with Upstream\n\n### Manual Sync\n\n1. Use the provided `sync-dirs.sh` script to sync specific CMP directories\n2. Review changes before committing\n3. Push changes to your repository\n\n### Automated Sync\n\n1. The GitHub workflow automatically syncs directories weekly\n2. Review and merge the generated pull requests\n3. Manual sync can be triggered from GitHub Actions\n\n### Best Practices for Sync Management\n\n1. **Regular Syncs**: Keep up with upstream changes through weekly automated syncs\n2. **Review Changes**: Always review generated PRs carefully\n3. **Backup First**: Use --dry-run before actual sync operations\n4. **Conflict Resolution**: Handle merge conflicts promptly\n5. **Version Control**: Maintain clean git history during syncs\n\n## 🤝 Contributing\n\nWe welcome contributions! Here's how you can help:\n\n1. Fork the repository\n2. Create a feature branch: `git checkout -b feature/amazing-feature`\n3. Commit changes: `git commit -m 'Add amazing feature'`\n4. Push to the branch: `git push origin feature/amazing-feature`\n5. Open a pull request\n\n## 📚 Documentation\n\n\u003e Documentation is a work in progress.\n\n- [Setup Guide](docs/SETUP.md)\n- [Architecture Overview](docs/ARCHITECTURE.md)\n- [Contributing Guidelines](CONTRIBUTING.md)\n- [Code Style Guide](docs/STYLE_GUIDE.md)\n\n## 📫 Support\n\n- Join\n  our [Slack channel](https://join.slack.com/t/mifos/shared_invite/zt-2wvi9t82t-DuSBdqdQVOY9fsqsLjkKPA)\n- Report issues on [GitHub](https://github.com/openMF/kmp-project-template/issues)\n- Track progress\n  on [Jira](https://mifosforge.jira.com/jira/software/c/projects/KMPPT/boards/63)\n\n## 📄 License\n\nThis project is licensed under the [Mozilla Public License 2.0](LICENSE).","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenmf%2Fkmp-project-template","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fopenmf%2Fkmp-project-template","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenmf%2Fkmp-project-template/lists"}