<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Discord on Christian Martínez De La Rosa</title><link>https://christt105.github.io/tags/discord/</link><description>Recent content in Discord on Christian Martínez De La Rosa</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Wed, 28 Oct 2026 00:00:00 +0100</lastBuildDate><atom:link href="https://christt105.github.io/tags/discord/index.xml" rel="self" type="application/rss+xml"/><item><title>InformadoRSS</title><link>https://christt105.github.io/projects/informadorss/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://christt105.github.io/projects/informadorss/</guid><enclosure url="https://christt105.github.io/projects/informadorss/cover.webp" length="34178" type="image/webp"/><description>&lt;p&gt;&lt;code&gt;InformadoRSS&lt;/code&gt; is a lightweight, self-hosted service that watches RSS and Atom feeds, filters their items per route and delivers them to Discord channels or &lt;a class="link" href="https://ntfy.sh/" target="_blank" rel="noopener"&#10; &gt;ntfy&lt;/a&gt;. It runs as a single container: a C# .NET 10 binary compiled with NativeAOT that serves a Vue 3 web UI and keeps everything in SQLite. It talks to Discord only through the bot REST API (no gateway, no bot commands). It is open source under the MIT license.&lt;/p&gt;&#10;&lt;p&gt;Key features:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Feeds and routes&lt;/strong&gt;: A feed is a URL; each feed has routes with a filter, one or more destinations (Discord or ntfy) and a message template.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Filter builder and template editor&lt;/strong&gt;: Build filters and edit messages from the web UI instead of writing them by hand.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Discord server and channel picker&lt;/strong&gt;: Choose destinations by name, and see which channels the bot cannot post in.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Alerts&lt;/strong&gt;: One alert when a feed or destination breaks and another when it recovers, through Discord or ntfy.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Daily backups&lt;/strong&gt;: Scheduled copies of the database to a folder, keeping the newest ones.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;MonitoRSS importer&lt;/strong&gt;: Import feeds and routes from a MonitoRSS export, with a dry run and a test channel to compare messages before switching.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Identity pattern for feeds that rewrite entries&lt;/strong&gt;: A regular expression over the description that is appended to the item id, so a status change in a MyAnimeList list counts as a new item.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Read how and why I built it in &lt;a class="link" href="https://christt105.github.io/blog/informadorss/" &gt;the blog post&lt;/a&gt;. The image is published to &lt;code&gt;ghcr.io/christt105/informadorss&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="The route editor: filter, message template and destination channel" class="gallery-image" data-flex-basis="252px" data-flex-grow="105" height="1994" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://christt105.github.io/projects/informadorss/web-route.webp" srcset="https://christt105.github.io/projects/informadorss/web-route_hu_a1005d249803043c.webp 800w, https://christt105.github.io/projects/informadorss/web-route_hu_458b51e51904d625.webp 1600w, https://christt105.github.io/projects/informadorss/web-route.webp 2100w" width="2100"&gt;&lt;/p&gt;&#10;</description></item><item><title>InformadoRSS: replacing MonitoRSS</title><link>https://christt105.github.io/blog/informadorss/</link><pubDate>Wed, 28 Oct 2026 00:00:00 +0100</pubDate><guid>https://christt105.github.io/blog/informadorss/</guid><enclosure url="https://christt105.github.io/blog/informadorss/cover.png" length="429533" type="image/png"/><description>&lt;p&gt;Hi again!&lt;/p&gt;&#10;&lt;p&gt;I have a couple of Discord servers where a bot announces new blog posts, YouTube videos, newsletters and my friends&amp;rsquo; anime and manga lists. For years that job was done by MonitoRSS. It works, but it&amp;rsquo;s nine containers (several Node services, Mongo, Postgres, RabbitMQ&amp;hellip;) and about 670 MB of RAM just to check every ten minutes whether a handful of feeds have something new. On a home server that already runs Jellyfin and half a dozen other things, that felt outrageous, and as you know, the world isn&amp;rsquo;t in a position to give RAM away. So I made my own.&lt;/p&gt;&#10;&lt;h2 id="what-it-is"&gt;What it is&#10;&lt;/h2&gt;&lt;p&gt;InformadoRSS is a self-hosted service that watches RSS and Atom feeds, filters their items and sends them to Discord channels. One container, one SQLite file and a web UI served by the same binary. It&amp;rsquo;s open source (MIT):&lt;/p&gt;&#10;&lt;a class="github-repo-card" href="https://github.com/christt105/InformadoRSS" target="_blank" rel="noopener"&gt;&#10; &lt;img src="https://avatars.githubusercontent.com/u/36189169?v=4" alt="christt105 avatar" class="repo-avatar"&gt;&#10; &lt;h3&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-github" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"&gt;&#10; &lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;&#10; &lt;path d="M9 19c-4.3 1.4 -4.3 -2.5 -6 -3m12 5v-3.5c0 -1 .1 -1.4 -.5 -2c2.8 -.3 5.5 -1.4 5.5 -6a4.6 4.6 0 0 0 -1.3 -3.2a4.2 4.2 0 0 0 -.1 -3.2s-1.1 -.3 -3.5 1.3a12.3 12.3 0 0 0 -6.2 0c-2.4 -1.6 -3.5 -1.3 -3.5 -1.3a4.2 4.2 0 0 0 -.1 3.2a4.6 4.6 0 0 0 -1.3 3.2c0 4.6 2.7 5.7 5.5 6c-.6 .6 -.6 1.2 -.5 2v3.5" /&gt;&#10;&lt;/svg&gt;&#10;&#10;&#10; christt105/InformadoRSS&lt;/h3&gt;&#10; &lt;p&gt;Lightweight single-container RSS/Atom to Discord forwarder&lt;/p&gt;&#10; &lt;div class="repo-stats"&gt;&#10; &lt;span&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" class="icon icon-tabler icons-tabler-filled icon-tabler-star"&gt;&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;&lt;path d="M8.243 7.34l-6.38 .925l-.113 .023a1 1 0 0 0 -.44 1.684l4.622 4.499l-1.09 6.355l-.013 .11a1 1 0 0 0 1.464 .944l5.706 -3l5.693 3l.1 .046a1 1 0 0 0 1.352 -1.1l-1.091 -6.355l4.624 -4.5l.078 -.085a1 1 0 0 0 -.633 -1.62l-6.38 -.926l-2.852 -5.78a1 1 0 0 0 -1.794 0l-2.853 5.78z" /&gt;&lt;/svg&gt; 0&lt;/span&gt;&#10; &lt;span&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-git-fork"&gt;&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;&lt;path d="M10 18a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" /&gt;&lt;path d="M5 6a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" /&gt;&lt;path d="M15 6a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" /&gt;&lt;path d="M7 8v2a2 2 0 0 0 2 2h6a2 2 0 0 0 2 -2v-2" /&gt;&lt;path d="M12 12l0 4" /&gt;&lt;/svg&gt; 0&lt;/span&gt;&#10; &lt;span&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-calendar-event"&gt;&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;&lt;path d="M4 7a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2l0 -12" /&gt;&lt;path d="M16 3l0 4" /&gt;&lt;path d="M8 3l0 4" /&gt;&lt;path d="M4 11l16 0" /&gt;&lt;path d="M8 15h2v2h-2l0 -2" /&gt;&lt;/svg&gt; 2026-10-24&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;p&gt;&lt;img alt="Pregonero, the bot, announcing a new post from the Godot blog" class="gallery-image" data-flex-basis="225px" data-flex-grow="94" height="1360" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://christt105.github.io/blog/informadorss/discord-godot.webp" srcset="https://christt105.github.io/blog/informadorss/discord-godot_hu_be3e79b240a22aeb.webp 800w, https://christt105.github.io/blog/informadorss/discord-godot.webp 1280w" width="1280"&gt;&lt;/p&gt;&#10;&lt;p&gt;The idea is simple:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;A &lt;strong&gt;feed&lt;/strong&gt; is a URL.&lt;/li&gt;&#10;&lt;li&gt;A &lt;strong&gt;route&lt;/strong&gt; says what to do with a feed: a filter, one or more destinations (a Discord channel or ntfy) and a message template.&lt;/li&gt;&#10;&lt;li&gt;The web UI has a filter builder, a template editor and a server and channel picker, so you don&amp;rsquo;t have to copy ids by hand.&lt;/li&gt;&#10;&lt;li&gt;The bot only talks to Discord through the REST API. No gateway, no commands, no webhooks. As simple as that.&lt;/li&gt;&#10;&lt;li&gt;When a feed or a destination breaks it sends me a single direct message on Discord, and another one when it recovers.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;img alt="The feed list, with the latest item of each feed and its status" class="gallery-image" data-flex-basis="204px" data-flex-grow="85" height="1690" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://christt105.github.io/blog/informadorss/web-feeds.webp" srcset="https://christt105.github.io/blog/informadorss/web-feeds_hu_5ee8d49264e2f793.webp 800w, https://christt105.github.io/blog/informadorss/web-feeds.webp 1440w" width="1440"&gt;&lt;/p&gt;&#10;&lt;p&gt;For example, the Media Tracker feed, where everything I finish watching or playing shows up, has four routes: on each server, films and series go to one channel and video games to another. When I finish Tetris, the item goes through all four routes and only reaches the channels that accept it:&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart LR&#10; I["New item&lt;br/&gt;in Media Tracker&lt;br/&gt;&lt;b&gt;Tetris&lt;/b&gt; · film"]&#10; I --&gt; R1["Route 3&lt;br/&gt;no video games"]&#10; I --&gt; R2["Route 4&lt;br/&gt;video games only"]&#10; I --&gt; R3["Route 1&lt;br/&gt;no video games"]&#10; I --&gt; R4["Route 2&lt;br/&gt;video games only"]&#10; R1 --&gt;|"✔ passes"| C1&#10; R2 -.-x|"✘ filtered out"| G1&#10; R3 --&gt;|"✔ passes"| C2&#10; R4 -.-x|"✘ filtered out"| G2&#10; subgraph Z["Discord · Los Zanahorios"]&#10; C1["#cine"]&#10; G1["#games"]&#10; end&#10; subgraph P["Discord · Los Panas"]&#10; C2["#animu-pelis-series"]&#10; G2["#gaming"]&#10; end&lt;/pre&gt;&lt;p&gt;&lt;img alt="The route editor: filter, message template and destination channel" class="gallery-image" data-flex-basis="252px" data-flex-grow="105" height="1994" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://christt105.github.io/blog/informadorss/web-route.webp" srcset="https://christt105.github.io/blog/informadorss/web-route_hu_a1005d249803043c.webp 800w, https://christt105.github.io/blog/informadorss/web-route_hu_458b51e51904d625.webp 1600w, https://christt105.github.io/blog/informadorss/web-route.webp 2100w" width="2100"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="This is how Tetris arrives on Discord" class="gallery-image" data-flex-basis="157px" data-flex-grow="65" height="1955" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://christt105.github.io/blog/informadorss/discord-mediatracker.webp" srcset="https://christt105.github.io/blog/informadorss/discord-mediatracker_hu_fb324b3eb85bfa5f.webp 800w, https://christt105.github.io/blog/informadorss/discord-mediatracker.webp 1280w" width="1280"&gt;&lt;/p&gt;&#10;&lt;h2 id="the-stack"&gt;The stack&#10;&lt;/h2&gt;&lt;p&gt;C# on .NET 10 compiled with NativeAOT, and a Vue 3 frontend that ends up as static files inside the same binary. I picked C# because it&amp;rsquo;s what I use every day, and that&amp;rsquo;s why I ruled out Go and C++. I was curious to try building something like this in one of those languages, but in the end C# is the one I&amp;rsquo;m most comfortable reading. Storage is SQLite, with a daily backup to another disk, although losing it wouldn&amp;rsquo;t be a big deal.&lt;/p&gt;&#10;&lt;p&gt;This is what it looks like inside:&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart TD&#10; F["RSS / Atom feeds"] --&gt; SRC&#10; YO["Browser on the LAN"] --&gt; WEB&#10; subgraph BIN["A single C# binary · .NET 10 with NativeAOT"]&#10; WEB["Vue 3 web UI"] &lt;--&gt; API["API"]&#10; API &lt;--&gt; DB[("SQLite")]&#10; SCH["Scheduler"] &lt;--&gt; DB&#10; SCH --&gt; SRC["Source&lt;br/&gt;fetch and parse"]&#10; SRC --&gt; PIPE["Routes&lt;br/&gt;filter and template"]&#10; subgraph SK["Sinks"]&#10; DSC["Discord"]&#10; NT["ntfy"]&#10; NEXT["Telegram?"]&#10; end&#10; PIPE --&gt; DSC&#10; PIPE --&gt; NT&#10; PIPE -.-&gt; NEXT&#10; end&#10; classDef futuro stroke-dasharray: 5 5&#10; class NEXT futuro&lt;/pre&gt;&lt;p&gt;The idea is for everything to be modular. Each destination is a sink, a class that implements a very small interface: a name and a method that delivers the message. Right now there are two, Discord and ntfy, and adding another one, like Telegram, means writing that class and registering it, without touching the scheduler or the filters; the web UI picks it up on its own and offers it as a destination. Sources work the same way: today there&amp;rsquo;s only RSS and Atom, but they sit behind their own interface.&lt;/p&gt;&#10;&lt;h2 id="the-numbers"&gt;The numbers&#10;&lt;/h2&gt;&lt;p&gt;Let&amp;rsquo;s put the numbers on the table and compare both services at similar moments: idle, with the same feeds and checking every ten minutes. I&amp;rsquo;ve already shut MonitoRSS down for obvious reasons, so its figures are from before the switch.&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;InformadoRSS&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;MonitoRSS&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Containers&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;9&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;RAM&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;75 MiB&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;about 670 MB&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Image&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;37 MB&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;about 3.9 GB combined&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Data on disk&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4.5 MB&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;656 MB&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;Even though the numbers are very good, there&amp;rsquo;s still room for improvement. In the first experiment, with no feeds and no web UI, the AOT binary used about 10 MiB, and in production it&amp;rsquo;s 75 MiB: the .NET garbage collector is in no hurry to give memory back on a machine with 15 GB free. If it ever matters to me, I can cap the heap. It also writes about 50 MB a day to disk, mostly overly detailed logs from the HTTP client, which is fixed by lowering the log level.&lt;/p&gt;&#10;&lt;h2 id="made-with-claude"&gt;Made with Claude&#10;&lt;/h2&gt;&lt;p&gt;First I wrote the design in an Obsidian note (what MonitoRSS does, what I actually use and what I can throw away) and then split it into tasks. Claude ran several of them in parallel in separate git worktrees, each with its own pull request, and I reviewed and merged them in waves: storage, filters and the feed parser, then the scheduler and Discord delivery, and finally the importer, alerts, backups and the web UI. I think I&amp;rsquo;ve found a very comfortable way of working with AI, I might write a post about how I work soon.&lt;/p&gt;&#10;&lt;h2 id="the-switch"&gt;The switch&#10;&lt;/h2&gt;&lt;p&gt;The scary part wasn&amp;rsquo;t the code, it was moving from one to the other. I wrote an importer that reads a MonitoRSS &lt;code&gt;mongoexport&lt;/code&gt; and creates the feeds and routes. The first pass sent every destination to a test channel and posted the latest item of each feed, so I could compare the messages side by side. Once it all matched, I stopped the MonitoRSS containers, pointed the 22 routes at the real channels and silently marked them as seen so nobody got flooded with old posts. If anything went wrong, a &lt;code&gt;docker start&lt;/code&gt; would bring the old stack back. Honestly, it came out almost perfect on the first try.&lt;/p&gt;&#10;&lt;h2 id="things-that-gave-me-trouble"&gt;Things that gave me trouble&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;YouTube feeds return 404 for a few hours every morning.&lt;/strong&gt; It&amp;rsquo;s a global outage, not my IP. That&amp;rsquo;s why a feed only counts as broken after failing for six hours straight. I don&amp;rsquo;t really understand why this happens to YouTube. &lt;a class="link" href="https://www.reddit.com/r/youtube/comments/1r61jpo/all_youtube_channel_rss_feeds_are_down_return_404/" target="_blank" rel="noopener"&#10; &gt;It seems to be a bug that&amp;rsquo;s been around for a while&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;MyAnimeList rewrites entries in place.&lt;/strong&gt; Each entry&amp;rsquo;s guid is the anime&amp;rsquo;s URL and the status lives in the description, so going from &lt;code&gt;Watching&lt;/code&gt; to &lt;code&gt;Completed&lt;/code&gt; was never sent. MonitoRSS had the same problem. Now a feed can have an identity pattern, a regular expression over the description that gets appended to the item id, so each status counts as a new item. Still, the way MAL organises its RSS is terrible (Ori, I won&amp;rsquo;t say it again, add RSS to your tracking app).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Old items after an outage.&lt;/strong&gt; Items older than a maximum age are marked as seen without being sent, and from the web UI you can send or reset any of them by hand. This tends to happen to me because I take several days to write a post: I forget to update the date, it shows up as published several days ago and the delivery gets skipped.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;img alt="A MyAnimeList status change that now does reach Discord" class="gallery-image" data-flex-basis="375px" data-flex-grow="156" height="818" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://christt105.github.io/blog/informadorss/discord-mal.webp" srcset="https://christt105.github.io/blog/informadorss/discord-mal_hu_a1a7bf577e79ccc3.webp 800w, https://christt105.github.io/blog/informadorss/discord-mal.webp 1280w" width="1280"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="A feed’s page, with its routes and the identity pattern field" class="gallery-image" data-flex-basis="309px" data-flex-grow="128" height="1629" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://christt105.github.io/blog/informadorss/web-feed.webp" srcset="https://christt105.github.io/blog/informadorss/web-feed_hu_384fba0bd150d037.webp 800w, https://christt105.github.io/blog/informadorss/web-feed_hu_a98081b772e13ef9.webp 1600w, https://christt105.github.io/blog/informadorss/web-feed.webp 2100w" width="2100"&gt;&lt;/p&gt;&#10;&lt;h2 id="whats-missing"&gt;What&amp;rsquo;s missing&#10;&lt;/h2&gt;&lt;p&gt;It&amp;rsquo;s a very basic service, it has exactly what I need. MonitoRSS has a lot more customisation and lets you do more things, but I don&amp;rsquo;t need it, much less at the cost of using nine times more RAM.&lt;/p&gt;&#10;&lt;p&gt;Things like Discord messages with Components V2, a Discord-style message preview and a Shorts filter for YouTube are missing. There&amp;rsquo;s no login: it&amp;rsquo;s meant for a trusted LAN.&lt;/p&gt;&#10;&lt;p&gt;It&amp;rsquo;s built to be quite modular, so I can add other sources or sinks, and if I need a feature I can add it easily: it&amp;rsquo;s not a very complex service. For now I&amp;rsquo;ll leave it like this, open for anyone who wants to use it or improve it.&lt;/p&gt;&#10;&lt;p&gt;If you use MonitoRSS and want something lighter, give it a try and take a look.&lt;/p&gt;&#10;&lt;p&gt;See you in the next one!&lt;/p&gt;&#10;</description></item></channel></rss>