YouTube Feeds
Mirror a YouTube channel's new uploads, Shorts and livestreams into a channel, each type posted the way it actually plays best. Setup, styles, and the three reasons a feed can go quiet.
YouTube Feeds mirrors a YouTube channel's new uploads, Shorts and livestreams into a channel,
checking roughly every 5 minutes for free, with no API key needed. Changing anything needs
Manage Server and Server Premium, but reading is free: if your Server Premium has lapsed, you
can still see exactly what's configured and why a channel has gone quiet. The command is
,youtubefeed (also ,ytfeed or ,youtubefeeds), and the slash form is /feeds youtube.
Add a feed
Syntax
,youtubefeed add <#channel> <channel-or-handle> [message]
Example
,youtubefeed add #videos @mkbhd
Give it the channel and the YouTube channel. You can give an @handle, a full channel URL, or a
UC… channel id directly. A server can hold up to 5 feeds. If your server is already at the
limit when you try to add another, remove one first; a server that was already over the limit
before it dropped keeps every feed it has.
A handle lookup is a guess, a URL isn't
Looking up a bare @handle means scraping YouTube's own channel page for its id, and every so
often that lands on the wrong channel. Pasting the channel's URL, or its UC… id if you already
have it, skips the guess entirely and is the reliable way to add a feed.
A new feed starts from now. It doesn't dump the channel's history into the channel, so the first thing you'll see posted is whatever that channel uploads after you added it, not anything older.
To remove a feed:
Syntax
,youtubefeed remove <#channel> <channel-or-handle>
Example
,youtubefeed remove #videos @mkbhd
Check what's configured, free of charge
Syntax
,youtubefeed list
Syntax
,youtubefeed info <#channel> <channel-or-handle>
Example
,youtubefeed info #videos @mkbhd
list shows every feed in the server; info shows one feed's full setup and current status.
Neither needs Server Premium; only Manage Server to view your own server's configuration. This
is deliberate: an admin whose channel has gone quiet because Server Premium lapsed is exactly the
person who most needs to see why, and paywalling the explanation would refuse them.
Three content types, each its own switch
A YouTube channel posts three different kinds of things, and each is its own on/off toggle, all on by default:
Syntax
,youtubefeed videos <#channel> <channel-or-handle> <on|off>
Example
,youtubefeed videos #videos @mkbhd off
Syntax
,youtubefeed shorts <#channel> <channel-or-handle> <on|off>
Example
,youtubefeed shorts #videos @mkbhd off
Syntax
,youtubefeed live <#channel> <channel-or-handle> <on|off>
Example
,youtubefeed live #videos @mkbhd off
videos is long-form uploads, shorts is Shorts, and live is livestreams. Each checks YouTube
independently, so turning one off genuinely stops that kind of post rather than filtering it out
after the fact.
You can't turn off the last one
A feed has to mirror something. Turning off the only content type you have left on is refused — turn a different one on first if you want to switch which kind of post this feed follows.
Why videos and livestreams post differently from Shorts
Syntax
,youtubefeed style <#channel> <channel-or-handle> <card|link|compact|default>
Example
,youtubefeed style #videos @mkbhd compact
| Style | What you get |
|---|---|
default | The smart choice below, per content type. This is what a new feed uses |
card | Righteous's own embed card for every post, regardless of type |
link | Just the link, which Discord unfurls into its own preview |
compact | A small embed for every post: the channel, the title, and a thumbnail |
default isn't a placeholder for "nothing chosen" — it's a real, deliberate behaviour you can come
back to. Under it, a long-form video and a livestream post as a plain link, because Discord
turns a YouTube link into its own playable player right there in the message, and a card on top of
that would only get in the way. A Short posts as Righteous's own embed card instead, with a
thumbnail, the title, and the view and like counts, because Shorts don't unfurl well on their own.
Explicit styles apply to every post type the same way
Once you set card, link or compact on a feed, that one style applies to videos, Shorts and
livestreams alike — there's no way to mix, say, a card for Shorts with a link for videos. default
is the only style that treats the three differently, which is exactly what it's for. Run
,youtubefeed style again with default to go back to it.
Give a feed a nickname
Syntax
,youtubefeed label <#channel> <channel-or-handle> <text|off>
Example
,youtubefeed label #videos @mkbhd Tech News
A short, display-only nickname, useful once a channel has more than one feed and the handle alone stops being a helpful label.
Add a trailing message, and a ping
Syntax
,youtubefeed message <#channel> <channel-or-handle> <text|off> [@role] [@everyone]
Example
,youtubefeed message #videos @mkbhd New upload: @Subscribers
This sets text that gets posted along with every one of that feed's posts, and it's also the only
place you configure a ping. Mentioning a role, or typing @everyone, needs Mention Everyone on
top of Manage Server and Server Premium. Running this command replaces the whole message and ping
setup at once: run it again with plain text and no mention, and any ping you had configured is
cleared along with it.
The mention has to actually be in the message text
Discord only sends a notification from a mention that is genuinely part of the message content, so
a role picked without a real @role mention typed into the text pings nobody: it renders, it
looks configured, and it never fires. Make sure the @role or @everyone is written directly
into the message you give this command.
Post under a different name and picture
A new feed's posts arrive as Righteous. You can change that per feed, so they post under the channel's own name and picture, or under a name you pick yourself.
Syntax
,youtubefeed webhook <#channel> <channel-or-handle> <off|source|custom|name|avatar> [value]
Example
,youtubefeed webhook #videos @mkbhd source
There are three modes:
| Mode | What posts look like |
|---|---|
off | Posts as Righteous itself |
source | Posts as the tracked channel, using its own display name and picture |
custom | Posts as a name and picture you set yourself |
For custom, set the two pieces separately:
Syntax
,youtubefeed webhook <#channel> <channel-or-handle> name <text>
Example
,youtubefeed webhook #videos @mkbhd name Tech News
Syntax
,youtubefeed webhook <#channel> <channel-or-handle> avatar <url>
Example
,youtubefeed webhook #videos @mkbhd avatar https://example.com/icon.png
You can also set a name, a picture, and a default mode once for the whole server, which every feed that has not chosen for itself will use. This is shared across GitHub, Twitter, Letterboxd and TikTok feeds too, so setting it from any of those commands sets it for all of them:
Syntax
,youtubefeed webhook default <name|avatar|mode> [value]
Example
,youtubefeed webhook default mode source
A feed that chose for itself always wins
Setting off on a feed means "never wear an identity" and is respected even when the server
default says otherwise. Only a feed that has never been given a mode of its own follows the server.
Turning it off stays free
Switching a feed back to off works even if your Server Premium has lapsed, and so does reading
what is configured. Only source and custom, and setting a name or picture, need Server Premium.
A feed whose Server Premium has lapsed keeps its setting and simply posts as Righteous until you
renew, and info shows you that is what is happening rather than showing a name your posts are
not actually wearing.
Righteous needs Manage Webhooks in the channel
Posting under a different name uses a webhook, which Righteous creates in the channel the first
time it needs one. Without the Manage Webhooks permission it cannot create one, so posts arrive as
Righteous instead. Nothing is ever lost this way: the post still goes out, and
,youtubefeed info tells you exactly why it is not wearing the identity you set. Grant the
permission and the next post picks it up on its own.
Why a feed goes quiet
A feed can stop posting for a few different reasons, and the fix is different for each one. None of them ever deletes a feed; they only pause it.
| Reason | Fix |
|---|---|
| You paused it yourself | ,youtubefeed resume |
| The channel or the connection to YouTube failed repeatedly | ,youtubefeed retry |
| Server Premium lapsed | Renew it. Nothing was deleted, and every feed picks back up once you're paying again |
Match the fix to the reason, or nothing changes
Resuming a feed that's actually broken doesn't fix it, and retrying a feed you paused on purpose
doesn't un-pause it: each of these touches only its own reason and leaves the others exactly as
they are. ,youtubefeed list and ,youtubefeed info tell you which reason currently applies to a
feed, including when more than one does at once.
Syntax
,youtubefeed pause <#channel> <channel-or-handle>
Example
,youtubefeed pause #videos @mkbhd
Syntax
,youtubefeed resume <#channel> <channel-or-handle>
Example
,youtubefeed resume #videos @mkbhd
Syntax
,youtubefeed retry <#channel> <channel-or-handle>
Example
,youtubefeed retry #videos @mkbhd
Test a feed without waiting for a real upload
Syntax
,youtubefeed test <#channel> <channel-or-handle>
Example
,youtubefeed test #videos @mkbhd
Posts the newest thing across all of that feed's enabled content types into the channel right now, rendered exactly the way a real post would be: a video or livestream previews as a link, a Short previews as a card, because the per-type style is part of what's being tested. Nothing about the feed is changed; it's a preview, not a real check-in. If the feed has a ping configured, this test does not fire it; the real feed will still ping normally on its next genuine upload.
Manage everything from one panel
Syntax
/feeds panel
Opens a private card for managing your GitHub, Twitter, Letterboxd and YouTube feeds, with a tab for
each. It updates in place as you navigate or act on a feed, and it stays visible only to whoever
opened it. This only opens over slash, on purpose, so it stays private: running ,youtubefeed panel on prefix points you at /feeds panel instead of posting anything. Opening the panel is
free; acting on a feed from it needs the same Manage Server and Server Premium the matching command
needs.
For what all the feed platforms have in common, GitHub's real-time webhook versus the others' polling, Server Premium and what happens when it lapses, and the reasons any feed goes quiet, see Feeds.
Honest limits
- No content-type filter beyond the three toggles.
videos/shorts/liveswitch a whole content type on or off; there's no per-topic or per-keyword filter on top of that. - This is separate from pasting a YouTube link into chat. That's a different setting entirely and doesn't interact with a feed you've configured here.
Common issues
A feed I added dumped a bunch of old uploads into the channel. It shouldn't: a new feed starts
from the moment you add it. If you're seeing old posts, check whether the feed shows as broken with
,youtubefeed info; a feed recovering from an outage
still only posts what's genuinely new.
I set up a ping and it never notifies anyone. Almost always this is the mention not actually
being in the message text; see Add a trailing message, and a ping
above. Re-run ,youtubefeed message with a real @role mention or @everyone typed into the text.
A feed stopped posting and I don't know why. Run ,youtubefeed info on it: it tells you which
of the reasons in Why a feed goes quiet applies, including when more than
one does.
,youtubefeed add refuses a channel. Either it isn't a valid channel id, handle or URL, or
YouTube doesn't have a channel there at all.
I can't turn off my last content type. A feed needs at least one of videos, shorts or
live switched on. Turn a different one on first, or remove the feed if you don't want it mirroring
anything.
I set a custom name or picture and posts still arrive as Righteous. Run ,youtubefeed info on
the feed. It tells you which of these it is: Righteous is missing Manage Webhooks in that channel,
the channel already holds Discord's maximum of 15 webhooks, Discord rejected the name you chose, or
your Server Premium has lapsed. The posts keep arriving throughout, so this is always a cosmetic
problem rather than a lost feed.
A video or livestream shows up as a link instead of a card. That's the intended default
behaviour, not a bug: see Why videos and livestreams post differently from Shorts.
Set an explicit card style if you want every post rendered the same way.