Conflict on merge: the add-ons table keeps every row (Photo Prints, Photo screensaver, Prayer Times).
Add-ons
Small, optional Android TV apps that plug into the launcher as a module card, kept in this repo
so they are easy to find, build and review. The launcher in launcher/ never
depends on them: it is built, tested and size-checked without this folder, so an add-on can't make
the core bigger or change how it behaves. You install an add-on only if you want it.
Add-ons
| Add-on | What it does | Author | Tested on | Permissions |
|---|---|---|---|---|
| Frigate Glance | Frigate camera pop-ups over whatever is playing | NickLD | TCL 65Q650G | overlay, accessibility (card keys), network, foreground service |
| Capacity Stats | Available/total and used/total RAM; available/total storage | lionlev21 | Android TV 12 (model private) | None |
| Weather | The weather for one city: now, US air quality and the next three days, from Open-Meteo (no key) | @Sumyabazar1 | Hisense SmartTV 4K FFM (lushan), Google TV 12 | INTERNET |
| Photo Prints | Your own photos as a screensaver: dated prints dealt in on a time-of-day sky, and a card that starts the slideshow | @shivamsingh262 | Sony BRAVIA KD-65X82L (Google TV 12) | None |
| Photo screensaver | Your own pictures and MP4 clips as the TV's screensaver and as a card, slowly zooming and crossfading (20 s each by default); optional time, photo dates, prints on a sky and weather | JorickGU | TCL 43P69K (Google TV 12) | INTERNET and coarse location, only with the weather option on |
| Prayer Times | Today's prayer times for one city from Aladhan (no key), the next prayer with a countdown, Gregorian and Hijri dates | @majnioui | Xiaomi TV (MiTV-MOOR2), Google TV 11 | INTERNET |
A widget, an info tile, a storage or smart-home card: if it can live as its own small app, it can live here. See the rules below.
How an add-on works
An add-on is a normal Android TV app with its own Gradle project in addons/<name>/. It declares a
card with the existing module-card contract: the how-to is docs/modules.md
and the spec is docs/specs/card.md. The launcher finds the card, asks the
TV owner once, and shows it as a tile with the add-on's label, caption and glow colour. Nothing else
connects the two.
Build one (JDK 17, Android SDK 34, as for the launcher):
cd addons/<name> && ./gradlew assembleRelease
TV_HOST=<tv ip> tools/venv/bin/python -I tools/tv.py --push addons/<name>/app/build/outputs/apk/release/app-release.apk /data/local/tmp/addon.apk
TV_HOST=<tv ip> tools/venv/bin/python -I tools/tv.py 'pm install -r /data/local/tmp/addon.apk; rm -f /data/local/tmp/addon.apk'
Rules
- Its own app. One folder per add-on,
addons/<name>/, with its own Gradle project (settings.gradle,app/), its own package name and its own README. - Only through the module-card spec. An add-on never edits anything under
launcher/, andlauncher/never referencesaddons/. If your idea needs a change inside the launcher, it isn't an add-on. Open an issue first instead. - No prebuilt APKs in the repo. People build from source, as with the launcher.
- Permissions up front. The add-on's README lists every permission it asks for and why, plus
any network access or background service. The rules in
docs/modules.mdapply: no telemetry without an opt-in, no ads, your own art. - Tested on a real TV. Say which one in the README and in the table above.
- The author maintains it. Issues about an add-on are assigned to its author. An add-on that
breaks on current Android TV versions, or goes unmaintained, may be removed. Its history stays in
git, and you can keep it going in a fork listed in
SHOWCASE.md.
Adding one
Open a pull request that adds addons/<name>/ and one row to the table above. The core CI is not
blocked by add-ons: a separate workflow builds whatever changed under addons/, and
tests/test_addons.py checks the folder rules (own Gradle project, a README with a Permissions
section, no APKs, a row in this table) and that the launcher never includes or references this folder.