[Skip to content](https://github.com/ahXN00/OwnTV#start-of-content)

You signed in with another tab or window. [Reload](https://github.com/ahXN00/OwnTV) to refresh your session.You signed out in another tab or window. [Reload](https://github.com/ahXN00/OwnTV) to refresh your session.You switched accounts on another tab or window. [Reload](https://github.com/ahXN00/OwnTV) to refresh your session.Dismiss alert

{{ message }}

[ahXN00](https://github.com/ahXN00)/ **[OwnTV](https://github.com/ahXN00/OwnTV)** Public

- [Notifications](https://github.com/login?return_to=%2FahXN00%2FOwnTV) You must be signed in to change notification settings
- [Fork\\
31](https://github.com/login?return_to=%2FahXN00%2FOwnTV)
- [Star\\
216](https://github.com/login?return_to=%2FahXN00%2FOwnTV)


main

[**1** Branch](https://github.com/ahXN00/OwnTV/branches) [**16** Tags](https://github.com/ahXN00/OwnTV/tags)

[Go to Branches page](https://github.com/ahXN00/OwnTV/branches)[Go to Tags page](https://github.com/ahXN00/OwnTV/tags)

Go to file

Code

Open more actions menu

## Folders and files

| Name | Name | Last commit message | Last commit date |
| --- | --- | --- | --- |
| ## Latest commit<br>![author](https://github.githubassets.com/images/gravatars/gravatar-user-420.png?size=40)<br>Ashiq Hasan<br>[Hide individual movies & series everywhere; add Customize PIN lock](https://github.com/ahXN00/OwnTV/commit/b3dfb8a86c19752682f75a5141e53f74e5421e3d)<br>Open commit detailssuccess<br>2 hours agoJul 6, 2026<br>[b3dfb8a](https://github.com/ahXN00/OwnTV/commit/b3dfb8a86c19752682f75a5141e53f74e5421e3d) · 2 hours agoJul 6, 2026<br>## History<br>[112 Commits](https://github.com/ahXN00/OwnTV/commits/main/) <br>Open commit details<br>[View commit history for this file.](https://github.com/ahXN00/OwnTV/commits/main/) 112 Commits |
| [.github](https://github.com/ahXN00/OwnTV/tree/main/.github ".github") | [.github](https://github.com/ahXN00/OwnTV/tree/main/.github ".github") | [Multi-playlist active filter, docs, contribution templates; restore p…](https://github.com/ahXN00/OwnTV/commit/1e672969476f852c329706f9e8f64ad25fc4ea86 "Multi-playlist active filter, docs, contribution templates; restore product brief  Selecting a playlist as \"Default\" now actually filters the app instead of only relabeling. A single \"active playlist\" setting (defaultSourceId; -1 = All) is applied as a display-only filter across Live TV, Movies, Series, TV Guide, Search, and the Home rails (Continue Watching / Favourites). \"All playlists\" restores the merged view. Nothing is deleted or re-imported.  Playback/UI: - New top-bar playlist switcher (chip becomes a button with 2+ playlists):   All / A / B / C picker, applies everywhere instantly, persists across   restarts. Chip shows \"All playlists\" when no default is set. - Default is chosen in the playlist Add/Edit form via a \"Default playlist\"   toggle; removed the per-row \"Make Default\" button (list shows a DEFAULT   status badge only). Toggling off the current default clears it to All. - Favourites & History rails in Live/Movies/Series now honor the active   playlist (list, inline search, Move snapshot, and count badges), via   sourceId filtering added to Channel/Movie/Series DAO queries. - Home rails post-filter Continue Watching / Recent / Favourites by source.  Shared logic: - New core/repository/ActiveSources.kt (activeProfileSources / activeSourceIds)   used by all Browse view models.  Backup/restore already covers defaultSourceId (Sources section) — no change.  Docs: - USER_GUIDE: new \"Multiple playlists\" section; CHANGELOG (v4.0.2) and README   updated. - Restore extras/OwnTV_Master_Product_Brief.docx (deleted in v4.0.0) and bring   it up to date: multiple playlists, VOD engine fallback + per-item MPV/EXO   toggle, per-item Move/Remove-from-History/Download, per-source Auto Refresh,   typed M3U import.  Contribution templates: - Converted bug_report / feature_request to GitHub Issue Forms with mandatory   required checkboxes (must confirm they read the User Guide and checked in-app   Settings/functions before filing); blank issues stay disabled. - PR template gains a required acknowledgement block, enforced by a new   pr-checklist GitHub Action (mark it a required status check to hard-block).") | 2 days agoJul 4, 2026 |
| [app](https://github.com/ahXN00/OwnTV/tree/main/app "app") | [app](https://github.com/ahXN00/OwnTV/tree/main/app "app") | [Hide individual movies & series everywhere; add Customize PIN lock](https://github.com/ahXN00/OwnTV/commit/b3dfb8a86c19752682f75a5141e53f74e5421e3d "Hide individual movies & series everywhere; add Customize PIN lock  Extends Live TV's per-item hide to Movies and Series, and adds an optional PIN lock on the Customize screen.  Hide (long-press → Hide): - Removes the title everywhere at once: global Search, in-section   search, its category, the All list + count, Home rails (Continue   Watching / Favourites), the Android TV Watch Next launcher, and   Downloads. The downloaded file is kept and the item returns on unhide. - Hidden categories now hide their items everywhere too. Previously a   hidden Movies/Series category only dropped the rail folder while its   items still showed in All and Search — now matches Live TV. - Unhide any hidden channel, movie or series from one place.  Customize screen: - Renamed \"Customize Category\" -> \"Customize & Hidden Items\" (it now   manages hidden items too). - Optional per-profile PIN lock (top-right \"Set PIN\"); asked on every   entry so nobody else can unhide items or change category setup.   Deliberately NOT included in backups (a lock code shouldn't travel in   a readable file; a restore must never lock you out).  Backup & Restore: - The chosen download folder — the one persistent setting still missing   — is now backed up and restored. A stale path on another device safely   falls back to app storage.  Docs: CHANGELOG, CHANGELOG_APP, USER_GUIDE, README, product brief.") | 2 hours agoJul 6, 2026 |
| [extras](https://github.com/ahXN00/OwnTV/tree/main/extras "extras") | [extras](https://github.com/ahXN00/OwnTV/tree/main/extras "extras") | [Hide individual movies & series everywhere; add Customize PIN lock](https://github.com/ahXN00/OwnTV/commit/b3dfb8a86c19752682f75a5141e53f74e5421e3d "Hide individual movies & series everywhere; add Customize PIN lock  Extends Live TV's per-item hide to Movies and Series, and adds an optional PIN lock on the Customize screen.  Hide (long-press → Hide): - Removes the title everywhere at once: global Search, in-section   search, its category, the All list + count, Home rails (Continue   Watching / Favourites), the Android TV Watch Next launcher, and   Downloads. The downloaded file is kept and the item returns on unhide. - Hidden categories now hide their items everywhere too. Previously a   hidden Movies/Series category only dropped the rail folder while its   items still showed in All and Search — now matches Live TV. - Unhide any hidden channel, movie or series from one place.  Customize screen: - Renamed \"Customize Category\" -> \"Customize & Hidden Items\" (it now   manages hidden items too). - Optional per-profile PIN lock (top-right \"Set PIN\"); asked on every   entry so nobody else can unhide items or change category setup.   Deliberately NOT included in backups (a lock code shouldn't travel in   a readable file; a restore must never lock you out).  Backup & Restore: - The chosen download folder — the one persistent setting still missing   — is now backed up and restored. A stale path on another device safely   falls back to app storage.  Docs: CHANGELOG, CHANGELOG_APP, USER_GUIDE, README, product brief.") | 2 hours agoJul 6, 2026 |
| [gradle](https://github.com/ahXN00/OwnTV/tree/main/gradle "gradle") | [gradle](https://github.com/ahXN00/OwnTV/tree/main/gradle "gradle") | [Complete TMDB metadata feature: trailers, name override, worker sourc…](https://github.com/ahXN00/OwnTV/commit/ae2e08f25d255bd47cab0171065c55b2d2cb2d87 "Complete TMDB metadata feature: trailers, name override, worker source, attribution & docs  Finishes the TMDB enrichment branch (U5b + U4 + M2 + M6 polish):  - Set TMDB name (U5b): manual title/year override for movies & series via   long-press dialog; stored in DataStore (MetadataOverrideStore), survives   re-syncs; override skips fuzzy matching and trusts TMDB's top hit - In-app trailers (U4): android-youtube-player 13.0.0; floating player window   styled like the TMDB Details card (Exit, progress bar, D-pad seek +/-10s,   YouTube-app fallback, auto-close at end); \"Play Trailer\" in movie/series   long-press menus, shown only when TMDB has a trailer - DB v12: additive metadata_cache.trailerKey column (MIGRATION_11_12); trailer   key parsed from append_to_response=videos (official Trailer > Trailer > Teaser) - Fix: episode long-press menu now returns focus to the episode row after any   action (e.g. Refetch TMDB details) instead of dropping it - In-app toast replaces remaining system toasts (already-downloaded paths) - worker/: Cloudflare Worker source (caching TMDB proxy) + wrangler.toml +   self-host README — the default metadata server is now version-controlled - TMDB attribution: official logo bundled (drawable + extras/tmdb_logo.svg),   shown in Settings -> Metadata; README gains a Credits - TMDB section - Docs: CHANGELOG.md / CHANGELOG_APP.md / USER_GUIDE.md / README.md updated;   plan file trimmed (staged docs transferred; Home trickle handed to codeVerine)") | 8 hours agoJul 6, 2026 |
| [worker](https://github.com/ahXN00/OwnTV/tree/main/worker "worker") | [worker](https://github.com/ahXN00/OwnTV/tree/main/worker "worker") | [Complete TMDB metadata feature: trailers, name override, worker sourc…](https://github.com/ahXN00/OwnTV/commit/ae2e08f25d255bd47cab0171065c55b2d2cb2d87 "Complete TMDB metadata feature: trailers, name override, worker source, attribution & docs  Finishes the TMDB enrichment branch (U5b + U4 + M2 + M6 polish):  - Set TMDB name (U5b): manual title/year override for movies & series via   long-press dialog; stored in DataStore (MetadataOverrideStore), survives   re-syncs; override skips fuzzy matching and trusts TMDB's top hit - In-app trailers (U4): android-youtube-player 13.0.0; floating player window   styled like the TMDB Details card (Exit, progress bar, D-pad seek +/-10s,   YouTube-app fallback, auto-close at end); \"Play Trailer\" in movie/series   long-press menus, shown only when TMDB has a trailer - DB v12: additive metadata_cache.trailerKey column (MIGRATION_11_12); trailer   key parsed from append_to_response=videos (official Trailer > Trailer > Teaser) - Fix: episode long-press menu now returns focus to the episode row after any   action (e.g. Refetch TMDB details) instead of dropping it - In-app toast replaces remaining system toasts (already-downloaded paths) - worker/: Cloudflare Worker source (caching TMDB proxy) + wrangler.toml +   self-host README — the default metadata server is now version-controlled - TMDB attribution: official logo bundled (drawable + extras/tmdb_logo.svg),   shown in Settings -> Metadata; README gains a Credits - TMDB section - Docs: CHANGELOG.md / CHANGELOG_APP.md / USER_GUIDE.md / README.md updated;   plan file trimmed (staged docs transferred; Home trickle handed to codeVerine)") | 8 hours agoJul 6, 2026 |
| [.gitattributes](https://github.com/ahXN00/OwnTV/blob/main/.gitattributes ".gitattributes") | [.gitattributes](https://github.com/ahXN00/OwnTV/blob/main/.gitattributes ".gitattributes") | [Initial commit: OwnTV — native Android TV IPTV player](https://github.com/ahXN00/OwnTV/commit/f4daa53e3cbd63cef914c2ec44b86ea8da495e79 "Initial commit: OwnTV — native Android TV IPTV player") | last monthJun 10, 2026 |
| [.gitignore](https://github.com/ahXN00/OwnTV/blob/main/.gitignore ".gitignore") | [.gitignore](https://github.com/ahXN00/OwnTV/blob/main/.gitignore ".gitignore") | [Multi-playlist active filter, docs, contribution templates; restore p…](https://github.com/ahXN00/OwnTV/commit/1e672969476f852c329706f9e8f64ad25fc4ea86 "Multi-playlist active filter, docs, contribution templates; restore product brief  Selecting a playlist as \"Default\" now actually filters the app instead of only relabeling. A single \"active playlist\" setting (defaultSourceId; -1 = All) is applied as a display-only filter across Live TV, Movies, Series, TV Guide, Search, and the Home rails (Continue Watching / Favourites). \"All playlists\" restores the merged view. Nothing is deleted or re-imported.  Playback/UI: - New top-bar playlist switcher (chip becomes a button with 2+ playlists):   All / A / B / C picker, applies everywhere instantly, persists across   restarts. Chip shows \"All playlists\" when no default is set. - Default is chosen in the playlist Add/Edit form via a \"Default playlist\"   toggle; removed the per-row \"Make Default\" button (list shows a DEFAULT   status badge only). Toggling off the current default clears it to All. - Favourites & History rails in Live/Movies/Series now honor the active   playlist (list, inline search, Move snapshot, and count badges), via   sourceId filtering added to Channel/Movie/Series DAO queries. - Home rails post-filter Continue Watching / Recent / Favourites by source.  Shared logic: - New core/repository/ActiveSources.kt (activeProfileSources / activeSourceIds)   used by all Browse view models.  Backup/restore already covers defaultSourceId (Sources section) — no change.  Docs: - USER_GUIDE: new \"Multiple playlists\" section; CHANGELOG (v4.0.2) and README   updated. - Restore extras/OwnTV_Master_Product_Brief.docx (deleted in v4.0.0) and bring   it up to date: multiple playlists, VOD engine fallback + per-item MPV/EXO   toggle, per-item Move/Remove-from-History/Download, per-source Auto Refresh,   typed M3U import.  Contribution templates: - Converted bug_report / feature_request to GitHub Issue Forms with mandatory   required checkboxes (must confirm they read the User Guide and checked in-app   Settings/functions before filing); blank issues stay disabled. - PR template gains a required acknowledgement block, enforced by a new   pr-checklist GitHub Action (mark it a required status check to hard-block).") | 2 days agoJul 4, 2026 |
| [CHANGELOG.md](https://github.com/ahXN00/OwnTV/blob/main/CHANGELOG.md "CHANGELOG.md") | [CHANGELOG.md](https://github.com/ahXN00/OwnTV/blob/main/CHANGELOG.md "CHANGELOG.md") | [Hide individual movies & series everywhere; add Customize PIN lock](https://github.com/ahXN00/OwnTV/commit/b3dfb8a86c19752682f75a5141e53f74e5421e3d "Hide individual movies & series everywhere; add Customize PIN lock  Extends Live TV's per-item hide to Movies and Series, and adds an optional PIN lock on the Customize screen.  Hide (long-press → Hide): - Removes the title everywhere at once: global Search, in-section   search, its category, the All list + count, Home rails (Continue   Watching / Favourites), the Android TV Watch Next launcher, and   Downloads. The downloaded file is kept and the item returns on unhide. - Hidden categories now hide their items everywhere too. Previously a   hidden Movies/Series category only dropped the rail folder while its   items still showed in All and Search — now matches Live TV. - Unhide any hidden channel, movie or series from one place.  Customize screen: - Renamed \"Customize Category\" -> \"Customize & Hidden Items\" (it now   manages hidden items too). - Optional per-profile PIN lock (top-right \"Set PIN\"); asked on every   entry so nobody else can unhide items or change category setup.   Deliberately NOT included in backups (a lock code shouldn't travel in   a readable file; a restore must never lock you out).  Backup & Restore: - The chosen download folder — the one persistent setting still missing   — is now backed up and restored. A stale path on another device safely   falls back to app storage.  Docs: CHANGELOG, CHANGELOG_APP, USER_GUIDE, README, product brief.") | 2 hours agoJul 6, 2026 |
| [CHANGELOG\_APP.md](https://github.com/ahXN00/OwnTV/blob/main/CHANGELOG_APP.md "CHANGELOG_APP.md") | [CHANGELOG\_APP.md](https://github.com/ahXN00/OwnTV/blob/main/CHANGELOG_APP.md "CHANGELOG_APP.md") | [Hide individual movies & series everywhere; add Customize PIN lock](https://github.com/ahXN00/OwnTV/commit/b3dfb8a86c19752682f75a5141e53f74e5421e3d "Hide individual movies & series everywhere; add Customize PIN lock  Extends Live TV's per-item hide to Movies and Series, and adds an optional PIN lock on the Customize screen.  Hide (long-press → Hide): - Removes the title everywhere at once: global Search, in-section   search, its category, the All list + count, Home rails (Continue   Watching / Favourites), the Android TV Watch Next launcher, and   Downloads. The downloaded file is kept and the item returns on unhide. - Hidden categories now hide their items everywhere too. Previously a   hidden Movies/Series category only dropped the rail folder while its   items still showed in All and Search — now matches Live TV. - Unhide any hidden channel, movie or series from one place.  Customize screen: - Renamed \"Customize Category\" -> \"Customize & Hidden Items\" (it now   manages hidden items too). - Optional per-profile PIN lock (top-right \"Set PIN\"); asked on every   entry so nobody else can unhide items or change category setup.   Deliberately NOT included in backups (a lock code shouldn't travel in   a readable file; a restore must never lock you out).  Backup & Restore: - The chosen download folder — the one persistent setting still missing   — is now backed up and restored. A stale path on another device safely   falls back to app storage.  Docs: CHANGELOG, CHANGELOG_APP, USER_GUIDE, README, product brief.") | 2 hours agoJul 6, 2026 |
| [CONTRIBUTING.md](https://github.com/ahXN00/OwnTV/blob/main/CONTRIBUTING.md "CONTRIBUTING.md") | [CONTRIBUTING.md](https://github.com/ahXN00/OwnTV/blob/main/CONTRIBUTING.md "CONTRIBUTING.md") | [Add auto-versioning, contributing guide, and PR template \[skip ci\]](https://github.com/ahXN00/OwnTV/commit/1a682e6195e98f6756947e07699964550b533745 "Add auto-versioning, contributing guide, and PR template [skip ci]") | last monthJun 10, 2026 |
| [LICENSE](https://github.com/ahXN00/OwnTV/blob/main/LICENSE "LICENSE") | [LICENSE](https://github.com/ahXN00/OwnTV/blob/main/LICENSE "LICENSE") | [\- \*\*Live TV could give up reconnecting too early during a real outage…](https://github.com/ahXN00/OwnTV/commit/aa6e84684f2bf3fc561af103581091049942ae75 "- **Live TV could give up reconnecting too early during a real outage** — a single failed reconnect   attempt was being counted twice against the retry budget (ExoPlayer fires both an error and an idle   event for the same failure), so a provider hiccup that needed ~30–60s to recover could exhaust all   retries and show \"Lost connection to this channel\" well before the stream was actually back. Reconnect   attempts are now deduplicated so each real failure only counts once, and the retry budget was raised   slightly to cover longer outages.    ### 📄 License  - OwnTV has moved from the **MIT License** to the **GNU General Public License v3.0 (GPLv3)**. OwnTV   remains fully open-source — anyone can use, study, modify, and redistribute it, including commercially —   but any redistributed version (forks, modified builds, or commercial products built on it) must also   be licensed under GPLv3 with its source made available. Versions released before this change remain   available under MIT. See [LICENSE](LICENSE).") | 5 days agoJul 1, 2026 |
| [README.md](https://github.com/ahXN00/OwnTV/blob/main/README.md "README.md") | [README.md](https://github.com/ahXN00/OwnTV/blob/main/README.md "README.md") | [Hide individual movies & series everywhere; add Customize PIN lock](https://github.com/ahXN00/OwnTV/commit/b3dfb8a86c19752682f75a5141e53f74e5421e3d "Hide individual movies & series everywhere; add Customize PIN lock  Extends Live TV's per-item hide to Movies and Series, and adds an optional PIN lock on the Customize screen.  Hide (long-press → Hide): - Removes the title everywhere at once: global Search, in-section   search, its category, the All list + count, Home rails (Continue   Watching / Favourites), the Android TV Watch Next launcher, and   Downloads. The downloaded file is kept and the item returns on unhide. - Hidden categories now hide their items everywhere too. Previously a   hidden Movies/Series category only dropped the rail folder while its   items still showed in All and Search — now matches Live TV. - Unhide any hidden channel, movie or series from one place.  Customize screen: - Renamed \"Customize Category\" -> \"Customize & Hidden Items\" (it now   manages hidden items too). - Optional per-profile PIN lock (top-right \"Set PIN\"); asked on every   entry so nobody else can unhide items or change category setup.   Deliberately NOT included in backups (a lock code shouldn't travel in   a readable file; a restore must never lock you out).  Backup & Restore: - The chosen download folder — the one persistent setting still missing   — is now backed up and restored. A stale path on another device safely   falls back to app storage.  Docs: CHANGELOG, CHANGELOG_APP, USER_GUIDE, README, product brief.") | 2 hours agoJul 6, 2026 |
| [build.gradle.kts](https://github.com/ahXN00/OwnTV/blob/main/build.gradle.kts "build.gradle.kts") | [build.gradle.kts](https://github.com/ahXN00/OwnTV/blob/main/build.gradle.kts "build.gradle.kts") | [Initial commit: OwnTV — native Android TV IPTV player](https://github.com/ahXN00/OwnTV/commit/f4daa53e3cbd63cef914c2ec44b86ea8da495e79 "Initial commit: OwnTV — native Android TV IPTV player") | last monthJun 10, 2026 |
| [gradle.properties](https://github.com/ahXN00/OwnTV/blob/main/gradle.properties "gradle.properties") | [gradle.properties](https://github.com/ahXN00/OwnTV/blob/main/gradle.properties "gradle.properties") | [Initial commit: OwnTV — native Android TV IPTV player](https://github.com/ahXN00/OwnTV/commit/f4daa53e3cbd63cef914c2ec44b86ea8da495e79 "Initial commit: OwnTV — native Android TV IPTV player") | last monthJun 10, 2026 |
| [gradlew](https://github.com/ahXN00/OwnTV/blob/main/gradlew "gradlew") | [gradlew](https://github.com/ahXN00/OwnTV/blob/main/gradlew "gradlew") | [Android TV Home: Continue Watching](https://github.com/ahXN00/OwnTV/commit/7599eadd7530a55ea3d1fb43444fd22df2a06964 "Android TV Home: Continue Watching  - Add Android TV Home integration (Watch Next / Continue Watching) and wire it through settings. - Improve database upgrades with schema v4 + idempotent 3→4 migration (unifies earlier schema variants). - Enable Room schema export and add migration test coverage.  Co-authored-by: Cursor <cursoragent@cursor.com>") | 2 weeks agoJun 22, 2026 |
| [gradlew.bat](https://github.com/ahXN00/OwnTV/blob/main/gradlew.bat "gradlew.bat") | [gradlew.bat](https://github.com/ahXN00/OwnTV/blob/main/gradlew.bat "gradlew.bat") | [Initial commit: OwnTV — native Android TV IPTV player](https://github.com/ahXN00/OwnTV/commit/f4daa53e3cbd63cef914c2ec44b86ea8da495e79 "Initial commit: OwnTV — native Android TV IPTV player") | last monthJun 10, 2026 |
| [settings.gradle.kts](https://github.com/ahXN00/OwnTV/blob/main/settings.gradle.kts "settings.gradle.kts") | [settings.gradle.kts](https://github.com/ahXN00/OwnTV/blob/main/settings.gradle.kts "settings.gradle.kts") | [Initial commit: OwnTV — native Android TV IPTV player](https://github.com/ahXN00/OwnTV/commit/f4daa53e3cbd63cef914c2ec44b86ea8da495e79 "Initial commit: OwnTV — native Android TV IPTV player") | last monthJun 10, 2026 |
| View all files |

## Repository files navigation

[![OwnTV](https://github.com/ahXN00/OwnTV/raw/main/extras/logo.png)](https://github.com/ahXN00/OwnTV/blob/main/extras/logo.png)

**Your own IPTV player for Android TV**

Fast · modern · remote-first — bring your own M3U or Xtream sources

![Platform](https://camo.githubusercontent.com/65cc231a1569e7d9c2ea46e627b3bffbbc210f6e3d78776577d8833769291714/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f706c6174666f726d2d416e64726f696425323054562d3344444338343f6c6f676f3d616e64726f6964266c6f676f436f6c6f723d7768697465)![Kotlin](https://camo.githubusercontent.com/8fd8f16ac8e23ead764a048b876c6912e496e74502e8d43aa5b62f32897fe927/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4b6f746c696e2d322e332e31302d3746353246463f6c6f676f3d6b6f746c696e266c6f676f436f6c6f723d7768697465)![Compose for TV](https://camo.githubusercontent.com/a5eb2412907ff827e8fbbdc64eb5e15df89cd52619f3a9fbac3704240f4f3695/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4a65747061636b253230436f6d706f73652d666f7225323054562d3432383546343f6c6f676f3d6a65747061636b636f6d706f7365266c6f676f436f6c6f723d7768697465)![Player](https://camo.githubusercontent.com/13d8b0136e9c536e1c4867844bb6574650c79d4af511509ebfd4b23bc67fbccd/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f656e67696e65732d6c69626d707625323025324225323045786f506c617965722d464238433030)![License](https://camo.githubusercontent.com/53640fb3f3383f0792fb73ce8f5e6e6b0ce896201473ec0bf4be3f64345b92b7/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d47504c76332d626c7565)![Built with the help of AI](https://camo.githubusercontent.com/3755bf1e7a25c7058fe56913c4e71e0a645026f107f5ffc4c78dc925a9b3e96a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6275696c74253230776974682d74686525323068656c702532306f6625323041492d384132424532)

[![Android CI](https://github.com/ahXN00/OwnTV/actions/workflows/android.yml/badge.svg)](https://github.com/ahXN00/OwnTV/actions/workflows/android.yml)

* * *

OwnTV is a native **Android TV** IPTV **player** built with Kotlin, Jetpack Compose for TV, and a
**dual playback engine** — **libmpv (FFmpeg)** for movies/series and maximum compatibility, **ExoPlayer**
**(Media3)** for near-instant Live TV. It's a _player only_ — you bring your own Xtream login or M3U playlist
(by **URL or a local `.m3u`/`.m3u8` file** on the device), and OwnTV gives you a fast, modern, remote-first
way to browse
and watch them.

> ⚠️ OwnTV does **not** provide any channels, playlists, subscriptions, streams, or media content.
> You are responsible for adding your own legally accessible sources.

This is an **open-source** project — the code is original (not derived from any other app) and was
**built with the help of AI**. **Contributions are welcome**: clone, build, and test it freely. It
targets **Android TV only** (leanback launcher, D-pad-first UI).

> ### 📖 New here? Read the [**User Guide & Hidden Features →**](https://github.com/ahXN00/OwnTV/blob/main/extras/USER_GUIDE.md)
>
> [Permalink: 📖 New here? Read the User Guide & Hidden Features →](https://github.com/ahXN00/OwnTV#-new-here-read-the-user-guide--hidden-features-)
>
> Long‑press to favourite, **Left** for the channel list, the MPV/EXO toggle's **compatibility mode**,
> catch‑up from the Guide, startup landing, A/V‑sync — all the remote shortcuts in one place.

* * *

## 💬 Community

[Permalink: 💬 Community](https://github.com/ahXN00/OwnTV#-community)

Questions, ideas, bug reports — or just want to follow along? **Join the OwnTV Telegram group:**

### 👉 [t.me/owntvplayer](https://t.me/owntvplayer)

[Permalink: 👉 t.me/owntvplayer](https://github.com/ahXN00/OwnTV#-tmeowntvplayer)

Scan to join from your phone:

[![Scan to join the OwnTV Telegram group](https://github.com/ahXN00/OwnTV/raw/main/extras/telegram_qr_code.jpg)](https://t.me/owntvplayer)

* * *

## ✨ Features

[Permalink: ✨ Features](https://github.com/ahXN00/OwnTV#-features)

### 🎬 Playback

[Permalink: 🎬 Playback](https://github.com/ahXN00/OwnTV#-playback)

- **Dual-engine design**
  - **libmpv (FFmpeg)** — movies, series, and any stream ExoPlayer can't open; maximum codec/container compatibility, every audio/subtitle track
  - **Media3 (ExoPlayer)** — Live TV default; near-instant HLS start, instant preview → fullscreen
  - **Per-channel mpv toggle** — the MPV/EXO pill pins a problem channel to mpv (remembered per channel)
  - **VOD engine fallback** — a movie/episode that terminally fails on one engine is retried on the
    other automatically; a setting picks which plays first (mpv default, or ExoPlayer for devices
    where mpv can't start VODs)
- **Direct-to-display rendering** — zero-copy 4K HDR path, app-drawn subtitles, auto software-decode fallback
- **Channel zapping** — D-pad/CH±/media keys, wraps around; **in-player channel list** (Left with controls hidden)
- **Audio** — surround sound (opt-in, Dolby/DTS → multichannel LPCM, auto-stereo safety net); volume boost to 150%; A/V sync nudge
- **Subtitles** — text (SRT/ASS) + image (PGS/VOBSUB/DVB on its own layer) + closed captions (CEA-608/708)
- **Resume & auto-play** — per-title resume prompt, auto-play next episode (across seasons), opens on last-watched episode
- **Mini-player / PiP** — dock any stream and keep browsing
- **Stream info overlay** — live codec · resolution · fps · HDR · bitrate · decoder readout
- 📺 **[Complete player design & feature reference →](https://github.com/ahXN00/OwnTV/blob/main/extras/player.html)**

### 🧭 Browse

[Permalink: 🧭 Browse](https://github.com/ahXN00/OwnTV#-browse)

- **Home screen** — Continue Watching hero carousel (partially-watched movies, episodes, recent channels); feeds system Watch Next on stock Android TV
- **Sections** — Live TV (preview + real stream resolution badge), Movies, Series, Downloads, EPG Guide
- **Fixed layout** — stable icon nav · full-label category column · content · preview (never expands/collapses)
- **Categories** — Favorites & History per section, full names, search box; customize (hide/rename/reorder, range-select); hide/unhide individual channels, movies & series; optional PIN lock; survives re-syncs
- **Search** — inline per-folder + global; TV-style bars; detailed channel results (category · number); long-press to favorite
- **Multiple playlists** — merge them all, or narrow the whole app to one via the **top-bar playlist switcher** (or a per-playlist **Default** toggle in Settings); applies to Live/Movies/Series/EPG/Search/Home incl. Favorites & History, and persists across restarts
- **Sort & view** — playlist order or A–Z; Movies & Series Grid/List toggle
- **Per-profile startup** — Home, last channel, or Live TV on Favorites
- **Built for scale** — ~50k channels / ~168k movies via Paging 3
- **Fast syncing** — priority import (pick e.g. Live TV first, the rest finishes in the background — survives sleep/reboot); incremental re-syncs only write what changed; auto-retrying downloads
- **Typed M3U playlists** — `type=` / `tvg-type=` tags route entries to **Movies** or **Series** (per-episode `S01E05` lines are grouped into shows, seasons and episodes automatically)
- 🎬 **TMDB metadata enrichment** — optional, on-demand posters, plots, cast, genres & ratings for Movies, Series and Episodes; **in-app trailers**; manual Refetch / "Set TMDB name" overrides; works with zero setup, your own TMDB key, or a self-hosted [caching proxy](https://github.com/ahXN00/OwnTV/blob/main/worker)

### 🗓️ EPG / TV Guide

[Permalink: 🗓️ EPG / TV Guide](https://github.com/ahXN00/OwnTV#%EF%B8%8F-epg--tv-guide)

- **Guide grid** — time × channel (XMLTV); now/next/later in preview; two-stage nav (Right selects row, OK browses)
- **Catch-up TV** — watch aired programmes (up to 7 days back); seekable archive replay; catch-up time setting
- **Live rewind** — timeshift on catch-up channels; scrubbable timeline + 30s steps + Live button
- **EPG matching** — auto-match by name (ignoring HD/country tags); long-press for manual match; survives re-syncs
- **Sort & filter** — A–Z / Provider / Live TV / Catch-up / Favorites; category filter with search
- **Multiple sources** — add/edit/delete XMLTV feeds; merge into guide; opt-in (pre-fills playlist URL)
- **Performance** — pre-loaded at startup; only your channels' programmes stored; malformed-tag tolerant

### 👥 Profiles

[Permalink: 👥 Profiles](https://github.com/ahXN00/OwnTV#-profiles)

- Multiple profiles (own favorites/history/resume); PIN locks (salted hash); kids flag; "Who's watching?" gate; shared sources

### ⬇️ Downloads

[Permalink: ⬇️ Downloads](https://github.com/ahXN00/OwnTV#%EF%B8%8F-downloads)

- Offline movies & episodes (never Live TV); pause/resume; user-chosen folder; states shown in grids

### 🎨 Personalization & Settings

[Permalink: 🎨 Personalization & Settings](https://github.com/ahXN00/OwnTV#-personalization--settings)

- **Appearance** — Material 3 (dark/light/system); any accent color (palette or hex); UI zoom; avatars; animations toggle
- **Content** — clear watch history (all or per-type); per-source **Auto refresh** for playlists & EPG (Off by default, startup or 6–48h staleness intervals)
- **Video Player** — hardware decoding, zoom, subtitle size/language, audio sync, surround sound, HDR
- **Backup & Restore** — profiles, sources, customizations, favorites, history, resume, settings, auto-refresh choices, default source and per-item engine/compatibility pins; choose what to include
- **Updates** — in-app from GitHub Releases; auto-check (toggleable) + manual; installs APK on TV
- **Android TV home** — feeds system Watch Next row; refresh button

### 🛡️ Robustness

[Permalink: 🛡️ Robustness](https://github.com/ahXN00/OwnTV#%EF%B8%8F-robustness)

- **Memory-safe** — device-scaled buffers; decode watchdog (4K/8K SW guard); background release; cache shedding
- **No ANRs** — all player commands off the UI thread; coalesced preview-scroll loads
- **Connection-friendly** — preview→fullscreen reuses stream; auto-reconnect on drops
- **Resilient imports** — HTTP 512 / truncated list → per-category fallback; credentials never shown
- **Offline detection** — banner + offline-aware error messages

* * *

## 📸 Screenshots

[Permalink: 📸 Screenshots](https://github.com/ahXN00/OwnTV#-screenshots)

|     |     |
| --- | --- |
| [![Home screen](https://github.com/ahXN00/OwnTV/raw/main/extras/screenshots/Home.png)](https://github.com/ahXN00/OwnTV/blob/main/extras/screenshots/Home.png)<br>Home — Continue Watching | [![Main view](https://github.com/ahXN00/OwnTV/raw/main/extras/screenshots/Main_View.png)](https://github.com/ahXN00/OwnTV/blob/main/extras/screenshots/Main_View.png)<br>Main view |
| [![Live TV with preview](https://github.com/ahXN00/OwnTV/raw/main/extras/screenshots/LiveTV_with_PreviewON.png)](https://github.com/ahXN00/OwnTV/blob/main/extras/screenshots/LiveTV_with_PreviewON.png)<br>Live TV — preview playing | [![Movies](https://github.com/ahXN00/OwnTV/raw/main/extras/screenshots/Movies.png)](https://github.com/ahXN00/OwnTV/blob/main/extras/screenshots/Movies.png)<br>Movies |
| [![Profile selection](https://github.com/ahXN00/OwnTV/raw/main/extras/screenshots/Profile_Selection.png)](https://github.com/ahXN00/OwnTV/blob/main/extras/screenshots/Profile_Selection.png)<br>"Who's watching?" profile gate | [![Downloads](https://github.com/ahXN00/OwnTV/raw/main/extras/screenshots/Downloads.png)](https://github.com/ahXN00/OwnTV/blob/main/extras/screenshots/Downloads.png)<br>Downloads |
| [![Settings](https://github.com/ahXN00/OwnTV/raw/main/extras/screenshots/Settings_Main.png)](https://github.com/ahXN00/OwnTV/blob/main/extras/screenshots/Settings_Main.png)<br>Settings | [![TV Guide](https://github.com/ahXN00/OwnTV/raw/main/extras/screenshots/EPG_loaded.png)](https://github.com/ahXN00/OwnTV/blob/main/extras/screenshots/EPG_loaded.png)<br>TV Guide (EPG) |
| [![Personalization](https://github.com/ahXN00/OwnTV/raw/main/extras/screenshots/Settings_Personalization.png)](https://github.com/ahXN00/OwnTV/blob/main/extras/screenshots/Settings_Personalization.png)<br>Personalization |  |

More in **[extras/screenshots/](https://github.com/ahXN00/OwnTV/blob/main/extras/screenshots)** — Live TV (preview off), playlist management,
profiles & sources settings.

* * *

## 🧱 Tech stack

[Permalink: 🧱 Tech stack](https://github.com/ahXN00/OwnTV#-tech-stack)

| Area | Choice |
| --- | --- |
| Language | Kotlin 2.3.10 (AGP 9 **built-in Kotlin**, no `kotlin-android` plugin) |
| Build | AGP 9.2.1 / Gradle 9.4.1, KSP2 2.3.9 |
| UI | Jetpack Compose for TV (`androidx.tv:tv-material` 1.1.0), Compose BOM 2026.05.00 |
| Media | **libmpv** (FFmpeg) — `dev.jdtech.mpv:libmpv` · **ExoPlayer/Media3** (Live TV + image subs) |
| Database | Room 2.8.4 + Paging 3.5.0 + FTS4 (WAL) |
| DI | Koin 4.1.1 |
| Networking | OkHttp |
| Images | Coil 3.3.0 |
| Preferences | DataStore |

`minSdk 26`, `targetSdk 36`, `applicationId tv.own.owntv`.

> **Build note:** Kotlin comes from AGP 9's built-in Kotlin (no `kotlin-android` plugin). KSP 2.3.6+
> supports built-in Kotlin, so Room codegen works alongside it; the Compose compiler and KSP track
> Kotlin 2.3.x.

## ⚙️ How it works (backend)

[Permalink: ⚙️ How it works (backend)](https://github.com/ahXN00/OwnTV#%EF%B8%8F-how-it-works-backend)

- **Parsing & sync** — M3U playlists are line-streamed and Xtream `player_api` JSON is read with
`android.util.JsonReader`, so huge provider payloads are never fully buffered. `SyncManager` does a
clear-then-insert refresh in ~500-row chunked transactions with Flow progress and cancellation.
- **Storage** — a 19-entity Room schema: profiles & sources (`ProfileSourceCrossRef` for sharing),
content (categories/channels/movies/series/seasons/episodes), per-profile favorites/history/progress/
downloads, EPG channels/programmes, and FTS4 search tables. Totals come from indexed `COUNT` queries.
- **Lists** — Paging 3 with a bounded `maxSize` keeps memory flat across 50k+ item lists.
- **EPG** — bulk XMLTV is stream-parsed (gzip-aware) into a rolling now→+48h window and pruned.
- **Player** — two engines behind a small `PlaybackEngine` interface: **libmpv** (movies/series, and any
live stream ExoPlayer can't open) and **ExoPlayer/Media3** (Live TV — instant HLS). Live "promotes" the
running preview straight to full-screen (no reload); the shell hoists the active surface across full ↔
mini-player. Player state is published as `StateFlow`s for the Compose HUD.
- **DI** — Koin modules (`appModule`, `databaseModule`, `dataModule`, `playerModule`).

### Project layout

[Permalink: Project layout](https://github.com/ahXN00/OwnTV#project-layout)

```
tv.own.owntv/
├── core/        database (Room), network, parser (M3U/Xtream/XMLTV), repository, sync, util
├── player/      libmpv + ExoPlayer engines (PlaybackEngine) + Compose surfaces + HUD + mini-player
├── ui/          theme + reusable components (focus surface, cards, state views, avatars)
├── features/    setup, shell, live, movies, series, search, downloads, epg, profiles, settings
└── di/          Koin modules
```

## 📚 Docs & design (`extras/`)

[Permalink: 📚 Docs & design (extras/)](https://github.com/ahXN00/OwnTV#-docs--design-extras)

- 📄 **[Complete Feature Document](https://github.com/ahXN00/OwnTV/blob/main/extras/OwnTV_Complete_Brief_Plan_With_Logo.docx)** — the full
as-built feature reference: playback, browse, EPG, profiles, architecture, and tech stack.
- 📺 **[Player design reference](https://github.com/ahXN00/OwnTV/blob/main/extras/player.html)** — an interactive Material 3 mockup of the player UI.
- 🖼️ `extras/logo.png` — the OwnTV logo.

## 📥 Installing (Fire TV / Android TV)

[Permalink: 📥 Installing (Fire TV / Android TV)](https://github.com/ahXN00/OwnTV#-installing-fire-tv--android-tv)

Grab the signed APK from the [**latest release**](https://github.com/ahXN00/OwnTV/releases/latest) and
sideload it. A fixed link always points at the newest signed build:

```
https://github.com/ahXN00/OwnTV/releases/latest/download/OwnTV.apk
```

- **Fire TV** — install the **Downloader** app (by AFTVnews) from the Amazon Appstore, then enter the
**Downloader code `4308278`** (or [`aftv.news/4308278`](https://aftv.news/4308278), which always
points at the latest signed `OwnTV.apk`). Enable _Apps from Unknown Sources_ if prompted.
- **Android TV / Google TV** — the **Downloader** app is also on Google Play, so the same code
**`4308278`** works here too. (If Downloader doesn't show in search, open the Play Store on the TV —
you can reach it via _Settings → Apps → See all apps → Show system apps → Google Play Store_ — and
install it from there.) Or just sideload the APK with your tool of choice ( _Send files to TV_, a USB
drive, or `adb install OwnTV.apk`).

> Only install the APK from this repository's official Releases (or the `…/releases/latest/download/OwnTV.apk`
> link above). It's the build signed by this project's CI — third-party re-hosts aren't endorsed.

## 🛠️ Building & running

[Permalink: 🛠️ Building & running](https://github.com/ahXN00/OwnTV#%EF%B8%8F-building--running)

1. Open the project in **Android Studio** (a version matching AGP 9.x) and let Gradle sync.
2. Run the `app` configuration on an **Android TV** emulator or device. The app declares a
`LEANBACK_LAUNCHER` **and** a regular `LAUNCHER` entry and marks the leanback feature **optional**, so
it shows in the **TV launcher** on Android TV and as a normal app icon on phones/tablets and non-TV
boxes too (minimum **Android 8.0 / API 26**).
3. Or from the command line:

```
./gradlew assembleDebug
```

On first launch you'll go through onboarding: accept the disclaimer, create a profile, then **add a**
**source** (M3U or Xtream) — or import a backup. After it imports, browse from the sidebar and open the
**Guide** for the EPG. Everything is managed under **Settings**.

**Tested on:** a real **TCL Google TV**, and the **Android Studio emulator** (both the Android TV and
Google TV system images).

## 🤖 CI & releases

[Permalink: 🤖 CI & releases](https://github.com/ahXN00/OwnTV#-ci--releases)

GitHub Actions ( [`.github/workflows/android.yml`](https://github.com/ahXN00/OwnTV/blob/main/.github/workflows/android.yml)) builds the app in the
cloud — no local build needed:

- **Every push / PR** → builds a debug APK and uploads it as a workflow **artifact** named
`OwnTV-v<version>-<sha>.apk` (download it from the run's _Summary → Artifacts_).
- **Push a `v*` tag** (e.g. `git tag v1.1.0 && git push origin v1.1.0`) → builds a **signed** APK and
publishes a **GitHub Release** with `OwnTV-v1.1.0.apk` attached. The release notes are taken from
the newest section of [`CHANGELOG.md`](https://github.com/ahXN00/OwnTV/blob/main/CHANGELOG.md) (which the in-app updater shows as
"What's new"), plus GitHub's auto-generated commit list.

**Versioning is automatic**: `versionName`/`versionCode` are derived from the tag (e.g. `v1.1.0` →
`1.1.0` / `10100`) — no need to touch `build.gradle.kts`.

**Signed release builds (optional, recommended for distribution).** Tag builds are debug-signed until you
add a release keystore. Create one and add four repo **Secrets** to get properly signed releases:

```
keytool -genkey -v -keystore owntv.keystore -alias owntv -keyalg RSA -keysize 2048 -validity 10000
base64 -w0 owntv.keystore   # copy the output into the KEYSTORE_BASE64 secret
```

Then add repo Secrets ( _Settings → Secrets and variables → Actions_): `KEYSTORE_BASE64`,
`KEYSTORE_PASSWORD`, `KEY_ALIAS`, `KEY_PASSWORD`. Keep the keystore file private — it's never committed.

## 🤝 Contributing

[Permalink: 🤝 Contributing](https://github.com/ahXN00/OwnTV#-contributing)

Contributions, bug reports, and ideas are welcome — open an issue or a pull request. Please keep the
project's player-only, bring-your-own-source positioning, and match the existing code style.

## 💛 Support the project

[Permalink: 💛 Support the project](https://github.com/ahXN00/OwnTV#-support-the-project)

OwnTV is — and will **always be** — completely **free, 100% open-source, and ad-free. Forever.** ❤️ No
paywalls, no "Pro" tier, no catch.

It's a passion project built in my spare time. If it's made your TV a little nicer and you'd like to say
thanks or **buy me a coffee**, a small **PayPal** tip is hugely appreciated — but it's **100% optional**, the
app stays free for everyone no matter what. 🙂

### ☕ [paypal.me/AshiqHasan](https://paypal.me/AshiqHasan)

[Permalink: ☕ paypal.me/AshiqHasan](https://github.com/ahXN00/OwnTV#-paypalmeashiqhasan)

Scan to donate from your phone:

[![Scan to donate via PayPal](https://github.com/ahXN00/OwnTV/raw/main/extras/paypal_qr.jpg)](https://paypal.me/AshiqHasan)

Thank you for using OwnTV! 🙏

## 🎬 Credits — TMDB

[Permalink: 🎬 Credits — TMDB](https://github.com/ahXN00/OwnTV#-credits--tmdb)

[![TMDB](https://github.com/ahXN00/OwnTV/raw/main/extras/tmdb_logo.svg)](https://github.com/ahXN00/OwnTV/blob/main/extras/tmdb_logo.svg)

Movie & series metadata and trailers are provided by [TMDB](https://www.themoviedb.org/).
**This product uses the TMDB API but is not endorsed or certified by TMDB.**

## ⚖️ Legal

[Permalink: ⚖️ Legal](https://github.com/ahXN00/OwnTV#%EF%B8%8F-legal)

OwnTV is a media **player** only. It ships with no channels, playlists, subscriptions, or content, and
does not endorse or facilitate access to unauthorized streams. Users are solely responsible for the
sources they add and for complying with the laws and rights that apply to them.

## 📄 License

[Permalink: 📄 License](https://github.com/ahXN00/OwnTV#-license)

Released under the **GNU General Public License v3.0 (GPLv3)** — see [LICENSE](https://github.com/ahXN00/OwnTV/blob/main/LICENSE).

In short: you're free to use, study, modify, and redistribute OwnTV, including commercially — but any
redistributed version (including forks and commercial products built on it) must also be licensed under
GPLv3 and its source made available.

* * *

OwnTV is an open-source, player-only project, built with the help of AI.

## About

No description, website, or topics provided.


### Resources

[Readme](https://github.com/ahXN00/OwnTV#readme-ov-file)

### License

[GPL-3.0 license](https://github.com/ahXN00/OwnTV#GPL-3.0-1-ov-file)

### Contributing

[Contributing](https://github.com/ahXN00/OwnTV#contributing-ov-file)

### Uh oh!

There was an error while loading. [Please reload this page](https://github.com/ahXN00/OwnTV).

[Activity](https://github.com/ahXN00/OwnTV/activity)

### Stars

**216**
stars


### Watchers

**2**
watching


### Forks

[**31**\\
forks](https://github.com/ahXN00/OwnTV/forks)

[Report repository](https://github.com/contact/report-content?content_url=https%3A%2F%2Fgithub.com%2FahXN00%2FOwnTV&report=ahXN00+%28user%29)

## [Releases\  16](https://github.com/ahXN00/OwnTV/releases)

[OwnTV v4.0.1\\
Latest\\
\\
3 days agoJul 3, 2026](https://github.com/ahXN00/OwnTV/releases/tag/v4.0.1)

[\+ 15 releases](https://github.com/ahXN00/OwnTV/releases)

## [Packages\  0](https://github.com/users/ahXN00/packages?repo_name=OwnTV)

No packages published

## [Contributors\  6](https://github.com/ahXN00/OwnTV/graphs/contributors)

- [![@codeVerine](https://avatars.githubusercontent.com/u/2361358?s=64&v=4)](https://github.com/codeVerine)
- [![@claude](https://avatars.githubusercontent.com/u/81847?s=64&v=4)](https://github.com/claude)
- [![@cursoragent](https://avatars.githubusercontent.com/u/199161495?s=64&v=4)](https://github.com/cursoragent)
- [![@ahXN00](https://avatars.githubusercontent.com/u/53382135?s=64&v=4)](https://github.com/ahXN00)
- [![@dan-maloney](https://avatars.githubusercontent.com/u/52582202?s=64&v=4)](https://github.com/dan-maloney)
- [![@attembot](https://avatars.githubusercontent.com/u/134982400?s=64&v=4)](https://github.com/attembot)

## Languages

- [Kotlin96.3%](https://github.com/ahXN00/OwnTV/search?l=kotlin)
- [HTML3.6%](https://github.com/ahXN00/OwnTV/search?l=html)
- [JavaScript0.1%](https://github.com/ahXN00/OwnTV/search?l=javascript)

You can’t perform that action at this time.