{"id":23734123,"url":"https://github.com/woojiahao/apollo","last_synced_at":"2025-08-07T23:08:31.799Z","repository":{"id":45269789,"uuid":"412725985","full_name":"woojiahao/apollo","owner":"woojiahao","description":"Open-source RSS aggregator built with Electron, React, and Tailwind","archived":false,"fork":false,"pushed_at":"2022-07-30T14:53:37.000Z","size":1146,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-12T02:36:29.134Z","etag":null,"topics":["electron","electron-app","react","react-router","rss","rss-aggregator","rss-reader","tailwindcss","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/woojiahao.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}},"created_at":"2021-10-02T07:38:56.000Z","updated_at":"2025-01-05T20:59:15.000Z","dependencies_parsed_at":"2022-09-07T13:00:24.893Z","dependency_job_id":null,"html_url":"https://github.com/woojiahao/apollo","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/woojiahao/apollo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/woojiahao%2Fapollo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/woojiahao%2Fapollo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/woojiahao%2Fapollo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/woojiahao%2Fapollo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/woojiahao","download_url":"https://codeload.github.com/woojiahao/apollo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/woojiahao%2Fapollo/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":269338065,"owners_count":24400180,"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-08-07T02:00:09.698Z","response_time":73,"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":["electron","electron-app","react","react-router","rss","rss-aggregator","rss-reader","tailwindcss","typescript"],"created_at":"2024-12-31T05:33:59.539Z","updated_at":"2025-08-07T23:08:31.779Z","avatar_url":"https://github.com/woojiahao.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003ch1 align=\"center\" style=\"border: none\"\u003eAPOLLO\u003c/h1\u003e\n  \u003cp\u003e\n   \u003cstrong\u003eOpen-source RSS Aggregator\u003c/strong\u003e\n  \u003c/p\u003e\n  \u003cem\u003eRSS Made Easy\u003c/em\u003e\n  \u003cimg src=\"./documentation/res/apollo-preview-feed.png\"\u003e\n  \u003cimg src=\"./documentation/res/apollo-preview-article.png\"\u003e\n\u003c/div\u003e\n\n## Installation\n\nCurrently, Apollo can be installed locally only. It requires a database `apollo-test` to be created in PostgreSQL.\n\n```bash\ncreatedb -U postgres apollo-test\ngit clone https://github.com/woojiahao/apollo.git\ncd apollo/\nnpm i\nnpm run start\n```\n\n## Tech Stack\n\nApollo uses the following technologies:\n\n- Electron\n- Typescript\n- React\n- Tailwind\n- PostgreSQL\n\n## Lessons learnt\n\n- React Rotuer can be used to help with \"view switching\" (i.e. having a SPA for an Electron app) and help to remove the need for maintaining a shared state across applications (i.e. each view, when reloaded, can reload the data accordingly based on the path provided)\n- Communication between the main and renderer processes should be managed using IPC\n\n## Refresh feed algorithm\n\nTo determine if an article is newly added to the feed, we employ the follow algorithm:\n\n1. Retrieve existing feed with articles from database\n2. Fetch the latest version of the feed\n3. For each feed,\n   1. Compare the existing list of articles against the latest list of articles*\n   2. If an article is completely new, add it to the list of existing articles\n   3. If an article exists but has been updated, update it in the list of existing articles\n4. Commit any changes made to the database\n\n```markdown\n* - Given that an article must include either a title or description, we will use those as a measure of \"new\".\n    If the article from the latest pulled feed has a completely different title/description, then that is a new article\n    If the article from the latest pulled feed has the same title/description, but differing content/link, we will \n      update that instead.\n\n    To make it easier to compare the contents, we will encode the content to Base-64\n```\n\n## TODO\n\n- [X] Cache articles\n- [X] Auto refresh all feeds when first launching app\n- [X] Today feature\n- [ ] Schedule refreshes for specific feeds\n- [ ] Feed-specific actions like editing tag/name\n- [ ] Deleting feeds\n- [ ] Dark theme\n- [ ] Bookmarks feature\n- [ ] Handle the other types of RSS feed formats like [Dublin Core](https://www.rssboard.org/rss-profile#namespace-elements-dublin)\n- [ ] Implement proper ordering for feeds","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwoojiahao%2Fapollo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwoojiahao%2Fapollo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwoojiahao%2Fapollo/lists"}