{"id":13902327,"url":"https://github.com/thomaskioko/tv-maniac","last_synced_at":"2025-07-18T00:31:32.582Z","repository":{"id":38379343,"uuid":"361393353","full_name":"thomaskioko/tv-maniac","owner":"thomaskioko","description":"Tv-Maniac is a personalized entertainment tracking and recommendation Multiplatform app (Android \u0026 iOS) for tracking TV Shows using TMDB API.","archived":false,"fork":false,"pushed_at":"2024-07-03T09:17:17.000Z","size":68824,"stargazers_count":228,"open_issues_count":8,"forks_count":25,"subscribers_count":6,"default_branch":"main","last_synced_at":"2024-07-03T23:16:13.260Z","etag":null,"topics":["android","clean-architecture","ios","jetpack-compose","kmm","kmp","koin","kotlin","kotlin-coroutines","kotlin-multiplatform","kotlin-serialization","ktor","ktor-client","mvi-clean-architecture","swiftui","tmdb-api","tmdb-client"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/thomaskioko.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-04-25T10:07:21.000Z","updated_at":"2024-07-03T23:16:54.871Z","dependencies_parsed_at":"2024-01-13T01:04:39.098Z","dependency_job_id":"768295d8-69ba-4231-a0e8-5e14020801ba","html_url":"https://github.com/thomaskioko/tv-maniac","commit_stats":null,"previous_names":["thomaskioko/tv-maniac","c0de-wizard/tv-maniac"],"tags_count":9,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thomaskioko%2Ftv-maniac","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thomaskioko%2Ftv-maniac/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thomaskioko%2Ftv-maniac/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thomaskioko%2Ftv-maniac/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thomaskioko","download_url":"https://codeload.github.com/thomaskioko/tv-maniac/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":214260226,"owners_count":15707062,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","clean-architecture","ios","jetpack-compose","kmm","kmp","koin","kotlin","kotlin-coroutines","kotlin-multiplatform","kotlin-serialization","ktor","ktor-client","mvi-clean-architecture","swiftui","tmdb-api","tmdb-client"],"created_at":"2024-08-06T22:01:06.371Z","updated_at":"2025-07-18T00:31:32.573Z","avatar_url":"https://github.com/thomaskioko.png","language":"Kotlin","funding_links":[],"categories":["Kotlin"],"sub_categories":[],"readme":"TvManiac\n-------------------------\n![Check](https://github.com/thomaskioko/tv-maniac/actions/workflows/ci.yml/badge.svg)\n![kmp](https://img.shields.io/badge/multiplatform-%237F52FF.svg?style=for-the-badge\u0026logo=kotlin\u0026logoColor=white)\n![compose](https://img.shields.io/badge/jetpack_compose-2bab6b.svg?style=for-the-badge\u0026logo=android\u0026logoColor=white)\n![swiftui](https://img.shields.io/badge/swiftui-%23000000.svg?style=for-the-badge\u0026logo=swift\u0026logoColor=white)\n\n**TvManiac** is a personalized entertainment tracking and recommendation Multiplatform app. By utilizing\n[TMDB](https://developer.themoviedb.org/docs), we can view shows, create a watchlist get statistics, and much more. This project aims to\ndemonstrate KMP development capabilities. This is currently running on:\n\n- Android: Compose\n- iOS: SwiftUI\n\n## 🚧 Under Heavy Development 🚧\n\nThis is my playground for learning Kotlin Multiplatform. With that said, I'm sure it's filled with bugs crawling everywhere, and I'm\nprobably doing a couple of things wrong. So a lot is changing, but that shouldn't stop you from checking it out.\n\n| Android                                                                                                  | iOS                                                                                                      |\n|----------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------|\n| \u003cvideo src=\"https://github.com/user-attachments/assets/90ec7924-7d50-40a4-bb0b-89d79aa9bbcd\" width=350/\u003e | \u003cvideo src=\"https://github.com/user-attachments/assets/69f101b7-e100-4775-9893-6687e455560c\" width=350/\u003e |\n\n\u003e [!IMPORTANT]\n\u003e To fetch data, you will need to [create a TMDB API app](https://www.themoviedb.org/settings/api) and generate an API key if you don't have\n\u003e one. Each platform has its own resource key file:\n\u003e\n\u003e - **Android**: Add your API keys to `core/util/src/androidMain/resources/dev.yaml`\n\u003e - **iOS**: Add your API keys to `ios/ios/Resources/dev.yaml`\n\u003e\n\u003e In both files, replace the placeholder values with your actual API keys.\n\n## 🖥 Project Setup \u0026 Environment\n\n#### Requirements\n\n- [Zulu Java 21](https://www.azul.com/downloads/?package=jdk#zulu)\n- You require the latest [Android Studio](https://developer.android.com/studio/preview) release to be able to build the app.\n- Install KMM Plugin. Checkout [this setup guide](https://kotlinlang.org/docs/multiplatform-mobile-setup.html).\n\n### Opening iOS Project\n\n- Navigate to the ios directory \u0026 open `.xcodeproj`\n\n### Git Hooks\n\nThe project uses Git hooks to enforce code quality checks before commits. To install the hooks, run:\n\n```bash\n./scripts/install-git-hooks.sh\n```\n\nThis will install the following hooks:\n\n- **pre-commit**: Runs code formatting checks using Spotless before allowing a commit. If the checks fail, the commit\n  will be aborted.\n\n## Architecture Overview\n\n- [ ] TODO: Add detail architecture\n\n![TvManiac Architecture](https://github.com/thomaskioko/tv-maniac/assets/841885/84e314fc-71a5-40e5-b034-213e6b546f9a)\n\n## Libraries Used\n\n### Android\n\n* [Accompanist](https://github.com/google/accompanist)\n  * [Insets](https://google.github.io/accompanist/insets/)\n  * [Pager Layouts](https://google.github.io/accompanist/pager/)\n* [Android-youtube-player](https://github.com/PierfrancescoSoffritti/android-youtube-player) - Youtube Player\n* [AppAuth](https://openid.github.io/AppAuth-Android/) - AppAuth for Android is a client SDK for communicating with OAuth 2.0 and OpenID\n  Connect providers.\n* [Compose Lints](https://slackhq.github.io/compose-lints/) - Custom lint checks for Jetpack Compose.\n* [Jetpack Compose](https://developer.android.com/jetpack/compose)\n  * [Coil](https://coil-kt.github.io/coil/compose/) - Image loading\n* [KenBurnsView](https://github.com/flavioarfaria/KenBurnsView) - Immersive image.\n* [Leakcanary](https://github.com/square/leakcanary) - Memory leak detection.\n\n### Kmp - Common\n\n* [Coroutines](https://github.com/Kotlin/kotlinx.coroutines#multiplatform) - Concurrency \u0026 Threading\n* [DataStore Preferences](https://android-developers.googleblog.com/2022/10/announcing-experimental-preview-of-jetpack-multiplatform-libraries.html) -\n  Data storage\n* [DateTime](https://github.com/Kotlin/kotlinx-datetime) - Date \u0026 Time\n* [Decompose](https://arkivanov.github.io/Decompose/) - Kotlin Multiplatform library for breaking down your code into lifecycle-aware\n  business logic components (aka BLoC).\n* [Kermit](https://kermit.touchlab.co/) - Logging\n* [kotlin-inject-anvil](https://github.com/amzn/kotlin-inject-anvil?tab=readme-ov-file) - Dependency Injection library.\n* [Kotlinx Serialization](https://ktor.io/docs/kotlin-serialization.html) - De/Serializing JSON\n* [Ktor](https://ktor.io/) - Networking\n* [Kotest Assertions](https://kotest.io/docs/assertions/assertions.html) - Testing\n* [Multiplatform Paging](https://github.com/cashapp/multiplatform-paging) A library that adds additional Kotlin/Multiplatform targets to\n  AndroidX Paging, and provides UI components to use Paging on iOS.\n* [SQLDelight](https://github.com/cashapp/sqldelight/) - Local storage\n  - [Coroutines Extensions](https://cashapp.github.io/sqldelight/js_sqlite/coroutines/) Consume queries as Flow\n* [Paging](https://developer.android.com/jetpack/androidx/releases/paging) -\n\n### iOS\n\n* [SDWebImage](https://github.com/SDWebImage/SDWebImage) - Async image downloader.\n* [OAuthSwift](https://github.com/OAuthSwift/OAuthSwift) Swift-based OAuth library for iOS and macOS.\n* [Youtube PlayerKit](https://github.com/SvenTiigi/YouTubePlayerKit) - Swift Youtube Player\n\n## Roadmap\n\nAndroid\n\n- [x] Implement Watchlist\n- [x] Add `More` screen. Shows GridView\n- [x] Recommended Shows\n- [x] Implement pagination.\n- [x] Add Settings panel.\n  - Dynamic theme change.\n- [x] Add Seasons UI\n- [x] Implement trakt auth \u0026 sign in\n- [x] Migrate to Material3\n- [x] Implement Paging\n- [x] Implement Search\n- [ ] Add Episode detail screen\n\niOS\n\n- [x] Add HomeScreen: Tabs \u0026 Empty UI\n- [x] Implement Discover UI\n- [x] Show Detail Screen\n- [x] Add Settings panel.\n- [x] Implement trakt auth \u0026 sign in\n- [x] Update show detail UI\n- [x] Add Seasons Detail UI\n- [x] Implement Paging\n- [x] Implement Search\n- [ ] Add Episode detail screen\n\nShared\n\n- [x] Use SQLDelight extensions to consume queries as Flow\n- [x] Refactor interactor implementation.\n- [x] Use koin for injection\n- [x] Modularize `shared` module\n- [x] Try out [Flow-Redux](https://github.com/freeletics/FlowRedux)\n- [ ] Fix paging\n- [x] Add test cases.\n- [ ] Improve error handling.\n\n### References \u0026 Inspiration\n\n- [Design Inspiration](https://dribbble.com/shots/7591814-HBO-Max-Companion-App-Animation)\n- [Code Snippets](https://github.com/android/compose-samples)\n- [Touchlab KaMPKit project](https://github.com/touchlab/KaMPKit)\n- [Tivi](https://github.com/chrisbanes/tivi)\n\n## License\n\n```\nCopyright 2021 Thomas Kioko\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    https://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthomaskioko%2Ftv-maniac","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthomaskioko%2Ftv-maniac","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthomaskioko%2Ftv-maniac/lists"}