Repository navigation
Architecture ru
English · Русский
Одно ядро на Kotlin Multiplatform, один UI на Compose Multiplatform, четыре платформы.
iOS/iPadOS отложен — iOS-таргетов и iosMain в проекте нет.
flowchart TD
A[androidApp<br/>MainActivity, манифест] --> C[composeApp<br/>UI на Compose Multiplatform]
D[точка входа десктопа] -.тот же модуль.- C
C --> S[shared<br/>ядро KMP]
SV[server<br/>сервер синхронизации на Ktor] --> W[sync-wire<br/>DTO клиент⇆сервер]
S --> W
| Модуль | Что это | Лицензия |
|---|---|---|
shared/ |
ядро: протоколы, хранилище, синхронизация, терминал, удалённые столы, AI | GPL-3.0 |
composeApp/ |
весь UI, включая точку входа десктопа | GPL-3.0 |
androidApp/ |
оболочка Android: MainActivity, манифест, applicationId app.skerry
|
GPL-3.0 |
server/ |
сервер синхронизации (Ktor, Exposed, SQLite/PostgreSQL) | AGPL-3.0 |
sync-wire/ |
wire-контракт, который компилируют обе стороны — руками не дублируется | общий для обеих сторон |
settings.gradle.kts выкидывает клиентские модули при -PserverOnly (или SKERRY_SERVER_ONLY=1)
— так собирается Docker-образ без Android SDK.
shared/src/
commonMain/ контракты, доменные типы, чистая логика — единственное, что видит UI
jvmSharedMain/ JVM-код, общий для десктопа и Android (sshj, Ktor, mosh, транспорты RDP/VNC)
desktopMain/ актуалы только для десктопа (JavaSound, ffmpeg H.264, pty4j)
androidMain/ актуалы только для Android (MediaCodec, keystore биометрии, USB serial)
commonTest/ desktopTest/
jvmSharedMain несёт основную нагрузку: и десктоп, и Android — JVM, поэтому код на JVM-библиотеках
живёт там один раз, а не дважды. Платформенные библиотеки прячутся за expect/actual или
интерфейсом; UI видит только контракты commonMain.
flowchart LR
UI[composeApp<br/>экраны · контроллеры · дизайн-примитивы]
DEP[AppDependencies<br/>граф, который собирает платформа]
CORE[shared/commonMain<br/>контракты + чистая логика]
PLAT[jvmShared / desktop / android<br/>реализации]
UI --> DEP --> CORE
PLAT -. реализует .-> CORE
DEP -. строится из .-> PLAT
AppDependencies — единый держатель, передаваемый корневому composable. Новая подсистема
становится его полем, а не ещё одним параметром корня; null означает «на этой платформе не
подключено», и UI показывает заглушку, а не падает.
| Пакет | Содержимое |
|---|---|
ssh/ |
контракт транспорта, цели и jump-цепочки, известные хосты, проброс портов, импорт ~/.ssh/config
|
sftp/, files/
|
контракты передачи файлов |
terminal/ |
эмулятор, reflow, SGR, поиск, выделение, история, запись, метки шагов |
vault/ |
контракт хранилища, криптография, записи, секреты, корзина, журнал безопасности, биометрия |
sync/ |
движок синхронизации, контракт клиента, курсоры, настройки |
team/, share/
|
команды и их области; трансляция живой сессии и её кадровый протокол |
rdp/, vnc/, graphics/, audio/
|
стеки удалённых столов и общие контракты кадрового буфера и звука |
mosh/, telnet/, serial/, container/, local/
|
остальные транспорты |
snippet/, runbook/, host/, tag/
|
доменные модели, видимые пользователю |
ai/ (+ ai/local/) |
провайдеры, политика по хостам, вырезание секретов, оценка риска, локальный рантайм llama.cpp |
guard/, trust/, update/, text/, io/
|
prod-страж, запросы доверия хосту, проверка обновлений, санитизация текста, приватная запись файлов |
rdp/ — самый большой пакет по числу файлов: стек RDP написан здесь, а не заимствован.
-
Сначала ищи, потом пиши. Каталог абстракций в
docs/coding-guidelines.mdперечисляет готовое под каждую повторяющуюся задачу; второе повторение — сигнал, третье делает выделение обязательным. - Файлы не растут за ~400–500 строк — режутся по секциям экрана или подсистемам.
-
Логика не живёт внутри composable. Парсеры, автоматы и протоколы — в
shared/или рядом с UI, но чистыми и напрямую тестируемыми. - Паритет desktop⇆Android — критерий готовности, а не последующая доработка.
Подробности по подсистемам: Подключения и транспорты, Движок терминала, Хранилище и криптография, Протокол синхронизации, Стеки удалённых рабочих столов, Слой UI.
User guide
- Installation
- Getting started
- Hosts and connections
- Vault and credentials
- Terminal
- Files (SFTP)
- Port forwarding
- Remote desktops
- Snippets and runbooks
- Monitoring and guard
- AI assistant
- Sync and devices
- Teams and sharing
- Settings and shortcuts
- Android
- Troubleshooting
Development
- Architecture
- Building and running
- Connections and transports
- Terminal engine
- Vault and crypto
- Sync protocol
- Remote desktop stacks
- UI layer
- Testing and the gate
- Contributing and releases
Русский — оглавление