Skip to main content

Overview

A feed follows one account of another service and posts a card in a channel each time it publishes something. It works for YouTube, Twitch and Kick (videos and live streams), Spotify, Deezer and Apple Music (new releases and podcast episodes), Bluesky, Mastodon, Reddit, Tumblr, Pinterest and Letterboxd, GitHub, npm, PyPI, Modrinth, Steam and AniList, any website with an RSS feed, and for things that need no account: the free games of Epic Games, the Pokémon, an article of Wikipedia and the puzzle of Chess.com. We are working hard to bring more services every week: tell us which one you miss in the feedback page. Everything starts from now on: when you follow an account, what it already published is not posted, only what comes next. Each notice is posted once, even if Petto restarts.
A Twitch card in the streams channel that pings Stream pings, with the title of the stream, the picture, the time and a Watch live button

In Discord: the live notice of a followed Twitch channel, with the role it pings.

Commands

You need the Manage Server permission.
liam follows PettoLand on Twitch in #streams and Petto Land on YouTube in #announcements, and Petto answers with the number of each feed

In Discord: a Twitch and a YouTube account followed.

liam adds pokemon 30m in #general and Petto confirms the feed of the Pokédex

In Discord: the Pokémon every 30 minutes.

kira tries a YouTube name that does not exist and Petto cannot find it, then PettoLand on Twitch and Petto says it is already followed there

In Discord: an account that is not found, and one already followed in that channel.

chu lists the five feeds with their number, platform, account, channel and state, r/aww paused because Petto cannot post there

In Discord: the feeds of the server and how each one is doing.

liam removes feed 3 and Petto stops following PettoBot/petto-bot, then feed 9 does not exist

In Discord: a feed removed, and a number that is not a feed.

liam tests feed 1 and Petto says a test notice was posted in #streams

In Discord: the answer to a test.

liam pauses feed 2 and Petto confirms it

In Discord: a feed paused.

liam resumes feed 5, r/aww, and Petto says it is on again

In Discord: a paused feed on again.

liam writes {feed.author} just posted: {feed.title} for feed 2 and Petto saves them, then clear removes them

In Discord: the words above each notice, then removed.

liam makes feed 1 mention Stream pings and Petto confirms it, then feed 3 with no role mentions nobody

In Discord: a role mentioned with each notice, and no one.

!feeds, !notify and !notifications do the same as !feed, and !feed alone shows the list. It is a prefix command only. !feed test posts the test notice in the channel of the feed, marked as a test:
Petto's test notice: the line Test notice, this is how it will look, over the card of the newest release of PettoBot/petto-bot

In Discord: the test notice of the GitHub feed in #announcements.

The default line

When you wrote no words of your own with !feed message, a feed of a creator, a channel or a project followed by name starts the notice with a short line, like Hey everyone! **Name** just uploaded a new video. These platforms send it: YouTube, Twitch, Kick, Bluesky, Modrinth, Mastodon, Tumblr, Letterboxd, GitHub, npm, PyPI, Steam and the music feeds (Spotify, Deezer and Apple Music). The rest send only the card, with no line above it: Reddit, Pinterest, RSS, AniList, Pokémon, Wikipedia, Chess.com, Epic Games, the animal feeds, the pictures feed and the random music feed. A feed with its own words keeps them exactly as you wrote them, and !feed message <id> clear goes back to the default line (or to no line, on the platforms that send none).

What each platform posts

A red card with the title of the video as a link, its description, the thumbnail and a Watch on YouTube button

In Discord: a new video of Petto Land, pinging Stream pings.

A red live card with the title, the viewers, the picture and a Watch live button

In Discord: a live stream of the channel.

A green Kick card with the title of the stream, the category and viewers, the Kick live picture and a Watch live button

In Discord: a live stream of Kick, with Kick's picture until the real one exists.

A green card headed by the cover of Night Drive next to a panel with the title and the artist, and a Listen on Spotify button

In Discord: a new album, headed by its cover card.

A purple card headed by the cover of Summer Tapes, with a Listen on Deezer button

In Discord: a new single.

A red card headed by the cover of Night Drive, with a Listen on Apple Music button

In Discord: a new album.

A blue card with the post, its picture and a Read on Bluesky button

In Discord: a new post with its picture.

A purple card with the post of @pettoland@mastodon.social, its picture and a Read on Mastodon button

In Discord: a new public post.

An orange card with a post of r/aww, its picture and a Read on Reddit button

In Discord: a new post of a subreddit.

A dark blue card with the post, its picture and a Read on Tumblr button

In Discord: a new post of a blog.

A red card with the pin Cozy purple desk setup, its picture and a See on Pinterest button

In Discord: a new pin.

A green card with the film, the review, the poster and a Read on Letterboxd button

In Discord: what someone watched and wrote.

A light blue card with the 1.4 update of Duck Valley, its header picture and a Read on Steam button

In Discord: an announcement of a game.

A grey card with v4.2.0 of PettoBot/petto-bot, its notes and a See on GitHub button

In Discord: a new release.

A green card with Cozy Ducks 2.1.0, its changes, Fabric 1.21 and a See on Modrinth button

In Discord: a new version of a mod.

A green card with the new mod Duck Furniture, marked New project

In Discord: a new project of the list of new mods.

A red card with discord.js 14.22.0, New version, and a See on npm button

In Discord: a new version of a package.

A blue card with episode 8 of Duck Quest, the cover and a See on AniList button

In Discord: a new episode.

An orange card with the October update of the Petto blog, its picture and a Read on RSS button

In Discord: a new post of a blog.

A white card with Duck Valley, Free until a date, its picture and a Get it free button

In Discord: a free game of the week, with the day it stops being free.

A grey card with the article Duck, its summary and picture, and a See more button

In Discord: the article of the day, in the language of the server.

A green card with the daily puzzle and its board

In Discord: the daily puzzle.

A yellow card with #0054 Psyduck, its Pokédex entry, its type, height and weight, and a See more button

In Discord: the Pokémon of the day.

A purple card with a picture of a duck and a See the photo button

In Discord: a picture of an animal, with nothing about where it comes from.

A purple card headed by the cover of Pink Clouds, A song for you, and a Listen button

In Discord: a song picked at random, with its cover card.

A pink card that says what it searched and Openverse, with the picture and a See the photo button

In Discord: a picture of what was searched.

Auto feeds: how often

The Pokémon, Wikipedia, Chess.com, the animals, the random music and the pictures have no account to follow: Petto posts on its own, at the pace you choose. Write it after the platform: !feed add pokemon 30m, or pick How often in the dashboard. 5 minutes is the shortest, so a channel is never flooded. Every server that picks the same pace gets the same notice at the same time, and the services behind them are asked once for each slot, not once for each server. You can change the pace of a feed later from the dashboard.

Live streams

  • A live notice goes out within a minute or two of the start (Twitch and Kick are asked every minute).
  • YouTube tells Petto by itself when a followed channel publishes (a video, a Short or a stream), so those notices go out within seconds and a channel does not have to be asked all the time. If that ever stops working, Petto goes back to looking at each channel every few minutes: nothing is lost.
  • Kick makes the picture of a stream a little after it starts. The notice does not wait for it: it goes out at once with a picture of Kick, and the same message is edited to show the real picture as soon as it exists.
  • Twitch does the same when the preview of the stream is not ready yet.
  • The notice says when the stream began, also for a stream that was scheduled days before.
  • When a stream ends, its card is edited to grey with two buttons: the channel and the replay.
The Twitch card of game night marked Stream ended, with the Open the channel and Watch the replay buttons

In Discord: a stream that ended: the card in grey with the channel and the replay.

A stream is never posted as a video. YouTube feeds need the bot to have its YouTube key, because without it a live stream cannot be told from a video. If YouTube cannot be asked at a given moment, nothing is posted and Petto tries again later. When a stream ends, its recording is not posted as a new video.
X, Instagram and TikTok are not available yet. They charge for access, or have no public way to follow an account, so they will be Premium only; the dashboard and the Premium page show them locked with the reason.

Limits

The limit is for each platform: So a Free server can follow 5 YouTube channels, and 5 Twitch channels, and 5 subreddits, and so on. The same account in two channels counts as two feeds.

The card

Each notice is a card in the color of the platform (Reddit and Pinterest are described below), with the title as a link, the picture of the account, a short description when there is one, the cover, and the kind of notice with the time. A Short is posted as its link by default, so Discord plays it; with Show the video player turned off it gets a card without the big picture. For YouTube videos and Shorts, Show the video player (in More options) posts the link instead of the card, so Discord plays the video right there; streams keep their card. A new release of music (Spotify, Deezer, Apple Music) is headed by the same picture as !deezer: the cover next to a panel with the title and the artist, with a button that opens it.
A red YouTube card with the title of the Short, New Short, Petto Land, the time and a Watch on YouTube button

In Discord: a YouTube Short with the video player off: the card has no big picture.

Petto's message with the words of the feed and the link of the video

In Discord: with Show the video player, the link instead of the card, so Discord plays the video.

Reddit is drawn picture first: a header with r/subreddit, the title as a link to the post, the picture, a small line with u/author and the date, and a Read on Reddit button. Pinterest has a header with the board, Pinterest and the owner, the picture of the pin big, and a See on Pinterest button. Only Reddit and Pinterest are drawn this way: every other feed (Bluesky, Mastodon, Tumblr, Letterboxd, RSS, Pokémon, Wikipedia, Chess.com, Epic Games, music, YouTube, Twitch and the rest) keeps its card with the icon of the platform and its button. Only the animal feeds and the pictures feed are just the picture in a clean card, with no icon, source or button. !animal (and /game cat, dog and fox) also answers with only the picture.

What the cards look like

A live stream of YouTube

Variables

The words from !feed message go above the card. You can use:

Dashboard

The Feeds group of the dashboard has a page for each platform. New feed opens a small window: you type the name of the account and the results appear with their pictures as you write (or paste a link), you pick one, and then choose what to post (videos, live streams, releases…), the channel, the words above the notice, the roles or @everyone to mention, and, under More options, the big picture, a button that opens the notice and words to include or skip. For the auto feeds it asks How often. The preview with the real card is one tap away. Saving, pausing and deleting update the list without reloading the page. Each feed can be tested, edited, paused or deleted, and a feed that fails shows why.
The Feeds page of Petto Land: a tile for each platform, the Premium platforms locked, the search and the six feeds of the server

Dashboard → Feeds → All feeds: every platform with what is followed, the locked ones, and the list of feeds.

The Twitch page with 1 of 5 accounts, the New feed button and PettoLand posting live streams in #streams, active

Dashboard → Feeds → Twitch: the accounts followed on Twitch, each with its test, edit, pause and delete buttons.

New feed of YouTube with petto typed and three channels found, what to post, the channel, the message, the ping and More options

Dashboard → Feeds → YouTube: the New feed window, with the results for what is typed.

New feed of Pokémon with How often on Once a day, the channel, the message and the ping

Dashboard → Feeds → Pokémon: an auto feed asks How often instead of an account.

New feed of Animals with How often and the animals to pick: cats, dogs, foxes, birds, ducks, capybaras and bunnies

Dashboard → Feeds → Animals: the animals feed also asks which animals.

New feed of Pictures with How often and the words typed in Tags

Dashboard → Feeds → Pictures: the pictures feed asks for one to four words.

Edit feed of PettoLand on Twitch with live streams, #streams, the words above the notice and the Stream pings role

Dashboard → Feeds → Twitch: a feed opened to edit.

The Preview of the feed: the ping of Stream pings and the words, then an example live card with its picture and Watch live button

Dashboard → Feeds → Twitch: the preview with the real card of the bot.

When something fails

  • A feed that cannot post five times in a row is turned off, and !feed list and the dashboard say why (Petto cannot see or write in the channel, the channel is gone, the account no longer exists). Fix it and resume it.
  • Petto needs to see the channel and send messages in it.
  • Some sites limit how often they can be asked. Petto spreads its questions and tries again later.