A full-featured open-source Kotlin Multiplatform app template — Android, iOS, Desktop & Backend.
Production-ready · Compose Multiplatform · Shared UI & Logic · Ktor Backend
Adoptme is an opinionated, production-ready Kotlin Multiplatform app template built on top of Compose Multiplatform. It targets Android, iOS, and Desktop from a single shared codebase — with a Ktor backend included.
Rather than covering only the basics, Adoptme solves the real problems you encounter when taking an app from zero to production: navigation, dependency injection, image loading, internationalization, dark mode, accessibility, CI, and more — all wired up and working out of the box.
Use it as a launchpad for your own KMP application.
- ✅ Login / Sign Up — full authentication flow
- ✅ Onboarding — swipeable intro slides with localized content
- ✅ Home — pet listings with "Near Me" grid and "Last Search" carousel
- ✅ Search Listing — filterable pet list by category
- ✅ Pet Detail — full pet profile with favorite toggle
- ✅ Favorites — lists all favorited pets with unfavorite action, backed by a real API
- ✅ Inbox — conversation list with per-conversation chat screen, message bubbles, and send input
- ✅ Chat — real-time-style messaging per conversation with auto-reply in debug/mock mode
- ✅ Pet Upload — form to submit a new pet listing
- ✅ Profile — logged-in user profile with ratings and options
- ✅ Profile Detail — public user profile with their listings
- ✅ Debug Menu — developer tools screen (debug builds only)
- ✅ Account Settings / Settings — stub screens ready to extend
- ✅
PetCardSmall&PetCardBigwith favorite heart icon overlay - ✅
RatingBarstar component - ✅
PickerItemlist row with icon - ✅
EmptyLayoutwith optional action button - ✅
PetsSearchBar - ✅
ColoredSnackBarwith success/error/info types - ✅ Shimmer loading animation
- ✅ Navigation bar (bottom bar + rail variants)
- ✅ Shared UI and Logic across all platforms
- ✅ Kotlin 2.4 + Compose Multiplatform 1.11
- ✅ Voyager — Navigation, Tabs, ScreenModel (ViewModel)
- ✅ Koin 4 — Dependency Injection with multiplatform support
- ✅ Ktor 3 (Client + Server)
- ✅ Kamel 1 — async image loading with per-platform decoders
- ✅ Kotlin Coroutines + StateFlow for reactive state
- ✅ Kotlin Serialization + Kotlin Datetime
- ✅ Multiplatform Settings — key-value storage
- ✅ Kermit — multiplatform logging
- ✅ Detekt — static code analysis
- ✅ Ktlint — code style linter
- ✅ Automated tests — backend route tests (Ktor
testApplication) + shared KMP unit tests - ✅ Version Catalogs (
libs.versions.toml) - ✅ Firebase Analytics (Android)
- ✅ Ktor Backend — PostgreSQL + Tomcat + OpenAPI / Swagger
- ✅ Dark mode ready
- ✅ Internationalization — English, Spanish, French, Italian, German (FIGS + EN)
- ✅ Accessibility + color-accessible themes
- ✅ Edge-to-edge display with
enableEdgeToEdge() - ✅ Favorites powered by
StateFlow<Set<Int>>— reactive across the whole app - ✅ CI (GitHub Actions) — build, lint, detekt, backend tests, shared KMP tests, test report upload
| Platform | Minimum |
|---|---|
| Android | API 26 (minSdk) |
| iOS | 16.0+ |
| Desktop | JVM 21 |
| Backend | JVM 21, PostgreSQL |
Adoptme/
├── composeApp/ # Android application entry point
├── shared/ # Shared KMP module (UI + logic, all platforms)
│ └── commonMain/
│ ├── di/ # Koin modules
│ ├── feature/ # Feature modules (favorites, profile, petupload, …)
│ ├── navigation/ # Tab navigation objects
│ ├── ui/ # Screens, components, theme, icons
│ └── localization/# Strings for all supported languages
├── backend/ # Ktor server (REST API, JWT auth, PostgreSQL)
└── gradle/
└── libs.versions.toml
git clone https://github.com/MultiplatformKickstarter/Adoptme.git
cd AdoptmeOpen the project in Android Studio and run the composeApp configuration.
./gradlew :composeApp:runOpen iosApp/iosApp.xcodeproj in Xcode and run on a simulator or device.
JWT_SECRET=your-secret ./gradlew :backend:runRequires a running PostgreSQL instance. Configure the connection in
backend/src/main/resources/application.conf.JWT_SECRETmust be set as an environment variable. For local tests it defaults to a safe fallback automatically.
# Backend route tests
./gradlew :backend:test
# Shared KMP unit tests (JVM)
./gradlew :shared:jvmTestThe Ktor backend exposes a REST API secured with JWT authentication:
| Method | Endpoint | Description |
|---|---|---|
POST |
/v1/users/create |
Register a new user |
POST |
/v1/users/login |
Login and receive JWT |
POST |
/v1/users/logout |
Logout |
GET |
/v1/pets/list |
List pets for current user |
GET |
/v1/pets/pet |
Get a single pet |
POST |
/v1/pets/create |
Create a pet listing |
PATCH |
/v1/pets/pet/update |
Update a pet listing |
DELETE |
/v1/pets/delete |
Delete a pet listing |
GET |
/v1/profile |
Get current user profile |
POST |
/v1/profile/create |
Create user profile |
PATCH |
/v1/profile/update |
Update user profile |
GET |
/v1/favorites |
List favorited pet IDs |
POST |
/v1/favorites/add |
Add a pet to favorites |
DELETE |
/v1/favorites/remove |
Remove a pet from favorites |
GET |
/v1/chat/conversations |
List conversations for current user |
POST |
/v1/chat/conversations/create |
Create a new conversation |
DELETE |
/v1/chat/conversations/delete |
Delete a conversation |
GET |
/v1/chat/messages |
Get messages for a conversation |
POST |
/v1/chat/messages/send |
Send a message |
OpenAPI docs available at /openapi when the server is running.
| Ferran Pons |
Contributions of any kind are welcome!
- Open an issue to discuss your idea
- Fork the repo
- Create your feature branch (
git checkout -b my-new-feature) - Commit your changes (
git commit -am 'Add some feature') - Push to the branch (
git push origin my-new-feature) - Open a Pull Request
For bugs, questions and discussions please use GitHub Issues.
Copyright 2023–2026 Multiplatform Kickstarter
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
Built with ❤️ for the Kotlin Multiplatform community.

