Skip to content

Nacchofer31/RandomBoxd

Repository files navigation

πŸŽ₯ RandomBoxd 🍿

PR Checks Coverage

RandomBoxd is a Compose Multiplatform project designed to fetch a random movie from a Letterboxd user's watchlists or custom lists. This app is built for Android and iOS devices. πŸ“±πŸŽ¬

πŸ“² Download

  • Android (phones & tablets): Available now on Google Play.
  • iOS (iPhone & iPad): Coming soon to the App Store.

✨ Features

  • 🎲 Fetch a random movie from a Letterboxd user's watchlist or custom lists.
  • πŸ“± Supports Android and iOS platforms.
  • πŸ”— Seamless deep linking with the Letterboxd app.
  • πŸ” Intuitive user search functionality.
  • 🏷️ Stores and displays previously entered UserNames locally via Room, shown as tappable tags for quick reuse or deletion.
  • ∩βˆͺ Intersection & Union β†’ Combine multiple users' watchlists and pick a random movie either from their shared movies (Intersection) or from the merged pool (Union).
  • 🎭 Genre Filters β†’ Narrow results to one or more genres at once. Works in both single-user and multi-user modes.

πŸ§™β€β™‚οΈ Watch the Magic

πŸ—οΈ Project Architecture

This project follows the Clean Architecture principles to ensure a scalable and maintainable codebase. For a detailed breakdown of layers, patterns, conventions, and technical decisions, see the Architecture Document.

πŸ›οΈ KMP Structure

  • /composeApp is for code that will be shared across your Compose Multiplatform applications.

    • commonMain contains code common for all targets.
    • Other folders include platform-specific code (e.g., iosMain for iOS-specific code like CoreCrypto integration).
  • /iosApp contains iOS applications.

    • Even if you're sharing UI with Compose Multiplatform, this folder is the entry point for the iOS app.
    • This is also where you can add SwiftUI code if needed.

πŸ”§ Tech Stack

  • Compose Multiplatform (CMP) - Shared logic for Android and iOS with Compose.
  • Jetpack Compose - UI for Android.
  • Ktor - Network requests.
  • Coroutines & Flow - Asynchronous programming.
  • Koin - Dependency Injection.
  • Coil - Image loading.
  • Room - Database.
  • Ksoup - HTML parsing.
  • Navigation Compose - Jetpack Compose navigation.
  • Kotlinx Serialization - JSON serialization.
  • Spotless - Code formatting.
  • Junit5 - Unit testing.
  • Turbine - State testing.
  • Jacoco - Code coverage.

🌍 Localization Support

RandomBoxd is built with full localization support, allowing the app to be translated into any language.

  • 🏳️ Uses Kotlin Multiplatform's localization tools for seamless translations.
  • πŸ“ Supports dynamic text updates based on user preferences.
  • 🌐 Easily adaptable for different regions and languages.

βœ… Testing

RandomBoxd's codebase is tested with:

  • πŸ§ͺ JUnit5 for unit tests.
  • 🌊 Turbine for verifying Kotlin Flow emissions and state changes.
  • πŸ”Œ Ktor Client Mock for mocking and testing network requests.
  • πŸ“ˆ Jacoco to measure and ensure code coverage across the project.

πŸ“Έ Screenshots

πŸ€– Android

🍏 iOS

πŸ” Search user lists & Deeplinking

πŸ”— Intersection & Union of Users' Watchlists

RandomBoxd allows you to combine multiple users' watchlists by holding the Submit button or selecting multiple user tags.
From there, a single random movie is chosen based on two available modes:

  • ∩ Intersection β†’ Selects only movies that are present in every selected user's watchlist.
  • βˆͺ Union β†’ Combines all movies from the selected users' watchlists and randomly picks one from the full collection.

✍️ See Previous UserName Prompts

🎭 Genre Filters

RandomBoxd lets you narrow your random pick to specific genres using the Genre button next to the search bar.
Select one or more genres and the app will only consider movies that match your selection:

  • Single genre β†’ e.g. only Horror movies from your watchlist.
  • Multiple genres β†’ combines genres so any matching movie can be picked.
  • Reset anytime β†’ clear the filter with one tap to go back to the full list.

Works seamlessly with both single-user and multi-user (Intersection & Union) modes.

πŸš€ Getting Started

  1. Clone the repository:

    git clone https://github.com/Nacchofer31/RandomBoxd.git
  2. Open the project in Android Studio (latest version with CMP Plugin).

  3. Run on an Android Emulator or an iOS Simulator.

  4. Run spotless commmands:

    ./gradlew :composeApp:spotlessApply 
  5. Generate jacoco reports:

    ./gradlew :composeApp:jacocoTestReport
  6. Start selecting random movies from Letterboxd lists! 🎞️

🀝 Contributing

Feel free to open issues or submit pull requests to improve the project. πŸ› οΈ

πŸ“œ License

This project is licensed under the Apache License 2.0. See the LICENSE file for details.


Enjoy RandomBoxd and never struggle to pick a movie again! πŸŽ¬πŸ€

About

πŸŽ₯ RandomBoxd - A Compose Multiplatform app that picks a random movie from a Letterboxd user's watchlist or custom lists. Built for Android & iOS with Jetpack Compose. πŸΏπŸ“±

Topics

Resources

License

Stars

Watchers

Forks

Contributors