MultiNotify
Monitor subreddits and RSS/Atom feeds for new content and automatically send them to Discord, Mattermost, Slack, or other services via webhook or directly to specific Discord channels. Supports Discord embeds, DM notifications, slash commands, automatic .env updates, and is fully containerized.
Install / Use
/learn @ethanocurtis/MultiNotifyREADME
MultiNotify (v1.7 Beta)
Monitor subreddits and RSS/Atom feeds for new content (optionally filtered by flair or separate keyword lists) and automatically send them to Discord, Mattermost, Slack, or other services via webhook or directly to specific Discord channels. Supports Discord embeds, DM notifications, slash commands, automatic .env updates, and is fully containerized for easy deployment.
⏰ Timezone: All user-facing times (digests, quiet hours, timestamps shown in embeds) default to America/Chicago, and can be changed by an admin via
/settimezone. A full list of TZ names can be found here.
Table of Contents
- Features
- How It Works
- Global vs Personal Settings
- Slash Commands
- Webhook Behavior
- How to Use
- Notes
- Updating the Bot
- Support
- License
Features
- Monitor any subreddit for new posts (global or personal).
- Monitor any number of RSS/Atom feeds (global or personal).
- Separate keyword filtering for Reddit and RSS (whole word, case-insensitive).
- Filter Reddit posts by one or multiple flairs (case-sensitive), or watch all.
- Personal flair filtering per user that can override global flair filters.
- Deliver to Discord webhooks (embeds), Discord channels (embeds), Discord threads, DMs (embeds), and non-Discord webhooks (plain text).
- Live configuration via slash commands with .env auto-persist (automatically saved when running as a Discord bot).
- Quiet hours (personal) and per-user digests (daily/weekly).
- Quarter-hour time suggestions for digest time and day dropdown for weekly digests.
- Per-destination “seen” tracking to prevent duplicate spam while allowing multiple users to follow the same sources independently.
- Watched Reddit users: Admin-managed global list and per-user personal lists.
- Watch bypass toggles (per user) to ignore subreddit, flair, and/or keyword filters.
- Configurable timezone via
/settimezone(IANA timezones supported). - Threaded posting for Discord channels.
- Keyword-based routing to specific Discord channels (global/admin only).
- Flair-based routing for global Reddit posts.
- Diagnostic commands to explain why content was delivered or skipped.
- Fully containerized; easy to run with Docker/Compose.
⚙️ All modules (webhooks, channel sends, thread posting, flair filtering, keyword filtering, DMs) can be enabled or disabled independently for both global and personal settings.
How It Works
MultiNotify periodically checks the configured sources and delivers new content based on both global and personal settings:
-
Fetching
- Reddit (subreddits): Monitors the global subreddit (if set) and any personal subreddits set by users.
- Reddit (authors): New: Fetches recent posts from the union of global watched users and all users’ personal watched users.
- RSS/Atom: Monitors all global feeds plus any personal feeds.
-
Filtering
- Posts and feed items can be filtered by flair (Reddit only) and/or keywords (both Reddit and RSS).
- Filters can be set globally or personally. Personal flair filters override global flair filters for that user.
- Watched-user alerts: Per-user toggles decide whether to bypass subreddit, flair, and/or keyword filters.
-
Routing & Delivery
- Global settings deliver to webhooks, global channels, and the global DM list.
- Personal settings deliver to the user’s DM only.
- Watched-user posts are only delivered to users who:
- personally watch that author or
- are covered by the global watch list (admin)
…and then pass that user’s chosen bypass rules & quiet hours/digest.
- Items may be routed to specific Discord channels based on:
- Global keyword routes
- Global Reddit flair routes
- If no route matches, items follow the default delivery path.
- Delivery targets may include Discord channels, threads, DMs, or webhooks.
- When thread mode is enabled, messages are posted into reusable threads instead of directly into channels.
- Seen Handling
- Global seen list: Shared for global deliveries (webhooks/channels/global DMs).
- Per-user seen lists: Each user has their own list for personal deliveries.
Global vs Personal Settings
Global settings are managed by admins listed in ADMIN_USER_IDS and apply by default.
Personal settings can be set by any user and override the global settings for that user.
Priority: Personal settings override their global counterparts (e.g., personal subreddits/flairs/keywords take precedence).
If the global subreddit is cleared, global Reddit monitoring pauses. Personal subreddits still work.
Watched users
- Admins can define a global watched-users list (e.g., high-signal posters).
- Any user can define their own personal watched-users list.
- A watched-user post is delivered to a user if the author is in that user’s personal list or in the admin/global list—then the user’s watch bypass toggles decide whether subreddit/flair/keyword filters are applied.
Slash Commands
Permissions note:
- Global commands require the caller to be in
ADMIN_USER_IDS. - Personal commands can be used by any user.
- Do not include any brackets or less than/greaster than symbols in your commands
Global (Admin) Commands
/setsubreddit [name]— Set/clear the global subreddit to monitor./setinterval <seconds>— Polling interval for new items./setpostlimit <number>— How many Reddit posts to fetch each cycle./setflairs [flair1, flair2,...]— Global Reddit flair filter (case-sensitive). Blank clears (allow all)./setredditkeywords [kw1, kw2,...]— Global Reddit keywords. Blank clears (allow all)./setrsskeywords [kw1, kw2,...]— Global RSS keywords. Blank clears (allow all)./setkeywords [kw1, kw2,...]— Legacy: set the same keywords for both Reddit and RSS./setwebhook [url]— Set/clear webhook. Discord webhooks get embeds; others get plain text./enabledms <true/false>— Enable/disable global DM notifications./adddmuser <user_id>//removedmuser <user_id>— Manage global DM recipients./setrssfeeds— Manage global RSS feeds./addchannel <channel_id>//removechannel <channel_id>//listchannels— Manage Discord channels for global sends./adduserwatch <username>— Add a Reddit author to the global watch list./removeuserwatch <username>— Remove from the global watch list./listuserwatches— List all globally watched users./settimezone <IANA_tz>— Set the default timezone (e.g.,America/Chicago,Europe/London)./setthreadmode <true|false>— Enable or disable thread mode globally./setthreadttl <hours>— How long inactive threads are kept before cleanup./setglobalkeywordroute reddit|rss <keyword> <channel_id>— Route global items by keyword./setglobalflairroute <flair> <channel_id>— Route global Reddit posts by flair./status— Show current configuration (ephemeral)./whyglobal <url>— Explain global delivery behavior for a specific item./help— Show help (ephemeral)./reloadenv— Reload.env./whereenv— Show the path to.env./delglobalkeywordroute— admin only, removes global keyword routes./listglobalkeywordroutes— admin only, lists global keyword routes/delglobalflairroute— admin only, removes global flair routes./listglobalflairroutes— admin only, lists global flair routes.
Personal (Any User) Commands
/myprefs— Show your personal settings./setmydms <true/false>— Enable or disable your DMs./setmykeywords reddit:<csv> rss:<csv>— Set your Reddit/RSS keywords. Blank to clear./setmyflairs [flair1, flair2,...]— Set your Reddit flairs. Blank to allow all./mysubs add <subreddit> | remove <subreddit> | list— Manage your subreddits./myfeeds add <url> | remove <url> | list— Manage your RSS/Atom feeds./setchannel [channel_id]— Deprecated: command remains available but no longer changes delivery behavior to prevent spam attemps./setdigest mode:<off|daily|weekly> [time_chi:HH:MM] [day:mon..sun]—
Set your digest:modechooses off/daily/weekly.time_chihas quarter-hour suggestions (00:00, 00:15, …, 23:45) in the bot’s timezone.dayis a dropdown whenmode=weekly.- Default time if omitted: 09:00.
/setquiet <start HH:MM> <end HH:MM>— Set your quiet hours in the bot’s timezone (suppresses personal deliveries during that window)./quietoff— Disable your quiet hours./mywatch add <username>— Add a personal watched user (nou/needed)./mywatch remove <username>— Remove from your personal watched list./mywatch list— List your personal watched users.- `/mywatchprefs subs:<true|false> flairs:<true|false> keywords:<true|fals
