{"id":47985871,"url":"https://github.com/featurecreep-cron/freshrss-extensions","last_synced_at":"2026-04-04T11:27:52.931Z","repository":{"id":347841850,"uuid":"1195444445","full_name":"featurecreep-cron/freshrss-extensions","owner":"featurecreep-cron","description":"Custom FreshRSS extensions — scroll anchoring, context menus, silent refresh, and more","archived":false,"fork":false,"pushed_at":"2026-03-29T18:05:35.000Z","size":33,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-29T19:37:12.367Z","etag":null,"topics":["context-menu","extension-manager","extensions","freshrss","freshrss-extension","php","rss","rss-reader","scroll-anchoring","self-hosted"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","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/featurecreep-cron.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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},"funding":{"buy_me_a_coffee":"featurecreep"}},"created_at":"2026-03-29T17:23:26.000Z","updated_at":"2026-03-29T18:05:39.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/featurecreep-cron/freshrss-extensions","commit_stats":null,"previous_names":["featurecreep-cron/freshrss-extensions"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/featurecreep-cron/freshrss-extensions","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/featurecreep-cron%2Ffreshrss-extensions","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/featurecreep-cron%2Ffreshrss-extensions/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/featurecreep-cron%2Ffreshrss-extensions/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/featurecreep-cron%2Ffreshrss-extensions/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/featurecreep-cron","download_url":"https://codeload.github.com/featurecreep-cron/freshrss-extensions/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/featurecreep-cron%2Ffreshrss-extensions/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31397799,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T10:20:44.708Z","status":"ssl_error","status_checked_at":"2026-04-04T10:20:06.846Z","response_time":60,"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":["context-menu","extension-manager","extensions","freshrss","freshrss-extension","php","rss","rss-reader","scroll-anchoring","self-hosted"],"created_at":"2026-04-04T11:27:52.849Z","updated_at":"2026-04-04T11:27:52.914Z","avatar_url":"https://github.com/featurecreep-cron.png","language":"JavaScript","funding_links":["https://buymeacoffee.com/featurecreep"],"categories":[],"sub_categories":[],"readme":"# FreshRSS Extensions\n\n[![License: MIT](https://img.shields.io/github/license/featurecreep-cron/freshrss-extensions)](https://github.com/featurecreep-cron/freshrss-extensions/blob/main/LICENSE)\n\nCustom extensions for [FreshRSS](https://freshrss.org) that fix everyday annoyances — scroll jumps, missing context menus, manual page refreshes, and no way to install extensions without SSH.\n\n**Requirements:** FreshRSS 1.20+ (uses `js_vars` hook and `registerController`). No external dependencies.\n\n## Extensions\n\n### Sticky Reader\n\nFixes the jarring scroll jumps when switching between articles. Keeps the toolbar visible, shows which feed you're reading, and hides the redundant feed column in single-feed view.\n\n- Scroll anchoring — clicked article stays where you clicked it\n- Sticky toolbar — nav controls don't scroll away\n- Feed name in toolbar — always know what you're reading\n- Locked sidebar (optional) — independent scroll for sidebar and content\n- Configurable scroll target (search bar, control bar, or title row)\n\n### Right-Click Actions\n\nContext menus on articles, feeds, and categories. Four zones (article header, article body, sidebar feed, sidebar category) with per-zone action toggles.\n\n![Right-click context menu](screenshots/context.png)\n\nArticle actions: toggle read/star, open in tab, mark older/newer as read, add permanent title filter.\nFeed actions: mark all read/unread, recently read, open settings.\nCategory actions: mark all read/unread, expand/collapse, manage subscriptions.\n\n### Silent Refresh\n\nUpdates sidebar unread counts via the FreshRSS JSON API without reloading the page. Configurable interval (1-60 minutes) and title bar mode (all unread vs. current view).\n\n### Recently Read\n\nAdds a \"Recently Read\" link to the sidebar that filters to articles you've already read, sorted by when you last interacted with them.\n\n![Recently Read sidebar link](screenshots/recently_read.png)\n\n### Extension Manager\n\nInstall, update, and remove FreshRSS extensions without SSH or file access. Add GitHub repository URLs as extension sources, browse available extensions, and install individually. Uses atomic updates with automatic rollback on failure.\n\n![Extension Manager with catalog](screenshots/extension_manager.png)\n\n## Installation\n\n### Option 1: Install Extension Manager first (recommended)\n\n1. Download this repo as a zip (Code → Download ZIP)\n2. Extract `xExtension-ExtensionManager` to your FreshRSS `extensions/` directory\n3. Enable Extension Manager in FreshRSS settings → Extensions\n4. Use Extension Manager to install the remaining extensions by pasting this repo's URL\n\n### Option 2: Manual\n\nCopy any `xExtension-*` directory into your FreshRSS `extensions/` directory, then enable in settings.\n\nThe extensions directory is typically at:\n- Docker: `/var/www/FreshRSS/extensions/` (inside the container)\n- Manual install: `\u003cfreshrss-root\u003e/extensions/`\n\n## Configuration\n\nEach extension has its own settings page in FreshRSS (Extensions → Configure). No global configuration file needed.\n\n## Contributing\n\nContributions are welcome. See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and code style.\n\n## Support\n\nIf these extensions are useful to you, [buy me a coffee](https://buymeacoffee.com/featurecreep).\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffeaturecreep-cron%2Ffreshrss-extensions","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffeaturecreep-cron%2Ffreshrss-extensions","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffeaturecreep-cron%2Ffreshrss-extensions/lists"}