{"id":20254383,"url":"https://github.com/andreshj87/nyuzuk","last_synced_at":"2025-07-24T10:39:19.823Z","repository":{"id":73333316,"uuid":"197643093","full_name":"andreshj87/Nyuzuk","owner":"andreshj87","description":"Android app written in Kotlin that displays news articles and showcases the use of Clean Architecture, MVVM+LiveData, Coroutines Flow, Room and many more!","archived":false,"fork":false,"pushed_at":"2019-09-10T17:02:54.000Z","size":608,"stargazers_count":10,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-06-03T17:48:45.133Z","etag":null,"topics":["android","arrow-kt","assertk","circleci","clean-architecture","clean-code","codacy","coil","coroutines","jacoco","junit","koin","kotlin","livedata","mockito-kotlin","moshi","mvvm","news-api","retrofit2","room"],"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/andreshj87.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":"2019-07-18T19:10:38.000Z","updated_at":"2020-04-14T23:22:57.000Z","dependencies_parsed_at":null,"dependency_job_id":"c769bd48-1b14-4b6b-817b-ef50c7405c90","html_url":"https://github.com/andreshj87/Nyuzuk","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/andreshj87/Nyuzuk","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreshj87%2FNyuzuk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreshj87%2FNyuzuk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreshj87%2FNyuzuk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreshj87%2FNyuzuk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/andreshj87","download_url":"https://codeload.github.com/andreshj87/Nyuzuk/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreshj87%2FNyuzuk/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266828999,"owners_count":23991222,"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","status":"online","status_checked_at":"2025-07-24T02:00:09.469Z","response_time":99,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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","arrow-kt","assertk","circleci","clean-architecture","clean-code","codacy","coil","coroutines","jacoco","junit","koin","kotlin","livedata","mockito-kotlin","moshi","mvvm","news-api","retrofit2","room"],"created_at":"2024-11-14T10:32:24.433Z","updated_at":"2025-07-24T10:39:19.784Z","avatar_url":"https://github.com/andreshj87.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"![Logo](logo.png)\n\n[![CircleCI](https://circleci.com/gh/andreshj87/Nyuzuk.svg?style=svg)](https://circleci.com/gh/andreshj87/Nyuzuk) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/4444fcaff2c847bf92757f839c138c46)](https://app.codacy.com/app/andreshj87/Nyuzuk?utm_source=github.com\u0026utm_medium=referral\u0026utm_content=andreshj87/Nyuzuk\u0026utm_campaign=Badge_Grade_Dashboard) [![Codacy Badge](https://api.codacy.com/project/badge/Coverage/7e32dafe20574c42afc2ae4437278db0)](https://www.codacy.com/app/andreshj87/Nyuzuk?utm_source=github.com\u0026amp;utm_medium=referral\u0026amp;utm_content=andreshj87/Nyuzuk\u0026amp;utm_campaign=Badge_Coverage)\n\n# Nyuzuk\n\nAndroid app written in Kotlin that displays news articles - powered by [News API](https://newsapi.org)\n\n## How to run it?\nIn order to make it work, make sure to get your free API key from https://newsapi.org and add it to a new file `config/secrets.properties` like this:\n```plain\nAPI_KEY=%your-api-key%\n```\n\nDo a gradle sync and everything should be ready.\n\n## Architecture\nIt's designed based in the classic 3-layer **clean architecture**.\n\n![](https://raw.githubusercontent.com/ImangazalievM/CleanArchitectureManifest/master/images/CleanArchitectureLayers.png)\n\nEvery layer is represented as module, thus achieving separation of concerns.\nAlso, it is important to note that domain layer is defined as a pure-kotlin non-android module, in order to avoid dependencies with the android framework.\n\n### domain layer\nThis is where all of our **domain entities** and **business logic** is.\n\nThis layer does not need to know anything about the other 2, being totally independent in this sense. Other layers are responsible for mapping models to be naturally understood by the `domain` layer.\n\nUse cases contain business logic that can be used by the `presentation` layer, and make use of repositories that are implemented in the `data` layer.\n\nI'm using [coroutines](https://kotlinlang.org/docs/reference/coroutines-overview.html) [flow](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/) to be able to execute asynchronous code.\n\n## data layer\nThis is where our repository implementations and data sources are.\n\nRepositories are responsible for deciding whether to retrieve data from local or remote datasources.\nI'm using [Room](https://developer.android.com/jetpack/androidx/releases/room) as database for the local datasource and Retrofit for the remote datasource.\n\n## presentation layer\nIn this layer I'm using the MVVM pattern, using [Jetpack ViewModels](https://developer.android.com/topic/libraries/architecture/viewmodel) and exposing a [LiveData](https://developer.android.com/topic/libraries/architecture/livedata) object that the view (activities or fragments) is observing and can react updating the UI accordingly.\n\n## other\nI'm using [koin](https://github.com/InsertKoinIO/koin) for dependency injection and, even if the learning curve is super smooth making it really easy to setup, you better watch out for any potential runtime crash while trying to resolve dependencies.\n\nIt's worth mentioning that I'm using the `Either` class from [Λrrow](https://github.com/arrow-kt/arrow) library, since it allows a very natural way of handling errors.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandreshj87%2Fnyuzuk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fandreshj87%2Fnyuzuk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandreshj87%2Fnyuzuk/lists"}