Mastodon: RSS Feed Titles Need to be More Expressive.

Created on 5 Aug 2018  ·  15Comments  ·  Source: tootsuite/mastodon

This was actually raised in #1438 . But, disappointingly, was closed without really understanding the heart of the issue. Followers should read that one first. 😒

The biggest change over all this was adding RSS to the mix. It seemingly did NOTHING to fix the issue.

We should not need to Reverse Engineer/workaround a F(L)OSS project, ala https://github.com/RSS-Bridge/rss-bridge to get a good feed that does not drop some non descript generic blurb where fed. Sad that we yearn for Twitter™ in that respect. With re-toots, replies, et cetera, when content is fed outside a Mastodon client, we get a bunch of generic feeds. And it is a waste of time clicking on things of no interest to us. Try https://mastodon.social/@TootBot.rss. It yields the same as https://mastodon.social/@TootBot.atom:

TootBot (@[email protected]) posted a new article: New status by TootBot ( https://mastodon.social/@TootBot/100495275495149029 )

And that is insufficient when a bit of description/summary is needed. There have been several issues related to this, including merged/pulls, and still this. 😒

suggestion

Most helpful comment

I posted the original. My user requirement still stands. atom.title is a useful summary of an atom item that is commonly used in the same way as an email subject line.

I don't know the detail of the underlying code that does federation. But if it really depends on atom.title containing text of the form "New status by $USERID" then there's something broken with the code design. atom.title should be purely descriptive text and not functional data. I actually find it really hard to believe that the activitypub spec calls for atom.title to be "New status by $USERID" and for that to be somehow used federation between activitypub instances. Can anyone point at a URL where this is stated?

All 15 comments

Historical and implementation notes:

7259 is where RSS feeds were added to the repo.

The title is set in RSS::AccountSerializer: https://github.com/tootsuite/mastodon/blob/master/app/serializers/rss/account_serializer.rb#L22 . There's duplication in RSS::TagSerializer to watch for too.

It's set from Status#title: https://github.com/tootsuite/mastodon/blob/master/app/models/status.rb#L146-L152 . Be mindful when changing that; it's also used for the Atom feed that communicates between instances. It's probably safer to construct a title specific to the RSS feed (#human_title or a one-off in the serializers).

Media RSS allows for a much more detailed description of the content to be delivered to the subscriber than the RSS standard.
https://en.wikipedia.org/wiki/Media_RSS

I think many of us who are happy to have a non-birdsite platform feed content elsewhere, would much rather know a basic bit about the status, if it interests us, before clicking. Just a basic blurb, not necessarily even MRSS.

The state of this repulses people from Mastoson instead of drawing them. Think about it… I put a Mastodon feed, and birdsite feed someplace. The birdsite fed item describes itself, and the Mastodon item states that some microblogger posted something in their microblog. If the birdsite item interests thrm, most people will click that, not some mystery link.

I posted the original. My user requirement still stands. atom.title is a useful summary of an atom item that is commonly used in the same way as an email subject line.

I don't know the detail of the underlying code that does federation. But if it really depends on atom.title containing text of the form "New status by $USERID" then there's something broken with the code design. atom.title should be purely descriptive text and not functional data. I actually find it really hard to believe that the activitypub spec calls for atom.title to be "New status by $USERID" and for that to be somehow used federation between activitypub instances. Can anyone point at a URL where this is stated?

My understanding of things is that there is a dedicated RSS feed for us to subscribe to (#7259), and any one who wants to improve it should submit a PR that changes the title. That line of code is here: https://github.com/tootsuite/mastodon/blob/master/app/serializers/rss/account_serializer.rb#L22

@jbond23 The reason an RSS reed was added was not because atom.title is required to be "New status by nightpool" but because the atom feed breaks most user-facing feed readers, full stop. So instead, we added a "user facing" RSS feed that was designed to be more friendly.

for that to be somehow used federation between activitypub instances

ActivityPub doesn't use atom at all. the atom feeds are required by OStatus.

My bad. Got my OStatus and ActivityPub mixed up.

As far as I can tell, atom.entry.title == rss.item.title and atom.entry.content == rss.item.description. And the only thing in the atom feed that might display badly in user-facing Atom feed readers is the atom.entry.title And the only reason that displays badly is because while it is "A human readable title for the entry." [W3C atom guidelines], the text is human-readable uselessness. Since rss.item.title is identical, I'd expect it to display equally badly in user-facing RSS feed readers.

I still don't believe that OStatus federation requires atom.entry.title to be this human useless. It should be human readable and not contain functional data. Any functional data should be in functional fields or extensions. I'd love it if somebody could explain why it has to be the way it is currently.

So, recommendations.
1) Make rss.item.title the first ~128 characters of the toot after stripping html.
2) At least consider doing exactly the same thing with atom.entry.title and understand exactly if and why this is not possible and would break OStatus federation.

I'd second that. Having human-readable RSS/Atom feeds is a feature Twitter has that Mastodon lacks imho.

Make rss.item.title the first ~128 characters of the toot after stripping html.

Maybe also include the whole HTML-rendered toot in a <content:encoded> tag using this RSS extension.

+1, this would help integrating users' timelines in other systems (i.e. public announcements in a project's IM room from the project's Mastodon user's toots).

Thank you for adding RSS and Atom feeds, it's a killer feature for me!

I don't know if all instances are the same, but on https://framapiaf.org/users/wikimediaitalia.rss all the items have the same title:

New status by wikimediaitalia

This means that a rather helpful service as Dlvrit (yeah, service as a software substitute, I know; but let me fix one thing at a time please!) only posts identical updates + a link + image if available to other feeds, e.g. https://twitter.com/sostienicultura/status/1046321889344274432

I think consumers got used to have overlong elements, so as a starter it would be fine to just copy the entire content of the update in it. Maybe a configuration setting could set a different length limit for it, so that people can decide to truncate it after, say, 256 characters even if they allow much longer content.</p> </div> <div class="card-footer"> <div class="row"> <div class="col"> <img src="https://avatars2.githubusercontent.com/u/901528?v=4&s=40" style="width:20px; height:20px;" class="mr-2 rounded float-left" alt="nemobis picture"> <strong>nemobis</strong> <span class="text-muted ml-1">on 30 Sep 2018</span> </div> <div class="col text-right"> 👍<span class="ml-2 mr-3">4</span> </div> </div> </div> </div> <div class="card card-custom mb-4"> <div class="card-body pt-3 pb-3 markdown"> <p>For those of us tracking this because of Matrix, one possible workaround might be to instead use <a rel="nofollow noopener" target="_blank" href="https://github.com/ma1uta/mxtoot">MXToot</a>.</p> </div> <div class="card-footer"> <div class="row"> <div class="col"> <img src="https://avatars3.githubusercontent.com/u/25986477?v=4&s=40" style="width:20px; height:20px;" class="mr-2 rounded float-left" alt="MilkManzJourDaddy picture"> <strong>MilkManzJourDaddy</strong> <span class="text-muted ml-1">on 10 Jan 2019</span> </div> <div class="col text-right"> </div> </div> </div> </div> <div class="mb-4"> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-3835332123789605" data-ad-slot="3731713875" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <div class="card card-custom mb-4"> <div class="card-body pt-3 pb-3 markdown"> <p>The RSS feed is not logging boosted toots, but the Atom feed is. </p> <p>The reason that is important is that one special use case for me is to monitor the RSS feed for curated content. One way to do that is to have a Mastodon account used only for curation, and toots that should be curated to a content aggregator could be boosted. Boosted toots would be culled from the RSS feed and placed into the content aggregator's RSS feed. If we could boost toots with a comment, and the comment was logged, the content aggregator could use the comment as a custom Title value in the content aggregator's RSS feed.</p> </div> <div class="card-footer"> <div class="row"> <div class="col"> <img src="https://avatars0.githubusercontent.com/u/11214905?v=4&s=40" style="width:20px; height:20px;" class="mr-2 rounded float-left" alt="crockwave picture"> <strong>crockwave</strong> <span class="text-muted ml-1">on 5 Feb 2019</span> </div> <div class="col text-right"> </div> </div> </div> </div> <div class="card card-custom mb-4"> <div class="card-body pt-3 pb-3 markdown"> <p>I'm supporting the request, good idea</p> </div> <div class="card-footer"> <div class="row"> <div class="col"> <img src="https://avatars1.githubusercontent.com/u/41069802?v=4&s=40" style="width:20px; height:20px;" class="mr-2 rounded float-left" alt="gerhardbeck picture"> <strong>gerhardbeck</strong> <span class="text-muted ml-1">on 21 Dec 2019</span> </div> <div class="col text-right"> 👍<span class="ml-2 mr-3">2</span> </div> </div> </div> </div> <div class="card card-custom mb-4"> <div class="card-body pt-3 pb-3 markdown"> <p>Would a patch be welcome for improving the RSS feed items as described?</p> </div> <div class="card-footer"> <div class="row"> <div class="col"> <img src="https://avatars3.githubusercontent.com/u/156867?v=4&s=40" style="width:20px; height:20px;" class="mr-2 rounded float-left" alt="Krinkle picture"> <strong>Krinkle</strong> <span class="text-muted ml-1">on 14 Oct 2020</span> </div> <div class="col text-right"> 👍<span class="ml-2 mr-3">2</span> </div> </div> </div> </div> <div class="card card-custom mb-4"> <div class="card-body pt-3 pb-3 markdown"> <blockquote> <p>Would a patch be welcome for improving the RSS feed items as described?</p> </blockquote> <p>For me: yes!</p> </div> <div class="card-footer"> <div class="row"> <div class="col"> <img src="https://avatars1.githubusercontent.com/u/41069802?v=4&s=40" style="width:20px; height:20px;" class="mr-2 rounded float-left" alt="gerhardbeck picture"> <strong>gerhardbeck</strong> <span class="text-muted ml-1">on 14 Oct 2020</span> </div> <div class="col text-right"> </div> </div> </div> </div> <div class="card card-custom mb-4"> <div class="card-body pt-3 pb-3 markdown"> <p>It's unfortunate that with some F(L)OSS projects, what seems to make the most sense <em>somehow</em> becomes the most difficult to {re-}implement. Sadly with this issue, assuming the content is {also} on Twitter™️, it's just easier to use Nitter { <a rel="nofollow noopener" target="_blank" href="https://github.com/zedeus/nitter/">zedeus/nitter</a> }. At least one server <em>instance</em> is in a non 14-Eyes nation state {see: <a rel="nofollow noopener" target="_blank" href="https://github.com/zedeus/nitter/wiki/Instances">Instances</a> }. And the about page, i.e. <a rel="nofollow noopener" target="_blank" href="https://nitter.net/about">as seen on Nitter.net</a>, declares that, <strong>among other goals that seem to align with F(L)OSS philosophy</strong>, RSS is strong with the Nitter. It's just sad to see <em>other</em> F(L)OSS projects <strong>I HAVE SUPPORTED</strong>, seem to not care about letting big conglomerates win by Centralization, i.e. letting them kill RSS/Atom and implement their Centralized form of Push. IMO, F(L)OSS projects should continue to support robust RSS/Atom Feeds, at least until F(L)OSS <strong>DECENTRALIZED</strong> Push becomes commonplace. Sad. </p> </div> <div class="card-footer"> <div class="row"> <div class="col"> <img src="https://avatars3.githubusercontent.com/u/25986477?v=4&s=40" style="width:20px; height:20px;" class="mr-2 rounded float-left" alt="MilkManzJourDaddy picture"> <strong>MilkManzJourDaddy</strong> <span class="text-muted ml-1">on 16 Oct 2020</span> </div> <div class="col text-right"> </div> </div> </div> </div> </div> <div class="col-12"> <div class="card card-custom mb-4"> <div class="card-body pt-3 pb-3 markdown text-center helpful"> <div class="title">Was this page helpful?</div> <div class="mt-1" onMouseLeave="rating(347665088, 0);"> <i class="fas fa-star inactive" id="star-1" onMouseOver="rating(347665088, 1);" onclick="rate(347665088, 1);"></i> <i class="fas fa-star inactive" id="star-2" onMouseOver="rating(347665088, 2);" onclick="rate(347665088, 2);"></i> <i class="fas fa-star inactive" id="star-3" onMouseOver="rating(347665088, 3);" onclick="rate(347665088, 3);"></i> <i class="fas fa-star inactive" id="star-4" onMouseOver="rating(347665088, 4);" onclick="rate(347665088, 4);"></i> <i class="fas fa-star inactive" id="star-5" onMouseOver="rating(347665088, 5);" onclick="rate(347665088, 5);"></i> </div> <div class="description text-small"><span id="rating-val">0</span> / 5 - <span id="rating-count">0</span> ratings</div> </div> </div> <div class="mb-4"> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-3835332123789605" data-ad-slot="3452512275" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> </div> </div> </div> <div class="col-12 col-lg-4"> <div id="ph-above-related"></div> <div class="card card-custom issue-box"> <div class="card-body pt-3 pb-5"> <h2 class="mb-4">Related issues</h2> <div> <strong> <a href="/mastodon/255085401/end-to-end-encryption-with-mailvelope">end-to-end encryption with Mailvelope</a> </strong> </div> <div class="text-muted text-small mt-2"> <img src="https://avatars2.githubusercontent.com/u/213000?v=4&s=40" style="width:20px; height:20px;" class="mr-2 rounded float-left" alt="mdik picture"> <strong class="pr-1" dir="ltr">mdik</strong>  ·  <span class="px-1" dir="ltr">46</span><span>Comments</span> </div> <hr /> <div> <strong> <a href="/mastodon/220021855/french-translation-change-pouet-to-another-word">French translation : change "Pouet" to another word ?</a> </strong> </div> <div class="text-muted text-small mt-2"> <img src="https://avatars0.githubusercontent.com/u/578154?v=4&s=40" style="width:20px; height:20px;" class="mr-2 rounded float-left" alt="0gust1 picture"> <strong class="pr-1" dir="ltr">0gust1</strong>  ·  <span class="px-1" dir="ltr">59</span><span>Comments</span> </div> <hr /> <div> <strong> <a href="/mastodon/187509106/support-groups">Support groups</a> </strong> </div> <div class="text-muted text-small mt-2"> <img src="https://avatars2.githubusercontent.com/u/2453866?v=4&s=40" style="width:20px; height:20px;" class="mr-2 rounded float-left" alt="cphuntington97 picture"> <strong class="pr-1" dir="ltr">cphuntington97</strong>  ·  <span class="px-1" dir="ltr">63</span><span>Comments</span> </div> <hr /> <div> <strong> <a href="/mastodon/221019555/activitypub-support">ActivityPub support</a> </strong> </div> <div class="text-muted text-small mt-2"> <img src="https://avatars0.githubusercontent.com/u/911174?v=4&s=40" style="width:20px; height:20px;" class="mr-2 rounded float-left" alt="strugee picture"> <strong class="pr-1" dir="ltr">strugee</strong>  ·  <span class="px-1" dir="ltr">76</span><span>Comments</span> </div> <hr /> <div> <strong> <a href="/mastodon/359565423/chain-blocking">Chain blocking</a> </strong> </div> <div class="text-muted text-small mt-2"> <img src="https://avatars2.githubusercontent.com/u/412651?v=4&s=40" style="width:20px; height:20px;" class="mr-2 rounded float-left" alt="Laurelai picture"> <strong class="pr-1" dir="ltr">Laurelai</strong>  ·  <span class="px-1" dir="ltr">57</span><span>Comments</span> </div> </div> </div> <div class="sticky-top pt-4"> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-3835332123789605" data-ad-slot="3919948963" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> <div id="ph-below-related-2" class="mt-4"> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-3835332123789605" data-ad-slot="3919948963" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> </div> </div> <div class="col-12 col-lg-4"> </div> </div> <div class="skyscraper-container"> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-3835332123789605" data-ad-slot="7879185320" data-ad-format="vertical" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> </div> <div class="mt-5 spacer"></div> <footer class="mt-5 pb-2 py-4 text-center mt-auto"> <div class="container"> <a class="navbar-brand logo mr-5" href="/"> <img src="/assets/img/logo.svg" width="40" height="40" alt="bleepingcoder logo"> bleeping<strong>coder</strong> </a> <div class="mt-4"> bleepingcoder.com uses publicly licensed GitHub information to provide developers around the world with solutions to their problems. We are not affiliated with GitHub, Inc. or with any developers who use GitHub for their projects. We do not host any of the videos or images on our servers. All rights belong to their respective owners. </div> <div> Source for this page: <a href="https://www.github.com/tootsuite/mastodon/issues/8125" rel="nofollow noreferrer" target="_blank">Source</a> </div> </div> <hr class="mb-5 mt-5"> <div class="container"> <div class="row"> <div class="col-sm-4 col-lg mb-sm-0 mb-5"> <strong>Popular programming languages</strong> <ul class="list-unstyled mb-0 mt-2"> <li class="mb-2"> <a href="/python" dir="ltr">Python</a> </li> <li class="mb-2"> <a href="/javascript" dir="ltr">JavaScript</a> </li> <li class="mb-2"> <a href="/typescript" dir="ltr">TypeScript</a> </li> <li class="mb-2"> <a href="/cpp" dir="ltr">C++</a> </li> <li class="mb-2"> <a href="/csharp" dir="ltr">C#</a> </li> </ul> </div> <div class="col-sm-4 col-lg mb-sm-0 mb-5"> <strong>Popular GitHub projects</strong> <ul class="list-unstyled mb-0 mt-2"> <li class="mb-2"> <a href="/microsoft/vscode" dir="ltr">vscode</a> </li> <li class="mb-2"> <a href="/numpy/numpy" dir="ltr">numpy</a> </li> <li class="mb-2"> <a href="/ant-design/ant-design" dir="ltr">ant-design</a> </li> <li class="mb-2"> <a href="/mui-org/material-ui" dir="ltr">material-ui</a> </li> <li class="mb-2"> <a href="/vercel/next-js" dir="ltr">next.js</a> </li> </ul> </div> <div class="col-sm-4 col-lg mb-0"> <strong>More GitHub projects</strong> <ul class="list-unstyled mb-0 mt-2"> <li class="mb-2"> <a href="/rust-lang/rust" dir="ltr">rust</a> </li> <li class="mb-2"> <a href="/moment/moment" dir="ltr">moment</a> </li> <li class="mb-2"> <a href="/yarnpkg/yarn" dir="ltr">yarn</a> </li> <li class="mb-2"> <a href="/mozilla/pdf-js" dir="ltr">pdf.js</a> </li> <li class="mb-2"> <a href="/JuliaLang/julia" dir="ltr">julia</a> </li> </ul> </div> </div> </div> <hr class="mb-5 mt-5"> <div class="container text-muted"> © 2025 bleepingcoder.com - <a href="/bleeps" rel="nofollow">Contact</a><br /> By using our site, you acknowledge that you have read and understand our <a href="/cookies" rel="nofollow">Cookie Policy</a> and <a href="/privacy" rel="nofollow">Privacy Policy</a>. </div> </footer> <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha256-4+XzXVhsDmqanXGHaHvgh1gMQKX40OUvDEBTu8JcmNs=" crossorigin="anonymous"></script> <script async src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script> <!--<script defer type="text/javascript" src="//s7.addthis.com/js/300/addthis_widget.js#pubid=ra-5fb2db66acbd74b2"></script>--> <script type="text/javascript" src="/assets/js/main.js"></script> <script src="https://cdn.jsdelivr.net/gh/google/code-prettify@master/loader/run_prettify.js"></script></body> </html>