Architecture Overview
Layers
Section titled “Layers”| Layer | Technology | Role |
|---|---|---|
| Frontend | SolidJS + Kobalte + Vite | UI (dashboard / settings / updates / licenses) |
| Backend | Rust / Tauri v2 | Media retrieval, Discord integration, settings management |
| Android native | Kotlin | Notification access, foreground service, JNI bridge |
Directories
Section titled “Directories”src/ Frontend (SolidJS) components/ UI components (panels, cards, etc.) locales/{ja,en}.json i18n strings (auto-selected from OS language at startup)src-tauri/ src/ adb/ ADB client and dumpsys parser apk_label/ App name resolution by pulling APKs (+disk cache) artwork/ ArtworkResolver plugin group (Niconico, YouTube, etc.) android/discord.rs C FFI wrapper for the Discord Social SDK commands/app.rs IPC commands exposed to the frontend tray.rs, config.rs ... Tray / settings / i18n / shutdown handling gen/android/ Android project (Kotlin) app/src/main/java/... MediaCollectorService (notification access) / MediaInfoService (FGS) / MediaBridge (JNI) etc.site/ Documentation site (Astro Starlight)scripts/ Build helper scripts (license generation, etc.)Main Data Flows
Section titled “Main Data Flows”- Desktop: the
adbmodule parsesdumpsys media_session→ frontend fetches via the IPC commandget_media_infoevery 5 seconds → updates Discord IPC only on change - Android: Kotlin-side events (notification posted/removed + a 30-second safety timer) flow into Rust through the JNI
MediaBridge.updateMediaInfoand are delivered to the frontend as the Tauri eventmedia-updated(normally event-driven, with a 30-second safety polling interval as backup)
IPC Command List
Section titled “IPC Command List”Tauri commands callable from the frontend (commands/app.rs):
| Command | Environment | Purpose |
|---|---|---|
get_adb_status |
Desktop | Get ADB connection status |
get_media_info |
Common | Get current media information |
connect_discord / disconnect_discord |
Common | Control the Discord connection |
update_discord_presence |
Common | Update Rich Presence |
get_discord_status |
Common | Get Discord connection status |
get_rpc_enabled / set_rpc_enabled |
Android | Persist the RPC toggle |
get_settings / update_settings |
Common | Read/write settings |
list_media_apps |
Android (empty-array stub on desktop) | List apps for the whitelist |
get_notification_access_status / open_notification_access_settings |
Android (success-path stubs on desktop) | Check & open notification access permission |
get_signing_fingerprint |
Android (None on desktop) |
Get the APK signing fingerprint |
check_android_update / download_android_update / install_android_update |
Android | Check, download, and install Android updates |
get_install_permission_status / open_install_permission_settings |
Android | Check & open the unknown-apps install permission |
Key External Dependencies
Section titled “Key External Dependencies”- adb_client — ADB protocol
- discord-rich-presence — desktop Discord IPC
- Discord Social SDK (Android) — not committed to the repository due to its terms; CI downloads it each time (see Release)
For design philosophy and implementation details, see also the comments in the source code.