<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
    <title>A Node on the Web</title>
    <link>https://rmendes.net/</link>
    <description>This site is my personal hub for long-form writing, curated bookmarks, and open-web experiments — where ideas about tech, autonomy, democracy, and digital culture meet.
Since February 2026, this site is also my personal ActivityPub instance, every posts you see on this blog can be fetched from the fediverse.</description>
    <language>en</language>
    <atom:link href="https://rmendes.net/feed.xml" rel="self" type="application/rss+xml"/>
    <atom:link href="https://websubhub.com/hub" rel="hub"/>
    <lastBuildDate>Fri, 12 Jun 2026 15:36:17 GMT</lastBuildDate>
    <item>
      <title></title>
      <link>https://rmendes.net/likes/2026/06/12/6e9c3/</link>
      <guid isPermaLink="true">https://rmendes.net/likes/2026/06/12/6e9c3/</guid>
      <pubDate>Fri, 12 Jun 2026 15:36:17 GMT</pubDate>
      <description></description>
    </item>
    <item>
      <title>petite mise à jours de mon poc #Vyshyvanka https://vyshyvanka.rmendes.net/#m=pan...</title>
      <link>https://rmendes.net/notes/2026/06/09/a60c9/</link>
      <guid isPermaLink="true">https://rmendes.net/notes/2026/06/09/a60c9/</guid>
      <pubDate>Tue, 09 Jun 2026 18:14:31 GMT</pubDate>
      <description>&lt;p&gt;petite mise à jours de mon poc &lt;a href=&quot;https://rmendes.net/categories/vyshyvanka/&quot; class=&quot;p-category hashtag&quot;&gt;#Vyshyvanka&lt;/a&gt; &lt;a href=&quot;https://vyshyvanka.rmendes.net/#m=panel&amp;amp;r=borshchiv&amp;amp;c=4&amp;amp;vy=25&amp;amp;st=sq&amp;amp;seed=vfpou3q&amp;amp;res=fhd&amp;amp;lay=fabric&amp;amp;bg=linen&amp;amp;sc=medium&amp;amp;sh=rushnyk&amp;amp;tr=81&amp;amp;sym=d4&amp;amp;vox=23.65&amp;amp;voy=25.59&amp;amp;voz=6.134&quot;&gt;https://vyshyvanka.rmendes.net/#m=panel&amp;amp;r=borshchiv&amp;amp;c=4&amp;amp;vy=25&amp;amp;st=sq&amp;amp;seed=vfpou3q&amp;amp;res=fhd&amp;amp;lay=fabric&amp;amp;bg=linen&amp;amp;sc=medium&amp;amp;sh=rushnyk&amp;amp;tr=81&amp;amp;sym=d4&amp;amp;vox=23.65&amp;amp;voy=25.59&amp;amp;voz=6.134&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Faut explorer la barre latérale de contrôle, wallpaper et Explore surtout et les autres onglets verticaux, il y a beaucoup d’options pour contrôler le résultat, ya sûrement encore des bugs aussi…si vous en trouvez faite signe !&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Working on making my #indiekit fork cloudron/docker deployment multi-site, the i...</title>
      <link>https://rmendes.net/notes/2026/06/07/ffe7e/</link>
      <guid isPermaLink="true">https://rmendes.net/notes/2026/06/07/ffe7e/</guid>
      <pubDate>Sun, 07 Jun 2026 16:10:57 GMT</pubDate>
      <description>&lt;p&gt;Working on making my &lt;a href=&quot;https://rmendes.net/categories/indiekit/&quot; class=&quot;p-category hashtag&quot;&gt;#indiekit&lt;/a&gt; fork cloudron/docker deployment multi-site, the idea is that I want anyone to deploy it and have a fully working setup in one shot, for that I created a plugin registry that act as “source of truth” for which plugin exist or is enabled per site and which version to deploy.&lt;/p&gt;
&lt;p&gt;This also allow me to test end to end the deployment of a new site using my fork, literally putting myself in the shoes of anyone doing it.&lt;/p&gt;
&lt;p&gt;The result is that I had to refactor quite a few parts to make site-configuration driven by data rather than env files.&lt;/p&gt;
&lt;p&gt;This allow me to configure any parts of the theme/site without touching code. well “any” is still a long shot ahead but I got branding, identity, h-card, homepage, blog sidebars fully data driven, if I change an option, its going to rebuild Eleventy and present me the changes in near real time, one rebuild away.&lt;/p&gt;
&lt;p&gt;I’m also using this opportunity to migrate my wordpress based chardonsbleus site to indiekit and since &lt;a href=&quot;http://chardonsbleus.org/&quot;&gt;chardonsbleus.org&lt;/a&gt; is not a blog and more a typical website I’ve had to make quite some modifications to let users decide how they want each page or post to behave, allowing them to choose widgets to display, sections to display for the homepage, without touching code.&lt;/p&gt;
&lt;p&gt;its still a work in progress, but I’m getting there !&lt;/p&gt;
</description>
    </item>
    <item>
      <title>The idea that you can “reset your algorithm” by doing X or Y on corporate platfo...</title>
      <link>https://rmendes.net/notes/2026/06/07/algorithmic-rant/</link>
      <guid isPermaLink="true">https://rmendes.net/notes/2026/06/07/algorithmic-rant/</guid>
      <pubDate>Sun, 07 Jun 2026 14:10:06 GMT</pubDate>
      <description>&lt;p&gt;The idea that you can “reset your algorithm” by doing X or Y on corporate platforms is absolutely ridiculous.&lt;/p&gt;
&lt;p&gt;At most you can influence just a bit the way you are impacted by feeding it dislike or not interested actions but ultimately the corporations that own the algorithm enforce whatever it wants to every users.&lt;/p&gt;
&lt;p&gt;You can’t “reset your algorithm” by watching 2 min shorts of nature or music or whatever. It’s an urban myth.&lt;/p&gt;
&lt;p&gt;You can’t pray the algorithm to obtain a change, it’s a delusion.&lt;/p&gt;
&lt;p&gt;The idea that if you land on a short is in itself a rare privilege encouraging you to like, comment or share the video is just another mechanism to manipulate the user, it has no impact whatsoever besides provoking a waterfall of similar content to keep you hooked.&lt;/p&gt;
&lt;p&gt;In the same way, replacing words such as S*x or whatever words to avoid hurting one’s account against the algorithm is ridiculous.&lt;/p&gt;
&lt;p&gt;People are self-censoring by pretending that masquerading keywords will avoid the algorithmic reranking of one’s post is another collective delusion. It’s like people adopt censorship thinking they can bypass algorithms or make their content surface better because it has S*x instead of Sex is beyond ridiculous.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Just for the fun : a local browser only #vyshyvanka generator inspired by Ukrain...</title>
      <link>https://rmendes.net/notes/2026/06/07/4eea3/</link>
      <guid isPermaLink="true">https://rmendes.net/notes/2026/06/07/4eea3/</guid>
      <pubDate>Sun, 07 Jun 2026 11:20:40 GMT</pubDate>
      <description>&lt;p&gt;Just for the fun : a local browser only &lt;a href=&quot;https://rmendes.net/categories/vyshyvanka/&quot; class=&quot;p-category hashtag&quot;&gt;#vyshyvanka&lt;/a&gt; &lt;a href=&quot;https://vyshyvanka.rmendes.net/&quot;&gt;generator&lt;/a&gt; inspired by Ukrainian traditions.
&lt;img src=&quot;https://rmendes.net/media/photos/2026/06/07/vyshyvanka-hutsul-fabric-fhd-4wp0zj4.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Now with better mobile support and better UI&lt;/p&gt;
</description>
      <enclosure url="https://rmendes.net/media/photos/2026/06/07/vyshyvanka-hutsul-fabric-fhd-4wp0zj4.png" type="image/jpeg" length="0"/>
      <media:content url="https://rmendes.net/media/photos/2026/06/07/vyshyvanka-hutsul-fabric-fhd-4wp0zj4.png" medium="image"/>
    </item>
    <item>
      <title>TLDR : A reflection on why simple stories of kindness, compassion, and humanity...</title>
      <link>https://rmendes.net/notes/2026/06/06/1a645/</link>
      <guid isPermaLink="true">https://rmendes.net/notes/2026/06/06/1a645/</guid>
      <pubDate>Sat, 06 Jun 2026 20:38:01 GMT</pubDate>
      <description>&lt;blockquote&gt;
&lt;p&gt;TLDR : A reflection on why simple stories of kindness, compassion, and humanity can evoke such powerful emotions, even in an age of algorithms and viral content.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sometimes I think it’s ridiculous how my mind reacts to a simple video, or even just a short piece of text telling a story about compassion, goodwill, humanity, or empathy.&lt;/p&gt;
&lt;p&gt;Our social media feeds are filled with these stories. Some—maybe many—are probably made up, carefully designed to create engagement and go viral. Others are manufactured from the start as beautiful but fictional narratives. Those aren’t the ones I’m talking about.&lt;/p&gt;
&lt;p&gt;I mean the simple posts that are often nothing more than a box of text. You actually have to stop and read them to grasp the story. Some of those are probably fictional too.&lt;/p&gt;
&lt;p&gt;It’s also likely that the Algorithm ©®™ has noticed how much I enjoy this type of content and keeps serving me more of it, or stories that follow the same pattern. But that’s not really the point.&lt;/p&gt;
&lt;p&gt;What I find interesting is how my brain can experience genuine emotions from such simple stories.&lt;/p&gt;
&lt;p&gt;A person helping someone else without expecting anything in return. A father struggling to feed his children being helped by a stranger. A truck driver stopping to help a struggling single mother. The examples could go on indefinitely.&lt;/p&gt;
&lt;p&gt;What amazes me is how powerfully humans respond to stories. Whether they come through books, movies, TV series, or a single social media slide, stories have a unique ability to move us. Sometimes just one paragraph is enough. A few lines of text can spark beautiful emotions because something in the story resonates with something within us.&lt;/p&gt;
&lt;p&gt;And sometimes those emotions bring tears. Not tears of sadness, but something harder to describe. It’s a strange mixture of gratitude, hope, tenderness, and awe. A story touches a nerve, and a wave of feeling rises from somewhere deep inside. It swells quietly and then crashes onto the shore of the mind, like the sea.&lt;/p&gt;
&lt;p&gt;It fascinates me that even when I know some of these stories may be exaggerated or entirely fictional, the emotional response can still be real. The facts matter, of course, but there is also something deeper at work. Perhaps it is the reminder that kindness exists, that people are capable of helping one another, and that goodness still has the power to surprise us. Maybe that is why these stories linger long after I’ve finished reading them.&lt;/p&gt;
&lt;p&gt;Perhaps stories is why humanity is still around.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>This is going to facilitate my daily job at work, I want to hack it so that I re...</title>
      <link>https://rmendes.net/notes/2026/06/06/fa38c/</link>
      <guid isPermaLink="true">https://rmendes.net/notes/2026/06/06/fa38c/</guid>
      <pubDate>Sat, 06 Jun 2026 12:34:25 GMT</pubDate>
      <description>&lt;p&gt;This is going to &lt;a href=&quot;https://github.com/microsoft/coreutils&quot;&gt;facilitate&lt;/a&gt; my daily job at work, I want to hack it so that I remove all conflicts with default Windows commands, hence giving coreutils priority !&lt;/p&gt;
</description>
    </item>
    <item>
      <title>The Brexit Bus Was Only the Beginning</title>
      <link>https://rmendes.net/articles/2026/06/06/the-brexit-bus-was-only/</link>
      <guid isPermaLink="true">https://rmendes.net/articles/2026/06/06/the-brexit-bus-was-only/</guid>
      <pubDate>Sat, 06 Jun 2026 10:15:32 GMT</pubDate>
      <description>&lt;p&gt;When historians write about the decline of democratic institutions in the early twenty-first century, they may not focus on artificial intelligence, deepfakes or social media algorithms.&lt;/p&gt;
&lt;p&gt;They may focus on a bus.&lt;/p&gt;
&lt;p&gt;A red bus promised that leaving the European Union would free up £350 million a week for the NHS. The claim was repeatedly challenged, repeatedly debunked, and yet it worked. Not because it was true, but because it was emotionally satisfying.&lt;/p&gt;
&lt;p&gt;Ten years later, the argument is no longer about whether Brexit delivered what was promised. The economic consequences are still debated, but something arguably more important happened: a lesson was learned.&lt;/p&gt;
&lt;p&gt;The lesson was that political narratives no longer needed to be true.&lt;/p&gt;
&lt;p&gt;They only needed to spread.&lt;/p&gt;
&lt;p&gt;The Brexit campaign was not the first political movement to use misinformation. Propaganda is as old as politics itself. What changed was the information environment. Social media platforms transformed the economics of persuasion.&lt;/p&gt;
&lt;p&gt;For centuries, publishing information carried costs. Newspapers had editors. Broadcasters had regulations. Journalists had professional standards. False information could spread, but it faced friction.&lt;/p&gt;
&lt;p&gt;The internet removed much of that friction.&lt;/p&gt;
&lt;p&gt;Social media platforms then discovered something even more consequential: outrage, fear, tribal identity and moral panic generated engagement. Engagement generated advertising revenue. The incentives aligned perfectly.&lt;/p&gt;
&lt;p&gt;The result was not merely the spread of misinformation.&lt;/p&gt;
&lt;p&gt;The result was the industrialization of misinformation.&lt;/p&gt;
&lt;p&gt;Today, we often discuss disinformation as though it were an unfortunate side effect of technology. Yet it is increasingly difficult to view it that way. The largest platforms on Earth possess vast resources, employ thousands of researchers and have unparalleled visibility into how information flows through society.&lt;/p&gt;
&lt;p&gt;They know which content drives engagement.&lt;/p&gt;
&lt;p&gt;They know which narratives spread fastest.&lt;/p&gt;
&lt;p&gt;They know which emotions keep users scrolling.&lt;/p&gt;
&lt;p&gt;And yet the underlying business model remains largely unchanged.&lt;/p&gt;
&lt;p&gt;Brexit was not caused by Facebook, Google, Twitter or YouTube.&lt;/p&gt;
&lt;p&gt;But Brexit revealed a new political reality: a sufficiently compelling narrative could outperform evidence, expertise and fact-checking.&lt;/p&gt;
&lt;p&gt;Since then, the same dynamics have appeared repeatedly across the democratic world.&lt;/p&gt;
&lt;p&gt;The issue is no longer any single election, referendum or political movement.&lt;/p&gt;
&lt;p&gt;The issue is that democratic societies increasingly depend upon information ecosystems whose incentives are fundamentally misaligned with democratic health.&lt;/p&gt;
&lt;p&gt;A healthy democracy requires informed citizens.&lt;/p&gt;
&lt;p&gt;A platform requires engaged users.&lt;/p&gt;
&lt;p&gt;These are not necessarily the same thing.&lt;/p&gt;
&lt;p&gt;One day there may be public inquiries into the role social media corporations played in accelerating polarization, amplifying disinformation and weakening public trust in institutions.&lt;/p&gt;
&lt;p&gt;Not because these companies intended to damage democracy.&lt;/p&gt;
&lt;p&gt;But because they built systems optimized for engagement while treating the resulting societal consequences as someone else’s problem.&lt;/p&gt;
&lt;p&gt;The question future generations may ask is not whether we knew the damage was occurring.&lt;/p&gt;
&lt;p&gt;The question may be why we allowed it to continue for so long.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Britain is a swamp of lies and disinformation – and we got here on the Brexit bus by &lt;a href=&quot;https://www.theguardian.com/commentisfree/2026/jun/05/britain-lies-disinformation-brexit-bus-economy-vote&quot;&gt;Jonathan Freedland&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</description>
    </item>
    <item>
      <title>The paradox of a country governed by lawyers is that an obsession with procedure...</title>
      <link>https://rmendes.net/replies/2026/06/01/adbe4/</link>
      <guid isPermaLink="true">https://rmendes.net/replies/2026/06/01/adbe4/</guid>
      <pubDate>Mon, 01 Jun 2026 16:12:58 GMT</pubDate>
      <description>&lt;p&gt;The paradox of a country governed by lawyers is that an obsession with procedure can become a weakness when confronted by authoritarianism. Whether the threat comes from corporations, the state, or an unofficial dictatorship, legalism alone is a poor defense. The United States, for all its self-congratulatory mythology about having “the best constitution in the world,” increasingly looks like a case study in democratic erosion. At times, even countries like Hungary or Turkey have shown greater institutional resilience.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Holy crap 😱 Persistent Orbital Junkyard that’s what it is</title>
      <link>https://rmendes.net/notes/2026/05/31/e9a23/</link>
      <guid isPermaLink="true">https://rmendes.net/notes/2026/05/31/e9a23/</guid>
      <pubDate>Sun, 31 May 2026 16:13:37 GMT</pubDate>
      <description>&lt;p&gt;Holy crap 😱&lt;/p&gt;
&lt;p&gt;Persistent Orbital Junkyard that’s what &lt;a href=&quot;https://leolabs.space/&quot;&gt;it&lt;/a&gt; &lt;a href=&quot;https://platform.leolabs.space/visualization&quot;&gt;is&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Reading : how to destroy a literary reputation in one move?</title>
      <link>https://rmendes.net/bookmarks/2026/05/31/reading-how-to-destroy-a/</link>
      <guid isPermaLink="true">https://rmendes.net/bookmarks/2026/05/31/reading-how-to-destroy-a/</guid>
      <pubDate>Sun, 31 May 2026 11:51:44 GMT</pubDate>
      <description>&lt;p&gt;Inspired by Dune’s Litany against Fear :&lt;/p&gt;
&lt;p&gt;I must not fear AI.&lt;/p&gt;
&lt;p&gt;Fear is the reputation-killer.&lt;/p&gt;
&lt;p&gt;Fear of being left behind drives institutions to replace judgment with automation.
Fear of losing market share drives executives to trade trust for efficiency.
Fear of missing the future drives them to abandon the very people who made them worth reading.&lt;/p&gt;
&lt;p&gt;I must not worship AI.&lt;/p&gt;
&lt;p&gt;AI is a tool, not a conscience.
It can generate words, but not wisdom.
It can mimic expertise, but not earn it.
It can produce content, but not trust.&lt;/p&gt;
&lt;p&gt;I will permit AI to pass through my workflow and through my tools.&lt;/p&gt;
&lt;p&gt;I will use it, but I will not surrender my judgment to it.&lt;/p&gt;
&lt;p&gt;And when the hype has passed and the dashboards are forgotten, I will turn the inner eye to see what remains.&lt;/p&gt;
&lt;p&gt;Words are abundant.
Content is abundant.
Information is abundant.&lt;/p&gt;
&lt;p&gt;Trust is scarce.&lt;/p&gt;
&lt;p&gt;If trust remains, the institution survives.&lt;/p&gt;
&lt;p&gt;If trust is gone, no amount of generated content can bring it back.&lt;/p&gt;
&lt;p&gt;Only trust will remain.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>En réponse à ceci Deuxième étape pour la France… Donner la même importance et la...</title>
      <link>https://rmendes.net/notes/2026/05/30/66d97/</link>
      <guid isPermaLink="true">https://rmendes.net/notes/2026/05/30/66d97/</guid>
      <pubDate>Sat, 30 May 2026 10:18:43 GMT</pubDate>
      <description>&lt;p&gt;En réponse à &lt;a href=&quot;https://www.facebook.com/share/18UWa5nVb9/&quot;&gt;ceci&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Deuxième étape pour la France… Donner la même importance et la même visibilité à toutes les victimes plutôt que de favoriser les victimes de chanteurs, d’auteurs, de personnalités connues.
La Justice française dort et ne se réveille que quand ses stars sont touchées.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://chardonsbleus.org/&quot;&gt;https://chardonsbleus.org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Faut-il être victime d’une personnalité connue ou être d’une famille importante pour avoir le droit à la justice?&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Quand Putin investit dans les idiots utiles pour servir ses intérêts</title>
      <link>https://rmendes.net/bookmarks/2026/05/30/quand-putin-investit-dans-les/</link>
      <guid isPermaLink="true">https://rmendes.net/bookmarks/2026/05/30/quand-putin-investit-dans-les/</guid>
      <pubDate>Sat, 30 May 2026 09:32:32 GMT</pubDate>
      <description>&lt;p&gt;« les changements de pouvoir promis par l’administration américaine n’auront pas lieu en Russie et en Biélorussie, mais en Europe, où elle s’appuie sur les forces patriotiques de l’extrême droite, prêtes à prendre les commandes ».&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Plume Post to your IndieWeb blog from any page — toolbar composer or right-click...</title>
      <link>https://rmendes.net/notes/2026/05/21/05d93/</link>
      <guid isPermaLink="true">https://rmendes.net/notes/2026/05/21/05d93/</guid>
      <pubDate>Thu, 21 May 2026 15:31:47 GMT</pubDate>
      <description>&lt;p&gt;&lt;a href=&quot;https://rmdes.github.io/plume/&quot;&gt;Plume&lt;/a&gt;
Post to your IndieWeb blog from any page — toolbar composer or right-click capture. Cross-browser, multi-account, no telemetry.&lt;/p&gt;
&lt;p&gt;You need a micropub compatible blog engine to use this extension &lt;a href=&quot;https://indieweb.org/Micropub/Servers&quot;&gt;List&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Chaque fois qu’éclate une affaire de viol en France, j’ai la même réflexion : et...</title>
      <link>https://rmendes.net/notes/2026/05/20/bbf3e/</link>
      <guid isPermaLink="true">https://rmendes.net/notes/2026/05/20/bbf3e/</guid>
      <pubDate>Wed, 20 May 2026 16:58:34 GMT</pubDate>
      <description>&lt;p&gt;Chaque fois qu’éclate une affaire de viol en France, j’ai la même réflexion : et si c’était un viol d’un inconnu contre une inconnue, la Justice et la société et les Médias donneraient ils la même importance qu’à Patrick Bruel par exemple?&lt;/p&gt;
&lt;p&gt;Faut-il être un criminel avec un nom et une classe sociale différente pour qu’un viol soit considéré grave et important?&lt;/p&gt;
&lt;p&gt;C’est tout ce que la France donne en guise de réponse par l’exercice de la pratique.&lt;/p&gt;
&lt;p&gt;Que ce soit dans les médias ou la Justice.&lt;/p&gt;
&lt;p&gt;La Justice de classe, elle est organisée et mise en place par les institutions, par l’État et son inertie chronique.&lt;/p&gt;
&lt;p&gt;Elle profite directement les prédateurs au détriment des victimes.&lt;/p&gt;
&lt;p&gt;Pendant que la presse mange des popcorns sur les décombres de vies brisées, pendant que nos sociétés sont plus intéressées par la révélation que par la souffrance des victimes, pendant que nos sociétés continuent d’asseoir les processus judiciaire sur des lois conçues pour protéger les prédateurs, des millions de cas de viols, d’abus sur des femmes et des enfants continuent.&lt;/p&gt;
&lt;p&gt;En toute &lt;a href=&quot;https://chardonsbleus.org/&quot;&gt;impunité&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Building Plume</title>
      <link>https://rmendes.net/articles/2026/05/20/building-plume/</link>
      <guid isPermaLink="true">https://rmendes.net/articles/2026/05/20/building-plume/</guid>
      <pubDate>Wed, 20 May 2026 07:42:02 GMT</pubDate>
      <description>&lt;p&gt;I got annoyed.&lt;/p&gt;
&lt;p&gt;Every time I wanted to bookmark a page or jot down a note, I’d open the Indiekit admin UI in a new tab, paste a URL, and click around. Small friction. But small friction repeats forever. So two days ago I started a brainstorm with Claude on what it would take to build a browser extension that posts to my Micropub blog directly from the toolbar.&lt;/p&gt;
&lt;p&gt;Two days later, Plume is live on the Chrome Web Store and Mozilla AMO. Source on GitHub. No telemetry, two browsers, 127 unit tests if you’re counting.&lt;/p&gt;
&lt;p&gt;Here’s how it happened.&lt;/p&gt;
&lt;h2 id=&quot;what-plume-does&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://rmendes.net/articles/2026/05/20/building-plume/#what-plume-does&quot;&gt;What Plume does&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;It’s a Micropub client that lives in your browser’s toolbar. Click the feather icon and you get a composer for notes, articles, bookmarks, replies, likes, reposts, quotes, and photos. Multi-account if you run more than one blog. Right-click any page, link, image, or text selection to post about it with the right fields already filled in. Drafts auto-save while you type. Failed posts queue up and retry in the background. There’s a Markdown toolbar with a live preview, and the composer can pop out to a tab if you need desk-width room for an article. The only network requests Plume makes are to your own Micropub endpoint.&lt;/p&gt;
&lt;p&gt;Standard IndieWeb stuff, just packaged so it’s always one keystroke away. Default shortcut: &lt;code&gt;Alt+Shift+P&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;how-we-built-it&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://rmendes.net/articles/2026/05/20/building-plume/#how-we-built-it&quot;&gt;How we built it&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I’d already written a Micropub MCP server — same family as Plume — so Claude could post to my blog directly. That codebase had everything Plume needed minus the browser layer: HTTP client for Micropub create/update/delete/query/upload, IndieAuth + PKCE, endpoint discovery. The work was wrapping it in something that runs inside Chrome and Firefox.&lt;/p&gt;
&lt;p&gt;Stack: WXT for the extension framework (Vite-based, generates Chrome and Firefox manifests from one config), Preact for the UI, TypeScript, Bun. Preact is small and feels like React minus the dependency cost. Bun runs TypeScript directly so there’s no build step for tests.&lt;/p&gt;
&lt;p&gt;The actual workflow was three skills stacked. First, a brainstorming skill that takes a one-line idea, walks me through clarifying questions, and produces a design document. Then a planning skill that turns the design into an implementation plan with exact files, code, and commit boundaries. Then a subagent-driven execution skill that dispatches a fresh agent per task, one per file or feature, with a review loop after each. Each agent only saw what it needed. I wasn’t managing thirty open files. That last part is the actual win — agentic coding only works if the human’s context stays clear too.&lt;/p&gt;
&lt;p&gt;Some things didn’t go to plan. Biome, the linter we picked first, crashed with SIGABRT twice in a row, so we migrated to ESLint + Prettier mid-build. Chrome Web Store rejected the first upload because we’d included a &lt;code&gt;manifest.key&lt;/code&gt; field, which CWS refuses on initial submission (it assigns its own ID). Mozilla AMO then rejected v1.0.3 because Firefox extensions now have to declare data collection permissions in the manifest. Each one felt like a setback at the time. Each one resolved in under thirty minutes.&lt;/p&gt;
&lt;p&gt;Three decisions I’m happy with:&lt;/p&gt;
&lt;p&gt;The Markdown preview lazy-loads snarkdown and DOMPurify only when you click the preview button. Users who never preview pay nothing for the parser. Eager-loaded, the popup chunk was 47 kB. Lazy, it’s 21 kB with 27 kB of optional chunks. The popup feels instant.&lt;/p&gt;
&lt;p&gt;The composer pop-out is the same &lt;code&gt;popup.html&lt;/code&gt; opened in a tab with a &lt;code&gt;?popout=1&lt;/code&gt; flag. The component code doesn’t know or care which target it’s rendering into — only the layout cares. Toolbar popup at 360 px, tab view at 480–720 px. One file, two contexts.&lt;/p&gt;
&lt;p&gt;For IndieAuth, &lt;code&gt;chrome.identity.launchWebAuthFlow&lt;/code&gt; handles the OAuth dance. The catch is that Chrome’s flow uses a per-extension callback URL on &lt;code&gt;*.chromiumapp.org&lt;/code&gt;. To make the same extension work in dev and prod, we embed the Chrome Web Store’s production public key as &lt;code&gt;manifest.key&lt;/code&gt; in dev mode. The dev install then derives the same extension ID as the published one, so one redirect URI declaration covers both.&lt;/p&gt;
&lt;p&gt;I also patched the upstream Indiekit endpoint-auth package so it can fetch a &lt;code&gt;client_id&lt;/code&gt; URL and parse &lt;code&gt;&amp;lt;link rel=&amp;quot;redirect_uri&amp;quot;&amp;gt;&lt;/code&gt; tags with wildcard subdomain matching. Plume’s redirect URI lives on &lt;code&gt;chromiumapp.org&lt;/code&gt;, not on &lt;code&gt;rmendes.net&lt;/code&gt;, and the existing validation rejected cross-host redirects.&lt;/p&gt;
&lt;h2 id=&quot;releases&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://rmendes.net/articles/2026/05/20/building-plume/#releases&quot;&gt;Releases&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;v1.0.0 shipped on May 18. By the end of the next day we were at v1.2.0. The dot releases in between were mostly the store-publishing learning curve. 1.0.1 fixed a missing file picker on the photo tab and a context-menu race condition. 1.0.2 made &lt;code&gt;manifest.key&lt;/code&gt; dev-only. 1.0.3 pinned the dev key to the CWS production key so callback URLs stayed stable. 1.0.4 added Firefox data collection permissions. Then 1.1.0 brought the MediaPicker (browse existing media on the server), the pop-out composer, server-side extension detection via &lt;code&gt;?q=post-types&lt;/code&gt; property scanning, the keyboard shortcut, and live-updating queue and draft lists. 1.2.0 added the Markdown toolbar and preview.&lt;/p&gt;
&lt;p&gt;Shipping a tagged release every couple of hours is unreasonably motivating. Each version landed, I tested it on &lt;a href=&quot;http://rmendes.net/&quot;&gt;rmendes.net&lt;/a&gt;, found the next gap, and the next one shipped in an hour or two. The release workflow on GitHub Actions extracts the changelog section by tag and drafts a GitHub release with the Chrome and Firefox zips attached.&lt;/p&gt;
&lt;h2 id=&quot;how-to-use-it&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://rmendes.net/articles/2026/05/20/building-plume/#how-to-use-it&quot;&gt;How to use it&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Install from the Chrome Web Store or Mozilla AMO. Click the feather icon in your toolbar. The first time, it’ll say “No Micropub account connected.” Click “Open Plume settings,” paste your blog URL, click Authorize. Your IndieAuth server opens a consent page in a small Chrome window. Approve. Plume gets a token and stores it locally.&lt;/p&gt;
&lt;p&gt;From there: toolbar feather to write. Right-click a page to bookmark it. Right-click selected text to reply or quote with the passage as a Markdown blockquote. Right-click an image to post a photo. Settings any time to switch accounts, drain the retry queue, or recover a draft.&lt;/p&gt;
&lt;h2 id=&quot;whats-next&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://rmendes.net/articles/2026/05/20/building-plume/#whats-next&quot;&gt;What’s next&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A few things on the list. Sending &lt;code&gt;content&lt;/code&gt; as &lt;code&gt;{markdown: &amp;quot;...&amp;quot;}&lt;/code&gt; explicitly instead of relying on Indiekit’s default markdown handling. Better cross-browser end-to-end coverage — right now E2E only runs on Chromium. Maybe a Firefox-specific design pass; the popup feels slightly tight there compared to Chrome.&lt;/p&gt;
&lt;p&gt;But the core thing is done. Plume is the tool I wanted: friction-free Micropub posting from any page, with my own blog as the destination. If you run Indiekit or another spec-compliant Micropub server, it should just work.&lt;/p&gt;
&lt;p&gt;Source: &lt;a href=&quot;https://github.com/rmdes/plume&quot;&gt;github.com/rmdes/plume&lt;/a&gt;&lt;br /&gt;
Landing page: &lt;a href=&quot;https://rmdes.github.io/plume/&quot;&gt;rmdes.github.io/plume&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Plume — Micropub for browsers</title>
      <link>https://rmendes.net/bookmarks/2026/05/19/plume-micropub-for-browsers/</link>
      <guid isPermaLink="true">https://rmendes.net/bookmarks/2026/05/19/plume-micropub-for-browsers/</guid>
      <pubDate>Tue, 19 May 2026 15:40:06 GMT</pubDate>
      <description></description>
    </item>
    <item>
      <title>Odd situation with buzzworkers LetsEncrypt certificate was not renewing properly...</title>
      <link>https://rmendes.net/notes/2026/05/19/59c57/</link>
      <guid isPermaLink="true">https://rmendes.net/notes/2026/05/19/59c57/</guid>
      <pubDate>Tue, 19 May 2026 14:55:51 GMT</pubDate>
      <description>&lt;p&gt;Odd situation with &lt;a href=&quot;https://buzzworkers.com/&quot;&gt;buzzworkers&lt;/a&gt; LetsEncrypt certificate was not renewing properly, changed gandi API LiveDNS (deprecated) to PAT and forced cloudron to renew the certificate.
Problem solved but in more than a decade its the first time a LE certificate does not renew properly on its own.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Hmm have to investigate why Bluesky sidebar widget is not updating anymore…</title>
      <link>https://rmendes.net/notes/2026/05/19/b6d59/</link>
      <guid isPermaLink="true">https://rmendes.net/notes/2026/05/19/b6d59/</guid>
      <pubDate>Tue, 19 May 2026 14:48:35 GMT</pubDate>
      <description>&lt;p&gt;Hmm have to investigate why Bluesky sidebar widget is not updating anymore…&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Listening https://somafm.com/player24/station/gsclassic</title>
      <link>https://rmendes.net/notes/2026/05/18/63bba/</link>
      <guid isPermaLink="true">https://rmendes.net/notes/2026/05/18/63bba/</guid>
      <pubDate>Mon, 18 May 2026 18:42:58 GMT</pubDate>
      <description>&lt;p&gt;Listening &lt;a href=&quot;https://somafm.com/player24/station/gsclassic&quot;&gt;https://somafm.com/player24/station/gsclassic&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
  </channel>
</rss>
