English | 简体中文
Yanami Next supports Android & iPhone for the Komari server monitoring tool. The repository is named Yanami-Next; the Android app is built with Material Design 3, and the iPhone app is built with SwiftUI.
A Komari client that supports Android & iPhone.
- Multi-Instance Management — Add, edit, and switch between multiple Komari server instances.
- Three Authentication Modes — Support password, API Key, and guest mode authentication.
- Real-Time Node List — WebSocket real-time push for node status (CPU / RAM / Disk / Network IO).
- Node Detail Dashboard — Load history, Ping trends, IPv4/IPv6, network speed, interval traffic, and cumulative traffic usage.
- SSH Terminal — Native terminal engines on both platforms with scrollback, selection, composed text input, special keys, and WebSocket resize synchronization.
- Home Screen Widget — Glance widget for node overview, refresh, and update interval configuration.
- iPhone App — Native SwiftUI client with multi-instance management, password / API Key / guest mode, custom HTTP headers, auto-refreshing node list, node detail, load and ping records.
- Tablet Landscape Layout — Adaptive large-screen layout with NavigationRail, multi-column lists, and split detail panels.
- Multi-Language Support — Chinese (Default), English, Japanese.
- Theme System — Material You dynamic colors (Android 12+) + 6 preset color palettes, supporting dark/light mode and system-following mode.
Expand
| Item | Requirement |
|---|---|
| Android | 9.0 (API 28) and above |
| iPhone | iOS 16 and above |
| Server | Komari 1.1.7 or above |
# Android debug APK
(cd apps/android && ./gradlew assembleDebug)
# Android release APK
(cd apps/android && ./gradlew assembleRelease)
# Clean and build Android debug APK
(cd apps/android && ./gradlew clean assembleDebug)
# Unsigned iPhone IPA
VERSION=$(tr -d '[:space:]' < VERSION)
BUILD_NUMBER=$(tr -d '[:space:]' < VERSION_CODE)
xcodebuild \
-project apps/iphone/Yanami.xcodeproj \
-scheme Yanami \
-configuration Release \
-sdk iphoneos \
-destination 'generic/platform=iOS' \
-derivedDataPath build/ios \
CODE_SIGNING_ALLOWED=NO \
CODE_SIGNING_REQUIRED=NO \
CODE_SIGN_IDENTITY="" \
DEVELOPMENT_TEAM="" \
PROVISIONING_PROFILE_SPECIFIER="" \
MARKETING_VERSION="$VERSION" \
CURRENT_PROJECT_VERSION="$BUILD_NUMBER" \
build
mkdir -p build/ios-ipa/Payload
ditto build/ios/Build/Products/Release-iphoneos/Yanami.app "build/ios-ipa/Payload/Yanami Next.app"
(cd build/ios-ipa && ditto -c -k --sequesterRsrc --keepParent Payload "../Yanami-Next-v${VERSION}-unsigned.ipa")Android build outputs are located at apps/android/app/build/outputs/apk/. The app version is sourced from VERSION and the build number from VERSION_CODE on both platforms. The unsigned iPhone IPA must be signed before device installation.
| Library | Version | Purpose |
|---|---|---|
| Kotlin | 2.3.10 | Android main language |
| Swift | 5 | iPhone main language |
| Jetpack Compose BOM | 2026.02.01 | Android UI framework |
| SwiftUI | iOS 16+ | iPhone UI framework |
| MD3 | — | Android design system |
| Voyager | 1.1.0-beta03 | Navigation + ScreenModel |
| Koin | 4.1.1 | Dependency Injection |
| Ktor | 3.4.1 | HTTP Client + WebSocket |
| Room | 2.8.4 | Local Database (Encrypted credential storage) |
| Vico | 3.0.3 | Charts (Compose M3) |
| Termux terminal-view + terminal-emulator | 0.119.0-beta.3 (e634d8f) |
Vendored terminal rendering and remote transport |
| DataStore Preferences | 1.2.0 | User Preferences Persistence |
The Android app adopts the MVI (Model-View-Intent) pattern with an adaptive root shell:
UI Layer MainActivity Root Shell + Voyager Screen + Compose UI + MviViewModel<State, Event, Effect>
Domain Layer Repository Interface + Domain Model (Node, ServerInstance …)
Data Layer Repository Implementation, Ktor, Room, DataStore
Each page follows the Contract Pattern, describing the complete MVI contract of the page with nested State / Event / Effect.
The Android app lives under apps/android, and the iPhone app lives under apps/iphone as a native SwiftUI project. The iPhone source is split into Models, Services, Stores, Views, Utilities, and Resources, matching the Android domain/data/UI separation while using native iOS APIs.
ServerListScreen → AddServerScreen
→ NodeListScreen → NodeDetailScreen → SshTerminalScreen
→ SettingsHubScreen → SettingsScreen / AboutScreen
- PASSWORD — Obtain
session_tokenviaPOST /api/login(supports 2FA). - API_KEY — Use
Authorization: Bearer <api-key>directly, without login flow. - GUEST — No authentication header; monitor APIs and WebSocket data remain available, but SSH terminal is disabled.
- Credentials and session data are encrypted with AES/GCM and stored in Room, automatically restored on startup.
- WebSocket (
wss://host/api/rpc2) always requires theOriginheader. - Every request explicitly carries the immutable authentication context and custom headers for its own server, preventing credentials from leaking across concurrent server sessions.
- Phone / narrow width: standard Voyager stack navigation.
- Tablet landscape: root-level
NavigationRail+ content pane. - Node and server lists switch to multi-column card layouts on wide landscape screens.
- Node detail charts and info cards use split wide-screen layouts.
- Form and settings pages use centered constrained-width content on large screens.
This project is licensed under the MIT License.














