{"id":15813784,"url":"https://github.com/yassineabou/llms","last_synced_at":"2026-01-23T22:10:36.399Z","repository":{"id":256604953,"uuid":"846253182","full_name":"yassineAbou/LLMS","owner":"yassineAbou","description":"Discover the power of AI with our Kotlin Multiplatform app. Choose from the latest open-source text and image models to boost your creativity. Pick the model that fits you, create unique texts or images.","archived":false,"fork":false,"pushed_at":"2025-04-17T01:48:31.000Z","size":3909,"stargazers_count":20,"open_issues_count":0,"forks_count":3,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-17T15:23:37.687Z","etag":null,"topics":["ai-horde","android","compose-multiplatform","ios","kotlin","kotlin-multiplatform","kotlin-wasm","linux","llms","macos","windows"],"latest_commit_sha":null,"homepage":"https://yassineabou.github.io/LLMs-Wasm/","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/yassineAbou.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":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-08-22T20:32:07.000Z","updated_at":"2025-04-17T01:48:34.000Z","dependencies_parsed_at":null,"dependency_job_id":"3c82129b-9e55-427c-a7a2-f7c14f7befae","html_url":"https://github.com/yassineAbou/LLMS","commit_stats":null,"previous_names":["yassineabou/llms"],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yassineAbou%2FLLMS","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yassineAbou%2FLLMS/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yassineAbou%2FLLMS/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yassineAbou%2FLLMS/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yassineAbou","download_url":"https://codeload.github.com/yassineAbou/LLMS/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250023511,"owners_count":21362414,"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":["ai-horde","android","compose-multiplatform","ios","kotlin","kotlin-multiplatform","kotlin-wasm","linux","llms","macos","windows"],"created_at":"2024-10-05T04:05:53.970Z","updated_at":"2026-01-23T22:10:36.392Z","avatar_url":"https://github.com/yassineAbou.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n\u003cdiv align=\"center\"\u003e  \n \u003cimg src=\"https://imgur.com/mVICjDJ.png\" alt=\"LLMS\" style=\"width: 100px; height: 100px; object-fit: contain; margin-right: 10px;\"\u003e\n \u003ch1 style=\"display: inline-block; margin: 0; vertical-align: middle; text-align: center; width: 100%;\"\u003eLLMS\u003c/h1\u003e  \n\u003c/div\u003e\n\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"https://img.shields.io/badge/%20AI-000000?logo=ai\u0026logoColor=white\u0026color=000000\" alt=\"AI\"\u003e\n\u003cimg src=\"https://img.shields.io/badge/Kotlin-7F52FF?style=flat\u0026logo=kotlin\u0026logoColor=white\" alt=\"Kotlin\"\u003e\n\u003cimg src=\"https://img.shields.io/badge/Kotlin%20Multiplatform-7F52FF?style=flat\u0026logo=kotlin\u0026logoColor=white\" alt=\"Kotlin Multiplatform\"\u003e\n\u003cimg src=\"https://img.shields.io/badge/Compose%20Multiplatform-4285F4?logo=jetpack-compose\u0026logoColor=white\" alt=\"Compose Multiplatform\"\u003e\n\u003cimg src=\"https://img.shields.io/badge/Ktor-0099FF?logo=ktor\u0026logoColor=white\" alt=\"Ktor\"\u003e\n\u003cimg src=\"https://img.shields.io/badge/WebAssembly-654FF0?logo=webassembly\u0026logoColor=white\" alt=\"WebAssembly\"\u003e\n\u003cimg src=\"https://img.shields.io/badge/Android-3DDC84?logo=android\" alt=\"Android\"\u003e\n\u003cimg src=\"https://img.shields.io/badge/iOS-000000?logo=apple\" alt=\"iOS\"\u003e\n\u003cimg src=\"https://img.shields.io/badge/Desktop-FCC624?logo=desktop\u0026logoColor=black\" alt=\"Desktop\"\u003e\n\n\u003c/p\u003e\n\nDiscover the power of AI with our Kotlin Multiplatform app. Choose from the latest open-source text and image models to boost your creativity. Pick the model that fits you, create unique texts or images. and keep everything safe and in sync across your devices.\n\n### 🚀 How to Run \nYou can run the application for **Android**, **Desktop**, **WebAssembly**, and **iOS** directly from your IDE.\n\n1. Open the project in **Android Studio** or **IntelliJ IDEA**.\n2. Select your desired run configuration from the dropdown menu (e.g., `composeApp`, `desktopRun`, `iosApp`).\n3. Click the **Run ▶️** button.\n\n*For **iOS**, you can alternatively open the `iosApp` folder in **Xcode** and run it from there.*\n\n\n\n## 🎨 Demo\n\nhttps://github.com/user-attachments/assets/af1903df-139f-4178-8fcb-c3d7c7b46219\n\nhttps://github.com/user-attachments/assets/46d00b90-6df8-484c-bfd6-f38c65ad85d9\n\n\n\nhttps://github.com/user-attachments/assets/62ad62f5-a80a-4ac0-b8a7-f0707a45a249\n\n\n\n## 📈 Progress\n\nOur development process is divided into five key steps:\n\n#### 1. Prototype with Fake Data 🚧\n- Status: 🎯 Done\n\n#### 2. Connect with AI REST API (Text Models) 📝 \n- Status: 🎯 Done\n  \n#### 3. Connect with AI REST API (Image Models) 🖼️  \n- Status: 🎯 Done \n\n#### 4. Save Chat History \u0026 Generated Images Locally 💾  \n- Status: 🎯 Done  \n\n#### 5. Sync Data Across Devices with Authentication 🔐  \n- Status: 🔄 in progress  \n\n\n## 🏗️ Architecture\n\n- **User Interface**:\n  Uses [Compose multiplatfrom](https://www.jetbrains.com/lp/compose-multiplatform/).\n\n- **Layers**: All data handling, business logic, and presentation layers are implemented\n  using [kotlin multiplatform](https://www.jetbrains.com/kotlin-multiplatform/)\n\n- **backend**: The backend is developed using [Ktor framework](https://ktor.io/).  \n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://miro.medium.com/v2/resize:fit:2552/1*0MUE4D4nlEITAUyOTZ1zcg.png\" alt=\"Kotlin Multiplatform\" width=\"250\"\u003e\n\u003c/p\u003e\n\n## 📦 Libraries\n\n- [Material 3 Adaptive](https://www.jetbrains.com/help/kotlin-multiplatform-dev/whats-new-compose-170.html#across-platforms) (creates adaptive UIs that will adapt themselves automatically)\n- [Compose Navigation](https://www.jetbrains.com/help/kotlin-multiplatform-dev/compose-navigation-routing.html) (Navigates between composables with built-in infrastructure and features)\n- [Kodein](https://github.com/kosi-libs/Kodein) (Painless Kotlin Dependency Injection)\n- [Coroutines](https://github.com/Kotlin/kotlinx.coroutines) (asynchronous or non-blocking)\n- [Sketch](https://github.com/panpf/sketch) (Image loading)\n- [Ktor Client](https://ktor.io/docs/full-stack-development-with-kotlin-multiplatform.html) (HTTP client)\n- [Markdown renderer](https://github.com/mikepenz/multiplatform-markdown-renderer) (Markdown renderer)\n- [Drag Select](https://github.com/jordond/drag-select-compose) (adding Google Photos style drag-to-select multi-selection to a LazyGrid)\n- [SQLDelight](https://sqldelight.github.io/sqldelight/2.1.0/) (SQLDelight generates typesafe Kotlin APIs from your SQL statements.)\n- [KotlinMultiplatformAuth](https://github.com/sunildhiman90/KotlinMultiplatformAuth) (Authentification Library Targeting Android, iOS, Desktop and Web Kotlin/Js and Kotlin/Wasm both)\n- [kotlinx-rpc](https://github.com/Kotlin/kotlinx-rpc) (is a Kotlin library for adding asynchronous Remote Procedure Call (RPC) services to your applications)\n- [Exposed](https://github.com/JetBrains/Exposed) (Kotlin SQL Framework)\n\n## Package Structure\n```\nLLMS/\n├── composeApp/    #  Main application module for the UI, built with Compose Multiplatform\n│   └── src/\n│       ├── org/yassineabou/llms/app/\n│       │   ├── App.kt\n│       │   ├── MainScreen.kt\n│       │   ├── core/\n│       │   │   ├── data/\n│       │   │   │   ├── async/\n│       │   │   │   ├── local/\n│       │   │   │   └── remote/\n│       │   │   ├── di/\n│       │   │   ├── navigation/\n│       │   │   ├── sharedViews/\n│       │   │   ├── theme/\n│       │   │   └── util/\n│       │   └── feature/\n│       │       ├── chat/\n│       │       │   ├── data/model/\n│       │       │   └── ui/\n│       │       │       ├── chat/\n│       │       │       ├── history/\n│       │       │       ├── listDetailPane/\n│       │       │       └── view/\n│       │       ├── imagine/\n│       │       │   ├── data/model/\n│       │       │   └── ui/\n│       │       │       ├── supportingPane/\n│       │       │       ├── util/\n│       │       │       └── view/\n│       │       └── you/\n│       │           ├── model/\n│       │           └── ui/\n│       │               ├── util/\n│       │               └── view/\n│       └── sqldelight/org/yassineabou/llms/    # SQLDelight source files defining the local database schema\n│\n├── server/     #  Backend server module, using Ktor, handling API requests and database interactions.\n│   └── src/\n│       └── org/yassineabou/llms/\n│           ├── Application.kt\n│           ├── Environment.kt\n│           └── database/\n│               ├── tables/\n│               ├── di/\n│               ├── repository/\n│               ├── service/\n│               └── DatabaseFactory.kt\n│\n└── shared/    #  Shared API contract and data models, enabling type-safe communication between compose and server module.\n    └── src/\n        └── org/yassineabou/llms/api/\n            ├── ChatService.kt\n            ├── ImageService.kt\n            ├── MessageService.kt\n            ├── UserService.kt\n            ├── Constants.kt\n            └── Platform.kt\n```\n## 🔵🔴🟡🟢 Google Authentication Setup\nThis project supports Google Authentication for data syncing across devices (part of Step 5 in Progress). Keys and sensitive files (e.g., `google-services.json`, `GoogleService-Info.plist`) are hidden and not committed to GitHub for security. To enable real Google auth after cloning the repo, follow these platform-specific steps. We've included fake data in the code (e.g., in `commonMain/YouViewModel.kt`) for testing without setup—uncomment the real auth code when ready.\n\nIf you are confused in the process, watch this video: [https://youtu.be/-5Ws4HSaYJc?si=uHhDbmnhC7GBZEL3](https://youtu.be/-5Ws4HSaYJc?si=uHhDbmnhC7GBZEL3).\n\n### General Steps\n1. Go to the [Firebase Console](https://console.firebase.google.com/).\n2. Create a new Firebase project (or select an existing one).\n3. Enable **Authentication** → **Sign-in method** → **Google**.\n4. For multiplatform support, also go to [Google Cloud Console → APIs \u0026 Services → Credentials](https://console.cloud.google.com/apis/credentials) to create OAuth 2.0 Client IDs as needed.\n\n### Compose App\n1. In Firebase, click “Add app” → **Android**.\n2. Register your package name (e.g., `com.yassineabou.llms`), add SHA-1 fingerprints (debug/release).\n3. Download `google-services.json`.\n4. Replace the placeholder in `composeApp/google-services.json` with your file.\n5. In Google Cloud Console, create an “Android” OAuth Client ID with the same package name and SHA-1.\n6. In `androidMain/MainActivity.kt`, uncomment the init code for `KMAuthInitializer`.\n7. In `commonMain/YouViewModel.kt` and `commonMain/App.kt`, uncomment the Google auth-related code.\n8. Sync Gradle and rebuild.\n\n### iOSMain Module\n1. In Firebase, click “Add app” → **iOS**.\n2. Register your bundle ID, App Store ID (optional), and nickname.\n3. Download `GoogleService-Info.plist`.\n4. Replace the placeholder in `iosApp/GoogleService-Info.plist` with your file.\n5. Drag it into Xcode (check “Copy items if needed”).\n6. Add the Google Sign-In SDK via Xcode: `File` → `Add Packages…` → URL: `https://github.com/google/GoogleSignIn-iOS` → Add **GoogleSignIn** to your target.\n7. In `iosApp/Info.plist`, uncomment and paste:\n   - `\u003ckey\u003eGIDClientID\u003c/key\u003e\u003cstring\u003ePASTE CLIENT_ID FROM GoogleService-Info.plist HERE\u003c/string\u003e`\n   - For `\u003ckey\u003eCFBundleURLTypes\u003c/key\u003e`, add the `\u003cdict\u003e` with `\u003ckey\u003eCFBundleURLSchemes\u003c/key\u003e\u003carray\u003e\u003cstring\u003ePASTE REVERSED_CLIENT_ID FROM GoogleService-Info.plist HERE\u003c/string\u003e\u003c/array\u003e`.\n\n### Desktop/WebAssembly (desktopMain Module and commonMain)\n1. In Google Cloud Console, create a “Web application” OAuth Client ID.\n2. Add authorized redirect URIs (e.g., `http://localhost:8080/callback`).\n3. Copy the generated `CLIENT_ID` and `CLIENT_SECRET`.\n4. Paste them into `commonMain/GoogleOAuthConfig.kt` (replace the empty constants).\n5. In `desktopMain/main.kt`, uncomment the init code for `KMAuthInitializer.initClientSecret`.\n6. In `commonMain/App.kt` and `commonMain/YouViewModel.kt`, uncomment the Google auth-related code.\n\n\n## 🤝 Contribution\n\nWe welcome contributions to our project! Please follow these guidelines when submitting changes:\n\n- Report bugs and feature requests by creating an issue on our GitHub repository.\n- Contribute code changes by forking the repository and creating a new branch.\n- Ensure your code follows our coding conventions.\n- Improve our documentation by submitting changes as a pull request.\n\nThank you for your interest in contributing to our project!\n\n## 📜 License\n\n```\nCopyright 2025 Yassine Abou \n  \nLicensed under the Apache License, Version 2.0 (the \"License\");  \nyou may not use this file except in compliance with the License.  \nYou may obtain a copy of the License at  \n  \n    http://www.apache.org/licenses/LICENSE-2.0  \n  \nUnless required by applicable law or agreed to in writing, software  \ndistributed under the License is distributed on an \"AS IS\" BASIS,  \nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  \nSee the License for the specific language governing permissions and  \nlimitations under the License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyassineabou%2Fllms","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyassineabou%2Fllms","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyassineabou%2Fllms/lists"}