{"id":51033930,"url":"https://github.com/ghazi-git/rss-feed-tracker","last_synced_at":"2026-06-22T03:30:40.119Z","repository":{"id":359739577,"uuid":"1167664386","full_name":"ghazi-git/rss-feed-tracker","owner":"ghazi-git","description":"Manage your RSS Feeds from the extension popup","archived":false,"fork":false,"pushed_at":"2026-06-14T03:54:39.000Z","size":1217,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-14T05:20:40.436Z","etag":null,"topics":["chrome-extension","rss-feed-reader"],"latest_commit_sha":null,"homepage":"https://chromewebstore.google.com/detail/rss-feed-tracker/bkhbcilgeakfdfpjmikgplahfphcglnf","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ghazi-git.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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":"2026-02-26T14:47:59.000Z","updated_at":"2026-05-31T14:20:47.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ghazi-git/rss-feed-tracker","commit_stats":null,"previous_names":["ghazi-git/rss-feed-tracker"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/ghazi-git/rss-feed-tracker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ghazi-git%2Frss-feed-tracker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ghazi-git%2Frss-feed-tracker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ghazi-git%2Frss-feed-tracker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ghazi-git%2Frss-feed-tracker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ghazi-git","download_url":"https://codeload.github.com/ghazi-git/rss-feed-tracker/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ghazi-git%2Frss-feed-tracker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34633796,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-22T02:00:06.391Z","response_time":106,"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":["chrome-extension","rss-feed-reader"],"created_at":"2026-06-22T03:30:39.590Z","updated_at":"2026-06-22T03:30:40.106Z","avatar_url":"https://github.com/ghazi-git.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# RSS Feed Tracker\n\nManage your RSS Feeds from the extension popup.\n\n[![Available in chrome webstore icon](https://developer.chrome.com/static/docs/webstore/branding/image/tbyBjqi7Zu733AAKA5n4.png)](https://chromewebstore.google.com/detail/rss-feed-tracker/bkhbcilgeakfdfpjmikgplahfphcglnf)\n\n## Features\n\n- Manage RSS feeds locally. No account required. Your data stays on your device.\n- Back up and restore all the extension data (feeds, folders, posts, bookmarks and settings). Details of the backup\n  format can be found [below](#backup-format).\n- Export and import feeds as OPML.\n- Organize feeds into folders with drag and drop support.\n- Search for posts already fetched by the extension.\n- Support for RSS, Atom and JSON feeds.\n- Support for keyboard navigation. The list of shortcuts is [below](#keyboard-navigation).\n- Light and dark themes.\n\n### Nice Extras\n\n- Pick up where you left off if the popup closes accidentally.\n- Mark posts as read by clicking them (with a setting to allow clicks to open the post instead).\n- Middle and right-click to open a post.\n- The back/forward mouse buttons work just like in the browser tabs. Or, use the keyboard shortcuts instead\n  `ctrl+alt+left`/`ctrl+alt+right`.\n- `ctrl+f` to filter recent posts and `ctrl+shift+f` to search all posts.\n- Hover over a link to view the URL at the bottom of the extension popup (Chrome does not do this for links\n  in the extension popup).\n- An icon with a link to the comments URL is added to the bottom of the post when a comments link is available. This\n  is pretty handy for feeds like 'Hacker News'.\n- Posts are grouped by feed when viewing all posts under a folder (with a setting to disable posts grouping).\n- Automatically check for feeds in the current tab when adding a feed.\n- Turn off auto-updates for specific feeds.\n- Bookmark posts.\n\n## Limitations\n\n- No Sync with other devices. Make sure to create extension backups regularly from the \"Preferences\" tab.\n- Cannot view the full post in the extension. I think it's best to view posts on the author's website and the extension\n  popup isn't the place for reading articles anyway.\n- No notifications. I don't like notifications.\n\n## Why create this extension\n\nI used Feeder's Chrome extension for years. I was mostly happy with it, especially that it didn't require a login.\nBut, there were some small issues that kept nagging at me and minor improvements that I wanted to add. So, I thought:\nwhy not create my own extension. And, this is the extension I'm using instead.\n\n## Backup format\n\nThe backup is a zip file containing the following JSON files:\n\n- `manifest.json` contains the backup metadata:\n  - `backupVersion` set to `1`. Will be incremented only when there is a breaking change.\n  - `extensionName`\n  - `extensionVersion` the extension version when the backup was generated.\n  - `createdAt` when was the backup generated.\n  - `preferences` the user preferences\n    - `uiTheme` `\"light\"` or `\"dark\"` or `null` (i.e. follow system theme).\n    - `defaultFeedUpdateFrequency` the default value in milliseconds for the 'Update Frequency' field when creating\n      a new feed.\n    - `clickPostToToggleUnread` when set to `true`, clicking a post marks it as unread. When set to `false`, clicking\n      a post opens the post in a new tab.\n    - `orderPostsBy` posts in a feed, under a folder, under bookmarks or in search, can be ordered by `publishedAt`\n      or `fetchedAt`. `publishedAt` is the time when the post was published according to the feed. `fetchedAt` is when\n      the post was fetched by the extension from the feed.\n    - `groupFolderPosts` can be `true` or `false`. If `true` and when displaying posts inside a folder, posts for\n      feed X will be shown first, then posts for feed Y, ... This grouping will be done for each page of posts.\n  - `backupFiles`\n    - `feeds_folders` the filename containing the feeds and folders data. Usually set to `nodes.json`.\n    - `posts` an array of filenames (0 or more) containing the feed posts. Each file contains at most 20K posts.\n      Usually named `posts_xxxx.json`.\n\n- `nodes.json` contains an array of feeds and folders. Each object has the following properties\n  - `id` auto-incremented integer.\n  - `type` can be `\"feed\"` or `\"folder\"`.\n  - `name` name of the feed or folder.\n  - `unreadCount` the number of unread posts inside the feed or folder.\n  - `parentId` ID of the parent folder containing this feed or folder. Can be `null` only for the root folder.\n  - `sortOrder` a number that allows sorting feeds and folders within the same parent folder\n  - `createdAt` when was the feed or folder created.\n  - `feed` set to `null` for folders. Contains the following properties when `type=\"feed\"`\n    - `url` feed URL\n    - `favicon` URL of the feed icon. can be `null`.\n    - `updateFrequency`frequency of feed updates in milliseconds. Can be `null` meaning that the feed will not be\n      updated automatically (user can still do that manually).\n    - `lastRunAt` last time the feed has run. Represented as an integer (milliseconds since epoch). Can be `null`.\n    - `nextRunAt` next time the feed will run. Equal to `lastRunAt + updateFrequency`. Represented as an integer\n      (milliseconds since epoch). Equals to `null` when `updateFrequency` is `null`.\n\n- `posts_xxxx.json` contains an array of feed posts. Each post has the following properties\n  - `feedId` feed ID\n  - `guid` string representing the unique identifier for the post. Provided by the feed.\n  - `title` title of the post\n  - `url` URL of the post\n  - `commentsURL` URL pointing to the comments of the post. Only RSS feeds can provide a comments URL (Atom and\n    JSON feeds do not).\n  - `unread` can be `1` (unread) or `0` (read)\n  - `bookmarked` can be `1` (bookmarked) or `0` (not bookmarked)\n  - `publishedAt` time the post was published according to the feed. Represented as an integer (milliseconds since epoch).\n  - `fetchedAt` time the post was fetched by the extension. Represented as an integer (milliseconds since epoch).\n\n## Keyboard Navigation\n\nTabbing through the UI elements and using arrows allow you to do almost everything. Still, some of the following\nshortcuts might prove useful:\n\n- `ctrl+shift+s` to open/close the extension popup (can be configured from `chrome://extensions/shortcuts`)\n- Top-header shortcuts\n  - `ctrl+l` go to the \"Library\" page\n  - `ctrl+b` go to the \"Bookmarks\" page\n  - `ctrl+p` go to the \"Preferences\" page\n- Filter/Search posts\n  - `ctrl+f` go to the filter posts page. Enabled in feed/folder/bookmarks/search pages\n  - `ctrl+shift+f` go to the search posts page. Enabled in feed/folder/bookmarks/filter pages\n  - `escape` exit from filter/search page and go back to the previous page\n- Back/forward navigation (the same as the browser back/forward buttons)\n  - `ctrl+alt+left` go back\n  - `ctrl+alt+right` go forward\n- Page Header Navigation (under \"Library\")\n  - `ctrl+t` toggle the feed/folder title dropdown\n  - `ctrl+m` mark all posts in the current feed/folder as read\n  - `ctrl+u` go to the unread posts page of the current feed/folder\n  - `ctrl+a` go to all posts page of the current feed/folder\n  - `backspace` go to the previous page (same as clicking the back button that is rendered in the extension UI)\n- Navigating the folders/feeds hierarchy\n  - `up`/`down` move up/down in the folder/feed list\n  - `right`/`enter` when a folder/feed is focused, go to that folder/feed page\n  - `left` go to the parent folder page\n  - `t` toggle the three-dot menu of the focused feed/folder\n  - `m` mark as read all posts of the focused feed/folder.\n  - `u` go to the unread posts page of the focused feed/folder\n  - `a` go to the all posts page of the focused feed/folder\n- Posts page\n  - `up`/`down` move up/down in the posts list\n  - `left` go to the parent folder page\n  - `l` load more posts\n  - `enter` opens the link in a new tab or toggles the unread status of the post depending on the user preferences\n  - `ctrl+enter` opens the link in a new tab\n  - `shift+enter` opens the link in a new window\n  - `ctrl+shift+enter` open the focused post in a new incognito window and move to that window\n  - `ctrl+c` copy the link of the focused post\n  - `k` open the comments link (if any) of the focused post in a new tab and move to that tab\n  - `ctrl+k` open the comments link (if any) of the focused post in a new tab but keep the focus on the extension popup\n  - `shift+k` open the comments link (if any) of the focused post in a new window and move to that window\n  - `ctrl+shift+k` open the comments link (if any) of the focused post in a new incognito window and move to that window\n  - `b` bookmark or remove the bookmark of the focused post\n  - `m` mark the focused post as read or unread\n\n## Running the project locally\n\n1. Install dependencies:\n\n```bash\nnpm install\n```\n\n2. Start development server:\n\n```bash\nnpm run dev\n```\n\n3. Open Chrome and navigate to `chrome://extensions/`, enable \"Developer mode\" and load the unpacked extension from the\n   `dist` directory.\n\n## Project Structure\n\n- `src/popup/index.html` - Extension popup UI.\n- `src/background/index.ts` - Extension service worker. Includes message handlers for managing extension data (stored\n  in indexedDB), feed polling for new posts, caching,\n- `src/offscreen/index.html` - Handles feeds export, backup/restore and search.\n- `manifest.config.js` - Chrome extension manifest configuration.\n\n## Release Process\n\n- [optional] Set env variable\n  `GITHUB_TOKEN` ([generate token](https://github.com/settings/tokens/new?scopes=repo\u0026description=extension-github-release))\n- Run `npm run release` which includes:\n  - Pull the latest changes `git pull`.\n  - Check for linting issues `npm run lint`.\n  - Set the new version in `package.json`\n  - Add the version and date to the changelog `## [\u003cversion\u003e] - \u003cyyyy-mm-dd\u003e` and keep `## [Unreleased]` at the top.\n  - Commit the changes and create a git tag `v\u003cversion\u003e`.\n  - Push the local commit and tag to GitHub.\n  - Create the GitHub release, done automatically if the `GITHUB_TOKEN` env variable is set. Otherwise, a new release\n    page is opened in the browser with fields prepopulated. The release notes are copied from the changelog.\n- Package the extension with `npm run build`.\n- Upload the packaged extension to the Chrome web store.\n\n## License\n\nThis project is [GPLv3 licensed](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fghazi-git%2Frss-feed-tracker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fghazi-git%2Frss-feed-tracker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fghazi-git%2Frss-feed-tracker/lists"}