Fork of (https://github.com/andrew-malitchuk/kite-aos) Modern, open-source Android kiosk application designed to transform tablets into dedicated smart home dashboards. https://github.com/andrew-malitchuk/kite-aos
  • HTML 58.8%
  • Kotlin 41.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-08-29 20:31:42 +02:00
build-logic fix: make release signing config optional when keystore is absent 2026-06-13 20:38:24 +03:00
common-core chore: remove GEMINI.md documentation files from all modules 2026-06-10 10:00:00 +03:00
common-core-analytics-api docs: add KDoc across domain, data, and presentation layers 2026-07-05 10:55:35 +03:00
common-core-analytics-impl docs: add KDoc across domain, data, and presentation layers 2026-07-05 10:55:35 +03:00
common-core-analytics-provider-console docs: add KDoc across domain, data, and presentation layers 2026-07-05 10:55:35 +03:00
common-core-analytics-provider-firebase docs: add KDoc across domain, data, and presentation layers 2026-07-05 10:55:35 +03:00
config/detekt chore: add editorconfig and detekt configuration 2026-03-24 13:03:37 +02:00
data-core chore: remove GEMINI.md documentation files from all modules 2026-06-10 10:00:00 +03:00
data-database-api chore: remove GEMINI.md documentation files from all modules 2026-06-10 10:00:00 +03:00
data-database-impl chore: remove GEMINI.md documentation files from all modules 2026-06-10 10:00:00 +03:00
data-mqtt-api feat: extend MQTT with screensaver, FAB, and camera URL telemetry commands 2026-06-02 11:00:00 +03:00
data-mqtt-impl feat: extend MQTT with screensaver, FAB, and camera URL telemetry commands 2026-06-02 11:00:00 +03:00
data-platform-api chore: remove GEMINI.md documentation files from all modules 2026-06-10 10:00:00 +03:00
data-platform-impl docs: add KDoc across domain, data, and presentation layers 2026-07-05 10:55:35 +03:00
data-preferences-api feat: add display on/off scheduler data layer 2026-08-29 15:19:26 +02:00
data-preferences-impl feat: add display on/off scheduler data layer 2026-08-29 15:19:26 +02:00
data-repository-impl feat: add display on/off scheduler data layer 2026-08-29 15:19:26 +02:00
data-runtime-api feat: add data-runtime module with in-memory screen-state source 2026-07-05 10:54:36 +03:00
data-runtime-impl feat: add data-runtime module with in-memory screen-state source 2026-07-05 10:54:36 +03:00
docs docs: document display scheduler, auto-reboot fixes and device-owner revocation 2026-08-29 15:35:52 +02:00
domain-core feat: add display on/off scheduler data layer 2026-08-29 15:19:26 +02:00
domain-repository-api feat: add display on/off scheduler data layer 2026-08-29 15:19:26 +02:00
domain-usecase-api feat: add display on/off scheduler data layer 2026-08-29 15:19:26 +02:00
domain-usecase-impl feat: add display on/off scheduler data layer 2026-08-29 15:19:26 +02:00
gradle fix: use material-icons-extended for Apps icon and correct inkSubtle color token 2026-06-13 20:15:44 +03:00
metadata doc: update documentation 2026-06-13 20:39:57 +03:00
presentation-core-application feat: add revoke Device Owner feature 2026-08-29 15:32:49 +02:00
presentation-core-localisation feat: add revoke Device Owner feature 2026-08-29 15:32:49 +02:00
presentation-core-navigation-api chore: remove GEMINI.md documentation files from all modules 2026-06-10 10:00:00 +03:00
presentation-core-navigation-impl chore: remove GEMINI.md documentation files from all modules 2026-06-10 10:00:00 +03:00
presentation-core-platform fix: address code review findings in scheduler and weekday default 2026-08-29 19:46:26 +02:00
presentation-core-styling chore: remove GEMINI.md documentation files from all modules 2026-06-10 10:00:00 +03:00
presentation-core-ui docs: add KDoc across domain, data, and presentation layers 2026-07-05 10:55:35 +03:00
presentation-feature-about chore: remove GEMINI.md documentation files from all modules 2026-06-10 10:00:00 +03:00
presentation-feature-application docs: add KDoc across domain, data, and presentation layers 2026-07-05 10:55:35 +03:00
presentation-feature-host docs: add CONTRIBUTING guide and refresh project docs 2026-07-05 10:55:14 +03:00
presentation-feature-main refactor: move ScreensaverClock into presentation-core-ui 2026-07-05 10:54:55 +03:00
presentation-feature-onboarding feat: request SCHEDULE_EXACT_ALARM during onboarding 2026-08-29 15:28:29 +02:00
presentation-feature-settings fix: address code review findings in scheduler and weekday default 2026-08-29 19:46:26 +02:00
site feat: extend motion-detection idle timing range to 24h 2026-08-29 15:33:46 +02:00
.editorconfig chore: add editorconfig and detekt configuration 2026-03-24 13:03:37 +02:00
.gitignore chore: ignore Kilo local tooling directory 2026-08-29 19:59:13 +02:00
build.gradle.kts build: upgrade Gradle to 9.3.1 and update version catalog 2026-05-06 19:19:01 +03:00
CHANGELOG.md docs: document display scheduler, auto-reboot fixes and device-owner revocation 2026-08-29 15:35:52 +02:00
CLAUDE.md feat: implement web engine preferences, auto-return, HA discovery, and WebView engine abstraction 2026-05-27 19:16:29 +03:00
CONTRIBUTING.md docs: add CONTRIBUTING guide and refresh project docs 2026-07-05 10:55:14 +03:00
gradle.properties fix: increase JVM and R8 heap to 4 GiB for F-Droid buildserver 2026-06-13 21:06:50 +03:00
gradlew chore(core): optimize gradlew 2026-02-03 18:35:44 +02:00
gradlew.bat chore(core): optimize gradlew 2026-02-03 18:35:44 +02:00
LICENSE Initial commit 2026-03-03 19:15:41 +02:00
mkdocs.yml docs: add CONTRIBUTING guide and refresh project docs 2026-07-05 10:55:14 +03:00
proguard-rules.pro fix: add dontwarn rules for GeckoView transitive missing classes 2026-06-13 21:51:48 +03:00
README.md docs: add installation and operations guide to README 2026-08-29 20:31:42 +02:00
requirements-docs.txt docs: add project documentation, architecture guides, and MkDocs configuration 2026-06-07 12:00:00 +03:00
ROADMAP.md docs: add CONTRIBUTING guide and refresh project docs 2026-07-05 10:55:14 +03:00
settings.gradle.kts feat: add data-runtime module with in-memory screen-state source 2026-07-05 10:54:36 +03:00

img_logo_big_filled.png

Kite

Telegram Latest Release License

Fork Changes

This repository is a fork of Kite AOS based on Kite AOS 1.1.0 (2026-06-13). It adds the following changes on top of that version, targeting smart-home kiosk deployments that need fine-grained screen scheduling and more robust device-owner operation:

  • Display On/Off Scheduler — schedule the kiosk screen to turn on/off on a per-weekday basis with an arbitrary number of rules (weekday chips + on/off time steppers). Uses setExactAndAllowWhileIdle with a setAlarmClock fallback, survives reboots, and suppresses motion-driven wake-ups while the screen is scheduled to be off.
  • Exact Alarms onboarding step — requests SCHEDULE_EXACT_ALARM during the first-run wizard (Android 12+), required by the Display Scheduler and Auto-Reboot.
  • Auto-Reboot fixes — now actually fires on Android 12+ (falls back to setAlarmClock when the exact-alarm permission is missing, instead of silently throwing SecurityException), and surfaces the Device Owner prerequisite in the settings UI so a pending-but-skipped reboot is no longer invisible.
  • Revoke Device Owner — resign the Device Owner privilege (needed to uninstall the kiosk app) either from Settings → System → Revoke Device Owner (with confirmation dialog and app restart) or headlessly over adb via an exported, shell/system-UID-guarded receiver.
  • Longer motion-detection idle times — dim/screen-timeout/FAB delays extended up to 24 h.
  • Dashboard URL validation fix — the URL regex now correctly accepts query (?) and hash (#) URLs.

Installation & Operations

Recommended setup and day-to-day operations for running this fork on a dedicated kiosk tablet. Most steps require a host computer with adb access to the tablet.

Install (debug build)

  1. Enable Developer Mode on the tablet:
    • Settings → About tablet → tap Build number several times until "You are now a developer" appears.
    • Settings → System → Developer options → enable USB debugging.
  2. Connect the tablet via USB and install the APK:
    adb install -r -t "presentation-core-application/build/outputs/apk/foss/debug/presentation-core-application-foss-debug.apk"
    
  3. (Optional, my modification) Set the app as Device Owner so it can reboot the device (required for Auto-Reboot / remote reboot):
    adb shell dpm set-device-owner dev.kite.aos.debug/presentation.core.platform.source.receiver.ApplicationDeviceAdminReceiver
    

Keep the display on and disable the lock screen. A lock screen PIN must be disabled first (set to "swipe") before disposing of the lock screen:

# Disable the lock screen (the PIN must already be disabled / set to swipe)
adb shell locksettings set-disabled true

# Never time out the display
adb shell settings put system screen_off_timeout 2147483647

# Keep the screen on while plugged in (charging)
adb shell settings put global stay_on_while_plugged_in 3

Overview

Kite AOS is a modern, open-source Android kiosk application designed to transform tablets into dedicated smart home dashboards. While optimized for Home Assistant, it is designed for any use case requiring a persistent, locked-down web-view interface (e.g., industrial panels, information kiosks, or dedicated web-resource controllers).

Originally developed to solve my personal smart home setup needs, the platform is highly modular. I'm always open to discussions and feature requests to expand its capabilities. Feel free to open an issue!

Telegram channel.

Onboarding Dashboard Settings — Motion & Camera Settings — MQTT & Web Kiosk

Settings — WebView & UI Settings — System & Advanced

Demo

Core Features

  • Versatile Web Kiosk: Display any web-based interface in a full-screen, locked-down environment. Choose between Android WebView and GeckoView (Firefox) engines.
  • Motion-Aware Intelligence: Automatic display wake-up via CameraX (Luma analysis), eliminating external hardware requirements.
  • MQTT & HA Discovery: Seamless integration with Home Assistant. Device state, battery, and motion data are exposed automatically.
  • Clean Architecture: A modular system comprising 40+ independent modules for maximum scalability.
  • Kiosk Lockdown: Full restriction of navigation gestures, status bars, and system notifications.

Functional Capabilities

Feature Description
Browser Engine Switchable engine: Android WebView (default) or GeckoView (Firefox) for better WebRTC/camera support.
Control Drawer Side panel (Haze blur) for WebView navigation control and a launcher for whitelisted apps.
Hardware Management Automated screen dimming and forced locking after periods of inactivity.
Onboarding Wizard Step-by-step configuration for system permissions and MQTT connectivity.
Custom Launcher Set Kite as the default Android launcher to prevent users from leaving the kiosk.
Auto-Return to Kiosk Automatically returns to the dashboard 30 s after leaving to an external app.
Network Recovery Detects connectivity loss and automatically reloads the dashboard on restoration.
Config Import / Export Back up and restore all settings as a JSON file via the system file picker.
HA Auto-Discovery Scans the local network for Home Assistant instances and populates the dashboard URL automatically.
Screensaver Image slideshow overlay with optional clock display; configurable activation delay and slide interval; dismisses automatically when motion is detected.
MJPEG Streaming Streams the front camera as MJPEG over HTTP (/stream.mjpg, /snapshot.jpg). The stream URL is auto-published to Home Assistant via MQTT Discovery — no credentials or manual YAML required.
Auto-Reboot Scheduled device reboots on a daily, weekly, bi-weekly, or monthly interval at a configured time; keeps long-running kiosk deployments healthy.
Periodic WebView Refresh Automatically reloads the dashboard at a configurable interval.
Reduce Motion Disables Android animations globally for smoother performance on low-end hardware.
MQTT Remote Control Bidirectional MQTT: control brightness, volume, FAB visibility, and receive device telemetry.
Analytics Pluggable analytics provider (console logging; Firebase Crashlytics in GMS flavor).

Technical Specifications

  • Framework: Jetpack Compose for the native UI layer.
  • State Management: Orbit MVI.
  • Persistence: Proto DataStore for atomic, thread-safe configuration.
  • Dependency Injection: Koin.
  • Camera: CameraX — Luma analysis for motion detection; MJPEG streaming server at 640×480.
  • MQTT: kmqtt-client-jvm with bidirectional telemetry and Home Assistant Discovery.
  • Analytics: Pluggable provider pattern — console in FOSS, Firebase Crashlytics in GMS.
  • Build System: Gradle Convention Plugins for centralized build logic.
  • Build Flavors: foss (no GMS/Firebase) and gms (full Firebase suite).

Installation & Deployment

Quick Install

Download the latest APK directly from GitHub Releases — no build step required.

  1. Download kite-*.apk from the latest release.
  2. Enable "Install from unknown sources" on your device.
  3. Install the APK and follow the onboarding wizard.

Build from Source

Prerequisites

  • Android Studio Ladybug or newer
  • JDK 21
  • Android Device (API level 26+)

Build Instructions

# Clone the repository
git clone https://github.com/andrew-malitchuk/kite-aos.git

# Generate debug APK
./gradlew assembleDebug

Setup

  1. Deploy the APK to the target device.
  2. Complete the initial configuration wizard to grant system-level permissions.
  3. Configure the dashboard URL and MQTT broker credentials.

Roadmap

The full roadmap is tracked in ROADMAP.md. Highlights currently in progress:

  • Companion HA Entities — expose uptime, app version, IP address, and current URL as Home Assistant sensors.
  • Inactivity Page Reset — navigate back to the home URL after a configurable idle period.
  • Volume Button Gesture — open the control drawer by pressing a physical volume button N times.
  • Time-Based Sleep / Wake Scheduler — define daily on/off rules without requiring Home Assistant automations.
  • Remote MQTT Commands — accept inbound commands to control WebView navigation remotely.

Community-sourced items and votes live in GitHub Issues.

Community

Join the Telegram channel @kite_aos for:

  • Feature discussions — suggest and vote on new capabilities
  • Troubleshooting — get help from the community and maintainer
  • Tips & tricks — share setups, automations, and HA integrations
  • Release announcements — be the first to know about updates

Feedback & Feature Requests

For bug reports and tracked feature requests, open an issue on GitHub. For open-ended discussions and quick questions, use the Telegram channel.

Troubleshooting

Check out the troubleshooting section for common problems and solutions. For community support, join the Telegram channel @kite_aos — someone has likely seen your issue before.

Contributing

Contributions are welcome. See CONTRIBUTING.md for the full guide covering branch naming, code style, module structure, and the PR process.

This project started as a personal tool to cover my specific use cases. If you need functionality that isn't currently supported, open an issue first so we can align on scope before you invest time in a PR.


Built with Jetpack Compose, Koin, and Orbit MVI.

License

Apache 2.0 License

Copyright (c) [2026] [Andrew Malitchuk]

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.