An open-source Android TV app that gives your Plex or Jellyfin library a channel lineup, a program guide, and a remote-control experience. Something is always on. Just change the channel.
Media servers all work the same way: open the app, browse, pick a show, pick an episode, press play. That is a video store, not television.
Clickarr flips it:
Open the app. Something is already playing. Change channels. Watch.
You build virtual channels out of your own library. Channel 10 is sitcoms, channel 20 is Star Trek, channel 50 is Christmas movies in December. Each channel runs a schedule. Tune to channel 10 at 7:17 PM and you land seventeen minutes into whatever is airing, exactly like turning on a TV. Leave and come back later and the channel has kept going without you.
Screens from the app as it stands, taken on the Android TV emulator by the test suite on every push.
Clickarr is a single APK that you sideload. There is no Clickarr server, container, or cloud account.
- Nightly (debug build of
main, changes daily): in the Fire TV Downloader app enterclickarr.net/nightly, or fetch it from the nightly pre-release. Once installed, Settings, About updates Clickarr in place from then on. - Release (signed, minified, updated when something is worth releasing): in Downloader enter
clickarr.net/apk, or fetch it from GitHub Releases. Settings, About on the Release channel updates it in place.
Nightlies are signed with one long-lived key, so each one installs over the last. Release builds use a different key; switching channels means uninstalling once.
Everything below is in the nightly and has been exercised on real Fire TV Sticks as well as the emulator.
- Plex or Jellyfin. One server per TV, chosen at first run (ADR 0022). Plex signs in with a code at plex.tv/link; Jellyfin with Quick Connect or a password. Settings has a section for each; the one you do not use is disabled.
- Channels from a library (genre and decade filters, multi-select titles, 0-9 / A-Z jump), collections, playlists, and hand-picked lists. Custom channel picks a library first, then Library, Collections, or Playlists. In order or shuffled. Back to back, or padded to 15, 30, or 60-minute slots with a "Coming up next" promo between programs: the next show's backdrop, time, and synopsis over its theme music.
- Reorder and delete on Settings, Channels: a handle on each regular channel row enters move mode (Up/Down or drag); Delete asks first. Holiday channels keep their numbers. Changes sync through the household or Drive.
- Episodes in a row. A shuffled channel can still play two, three, or a range of one show's episodes back to back in aired order before moving on; a channel of several shows alternates between them.
- Suggest channels. Reads your library once and proposes a starting lineup the way you would make it by hand: a rerun channel for each show you have the most of, collections and playlists with enough in them, genre themes such as Sitcoms, Cartoons, and Horror Movies, strong decades, and one shuffled movie channel.
- Keep lineups current. Once a day Clickarr re-reads every channel's source from your server, so new episodes join at the next program boundary without anyone pressing Refresh.
- Guide two hours across with a now-line, a preview card, favorites, and numeric channel entry. In the player, Left focuses the Audio & video gear; Right opens the mini-guide of upcoming programs.
- Player that tunes in mid-program like television, with an overlay, Up Next, and automatic advancement at each boundary. Audio & video from the gear: pick a server version and an audio track; Settings, Playback sets Preferred audio. Captions in your language: off by default, on in Settings or with a hold of OK. A mid-programme stream drop reconnects at the live position. Double-Back asks before leaving Clickarr; Home (and other backgrounding) stops the tune so channel audio cannot resume under another app.
- Sleep timer and still-watching stop playback and show a bouncing Clickarr logo on black; any button tunes back in live. Back on the sleep UI wakes or dismisses instead of dumping to the TV home screen.
- Deterministic schedules. A channel is a function from time to program; every TV computes the same answer from the same frozen lineup, so nothing drifts and nothing streams between TVs.
- Households. TVs pair over the LAN with a PIN over TLS with pinned certificates. One coordinates, the others cache the lineup and keep playing if it is off; members pick up new channels after join. Manual coordinator migration when the coordinating TV moves on.
- Google Drive sync as the alternative to a LAN household: backup, restore, and TVs in different homes on one lineup, as long as they use the same media server. TV code sign-in, no Google Play Services. Built; waits on a Google OAuth client in the build (ADR 0020).
- Tell Plex or Jellyfin what you watched, off unless you turn it on. Episodes you sit through are marked watched, measured from the player's own position so tuning in for the ending does not count; optionally the running position too, for Continue Watching.
- Settings lock. A four-digit code on an on-screen pad covers Settings and the channel editor; the guide and watching stay open. Per TV, never synced.
- Appearance and time. Four themes (Clickarr navy, Dark, a slate Light, Dracula), three sizes, a clock in the shell, automatic network time and a time zone. The Favorites tab can be hidden.
- Updates and diagnostics. Check, download with checksum, and install from Settings, About, on a nightly or release channel. A Diagnostics pane with everything a bug report needs, tokens never included. Reproducible release builds verified in CI.
Plex or Jellyfin server
│
│ metadata + direct video stream
▼
┌──────────────┐
│ Clickarr APK │
│ channels │
│ scheduler │
│ guide │
│ player │
└──────────────┘
A few decisions shape everything else:
- A channel is a function from time to program. Schedules are never stored or synced. They are recomputed from a frozen lineup, a start time, and a seed, so every device gets the same answer for "what is on channel 10 at 7:17 PM" without talking to each other.
- Video goes straight from your server to the TV. Clickarr never proxies media. The server still does direct play or transcoding; Clickarr asks for the right item at the right offset.
- Multiple TVs form a household over the LAN, or sync through Google Drive. Pick one in Settings. Either way the household shares channels, never credentials.
- Media server credentials never leave the device they were entered on. Each TV signs in itself, and the token lives in that TV's Android Keystore.
- Fire TV is a first-class target. Nothing depends on Google Play Services. Sideload the APK and go.
The full reasoning, with the options that were considered and rejected, is in the architecture proposal. The living summary is docs/architecture.md, and each decision has an ADR.
Clickarr targets Android TV, Google TV, and Fire TV (Fire OS 6+ via sideload). That is the supported product.
Phones and tablets may sideload the APK and open it (the app declares a normal LAUNCHER entry alongside LEANBACK_LAUNCHER, and does not require Leanback to install). Mobile and tablet are unsupported: the UI is built for a D-pad remote and a TV, not touch. Web, Apple TV, and other platforms are not planned.
| Target | Status |
|---|---|
| Amazon Fire TV (Fire OS 6+) via sideload | Maintainer-tested on Fire TV Sticks (including a two-Stick household). The home-row tile is square by Fire OS design for sideloaded apps; the full-width tile comes with an Appstore listing. |
| Android TV / Google TV (Android 7.1+) | Runs end to end on the Android TV emulator in CI on every push. Community and maintainer reports from real sets and boxes below. |
| Phones and tablets | Install and Open can work after sideload; not supported and not a product goal. |
| Web, Apple TV, and other platforms | Not planned. Clickarr is a television interface. |
Community and maintainer reports, not a certification list or a guarantee that every SKU of a brand works:
- Fire TV Sticks (maintainer)
- TCL Smart TV Pro with built-in Google TV
- Xiaomi TV Box
- Roku TV with a Google TV dongle
- LG TV with an Nvidia Shield Pro
- Sceptre TV with a Xiaomi box
If your set or box works (or does not), an issue with the device name and Settings, Diagnostics lines helps everyone.
clickarr.net is the project's home on the web: the pitch, the screens, release notes synced from GitHub Releases (stable and nightly), and the short URLs for Downloader (clickarr.net/nightly, and clickarr.net/apk once there is a release). It is a static page in site/, deployed by GitHub Pages on every push.
- Architecture overview
- Architecture proposal (the approved original, with every option and tradeoff)
- Architecture decision records
- Design language and mockups
- Releasing, developing, security
- Brand assets
Clickarr is developed in the open and help is welcome. The most useful things right now, in order:
- Run the nightly on a real TV and report what breaks. Chromecast with Google TV, Shield, Sony and TCL sets, older Fire TV models: each one is a little different, and CI only has an emulator. Open an issue with the device, the Plex or Jellyfin server version, and the lines from Settings, Diagnostics.
- Try your library against Suggest channels and the channel editor. Odd metadata (specials, multi-part episodes, mixed libraries) is where schedulers go wrong.
- Send a pull request for a bug you can reproduce or a small, well-scoped feature. Open an issue first for anything bigger than an afternoon so we agree on the shape before you write it.
How a change gets in:
- Fork the repo and work on a branch in your fork. Nobody but the maintainer can push to
main, andmainonly takes squash-merged pull requests that pass CI and have been reviewed and merged by the maintainer. That is deliberate: one person is paying attention to every line, and there is no second remote to drift. - CI (detekt, unit tests, lint, a debug build) runs on your pull request after the maintainer approves the run; the emulator suite and the nightly publish run only on
main. Please run./gradlew detekt testyourself first. - Read CONTRIBUTING.md for the rules that will not change: no code copied from other media clients (Clickarr is MIT and stays clean-room), no secrets or server tokens in the repo, Plex and Jellyfin only, and tests alongside scheduler and protocol changes. docs/development.md has the toolchain.
MIT. See LICENSE. Inter is bundled under the SIL Open Font License, and channel glyphs come from Lucide (ISC); see THIRD_PARTY_NOTICES.md. Plex is a trademark of Plex, Inc.; Clickarr is an independent project and is not affiliated with or endorsed by Plex or the Jellyfin project.









