{"id":13608685,"url":"https://github.com/boitakub/Bogadex","last_synced_at":"2025-04-12T17:32:35.006Z","repository":{"id":41531126,"uuid":"404460973","full_name":"boitakub/Bogadex","owner":"boitakub","description":"🎲 BoardGameGeek collections explorer application using Hilt,  Coroutines, Flow, Jetpack (Room, ViewModel) based on MVVM architecture.","archived":false,"fork":false,"pushed_at":"2024-07-21T22:03:16.000Z","size":10756,"stargazers_count":17,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-11-07T14:41:54.936Z","etag":null,"topics":["android","android-application","boardgamegeek","clean-architecture","coroutines","dagger2","flow","hilt","hilt-android","hilt-dependency-injection","jetpack-compose","kotlin","kotlin-coroutines","mvi-architecture","mvvm-android","mvvm-architecture","retrofit2","room","workmanager"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/boitakub.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":"CODE_OF_CONDUCT.md","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-09-08T18:52:43.000Z","updated_at":"2024-07-26T10:50:01.000Z","dependencies_parsed_at":"2023-10-15T08:28:49.375Z","dependency_job_id":"adb940ef-c836-47ba-ac25-3ef74e6feee3","html_url":"https://github.com/boitakub/Bogadex","commit_stats":null,"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/boitakub%2FBogadex","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/boitakub%2FBogadex/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/boitakub%2FBogadex/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/boitakub%2FBogadex/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/boitakub","download_url":"https://codeload.github.com/boitakub/Bogadex/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248605287,"owners_count":21132142,"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","android-application","boardgamegeek","clean-architecture","coroutines","dagger2","flow","hilt","hilt-android","hilt-dependency-injection","jetpack-compose","kotlin","kotlin-coroutines","mvi-architecture","mvvm-android","mvvm-architecture","retrofit2","room","workmanager"],"created_at":"2024-08-01T19:01:29.212Z","updated_at":"2025-04-12T17:32:29.997Z","avatar_url":"https://github.com/boitakub.png","language":"Kotlin","funding_links":[],"categories":["Kotlin"],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003eBogadex\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://github.com/boitakub/Bogadex\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/boitakub/Bogadex/main/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png\" width=\"150\" alt=\"Bogadex\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003c/h1\u003e\n\n[![Build](https://github.com/boitakub/Bogadex/actions/workflows/main.yml/badge.svg)](https://github.com/boitakub/Bogadex/actions/workflows/main.yml)\n[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=boitakub_Bogadex\u0026metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=boitakub_Bogadex)\n[![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=boitakub_Bogadex\u0026metric=reliability_rating)](https://sonarcloud.io/summary/new_code?id=boitakub_Bogadex)\n[![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=boitakub_Bogadex\u0026metric=security_rating)](https://sonarcloud.io/summary/new_code?id=boitakub_Bogadex)\n[![Bugs](https://sonarcloud.io/api/project_badges/measure?project=boitakub_Bogadex\u0026metric=bugs)](https://sonarcloud.io/summary/new_code?id=boitakub_Bogadex)\n[![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=boitakub_Bogadex\u0026metric=vulnerabilities)](https://sonarcloud.io/summary/new_code?id=boitakub_Bogadex)\n[![Technical Debt](https://sonarcloud.io/api/project_badges/measure?project=boitakub_Bogadex\u0026metric=sqale_index)](https://sonarcloud.io/summary/new_code?id=boitakub_Bogadex)\n[![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=boitakub_Bogadex\u0026metric=code_smells)](https://sonarcloud.io/summary/new_code?id=boitakub_Bogadex)\n[![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=boitakub_Bogadex\u0026metric=ncloc)](https://sonarcloud.io/summary/new_code?id=boitakub_Bogadex)\n[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=boitakub_Bogadex\u0026metric=coverage)](https://sonarcloud.io/summary/new_code?id=boitakub_Bogadex)\n[![Kotlin](https://img.shields.io/badge/Kotlin-1.8.10-blue.svg?style=flat)](https://kotlinlang.org)\n[![API](https://img.shields.io/badge/API-23%2B-brightgreen.svg?style=flat)](https://android-arsenal.com/api?level=23)\n[![License](https://img.shields.io/github/license/boitakub/bogadex)](LICENSE.md)\n[![gitmoji](https://img.shields.io/badge/gitmoji-%20😜%20😍-FFDD67.svg)](https://github.com/carloscuesta/gitmoji)\n[![Twitter](https://img.shields.io/badge/Twitter-@jforatier-blue.svg?style=flat)](http://twitter.com/jforatier)\n\n\u003cp align=\"center\"\u003e\nBogadex is a small demo and functionnal application based on modern Android application tech-stacks and MVVM architecture.\u003cbr\u003eThis project aim to regroup and present most of current practices and patterns.\u003cbr\u003e\nAlso dealing with data (from \u003ca href=\"https://www.boardgamegeek.com/\"\u003eBoardGameGeek\u003c/a\u003e) and presenting them in elegants ways.\n\u003c/p\u003e\n\u003c/br\u003e\n\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"/docs/assets/capture_1.gif\" height=\"500\" alt=\"Bogadex - Screenshot\"/\u003e\n\u003c/p\u003e\n\n## Download 📲\n\nGo to the [Releases](https://github.com/boitakub/Bogadex/releases) to download the latest APK.\n\n## Features ✨\n\n* Free and open source\n* List, Sort and Filter all you [BGG BoardGameGeekCollection](https://boardgamegeek.com/)\n\n## Tech Stack \u0026 Libraries 🧬\n\nThis project takes advantage of best practices, and many popular libraries and tools in the Android ecosystem.\n- [Kotlin](https://kotlinlang.org/) - 100% Kotlin - Code and Scripts\n- [Flow](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/) for asynchronous.\n- Lifecycle - dispose of observing data when lifecycle state changes.\n- ViewModel - UI related data holder, lifecycle aware.\n- [Hilt-Dagger](https://dagger.dev/hilt/) for dependency injection.\n- [JetPack](https://developer.android.com/jetpack)\n  * [Compose](https://developer.android.com/jetpack/compose?hl=fr) - UI build 100% with Jetpack Compose\n  * [WorkManager](https://developer.android.com/topic/libraries/architecture/workmanager) - Updating and maintaining data up-to-date periodically and asynchronous\n  * [DataStore](https://developer.android.com/topic/libraries/architecture/datastore) - for shared preferences\n  * [Room](https://developer.android.com/training/data-storage/room) - Database for cache / offline storage\n\n- [Material 3](https://m3.material.io/) - Using Material Design 3\n  * [Dark Mode](https://developer.android.com/guide/topics/ui/look-and-feel/darktheme) - Generate theme trough [Material Theme Builder](https://m3.material.io/theme-builder#/dynamic)\n- [Retrofit2 \u0026 OkHttp3](https://github.com/square/retrofit) - construct the REST APIs and paging network data.\n- [Coil](https://github.com/coil-kt/coil) - Async images management.\n\n\n- [SonarCloud](https://sonarcloud.io/project/overview?id=boitakub_Bogadex) - Code quality and coverage analysis\n- [Gradle optimizations](https://proandroiddev.com/how-we-reduced-our-gradle-build-times-by-over-80-51f2b6d6b05b) - Some gradle tips to optimize build time\n\n## Flow \u0026 Delivery 🚚\n\n### Triggering a Release\n\nRelease a build version triggers in the following scenarios:\n- You push a version tag to the repository.\n- You create a pull request targeting the main branch.\n- Check on pre-commit [Article](https://medium.com/@anjani.kjoshi/android-lint-pre-commit-hook-for-clean-code-747edfe57abf)\n  * lint - for Android critical issues\n  * KtLint - for kotlin file quality\n- Auto version from git tag [Article](https://dev.to/ychescale9/git-based-android-app-versioning-with-agp-4-0-24ip) [Plugin](https://github.com/ReactiveCircus/app-versioning)\n- Auto delivery from git tag\n  * on GitHub Release\n  * on Firebase App Distribution\n  * 🚧 on Google Play Store - Beta \u0026 Production\n- Release signing [Article](https://proandroiddev.com/how-to-securely-build-and-sign-your-android-app-with-github-actions-ad5323452ce)\n\n## Code formatting\n\nThe CI uses [Spotless](https://github.com/diffplug/spotless) to check if your code is formatted correctly and contains the right licenses.\nInternally, Spotless uses [ktlint](https://github.com/pinterest/ktlint) to check the formatting of your code.\nTo set up ktlint correctly with Android Studio, follow one of the [listed setup options](https://github.com/pinterest/ktlint#-with-intellij-idea).\n\nBefore committing your code, run `./gradlew app:spotlessApply` to automatically format your code.\n\n\u003c!--- ## MAD Score\n\n![summary](https://user-images.githubusercontent.com/24237865/102366914-84f6b000-3ffc-11eb-8d49-b20694239782.png)\n\n![kotlin](https://user-images.githubusercontent.com/24237865/102366932-8a53fa80-3ffc-11eb-8131-fd6745a6f079.png)\n\n--\u003e\n\n## Architecture 📐\n\nBogadex is based on MVVM architecture and a repository pattern with a modular approach.\n- MVVM -\u003e MVI Architecture (View - ViewModel - Model)\n- Business oriented with UseCases pattern - [By layer or feature? Why not both?! Guide to Android app modularization](https://www.youtube.com/watch?v=16SwTvzDO0A)\n- Repository pattern\n- UI 100% Jetpack compose\n\nConcerns are separate by modules containing feature\n![Design by features](docs/assets/design_by_feature.png)\n\nEach modules/feature share a common clean architecture pattern\n![Clean architecture](docs/assets/clean_architecture.png)\n\n\u003c!---\n\n![architecture](https://user-images.githubusercontent.com/24237865/77502018-f7d36000-6e9c-11ea-92b0-1097240c8689.png)\n\n--\u003e\n\n## Credits \u0026 Inspiration 🎖️\n\nBogadex is inspired by the wonderful repositories :\n\n- [Jaewoong Eum](https://github.com/skydoves), especially [Pokedex](https://github.com/skydoves/Pokedex).\n- [Igor Wojda](https://github.com/igorwojda) and his great repo [android-showcase](https://github.com/igorwojda/android-showcase).\n- [Lopez Mikhael](https://github.com/lopspower) with [Pokedex Compose](https://github.com/lopspower/PokeCardCompose)\n\nThank you for the great job.\n\n## BoardGameGeek API 🎲\n\n\u003cimg src=\"https://images.squarespace-cdn.com/content/v1/5902292fd482e9284cf47b8d/1567633051478-PRQ3UHYD6YFJSP80U3YV/BGG.jpeg?format=1500w\" align=\"right\" width=\"21%\"/\u003e\n\nPokedex using the [BoardGameGeekAPI](https://boardgamegeek.com/wiki/page/BGG_XML_API2/) for constructing RESTful-oriented API.\u003cbr\u003e\nBoardGameGeekAPI provides a XML API interface to highly detailed objects built from thousands of lines of data related to Boardgames.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fboitakub%2FBogadex","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fboitakub%2FBogadex","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fboitakub%2FBogadex/lists"}