{"id":18020889,"url":"https://github.com/rm3l/dev-feed","last_synced_at":"2025-03-26T21:32:37.395Z","repository":{"id":35391513,"uuid":"187110569","full_name":"rm3l/dev-feed","owner":"rm3l","description":"Flutter-based mobile app displaying a list of daily curated content from top engineering blogs and articles. Backed by a GraphQL-based API written in Kotlin..","archived":false,"fork":false,"pushed_at":"2025-03-22T07:42:15.000Z","size":49881,"stargazers_count":23,"open_issues_count":11,"forks_count":11,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-03-22T14:21:59.828Z","etag":null,"topics":["android","android-app","android-application","dart","dartlang","flutter","flutter-app","graphql","graphql-server","ios","ios-app","jvm","kotlin","news-aggregator","spring-boot","tech-blog","technology"],"latest_commit_sha":null,"homepage":"https://dev-feed-api.onrender.com/graphiql","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rm3l.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-05-16T22:42:14.000Z","updated_at":"2025-03-22T07:40:48.000Z","dependencies_parsed_at":"2023-02-12T11:31:32.872Z","dependency_job_id":"da4ae12f-a945-44a8-92ad-c4575bd2ae62","html_url":"https://github.com/rm3l/dev-feed","commit_stats":null,"previous_names":[],"tags_count":42,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rm3l%2Fdev-feed","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rm3l%2Fdev-feed/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rm3l%2Fdev-feed/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rm3l%2Fdev-feed/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rm3l","download_url":"https://codeload.github.com/rm3l/dev-feed/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245739026,"owners_count":20664385,"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-app","android-application","dart","dartlang","flutter","flutter-app","graphql","graphql-server","ios","ios-app","jvm","kotlin","news-aggregator","spring-boot","tech-blog","technology"],"created_at":"2024-10-30T06:08:09.751Z","updated_at":"2025-03-26T21:32:32.381Z","avatar_url":"https://github.com/rm3l.png","language":"Kotlin","readme":"# Dev Feed\n\n[![Backend Build Workflow](https://github.com/rm3l/dev-feed/workflows/Backend%20Build%20and%20Publish%20Docker%20Image/badge.svg)](https://github.com/rm3l/dev-feed/actions?query=workflow%3A%22Backend+Build+and+Publish+Docker+Image%22)\n[![Mobile Build Workflow](https://github.com/rm3l/dev-feed/workflows/Mobile%20Build/badge.svg)](https://github.com/rm3l/dev-feed/actions?query=workflow%3A%22Mobile+Build%22)\n\n[![Render](https://img.shields.io/badge/deployed%20on%20render-blue.svg)](https://dev-feed-api.onrender.com/graphiql)\n\n[![Docker Stars](https://img.shields.io/docker/stars/rm3l/dev-feed-api.svg)](https://hub.docker.com/r/rm3l/dev-feed-api)\n[![Docker Pulls](https://img.shields.io/docker/pulls/rm3l/dev-feed-api.svg)](https://hub.docker.com/r/rm3l/dev-feed-api)\n\n[![License](https://img.shields.io/badge/license-MIT-green.svg?style=flat)](https://github.com/rm3l/dev-feed/blob/master/LICENSE)\n\nDev Feed is a Flutter-based mobile application allowing to keep up with top engineering content from\ncompanies all over the world.\nIt stemmed from my own needs to not only follow a curated list of tech-related blogs, but also\nplay a little bit with the excellent [Flutter](https://flutter.dev/) SDK.\n\n\u003ca href=\"https://play.google.com/store/apps/details?id=lemrapps.dev_feed\"\u003e\u003cimg src=\"https://github.com/rm3l/dev-feed/raw/master/mobile/deployment/screenshots/android/google-play-badge.png\" width=\"50%\"/\u003e\u003c/a\u003e\n\n![demo](https://raw.githubusercontent.com/rm3l/dev-feed/master/mobile/deployment/screenshots/android/latest_news_w400.png)\n\n## Tech Stack\n\nThe tech stack is rather simple:\n* Backend\n  * A [Spring Boot](https://spring.io/projects/spring-boot) application written in [Kotlin](https://kotlinlang.org/), which contains scheduled crawlers in charge of analyzing certain remote websites for articles and feeding a local database. It then aggregates and exposes such data over a [GraphQL](https://graphql.org/) API, with the ability to search for articles, or by tags, or to read past articles. This Backend application is published to the [Docker Hub](https://hub.docker.com/r/rm3l/dev-feed), and continuously deployed to [Render](https://dev-feed-api.onrender.com/graphiql) as well. At the moment, articles are fetched from the list below, but additional sources may be added later on:\n    * [DiscoverDev.io](https://www.discoverdev.io/)\n    * [EngineeringBlogs.xyz](https://engineeringblogs.xyz/)\n    * my own blog, located at [rm3l.org](https://rm3l.org)\n* Mobile\n  * A cross-platform mobile UI application written in [Dart](https://dart.dev/), using the [Flutter](https://flutter.dev/) SDK. Please note that there is no sync'ing mechanism, and all search/favorite articles are stored on the local device. This is an enhancement that might be implemented later on.\n\n### Building and running\n\n#### Using the Backend GraphQL API\n\n##### Docker\n\nA Docker repository with the GraphQL API Server can be found here: https://hub.docker.com/r/rm3l/dev-feed-api\n\nTo fetch the docker image, run:\n\n```bash\ndocker image pull rm3l/dev-feed-api\n```\n\nTo run the server with the default options and expose it on port 8080:\n\n```bash\ndocker container run --rm -p 8080:8080 rm3l/dev-feed-api\n```\n\nYou can then access the GraphiQL browser by heading to http://localhost:8080/graphiql\n\n##### Kubernetes\n\nThe Backend API is also published to [my Helm Charts repository](https://helm-charts.rm3l.org/), so as to be deployable to a Kubernetes Cluster using [Helm](https://helm.sh/).\n\nIt is listed on Artifact Hub : https://artifacthub.io/packages/helm/rm3l/dev-feed\n\n```bash\n$ helm repo add rm3l https://helm-charts.rm3l.org\n$ helm install my-dev-feed rm3l/dev-feed\n```\n\nSee https://artifacthub.io/packages/helm/rm3l/dev-feed or https://github.com/rm3l/helm-charts/blob/main/charts/dev-feed/README.md for\nall customizable values.\n\nYou can then access the GraphiQL browser by heading to http://localhost:8080/graphiql\n\n##### Manual mode\n\n1. Build the Backend\n\n```sh\n./backend/gradlew -p ./backend build --stacktrace\n```\n\n2. Run the Backend GraphQL API\n\n```sh\njava -jar backend/api/build/libs/dev-feed-api-2.0.1.jar\n```\n\nYou can then access the GraphiQL browser by heading to http://localhost:8080/graphiql\n\n#### Using the Mobile application\n\n1. Install Flutter by following the instructions on the [official website](https://flutter.dev/docs/get-started/install)\n\n2. Prepare the configuration environment\n\nSkip this to use the default Render Backend. Otherwise, if you have a custom Backend (either local or remote), you need to create a specific environment file (say `my_personal_backend.dart`) in the `mobile/lib/environments` folder, e.g.:\n\n```dart\nimport 'package:dev_feed/env.dart';\n\nvoid main() =\u003e MyPersonalBackend();\n\nclass MyPersonalBackend extends Env {\n  final String baseUrl = 'https://my-dev-feed-backend-api.example.org';\n}\n```\n\n3. Build the mobile apps\n\nFirst `cd` to the `mobile` directory:\n\n```sh\ncd mobile\n```\n\nIf you simply want to target the default Render backend, just run:\n\n```sh\nflutter build apk --debug\n```\n\nOtherwise, if you have a custom Backend (and its related Dart environment file) declared under `mobile/lib/environments/my_personal_backend.dart`, then run:\n\n```sh\nflutter build apk --debug -t lib/environments/my_personal_backend.dart\n```\n\nYou will then find the mobile applications built under the respective platform folders. For example, the APK for Android can be found under `build/app/outputs/apk/debug/`.\n\n4. Install and run the APK either in an emulator or in a real device\n\n```sh\nflutter install\n```\n\nOr:\n\n```sh\nadb install -r build/app/outputs/apk/debug/app-debug.apk\n```\n\n## Contribution Guidelines\n\nContributions and issue reporting are more than welcome. So to help out (e.g., with a new Article crawler plugin in the Backend), do feel free to fork this repo and open up a pull request.\nI'll review and merge your changes as quickly as possible.\n\nYou can use [GitHub issues](https://github.com/rm3l/awesome-dev/issues) to report bugs.\nHowever, please make sure your description is clear enough and has sufficient instructions to be able to reproduce the issue.\n\n## Credits / Inspiration\n\n* [EngineeringBlogs.xyz](https://engineeringblogs.xyz/)\n* [DiscoverDev.io](https://www.discoverdev.io/)\n\n## Developed by\n\n* Armel Soro\n  * [keybase.io/rm3l](https://keybase.io/rm3l)\n  * [rm3l.org](https://rm3l.org) - \u0026lt;apps+dev_feed@rm3l.org\u0026gt; - [@rm3l](https://twitter.com/rm3l)\n  * [paypal.me/rm3l](https://paypal.me/rm3l)\n  * [coinbase.com/rm3l](https://www.coinbase.com/rm3l)\n\n## License\n\n    The MIT License (MIT)\n\n    Copyright (c) 2019-2022 Armel Soro\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE.\n","funding_links":["https://paypal.me/rm3l"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frm3l%2Fdev-feed","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frm3l%2Fdev-feed","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frm3l%2Fdev-feed/lists"}