Skip to content

feat(extensions): add Webhook extension for automated RSS notifications#456

Merged
Alkarex merged 17 commits into
FreshRSS:mainfrom
IAM-marco:feat/freshrss-1515-webhook-extension
May 3, 2026
Merged

feat(extensions): add Webhook extension for automated RSS notifications#456
Alkarex merged 17 commits into
FreshRSS:mainfrom
IAM-marco:feat/freshrss-1515-webhook-extension

Conversation

@IAM-marco
Copy link
Copy Markdown
Contributor

This is a copy of #324 with the linting fixed.

All credits to @Ryahn (and @Alkarex for the fixes)


🎯 Purpose

Implements the long-requested webhook feature from issue #1513, allowing users to automatically send webhook notifications when RSS entries match specified keywords.

🚀 Features

  • Automated webhook notifications for matching RSS entries
  • Flexible pattern matching (titles, feeds, authors, content)
  • Support for multiple HTTP methods and request formats
  • Template-based webhook payloads with placeholders
  • Comprehensive error handling and logging
  • Built-in test functionality

🔧 Technical Details

  • Complete PHPDoc documentation
  • Optimized performance with minimal RSS processing impact

🧪 Testing

  • Syntax validation passed
  • Configuration interface tested
  • Webhook functionality verified
  • Error handling validated

📚 Documentation

  • Comprehensive README with examples
  • PHPDoc documentation throughout
  • Configuration guide included
  • Troubleshooting section provided

Resolves FreshRSS/FreshRSS#1513

Alkarex added a commit to Alkarex/FreshRSS that referenced this pull request Apr 19, 2026
@Alkarex
Copy link
Copy Markdown
Member

Alkarex commented Apr 19, 2026

I have made a bunch of changes and will continue later, but tests already welcome.
Will need to merge FreshRSS/FreshRSS#8705 first

Alkarex added a commit to FreshRSS/FreshRSS that referenced this pull request Apr 20, 2026
Comment thread xExtension-Webhook/LICENSE Outdated
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This license is different from the one in the readme.
I suggest removing this file also for uniformity with the rest of the repo

And more simplification
Alkarex added a commit to FreshRSS/FreshRSS that referenced this pull request Apr 28, 2026
@Alkarex Alkarex merged commit 353a7c9 into FreshRSS:main May 3, 2026
1 check passed
@IAM-marco
Copy link
Copy Markdown
Contributor Author

Hey @Alkarex

Apologies for having let this PR go unmaintained.

Thank you for taking care of it, it's really appreciated!

@Alkarex
Copy link
Copy Markdown
Member

Alkarex commented May 3, 2026

No worries, and tests / feedback welcome.
I have tried to make it more uniform with #458

doonga pushed a commit to greyrock-labs/home-ops that referenced this pull request May 13, 2026
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [freshrss/freshrss](https://freshrss.org/) ([source](https://github.com/FreshRSS/FreshRSS)) | minor | `1.28.1-alpine` → `1.29.0-alpine` |

---

### Release Notes

<details>
<summary>FreshRSS/FreshRSS (freshrss/freshrss)</summary>

### [`v1.29.0`](https://github.com/FreshRSS/FreshRSS/blob/HEAD/CHANGELOG.md#2026-05-10-FreshRSS-1290)

[Compare Source](FreshRSS/FreshRSS@1.28.1...1.29.0)

- Features
  - New sort order preferences at global, category, and feed levels [#&#8203;8234](FreshRSS/FreshRSS#8234)
  - New filtering by date of *Server modification date* [#&#8203;8131](FreshRSS/FreshRSS#8131), [#&#8203;8576](FreshRSS/FreshRSS#8576)
    - Corresponding search operator, e.g. `mdate:P1D` for finding articles modified by the author / server during the past day.
    - Especially useful for optimising the API synchronisation.
  - Use feed-provided icon [#&#8203;8633](FreshRSS/FreshRSS#8633)
  - New option to automatically mark new articles as read if an identical GUID already exists in the same category [#&#8203;8673](FreshRSS/FreshRSS#8673)
  - Automatic feed visibility/priority during search [#&#8203;8609](FreshRSS/FreshRSS#8609)
  - Add feed visibility filter to statistics view *unread dates* [#&#8203;8489](FreshRSS/FreshRSS#8489)
  - Add option to enable/disable notifications, also for PWA [#&#8203;8458](FreshRSS/FreshRSS#8458)
  - Add a form to create new user queries on the *User Queries* page [#&#8203;8623](FreshRSS/FreshRSS#8623)
  - Allow WebSub hub push from same private network [#&#8203;8450](FreshRSS/FreshRSS#8450)
  - Support category field in JSON feed import [#&#8203;8786](FreshRSS/FreshRSS#8786)
- Bug fixing
  - Fix wrong search `toString` in case of regex-looking string [#&#8203;8479](FreshRSS/FreshRSS#8479)
  - Fix article *last seen date* in case of feed errors [#&#8203;8646](FreshRSS/FreshRSS#8646)
  - Fix search expansion with backslash [#&#8203;8497](FreshRSS/FreshRSS#8497)
  - Fix user query parsing [#&#8203;8543](FreshRSS/FreshRSS#8543)
  - Fix search in shared user queries [#&#8203;8789](FreshRSS/FreshRSS#8789)
  - Fix redirect to wrong view after mark as read in *reader* and *global* views [#&#8203;8552](FreshRSS/FreshRSS#8552)
  - Fix SQLite paging when sorting by article length [#&#8203;8594](FreshRSS/FreshRSS#8594)
  - Fix change sorting during paging [#&#8203;8688](FreshRSS/FreshRSS#8688)
  - Fix SQL keyset pagination when sorting by category name [#&#8203;8597](FreshRSS/FreshRSS#8597)
  - Fix SQL duplicates in the user labels when sorting randomly [#&#8203;8626](FreshRSS/FreshRSS#8626)
  - Fix wrong error redirect in subscription management [#&#8203;8625](FreshRSS/FreshRSS#8625)
  - Fix do not include hidden feeds when counting total number of unread articles [#&#8203;8715](FreshRSS/FreshRSS#8715)
  - Update user modify date when changing extensions UserJS / UserCSS [#&#8203;8607](FreshRSS/FreshRSS#8607)
  - Non-strict OPML export [#eedefb](FreshRSS/FreshRSS@eedefbd)
- Security
  - Limit cURL to protocols HTTP, HTTPS [#&#8203;8713](FreshRSS/FreshRSS#8713)
  - Better sanitise favicon URLs [#&#8203;8714](FreshRSS/FreshRSS#8714)
  - New setting for `<iframe>` referrer allow list [#&#8203;8672](FreshRSS/FreshRSS#8672)
  - Fix email validation and allow error page for unverified email users [#&#8203;8582](FreshRSS/FreshRSS#8582)
  - Add `allowfullscreen` to `<iframe>` [#&#8203;8467](FreshRSS/FreshRSS#8467)
  - Rewrite `Set-Cookie` using native PHP support of `SameSite` [#&#8203;8447](FreshRSS/FreshRSS#8447), [#&#8203;8778](FreshRSS/FreshRSS#8778)
    - Sanitize lifetime of session cookies from `session.cookie-lifetime` in `php.ini`
  - Update to `<meta name="referrer" content="no-referrer" />` from deprecated `never` [#&#8203;8725](FreshRSS/FreshRSS#8725)
  - Preventive measure against search ingestion [#&#8203;8777](FreshRSS/FreshRSS#8777)
- UI
  - New option to hide sidebar by default [#&#8203;8528](FreshRSS/FreshRSS#8528)
  - Improve mobile view with multiple lines when thumbnails and summaries are shown [#&#8203;8631](FreshRSS/FreshRSS#8631)
  - New option to disable unread counter in tab title and favicon [#&#8203;8728](FreshRSS/FreshRSS#8728)
  - Show time since when a feed has problems [#&#8203;8670](FreshRSS/FreshRSS#8670)
  - Improve add feed UI [#&#8203;8683](FreshRSS/FreshRSS#8683)
  - Improve slider behaviour when using navigate back button [#&#8203;8496](FreshRSS/FreshRSS#8496), [#&#8203;8524](FreshRSS/FreshRSS#8524)
  - Improve consistency of slider behaviour after submitting form [#&#8203;8612](FreshRSS/FreshRSS#8612)
  - Create dynamic favicons from SVG instead of PNG canvas [#&#8203;8577](FreshRSS/FreshRSS#8577), [#&#8203;8588](FreshRSS/FreshRSS#8588)
  - Only display scrollbar everywhere if there's an overflow (especially for Chromium) [#&#8203;8542](FreshRSS/FreshRSS#8542)
  - Fix CSS padding of `.content pre code` [#&#8203;8620](FreshRSS/FreshRSS#8620)
  - Fix wrong navigation buttons layout on Chromium [#&#8203;8606](FreshRSS/FreshRSS#8606)
  - Fix don’t mark as read if middle click is outside of article link [#&#8203;8553](FreshRSS/FreshRSS#8553)
  - More robust JS [#&#8203;8595](FreshRSS/FreshRSS#8595)
  - Fix sidebar slide animation at narrow viewports [#&#8203;8747](FreshRSS/FreshRSS#8747)
  - Visually dim disabled users in user management table [#&#8203;8768](FreshRSS/FreshRSS#8768)
  - Improve multiple UI themes [#&#8203;8711](FreshRSS/FreshRSS#8711), [#&#8203;8732](FreshRSS/FreshRSS#8732),
    [#&#8203;8733](FreshRSS/FreshRSS#8733), [#&#8203;8734](FreshRSS/FreshRSS#8734), [#&#8203;8735](FreshRSS/FreshRSS#8735),
    [#&#8203;8736](FreshRSS/FreshRSS#8736), [#&#8203;8737](FreshRSS/FreshRSS#8737), [#&#8203;8738](FreshRSS/FreshRSS#8738),
    [#&#8203;8739](FreshRSS/FreshRSS#8739), [#&#8203;8743](FreshRSS/FreshRSS#8743), [#&#8203;8746](FreshRSS/FreshRSS#8746),
    [#&#8203;8749](FreshRSS/FreshRSS#8749), [#&#8203;8761](FreshRSS/FreshRSS#8761), [#&#8203;8781](FreshRSS/FreshRSS#8781),
    [#&#8203;8784](FreshRSS/FreshRSS#8784), [#&#8203;8785](FreshRSS/FreshRSS#8785)
  - Various UI and style improvements: [#&#8203;8537](FreshRSS/FreshRSS#8537), [#&#8203;8538](FreshRSS/FreshRSS#8538),
    [#&#8203;8541](FreshRSS/FreshRSS#8541), [#&#8203;8624](FreshRSS/FreshRSS#8624), [#&#8203;8731](FreshRSS/FreshRSS#8731),
    [#&#8203;8774](FreshRSS/FreshRSS#8774)
- Deployment
  - Also push Docker images to [GitHub registry](https://github.com/FreshRSS/FreshRSS/pkgs/container/freshrss) [#&#8203;8669](FreshRSS/FreshRSS#8669)
  - Improve support of PHP 8.5+ using `Pdo\Mysql` [#&#8203;8526](FreshRSS/FreshRSS#8526)
  - Add support for Podman in Makefile [#&#8203;8456](FreshRSS/FreshRSS#8456)
  - Re-add database status in installation check [#&#8203;8510](FreshRSS/FreshRSS#8510)
  - Docker / CLI: Allow chown/chmod to fail with warning [#&#8203;8635](FreshRSS/FreshRSS#8635)
- Extensions
  - New Webhook extension for automated RSS notifications [Extensions#456](FreshRSS/Extensions#456)
  - New LLM Classification extension to automatically tag incoming articles based on a prompt sent to an LLM [Extensions#458](FreshRSS/Extensions#458)
  - New extension methods to get typed configuration values [#&#8203;8696](FreshRSS/FreshRSS#8696)
  - New hook: `Minz_HookType::ActionExecute` [#&#8203;8599](FreshRSS/FreshRSS#8599), [#&#8203;8603](FreshRSS/FreshRSS#8603)
  - New hook to modify the list of feeds to actualize [#&#8203;8655](FreshRSS/FreshRSS#8655), [#&#8203;8675](FreshRSS/FreshRSS#8675)
  - Allow passing `Minz_HookType` as hook name in `registerHook()` [#&#8203;8600](FreshRSS/FreshRSS#8600)
  - Return more info and status from `httpGet()` [#&#8203;8700](FreshRSS/FreshRSS#8700)
  - Make `httpGet()` cache nullable [#&#8203;8705](FreshRSS/FreshRSS#8705)
  - Allow extensions’ configuration UI to use `select-input-changer` JavaScript helper [#&#8203;8721](FreshRSS/FreshRSS#8721)
- SimplePie
  - Bump upstream [#&#8203;8628](FreshRSS/FreshRSS#8628), [simplepie#71](FreshRSS/simplepie#71)
  - New function `get_icon_url()` for feed favicon [simplepie#974](simplepie/simplepie#974)
  - Fix Undefined array key in `get_thumbnail()` [#&#8203;8634](FreshRSS/FreshRSS#8634), [simplepie#970](simplepie/simplepie#970)
  - Fix int types for enclosures [#&#8203;8702](FreshRSS/FreshRSS#8702), [simplepie#975](simplepie/simplepie#975)
  - Fix HTTPS headers given to SimplePie, e.g. for some HTTP/2 cases [#&#8203;8742](FreshRSS/FreshRSS#8742)
- CLI
  - New `cli/purge.php` to apply purge policy [#&#8203;8740](FreshRSS/FreshRSS#8740)
- I18n
  - CLI validate language directory names [#&#8203;8767](FreshRSS/FreshRSS#8767)
  - New functions to handle plural, and new `timeago()` [#&#8203;8670](FreshRSS/FreshRSS#8670)
  - Improve German [#&#8203;8491](FreshRSS/FreshRSS#8491), [#&#8203;8557](FreshRSS/FreshRSS#8557), [#&#8203;8689](FreshRSS/FreshRSS#8689),
    [#&#8203;8704](FreshRSS/FreshRSS#8704)
  - Improve Italian [#&#8203;8517](FreshRSS/FreshRSS#8517), [#&#8203;8519](FreshRSS/FreshRSS#8519), [#&#8203;8554](FreshRSS/FreshRSS#8554),
    [#&#8203;8555](FreshRSS/FreshRSS#8555), [#&#8203;8556](FreshRSS/FreshRSS#8556), [#&#8203;8566](FreshRSS/FreshRSS#8566)
  - Improve Latvian [#&#8203;6553](FreshRSS/FreshRSS#6553)
  - Improve Polish [#&#8203;8536](FreshRSS/FreshRSS#8536)
  - Improve Portuguese [#&#8203;8649](FreshRSS/FreshRSS#8649)
  - Improve Simplified Chinese [#&#8203;8474](FreshRSS/FreshRSS#8474), [#&#8203;8475](FreshRSS/FreshRSS#8475), [#&#8203;8476](FreshRSS/FreshRSS#8476)
  - Improve Traditional Chinese [#&#8203;8709](FreshRSS/FreshRSS#8709), [#&#8203;8716](FreshRSS/FreshRSS#8716), [#&#8203;8723](FreshRSS/FreshRSS#8723),
    [#&#8203;8730](FreshRSS/FreshRSS#8730), [#&#8203;8748](FreshRSS/FreshRSS#8748)
  - Improve Spanish [#&#8203;8572](FreshRSS/FreshRSS#8572)
- Misc.
  - Initial conventions for AI agents and humans: `AGENTS.md`, `SKILLS.md`, `instructions.md` [#&#8203;8478](FreshRSS/FreshRSS#8478)
  - Update to CSSXPath 1.5.0 [#&#8203;8642](FreshRSS/FreshRSS#8642)
  - Update to PHPMailer 7.0.2 [#&#8203;8483](FreshRSS/FreshRSS#8483)
  - SQL improve PHP syntax uniformity [#&#8203;8604](FreshRSS/FreshRSS#8604)
  - Trim SQL whitespace before parenthesis [#&#8203;8522](FreshRSS/FreshRSS#8522)
  - Improve PHP code [#&#8203;8627](FreshRSS/FreshRSS#8627), [#&#8203;8644](FreshRSS/FreshRSS#8644), [#&#8203;8753](FreshRSS/FreshRSS#8753),
    [#&#8203;8697](FreshRSS/FreshRSS#8697)
  - Add dev legacy rules PHPCS 3 [#&#8203;8645](FreshRSS/FreshRSS#8645)
  - Update dev dependencies [#&#8203;8469](FreshRSS/FreshRSS#8469), [#&#8203;8480](FreshRSS/FreshRSS#8480), [#&#8203;8499](FreshRSS/FreshRSS#8499),
    [#&#8203;8545](FreshRSS/FreshRSS#8545), [#&#8203;8546](FreshRSS/FreshRSS#8546), [#&#8203;8547](FreshRSS/FreshRSS#8547),
    [#&#8203;8617](FreshRSS/FreshRSS#8617), [#&#8203;8638](FreshRSS/FreshRSS#8638), [#&#8203;8660](FreshRSS/FreshRSS#8660),
    [#&#8203;8661](FreshRSS/FreshRSS#8661), [#&#8203;8662](FreshRSS/FreshRSS#8662), [#&#8203;8663](FreshRSS/FreshRSS#8663),
    [#&#8203;8664](FreshRSS/FreshRSS#8664), [#&#8203;8665](FreshRSS/FreshRSS#8665), [#&#8203;8666](FreshRSS/FreshRSS#8666),
    [#&#8203;8667](FreshRSS/FreshRSS#8667), [#&#8203;8668](FreshRSS/FreshRSS#8668), [#&#8203;8685](FreshRSS/FreshRSS#8685),
    [#&#8203;8752](FreshRSS/FreshRSS#8752), [#&#8203;8754](FreshRSS/FreshRSS#8754), [#&#8203;8755](FreshRSS/FreshRSS#8755),
    [#&#8203;8756](FreshRSS/FreshRSS#8756), [#&#8203;8757](FreshRSS/FreshRSS#8757), [#&#8203;8758](FreshRSS/FreshRSS#8758),
    [#&#8203;8772](FreshRSS/FreshRSS#8772), [#&#8203;8798](FreshRSS/FreshRSS#8798)

</details>

---

### Configuration

📅 **Schedule**: (in timezone America/New_York)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNjAuNyIsInVwZGF0ZWRJblZlciI6IjQzLjE2MC43IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9jb250YWluZXIiLCJ0eXBlL21pbm9yIl19-->

Co-authored-by: todd <tpunderson@greyrock.io>
Reviewed-on: https://git.greyrock.io/greyrock-labs/home-ops/pulls/20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature Request] Share to Webhook

2 participants