Как один Kotlin-проект охватывает Android, iOS, Web, Wear OS и AI-агентов
Когда нужно показать возможности Kotlin Multiplatform в реальном коде, легко увязнуть в сложной архитектуре и десятках слоев абстракций. Джон О'Райли пошел другим путем. Он взялся за понятную задачу: отображение списка людей на орбите и координат МКС. В итоге получился наглядный пример того, как один модуль с бизнес-логикой работает на десятке разных платформ.
Проект попал в официальную документацию Kotlin и Google Dev Library. Разберем, как тут все устроено, и почему эту кодовую базу удобно использовать в качестве песочницы.
В чем суть проекта
Приложение запрашивает данные из двух открытых источников. Список астронавтов с биографиями берется из The Space Devs API, а координаты МКС подтягиваются через Open Notify API. Чтобы клиенты не дергали сторонние сервисы напрямую, в репозитории лежит небольшой бэкенд на Ktor.
Главная идея здесь в дедупликации кода. Бизнес-логика, сетевые запросы, кэширование и модели данных пишутся один раз в общем модуле common. Дальше этот код подключается к клиентам под самые разные операционные системы и экраны.
В список поддерживаемых таргетов входят:
- Смартфоны на Android и виджеты для рабочего стола на Glance API
- iOS-приложение на SwiftUI
- Умные часы на Wear OS
- Десктопная версия через Compose for Desktop
- Веб-клиент на Kotlin/Wasm
- Серверная часть на Ktor
- Сервер MCP для подключения к ИИ-клиентам
Что под капотом у общего модуля
Модуль common забирает на себя всю рутину. Внутри используются привычные для Kotlin-разработчиков библиотеки:
- Ktor Client отвечает за сетевые запросы
- SQLDelight берет на себя локальное хранение данных в БД
- Koin занимается внедрением зависимостей
- Kotlinx Serialization разбирает JSON
Для связи с пользовательским интерфейсом используются Compose Multiplatform и библиотека SKIE. Последняя существенно упрощает работу со Swift, транслируя корутины и Flow в понятные для iOS-разработчика асинхронные концепции.
class PeopleInSpaceViewModel(
private val peopleInSpaceRepository: PeopleInSpaceRepositoryInterface
) : KMMViewModel() {
val peopleInSpace: StateFlow<List<Assignment>> =
peopleInSpaceRepository.fetchPeopleAsFlow()
.stateIn(viewModelScope, SharingStarted.Eagerly, emptyList())
}
Благодаря такому разделению платформенные клиенты получаются тонкими. Они занимаются только отрисовкой UI и обработкой пользовательских касаний.
От умных часов до веб-браузера
Каждый клиент в репозитории оформлен в виде отдельного модуля. Это помогает быстро понять, как конкретная технология интегрируется с общим KMP-кодом.
Android-приложение построено на Jetpack Compose. Рядом с ним лежит модуль wearApp, где интерфейс адаптирован под круглые экраны часов с помощью Compose for Wear OS. Там же вы найдете рабочий виджет для домашнего экрана Android, написанный с использованием Glance API.
Для iOS автор предлагает два пути: классический SwiftUI-интерфейс или общий Compose-код. Выбор за разработчиком.
Версия для браузера собрана с помощью Kotlin/Wasm. Сборка запускается через стандартную таску Gradle, выдавая рабочий фронтенд без необходимости писать JavaScript-код.
Подключение к Claude Desktop через MCP
Одно из самых свежих пополнений в репозитории — модуль mcp-server. Автор реализовал сервер по протоколу Model Context Protocol, используя официальный Kotlin MCP SDK.
Смысл в том, что тот же самый модуль common с бизнес-логикой и сетевым слоем подтягивается в консольное приложение. Это приложение отдает инструменты для искусственного интеллекта. Запустив локальный сервер, можно подключить его к Claude Desktop или другому ассистенту.
Конфигурация для Claude Desktop выглядит так:
{
"mcpServers": {
"kotlin-peopleinspace": {
"command": "java",
"args": [
"-jar",
"/path/to/repo/mcp-server/build/libs/serverAll.jar",
"--stdio"
]
}
}
}
После этого нейросеть получает прямой доступ к функции получения данных и отвечает на вопросы о космонавтах, обращаясь к вашему KMP-коду за свежей информацией.

Зачем смотреть этот репозиторий
Репозиторий PeopleInSpace ценен не масштабностью кода, а актуальностью стек-трека. Автор постоянно обновляет версии Kotlin, Gradle, Compose и сопутствующих библиотек.
Проект станет хорошим справочником, если вы планируете:
- Оценить объём кода, который реально переиспользовать между Android и iOS.
- Посмотреть на практике запуск Kotlin/Wasm в браузере.
- Разобраться с работой SKIE при передаче потоков данных в Swift.
- Изучить устройство MCP-серверов на Kotlin.
Для первого знакомства достаточно склонировать репозиторий, открыть его в свежей версии Android Studio и запустить нужную Gradle-задачу.
