{"id":46597460,"url":"https://github.com/icylian/yanami","last_synced_at":"2026-04-01T21:57:38.243Z","repository":{"id":342757414,"uuid":"1174250439","full_name":"icylian/Yanami","owner":"icylian","description":"A Material Design 3 Android client for the Komari server monitoring tool.","archived":false,"fork":false,"pushed_at":"2026-03-08T14:13:10.000Z","size":2220,"stargazers_count":93,"open_issues_count":1,"forks_count":3,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-09T21:07:05.262Z","etag":null,"topics":["android","jetpack-compose","komari","kotlin","mvi"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/icylian.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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-06T08:25:12.000Z","updated_at":"2026-03-09T18:13:58.000Z","dependencies_parsed_at":"2026-03-10T18:00:31.054Z","dependency_job_id":null,"html_url":"https://github.com/icylian/Yanami","commit_stats":null,"previous_names":["icylian/yanami"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/icylian/Yanami","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/icylian%2FYanami","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/icylian%2FYanami/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/icylian%2FYanami/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/icylian%2FYanami/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/icylian","download_url":"https://codeload.github.com/icylian/Yanami/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/icylian%2FYanami/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30346477,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-10T15:55:29.454Z","status":"ssl_error","status_checked_at":"2026-03-10T15:54:58.440Z","response_time":106,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["android","jetpack-compose","komari","kotlin","mvi"],"created_at":"2026-03-07T15:01:51.572Z","updated_at":"2026-04-01T21:57:38.230Z","avatar_url":"https://github.com/icylian.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"English | [简体中文](README_zh.md)\n\n# Yanami\n\n![Badge](https://hitscounter.dev/api/hit?url=https%3A%2F%2Fgithub.com%2Ficylian%2FYanami\u0026label=icylian%2FYanami\u0026icon=github\u0026color=%23feb272\u0026message=\u0026style=flat\u0026tz=UTC) \n[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/icylian/Yanami)\n\n\u003cp style=\"text-align: center;\"\u003e\n    \u003cimg alt=\"banner\" src=\"assets/banner.png\"\u003e\n\u003c/p\u003e\n\n**Yanami** is an Android client for the [Komari](https://github.com/komari-monitor/komari) server monitoring tool, built with the Material Design 3 design language.\n\n\u003e A Material Design 3 Android client for the Komari server monitoring tool.\n\n---\n\n## Features\n\n- **Multi-Instance Management** — Add, edit, and switch between multiple Komari server instances.\n- **Three Authentication Modes** — Support password, API Key, and guest mode authentication.\n- **Real-Time Node List** — WebSocket real-time push for node status (CPU / RAM / Disk / Network IO).\n- **Node Detail Dashboard** — Load history line charts, Ping latency trends, basic server information.\n- **SSH Terminal** — Full-featured ANSI/VT100 terminal based on termux terminal-view + WebSocket, supporting special key toolbars and font size adjustment.\n- **Home Screen Widget** — Glance widget for node overview, refresh, and update interval configuration.\n- **Tablet Landscape Layout** — Adaptive large-screen layout with NavigationRail, multi-column lists, and split detail panels.\n- **Multi-Language Support** — Chinese (Default), English, Japanese.\n- **Theme System** — Material You dynamic colors (Android 12+) + 6 preset color palettes, supporting dark/light mode and system-following mode.\n\n## Screenshots\n\n\u003cdetails\u003e\n\n\u003csummary\u003eExpand\u003c/summary\u003e\n\n### Instance Management\n\n\u003cp style=\"text-align: center;\"\u003e\n    \u003cimg alt=\"addserver\" src=\"assets/addserver.png\" width=\"360\"\u003e \u003cimg alt=\"serverlist\" src=\"assets/serverlist.png\" width=\"360\"\u003e\n\u003c/p\u003e\n\n### Day/Light Mode (Phone)\n\n\u003cp style=\"text-align: center;\"\u003e\n    \u003cimg alt=\"nodelist\" src=\"assets/nodelist.png\" width=\"360\"\u003e \u003cimg alt=\"nodedetail1\" src=\"assets/nodedetail1.png\" width=\"360\"\u003e\n\u003c/p\u003e\n\n### Day/Light Mode (Tablet)\n\n\u003cp style=\"text-align: center;\"\u003e\n    \u003cimg alt=\"nodelisttablet\" src=\"assets/nodelisttablet.png\" width=\"720\"\u003e\n\u003c/p\u003e\n\n\u003cp style=\"text-align: center;\"\u003e\n    \u003cimg alt=\"nodedetail1tablet\" src=\"assets/nodedetail1tablet.png\" width=\"720\"\u003e\n\u003c/p\u003e\n\n### Night/Dark Mode\n\n\u003cp style=\"text-align: center;\"\u003e\n    \u003cimg alt=\"nodelistdark\" src=\"assets/nodelistdark.png\" width=\"360\"\u003e \u003cimg alt=\"nodedetaildark\" src=\"assets/nodedetaildark.png\" width=\"360\"\u003e\n\u003c/p\u003e\n\n### Latency Monitoring/SSH Terminal\n\n\u003cp style=\"text-align: center;\"\u003e\n    \u003cimg alt=\"nodedetail2\" src=\"assets/nodedetail2.png\" width=\"360\"\u003e \u003cimg alt=\"nodeterminal\" src=\"assets/nodeterminal.png\" width=\"360\"\u003e\n\u003c/p\u003e\n\n### Snippets\n\n\u003cp style=\"text-align: center;\"\u003e\n    \u003cimg alt=\"snippetslist\" src=\"assets/snippetslist.png\" width=\"360\"\u003e \u003cimg alt=\"addsnippet\" src=\"assets/addsnippet.png\" width=\"360\"\u003e\n\u003c/p\u003e\n\n### Widget\n\n\u003cp style=\"text-align: center;\"\u003e\n    \u003cimg alt=\"widget\" src=\"assets/widget.png\" width=\"360\"\u003e \u003cimg alt=\"widgetdark\" src=\"assets/widgetdark.png\" width=\"360\"\u003e\n\u003c/p\u003e\n\n\u003c/details\u003e\n\n## System Requirements\n\n| Item | Requirement |\n|---|---|\n| Android | 9.0 (API 28) and above |\n| Server | Komari 1.1.7 or above |\n\n## Build\n\n```bash\n# Debug APK\n./gradlew assembleDebug\n\n# Release APK\n./gradlew assembleRelease\n\n# Clean and Build\n./gradlew clean assembleDebug\n```\n\nBuild outputs are located at `app/build/outputs/apk/`.\n\n## Tech Stack\n\n| Library | Version | Purpose |\n|---|---|---|\n| Kotlin | 2.3.10 | Main language |\n| Jetpack Compose BOM | 2026.02.01 | UI Framework |\n| MD3 | — | Design System |\n| Voyager | 1.1.0-beta03 | Navigation + ScreenModel |\n| Koin | 4.1.1 | Dependency Injection |\n| Ktor | 3.4.1 | HTTP Client + WebSocket |\n| Room | 2.8.4 | Local Database (Encrypted credential storage) |\n| Vico | 3.0.3 | Charts (Compose M3) |\n| termux terminal-view | 0.119.0-beta.3 | Terminal ANSI/VT100 Rendering |\n| DataStore Preferences | 1.2.0 | User Preferences Persistence |\n\n## Architecture\n\nAdopts the **MVI (Model-View-Intent)** pattern with an adaptive root shell:\n\n```\nUI Layer      MainActivity Root Shell + Voyager Screen + Compose UI + MviViewModel\u003cState, Event, Effect\u003e\nDomain Layer  Repository Interface + Domain Model (Node, ServerInstance …)\nData Layer    Repository Implementation, Ktor, Room, DataStore\n```\n\nEach page follows the **Contract Pattern**, describing the complete MVI contract of the page with nested `State` / `Event` / `Effect`.\n\n### Navigation Flow\n\n```\nServerListScreen → AddServerScreen\n                 → NodeListScreen → NodeDetailScreen → SshTerminalScreen\n                 → SettingsHubScreen → SettingsScreen / AboutScreen\n```\n\n### Authentication \u0026 Network\n\n- **PASSWORD** — Obtain `session_token` via `POST /api/login` (supports 2FA).\n- **API_KEY** — Use `Authorization: Bearer \u003capi-key\u003e` directly, without login flow.\n- **GUEST** — No authentication header; monitor APIs and WebSocket data remain available, but SSH terminal is disabled.\n- Credentials and session data are encrypted with AES/GCM and stored in Room, automatically restored on startup.\n- WebSocket (`wss://host/api/rpc2`) always requires the `Origin` header.\n- `SessionCookieInterceptor` / network layer automatically inject Cookie, Bearer token, or skip auth headers according to `authType`.\n\n### Adaptive Layout\n\n- Phone / narrow width: standard Voyager stack navigation.\n- Tablet landscape: root-level `NavigationRail` + content pane.\n- Node and server lists switch to multi-column card layouts on wide landscape screens.\n- Node detail charts and info cards use split wide-screen layouts.\n- Form and settings pages use centered constrained-width content on large screens.\n\n## License\n\nThis project is licensed under the [MIT License](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ficylian%2Fyanami","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ficylian%2Fyanami","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ficylian%2Fyanami/lists"}