{"id":22411018,"url":"https://github.com/alielderawi/kotlinspaceradar","last_synced_at":"2026-05-06T20:36:03.989Z","repository":{"id":259764476,"uuid":"866082090","full_name":"AliElDerawi/KotlinSpaceRadar","owner":"AliElDerawi","description":"A Jetpack Compose-based asteroid tracker with modern architecture, it features offline-first capabilities and a responsive, reactive UI. Designed to showcase clean code, modular design, and robust data handling for a seamless user experience.","archived":false,"fork":false,"pushed_at":"2026-02-08T13:08:22.000Z","size":6412,"stargazers_count":4,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-02-08T17:21:47.033Z","etag":null,"topics":["accessibility","android","api","bindingadapter","clean-architecture","composer","coroutines","design-patterns","flow","kotlin","kotlin-android","paging3","reactive-programming","reactive-ui","reactiveui","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":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/AliElDerawi.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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-10-01T16:06:38.000Z","updated_at":"2026-02-08T11:17:17.000Z","dependencies_parsed_at":"2024-10-27T22:41:17.178Z","dependency_job_id":"6b948b4f-c481-4d3f-a88e-6f29b04fdf19","html_url":"https://github.com/AliElDerawi/KotlinSpaceRadar","commit_stats":null,"previous_names":["alielderawi/asteroidradar","alielderawi/kotlinspaceradar"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/AliElDerawi/KotlinSpaceRadar","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AliElDerawi%2FKotlinSpaceRadar","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AliElDerawi%2FKotlinSpaceRadar/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AliElDerawi%2FKotlinSpaceRadar/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AliElDerawi%2FKotlinSpaceRadar/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AliElDerawi","download_url":"https://codeload.github.com/AliElDerawi/KotlinSpaceRadar/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AliElDerawi%2FKotlinSpaceRadar/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32711520,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-06T19:35:05.142Z","status":"ssl_error","status_checked_at":"2026-05-06T19:35:03.996Z","response_time":117,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["accessibility","android","api","bindingadapter","clean-architecture","composer","coroutines","design-patterns","flow","kotlin","kotlin-android","paging3","reactive-programming","reactive-ui","reactiveui","room","workmanager"],"created_at":"2024-12-05T13:12:46.066Z","updated_at":"2026-05-06T20:36:03.983Z","avatar_url":"https://github.com/AliElDerawi.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# KotlinSpaceRadar [![Build Status][ci-image]][ci]\n\n**\"A NASA-powered Compose app to monitor asteroids and their Earth proximity, with offline features and clean architecture.\"**\n\nKotlinSpaceRadar is a Compose app designed to help users track asteroids detected by NASA that come near Earth. It uses a free, open-source API from NASA JPL's Asteroid team and stores data locally for offline access.\n\n## Main Features of the Project\n\n- **Modern UI**: Use Jetpack Compose for modern UI. Also uses a single-activity architecture with multiple fragments to simplify navigation and improve modularity (in the XML branch).\n- **MVVM and Repository Architecture**: Implements MVVM and Repository to enhance maintainability, modularity, and scalability, promoting cleaner code and separation of concerns.\n- **Offline Mode**: Provides offline access to data by using Room for local storage, ensuring the app is usable even without an internet connection.\n- **Paging Library (v3)**: Optimizes data viewing with seamless scrolling, ensuring smooth navigation through large lists of asteroids.\n- **Accessible UI**: Dynamically generated ContentDescriptions to enhance accessibility, making the app inclusive for all users.\n- **Orientation Support**: Adapts to portrait and landscape orientations without losing data or state, ensuring a smooth user experience.\n- **Dependency Injection**: Koin (v4) improves modularity and testability by effectively managing dependencies.\n- **Reactive UI**: Incorporates DataBindingAdapter and Kotlin Flow for a reactive and responsive user experience (in the XML branch).\n\n## Showcased Skills\n\n- **Clean Architecture**: Enforced separation of concerns through domain, data, and presentation layers.\n- **Offline-first Design**: Implemented offline access using Room, ensuring a consistent user experience even without network availability, supported by periodic background data updates using WorkManager to keep the data fresh.\n- **Scalable Codebase**: Followed MVVM and Repository patterns to make the project scalable and maintainable.\n- **Reactive Programming**: Utilized Kotlin Flow to efficiently handle data streams, making the app responsive and resource-efficient.\n- **Accessibility**: Implemented accessibility features, including dynamic content descriptions and support for screen readers, to promote an inclusive experience for all users.\n\n## Project Resources\n\n- [Starter Project Code](https://github.com/udacity/nd940-android-kotlin-c2-starter/tree/master): Get the starter code for the project.\n- [Project Rubric](https://docs.google.com/document/d/1zuizdkZE564NyypAysOyI8sX7mICE64eMlmOPUV8W9w/edit?usp=sharing): View the project rubric.\n- [Android Kotlin Developer Nanodegree Program](https://www.udacity.com/course/android-kotlin-developer-nanodegree--nd940): Learn more about the full program and its related projects.\n\n#### **Note**: Many improvements and features in this project are not included in the Project Rubric, as it was originally for the Udacity Nanodegree Program.\n\n## Installation Guide\n\nThis project requires a NASA API Key. Follow these steps to run the app:\n\n1. **Clone the Repository**: Clone the project repository using Git.\n2. **Open in Android Studio**: Open the project in **Android Studio Ladybug (2024.2.1 Patch 2)** or later.\n3. **Generate NASA API Key**: Obtain your [NASA API Key](https://api.nasa.gov/).\n4. **Add NASA API Key**: Add the NASA API key to the `local.properties` file:\n```NASA_API_KEY=\"YOUR_API_KEY_HERE\"```\nAlternatively, follow the [Secrets Gradle Plugin guide](https://developers.google.com/maps/documentation/places/android-sdk/secrets-gradle-plugin).\n5. **Build the Project**: Use **Gradle Plugin v8.7.2** to build the project.\n\n**Note:** Ensure you have the latest version of Android Studio and the Gradle build tool installed. Please look at the [official guide](https://developer.android.com/studio/install) if needed.\n\n## Main Included External Libraries\n\n- **[Koin (v4)](https://github.com/InsertKoinIO/koin)**: Dependency injection framework, allowing modularity and making the project easier to test.\n- **[Timber](https://github.com/JakeWharton/timber)**: Logging utility to simplify debugging.\n- **[Coil](https://github.com/coil-kt/coil)**: Image loading and caching for efficient display of images.\n- **[Retrofit](https://github.com/square/retrofit)**: REST API management for fetching data from NASA's servers.\n- **[Moshi](https://github.com/square/moshi)**: JSON parsing for managing API responses.\n- **[Secrets Gradle Plugin](https://developers.google.com/maps/documentation/places/android-sdk/secrets-gradle-plugin)**: Secure management of sensitive data like API keys.\n- **[KSP](https://developer.android.com/build/migrate-to-ksp)**: Annotation processing plugin for improved build performance.\n\n## Snapshots from the App  \n\n### Phone Screens (Portrait)  \n\n\u003cdiv align=\"center\"\u003e\n\u003ctable\u003e\n\u003ctr\u003e\n \u003ctd align=\"center\"\u003e\n   \u003cimg src=\"./images/asteroids_list.jpg\" width=\"300\" height=\"666\" alt=\"Asteroid List Screen\"/\u003e\n   \u003cp\u003e\u003cstrong\u003eAsteroid List Screen\u003c/strong\u003e\u003cbr\u003eDisplays a paging list of asteroids with essential information.\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd align=\"center\"\u003e\n   \u003cimg src=\"./images/asteroids_filter.jpg\" width=\"300\" height=\"666\" alt=\"Asteroids Filter Screen\"/\u003e\n   \u003cp\u003e\u003cstrong\u003eAsteroids Filter Scren\u003c/strong\u003e\u003cbr\u003eCustomizable filter to auto-fetch specific data using Repository.\u003c/p\u003e\n \u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n \u003ctd align=\"center\"\u003e\n   \u003cimg src=\"./images/asteroid_detail_safe.jpg\" width=\"300\" height=\"666\" alt=\"Asteroid Detail - Non-Hazardous Screen\"/\u003e\n   \u003cp\u003e\u003cstrong\u003eAsteroid Detail - Non-Hazardous Screen\u003c/strong\u003e\u003cbr\u003eDynamic previews details of a non-hazardous asteroid.\u003c/p\u003e\n \u003c/td\u003e\n \u003ctd align=\"center\"\u003e\n   \u003cimg src=\"./images/asteroid_detail_hazardous.jpg\" width=\"300\" height=\"666\" alt=\"Asteroid Detail - Hazardous Screen\"/\u003e\n   \u003cp\u003e\u003cstrong\u003eAsteroid Detail - Hazardous Screen\u003c/strong\u003e\u003cbr\u003eDynamic previews details of a hazardous asteroid.\u003c/p\u003e\n \u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\u003c/div\u003e  \n\n### Phone Screens (Landscape)  \n\n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"./images/asteroid_list_landscape.jpg\" width=\"666\" height=\"300\" alt=\"Asteroid List Screen in Landscape Mode\"/\u003e\n\u003cp\u003e\u003cstrong\u003eAsteroid List Screen in Landscape Mode\u003c/strong\u003e\u003cbr\u003eOptimized for a seamless landscape viewing experience.\u003c/p\u003e\n\u003c/div\u003e  \n\n\n## Contributing\n\nContributions are welcome! Please open an issue or submit a pull request for improvements or bug fixes. Please feel free to reach out if you'd like to add new features or expand on existing ones.\n\n### How to Contribute\n\n- **Fork the Repository**: Click the \"Fork\" button at the top.\n- **Create a Feature Branch**: Branch off from `main` for any features (`git checkout -b feature/your-feature`).\n- **Submit a Pull Request**: Submit a PR describing your changes.\n\n## Contact\n\nFeel free to reach out for any collaboration opportunities or if you have any questions. I'd love to hear your thoughts and contributions!\nCheck my **[GitHub profile](https://github.com/AliElDerawi)**.\n\n## License\n\nThis project is open-source and licensed under the Apache 2.0 License. The LICENSE file in this repository provides more details.\n\n[ci-image]: https://img.shields.io/github/actions/workflow/status/AliElDerawi/KotlinSpaceRadar/android-kotlin-ci.yml?label=Build%20Status\u0026logo=github\n[ci]: https://github.com/AliElDerawi/KotlinSpaceRadar/actions?query=workflow%3ABuild\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falielderawi%2Fkotlinspaceradar","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falielderawi%2Fkotlinspaceradar","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falielderawi%2Fkotlinspaceradar/lists"}