{"id":24736693,"url":"https://github.com/mshdabiola/Kmtemplate","last_synced_at":"2025-10-10T05:31:26.847Z","repository":{"id":239164169,"uuid":"798743418","full_name":"mshdabiola/Hydraulic","owner":"mshdabiola","description":"Hydraulic is a template","archived":false,"fork":false,"pushed_at":"2025-01-09T10:55:21.000Z","size":12534,"stargazers_count":2,"open_issues_count":10,"forks_count":1,"subscribers_count":1,"default_branch":"develop","last_synced_at":"2025-01-09T11:42:44.864Z","etag":null,"topics":["android","compose-multiplatform","datastores","desktop","kotlin-multiplatform","linux","macos","room-database","windows"],"latest_commit_sha":null,"homepage":"https://mshdabiola.github.io/Hydraulic/","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mshdabiola.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-05-10T11:28:07.000Z","updated_at":"2025-01-04T23:40:47.000Z","dependencies_parsed_at":"2024-06-10T05:24:09.374Z","dependency_job_id":"b754cff4-7613-45cb-abc9-780c654bda44","html_url":"https://github.com/mshdabiola/Hydraulic","commit_stats":null,"previous_names":["mshdabiola/hydraulic"],"tags_count":65,"template":true,"template_full_name":"mshdabiola/SkeletonMultiplatform","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mshdabiola%2FHydraulic","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mshdabiola%2FHydraulic/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mshdabiola%2FHydraulic/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mshdabiola%2FHydraulic/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mshdabiola","download_url":"https://codeload.github.com/mshdabiola/Hydraulic/tar.gz/refs/heads/develop","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":235925009,"owners_count":19067034,"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","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":["android","compose-multiplatform","datastores","desktop","kotlin-multiplatform","linux","macos","room-database","windows"],"created_at":"2025-01-27T21:26:53.119Z","updated_at":"2025-10-10T05:31:26.841Z","avatar_url":"https://github.com/mshdabiola.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n \u003ca\u003e\n  \u003cimg alt=\"Kotlin\" src=\"https://img.shields.io/badge/Kotlin-Multiplatform-%237f52ff?logo=kotlin\u0026style=for-the-badge\"/\u003e\n\u003c/a\u003e\n  \u003cimg alt=\"Jetpack Compose\" src=\"https://img.shields.io/static/v1?style=for-the-badge\u0026message=Jetpack+Compose\u0026color=4285F4\u0026logo=Jetpack+Compose\u0026logoColor=FFFFFF\u0026label=\"/\u003e\n    \u003cimg alt=\"material\" src=\"https://custom-icon-badges.demolab.com/badge/material%20you-lightblue?style=for-the-badge\u0026logoColor=333\u0026logo=material-you\"/\u003e\n  \u003cbr\u003e\n  \u003cbr\u003e\n \u003ca href=\"\"\u003e\n\u003cimg src=\"https://tokei.rs/b1/github/mshdabiola/kmtemplate?category=code\u0026color=orange\u0026style=for-the-badge\" alt=\"\"/\u003e\n\u003c/a\u003e\n    \u003ca href=\"https://github.com/mshdabiola/kmtemplate/actions\"\u003e\n  \u003cimg alt=\"GitHub commits since tagged version (branch)\" src=\"https://img.shields.io/github/commits-since/mshdabiola/kmtemplate/1.0.0?color=palegreen\u0026label=Commits\u0026style=for-the-badge\"\u003e\n  \u003cimg alt=\"GitHub code size in bytes\" src=\"https://img.shields.io/github/languages/code-size/mshdabiola/kmtemplate?style=for-the-badge\u0026color=37ABB5\"\u003e\n  \u003cimg src=\"https://wakatime.com/badge/user/8e707c95-01e6-41d3-a760-223960f0cdf7.svg?style=for-the-badge\" alt=\"\"/\u003e\n\u003c/a\u003e\n  \u003cbr\u003e\n  \u003ca href=\"https://hits.sh/github.com/mshdabiola/kmtemplate/\"\u003e\n      \u003cimg alt=\"Hits\" src=\"https://hits.sh/github.com/mshdabiola/kmtemplate.svg?style=for-the-badge\u0026label=Views\u0026extraCount=7500\u0026color=ff3f6f\"/\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/mshdabiola/kmtemplate/releases\"\u003e\n      \u003cimg src=\"https://img.shields.io/github/downloads/mshdabiola/kmtemplate/total?color=orange\u0026style=for-the-badge\"/\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/mshdabiola/kmtemplate/stargazers\"\u003e\n      \u003cimg src=\"https://img.shields.io/github/stars/mshdabiola/kmtemplate?color=ffff00\u0026style=for-the-badge\"/\u003e\n  \u003c/a\u003e\n  \u003cbr\u003e\n  \u003ca href=\"https://github.com/mshdabiola/kmtemplate/releases/latest\"\u003e\n      \u003cimg src=\"https://img.shields.io/github/v/release/mshdabiola/kmtemplate?color=green\u0026logo=github\u0026style=for-the-badge\"/\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/mshdabiola/kmtemplate/releases/latest\"\u003e\n      \u003cimg src=\"https://img.shields.io/github/v/release/mshdabiola/kmtemplate?color=purple\u0026logo=github\u0026style=for-the-badge\u0026include_prereleases\u0026label=Pre%20Release%20\"/\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg alt=\"badge-Android\" src=\"https://img.shields.io/badge/Platform-Android-brightgreen\"/\u003e\n  \u003c!-- \u003cimg alt=\"badge-iOS\" src=\"https://img.shields.io/badge/Platform-iOS-lightgray\"/\u003e --\u003e\n  \u003cimg alt=\"badge-JVM\" src=\"https://img.shields.io/badge/Platform-JVM-orange\"/\u003e\n  \u003cimg alt=\"badge-macOS\" src=\"https://img.shields.io/badge/Platform-macOS-purple\"/\u003e\n  \u003cimg alt=\"badge-web\" src=\"https://img.shields.io/badge/Platform-Web-blue\"/\u003e\n  \u003ca href=\"https://codecov.io/github/mshdabiola/Kmtemplate\"\u003e\n    \u003cimg alt=\"codecov\" src=\"https://codecov.io/github/mshdabiola/Kmtemplate/graph/badge.svg?token=QEMUHWH4YW\"/\u003e\n  \u003c/a\u003e\n\u003c/div\u003e\n\n# Kmtemplate\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./fastlane/metadata/android/en-US/images/icon.png\" width=\"200\" /\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"images/screenshot.png\" width=\"800\" alt=\"Application Screenshot\" /\u003e\n\u003c/p\u003e\n\n\u003cdiv align=\"center\"\u003e\n\u003c!-- \u003ca href=\"https://apt.izzysoft.de/packages/com.mshdabiola.kmttemplate/\"\u003e\u003cimg src=\"https://gitlab.com/IzzyOnDroid/repo/-/raw/master/assets/IzzyOnDroid.png\" height=\"80\"\u003e\u003c/a\u003e --\u003e\n\u003ca href=\"https://f-droid.org/en/packages/com.mshdabiola.kmttemplate\"\u003e\u003cimg src=\"https://fdroid.gitlab.io/artwork/badge/get-it-on.png\" height=\"80\" alt=\"Get it on F-Droid\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://kmtemplate-download.onrender.com\"\u003e\u003cimg src=\"images/desktop-icon.png\" height=\"80\" alt=\"Download for Desktop\"\u003e\u003c/a\u003e\n   \u003ca href=\"https://kmtemplate.onrender.com/\"\u003e\u003cimg src=\"images/web-icon.png\" height=\"80\" alt=\"Try it on Web\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/mshdabiola/Kmtemplate/releases\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/NeoApplications/Neo-Backup/034b226cea5c1b30eb4f6a6f313e4dadcbb0ece4/badge_github.png\" height=\"80\" alt=\"Get it on Github\"\u003e\u003c/a\u003e\n\u003c/div\u003e\n\n\u003cbr\u003e\n\u003cbr\u003e\n\nKotlin Multiplatform Template is a robust project starter designed with a **modern multi-module architecture**. It enables seamless code sharing and modular development across **JVM**, **Android**, and **WASM** platforms. The template leverages Kotlin Multiplatform to maximize code reuse, maintainability, and scalability, making it ideal for building cross-platform applications with a clean separation of concerns and platform-specific optimizations.\n\nThis project focuses on promoting a modular, scalable, maintainable, and testable architecture. It incorporates a leading-edge tech stack and embodies the finest practices in software development. While the application may appear straightforward, it encompasses all the crucial components that lay the groundwork for a robust, large-scale application.\n\nThe design principles and architectural choices applied in this project are ideally suited for larger teams and extended application lifecycles.\n\n---\n\n## 🏗️ Architecture\n\nThis project follows **Clean Architecture** principles, ensuring a scalable, maintainable, and testable codebase. The architecture divides the application into three main layers with clear boundaries, promoting a strong separation of concerns.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"images/Architecture - overall.png\" width=\"800\" alt=\"Overall Architecture Diagram\" /\u003e\n\u003c/p\u003e\n\n### 💻 Presentation Layer\n\nThis layer is closest to what the user sees on the screen. It's responsible for managing the UI state and handling user interactions.\n\n* **View**: The UI components, built with **Compose Multiplatform**, that consume the UI state and present it to the user. They forward user interactions to the **ViewModel**.\n* **ViewModel**: Manages and stores UI-related data in a lifecycle-aware way. It exposes the **View State** to the View via observable state holders like **Kotlin Flow**. User actions trigger updates to this state.\n* **ViewState**: A common, immutable state for a single view, acting as a single source of truth.\n\n### 🧠 Domain Layer\n\nThis is the core layer of the application. It contains the business logic and is completely independent of other layers. Changes to the UI (Presentation) or data source (Data) will not affect this layer.\n\n* **UseCase**: Contains the application's business logic, orchestrating actions and data flow.\n* **DomainModel**: Defines the core structure of the data used within the application. This is the source of truth for all application data.\n* **Repository Interface**: An abstraction that defines the contract for data access. It allows the Domain layer to remain independent from the specific data implementation in the Data layer.\n\n### 💾 Data Layer\n\nThis layer is responsible for encapsulating application data. It provides the necessary data to the Domain layer and handles the details of data retrieval, storage, and synchronization.\n\n* **Repository**: Implements the repository interface defined in the Domain layer. It's responsible for fetching data from one or more data sources (e.g., network, local database).\n* **Mapper**: Transforms data from **Data Models** (e.g., API responses, database entities) into **Domain Models**, ensuring the Domain layer remains decoupled from the specific data source implementation.\n* **Data Sources**: The low-level implementation for data access, such as **Ktor** for network requests or **Room** for local database storage.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"images/Architecture - data.png\" width=\"800\" alt=\"Data Layer Architecture Diagram\" /\u003e\n\u003c/p\u003e\n\n---\n\n## 🧩 Modularization\n\nThe codebase is organized into multiple Gradle modules to improve maintainability, scalability, and reusability. This modular approach enables independent development, easier testing, and faster build times, while supporting code sharing across all supported platforms.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"images/Modularization.png\" width=\"800\" alt=\"Modularization Diagram\" /\u003e\n\u003c/p\u003e\n\n* **:app**: The main application module that wires everything together. It contains platform-specific code for each target (Android, JVM, WASM) and the entry points for the application.\n* **:features:**: Feature-specific modules (e.g., `main`, `detail`, `setting`) that contain all the code related to a given feature, including its Presentation, Domain, and Data layers.\n* **:modules**: Common library modules that are shared across different parts of the application. Examples include `designsystem`, `network`, `database`, `data`, and `domain`.\n\n---\n\n## 🛠️ Tech Stack \u0026 Open-source Libraries\n\nThis project leverages a modern, production-ready tech stack and a curated set of open-source libraries to ensure high performance, maintainability, and a delightful developer experience.\n\n* **Multiplatform**:\n    * **Kotlin Multiplatform (KMP)**: Enables code sharing of business logic across Android, JVM, and WASM platforms.\n    * **Jetpack Compose \u0026 Compose Multiplatform**: The modern, declarative UI toolkit for building native user interfaces across all platforms from a single codebase.\n* **Architecture**:\n    * **Clean Architecture**: A software architecture that promotes a scalable, maintainable, and testable codebase by separating concerns into distinct layers.\n    * **Kotlin Coroutines \u0026 Flow**: Used for asynchronous and reactive programming, providing a streamlined way to handle background operations and data streams.\n    * **Koin**: A pragmatic and lightweight dependency injection framework that simplifies dependency management.\n* **Data \u0026 Networking**:\n    * **Ktor**: An asynchronous HTTP client for making network requests across all platforms.\n    * **Kotlinx Serialization**: A powerful library for serializing and deserializing JSON data in a type-safe manner.\n    * **Room**: A local database library for structured data persistence on Android.\n    * **DataStore**: A modern and type-safe data storage solution for simple, key-value pairs or typed objects on Android.\n* **Testing \u0026 Quality**:\n    * **Spotless, ktlint, detekt**: Static analysis tools for enforcing consistent code formatting and detecting code smells.\n    * **JUnit 5 \u0026 Turbine**: Testing frameworks for writing robust unit and integration tests.\n    * **Jacoco**: A code coverage tool to measure the effectiveness of your test suite.\n* **Deployment**:\n    * **Hydraulic Conveyor**: A powerful tool to package and distribute desktop applications for Windows, macOS, and Linux.\n\n---\n\n## 📸 Screenshots\n\nSee the app in action across all supported screens:\n\n### 🤖 Android\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./fastlane/metadata/android/en-US/images/phoneScreenshots/1.png\" width=\"200\" alt=\"Android Home Screen Screenshot\" /\u003e\n  \u003cimg src=\"./fastlane/metadata/android/en-US/images/phoneScreenshots/2.png\" width=\"200\" alt=\"Android Settings Screen Screenshot\" /\u003e\n  \u003cimg src=\"./fastlane/metadata/android/en-US/images/phoneScreenshots/3.png\" width=\"200\" alt=\"Android Detail Screen Screenshot\" /\u003e\n  \u003cimg src=\"./fastlane/metadata/android/en-US/images/phoneScreenshots/4.png\" width=\"200\" alt=\"Android Detail Screen Screenshot\" /\u003e\n  \u003cimg src=\"./fastlane/metadata/android/en-US/images/phoneScreenshots/5.png\" width=\"200\" alt=\"Android Detail Screen Screenshot\" /\u003e\n\u003c/p\u003e\n\n### 💻 Large Screen\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./fastlane/metadata/android/en-US/images/tabletScreenshots/1.png\" width=\"200\" alt=\"Tablet Home Screen Screenshot\" /\u003e\n  \u003cimg src=\"./fastlane/metadata/android/en-US/images/tabletScreenshots/2.png\" width=\"200\" alt=\"Tablet Settings Screen Screenshot\" /\u003e\n  \u003cimg src=\"./fastlane/metadata/android/en-US/images/tabletScreenshots/3.png\" width=\"200\" alt=\"Tablet Detail Screen Screenshot\" /\u003e\n\u003c/p\u003e\n\u003c!--\n### 🌐 WASM (Web)\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./fastlane/metadata/android/en-US/images/webScreenshots/1.png\" width=\"200\" alt=\"Web Home Screen Screenshot\" /\u003e\n  \u003cimg src=\"./fastlane/metadata/android/en-US/images/webScreenshots/2.png\" width=\"200\" alt=\"Web Feature Screen Screenshot\" /\u003e\n  \u003cimg src=\"./fastlane/metadata/android/en-US/images/webScreenshots/3.png\" width=\"200\" alt=\"Web Settings Screen Screenshot\" /\u003e\n\u003c/p\u003e --\u003e\n\n---\n\n## 🌍 Localization Support\n\nKmtemplate is built with comprehensive localization support, making it easy to adapt the app for any language or region:\n\n* 🌐 Seamlessly translate all app content using **Kotlin Multiplatform's localization tools**.\n* 📝 Dynamic text updates based on user language or locale preferences.\n* 🏳️ Effortlessly add or update translations for new languages.\n* 🔄 Instantly switch languages at runtime for a global user experience.\n\nThis ensures your application is ready for international audiences and can grow with your user base.\n\n---\n\n## What This Project Does Not Cover?\n\nThe interface of this app utilizes some of the modern Material Design components, but it is deliberately kept simple to focus on application architecture and project configuration. This project does **not** cover advanced topics such as:\n\n* Advanced UI/UX animations and custom components.\n* Detailed business logic for a specific domain (e.g., e-commerce, social media).\n* Integration with complex third-party APIs beyond a simple network client.\n* Detailed platform-specific features that cannot be abstracted into a common module.\n\n---\n\n## 🚀 Getting Started\n\nThis project utilizes Kotlin Multiplatform to target Android, Desktop, and WebAssembly (WASM). Android has two build variants: **GooglePlay** and **FossReliant**. To build and run the project on each platform, follow the instructions below:\n\n### Android\n\n#### GooglePlay Variant\n1.  Open the project in Android Studio.\n2.  Select the **GooglePlay** build variant.\n3.  Connect an Android device or start an emulator.\n4.  Run the `app` module to build and install the APK with Google Play dependencies.\n\n#### FossReliant Variant\n1.  Open the project in Android Studio.\n2.  Select the **FossReliant** build variant.\n3.  Connect an Android device or start an emulator.\n4.  Run the `app` module to build and install the APK without Google Play dependencies (FOSS only).\n\n### Desktop\n\nBuild and run the desktop application (Windows, macOS, or Linux):\n\n```sh\n./gradlew app:run\n```\n\n### Web\n\nBuild and run the web application with a development server:\n\n```sh\n./gradlew wasmJsBrowserRun -t\n```\n\nOpen the provided URL in your browser to access the app.\n\n\u003e **Note:** Node.js and Yarn may be required for web builds.\n\n-----\n\n## Release\n\nRelease builds are available for Android, Desktop, and Web. Use the following instructions for each platform.\n\n### Android\n\n#### GooglePlay Variant\n\nBuild the release APK:\n\n```sh\n./gradlew assembleGooglePlayRelease\n```\n\nUpload the signed APK to the Google Play Console.\n\n#### FossReliant Variant\n\nBuild the release APK:\n\n```sh\n./gradlew assembleFossReliantRelease\n```\n\nDistribute the APK via your preferred channels (e.g., GitHub Releases, F-Droid).\n\n### Desktop\n\nThis project uses Conveyor to package and distribute desktop applications for Windows, macOS, and Linux.\n\n1.  Install Conveyor from [Hydraulic](https://downloads.hydraulic.dev/).\n2.  Build the release executable:\n    ```sh\n    conveyor make app\n    ```\n3.  Create a site for all desktop platforms:\n    ```sh\n    conveyor make site\n    ```\n\n### Web\n\nBuild the release version of the web application:\n\n```sh\n./gradlew wasmJsBrowserDistribution\n```\n\nDeploy the output files to your web server or hosting provider.\n\n-----\n\n## 🧪 Testing\n\nKmtemplate provides a robust testing suite to ensure code quality, reliability, and UI consistency across all platforms.\n\n### JVM Tests\n\n  * **Unit Tests**: Validate individual components and functions in isolation.\n  * **Integration Tests**: Ensure correct interaction between modules and system components.\n  * **Data Layer Tests**: Check data access, persistence, and retrieval logic.\n  * **Business Logic Tests**: Confirm the correct implementation of business rules and workflows.\n\nRun all JVM tests with:\n\n```sh\n./gradlew jvmTest\n```\n\n### UI Screenshot Testing\n\nCompose Screenshot Testing helps prevent visual regressions by comparing the current UI against baseline images (\"goldens\").\n\nAutomated screenshot tests are powered by the Compose Screenshot Test. Key Gradle tasks include:\n\n  * `validateFossReliantDebugScreenshotTest`: Run all screenshot tests and compare with baseline images to detect visual changes.\n  * `updateFossReliantDebugScreenshotTest`: Update baseline images after intentional UI changes.\n  * `testFossReliantDebugScreenshotTest`: Generate comparison images highlighting differences between failed tests and baselines.\n\nThese tools ensure your UI remains visually consistent and any unintended changes are caught early.\n\n-----\n\n## 🚦 Performance\n\nKmtemplate is optimized for speed, responsiveness, and efficiency across all supported platforms. The project integrates several tools and strategies to monitor and improve performance:\n\n### Benchmarks\n\n  * Automated benchmarking tools are used to measure the performance of critical operations, including UI rendering, data processing, and network requests.\n  * Benchmark results help identify bottlenecks and guide targeted optimizations for a smooth user experience.\n\n### Baseline Profiles\n\n  * **Baseline Profiles** are included in the build process to improve app startup time and reduce initial rendering latency.\n  * These profiles instruct the Android Runtime (ART) to pre-compile frequently used code paths, resulting in faster launches and better runtime performance.\n\nGenerate a Baseline Profile with:\n\n```sh\n./gradlew generateReleaseBaselineProfile\n```\n\n### Compose Compiler Metrics\n\n  * **Compose Compiler Metrics** provide insights into UI performance, such as recomposition counts and skippability rates.\n  * These metrics help proactively detect and resolve inefficiencies, ensuring the Compose UI remains fast and responsive as the app evolves.\n\nEnable Compose Compiler Metrics with:\n\n```sh\n./gradlew assembleDebug -PenableComposeCompilerMetrics=true -PenableComposeCompilerReports=true\n```\n\n-----\n\n## ⭐️ Found this project useful?\n\nIf you find Kmtemplate helpful, please consider supporting it by starring the repository:\n\n[🌟 Star on GitHub](https://github.com/mshdabiola/kmtemplate/stargazers)\n\nYou can also [follow me](https://github.com/mshdabiola) for updates and future projects! 🤩\n\n-----\n\n## 📈 Star History\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://star-history.com/#mshdabiola/kmtemplate\u0026Date\"\u003e\n    \u003cpicture\u003e\n      \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/svg?repos=mshdabiola/kmtemplate\u0026type=Date\u0026theme=dark\" /\u003e\n      \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/svg?repos=mshdabiola/kmtemplate\u0026type=Date\" /\u003e\n      \u003cimg alt=\"Star History Chart\" src=\"https://api.star-history.com/svg?repos=mshdabiola/kmtemplate\u0026type=Date\" /\u003e\n    \u003c/picture\u003e\n  \u003c/a\u003e\n  \u003cbr/\u003e\n  \u003cimg alt=\"Repobeats analytics image\" src=\"https://repobeats.axiom.co/api/embed/38e2708cee576cecfba6e0cba2b2cdb7b6954f93.svg\" /\u003e\n\u003c/div\u003e\n\n-----\n\n## 👥 Contributors\n\nA huge thank you to all the amazing people who have contributed to this project:\n\n\u003ca href=\"https://github.com/mshdabiola/kmtemplate/graphs/contributors\"\u003e\n  \u003cimg src=\"https://contrib.rocks/image?repo=mshdabiola/kmtemplate\" alt=\"Contributors\" /\u003e\n\u003c/a\u003e\n\n-----\n\n## 📝 License\n\nKmtemplate is distributed under the terms of the Apache License, Version 2.0. See the [LICENSE](LICENSE) file for details.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmshdabiola%2FKmtemplate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmshdabiola%2FKmtemplate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmshdabiola%2FKmtemplate/lists"}