<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Renegade</title>
    <link>https://renegade.es/</link>
    <description>Recent content on Renegade</description>
    <generator>Hugo -- 0.154.3</generator>
    <language>es</language>
    <lastBuildDate>Thu, 21 May 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://renegade.es/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Ahora</title>
      <link>https://renegade.es/now/</link>
      <pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate>
      <guid>https://renegade.es/now/</guid>
      <description>&lt;p&gt;Últimamente no estoy haciendo gran cosa. Estoy dedicando mi tiempo libre a jugar juegos y a avanzar bastante con la lectura. No me apetece volverme loco a aprender cosas nuevas, ya habrá tiempo para eso. Ahora mismo estoy leyendo «Las naves de la magia», de Robin Hobb y jugando a «Kingdom Come Deliverance II».&lt;/p&gt;
&lt;h2 id=&#34;las-naves-de-la-magia-libro&#34;&gt;Las naves de la magia (Libro)&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&#34;Portada de Las naves de la magia de Robin Hoob&#34; loading=&#34;lazy&#34; src=&#34;https://www.nocturnaediciones.com/imagenes/biblioteca/465_alta.jpg&#34;&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Últimamente no estoy haciendo gran cosa. Estoy dedicando mi tiempo libre a jugar juegos y a avanzar bastante con la lectura. No me apetece volverme loco a aprender cosas nuevas, ya habrá tiempo para eso. Ahora mismo estoy leyendo «Las naves de la magia», de Robin Hobb y jugando a «Kingdom Come Deliverance II».</p>
<h2 id="las-naves-de-la-magia-libro">Las naves de la magia (Libro)</h2>
<p><img alt="Portada de Las naves de la magia de Robin Hoob" loading="lazy" src="https://www.nocturnaediciones.com/imagenes/biblioteca/465_alta.jpg"></p>
<p>De momento no llevo mucho. La trilogía anterior «La trilogía del Vatídico» me encantó tanto que cuando me enteré de que Nocturna reeditaba esta segunda trilogía al castellano me la tuve que comprar y ahí vamos.</p>
<h2 id="kingdom-come-deliverance-ii">Kingdom Come Deliverance II</h2>
<p><img alt="Portada del Kingdom Come Deliverance II" loading="lazy" src="https://www.deepsilver.com/media/uocbzxol/kcd2_wallpaper-main-keyart_desktop_3840x2160.jpg"></p>
<p>Sobre «Kingdom Come Deliverance» tengo bastante más que decir, el primero fue mi juego favorito del año pasado con diferencia y este juego de momento es lo mejor que he jugado. Una pasada. Está ambientado en la europa medieval y el prota es muy carismático. Henry de Skalice es un pajini, pero es nuestro pajini.</p>
<p>La ambientación es una pasada, se ve increible y es divertido. El juego es tan loco que las ciudades y pueblos en el juego están en el mismo lugar que en la vida real, incluso el trazado de las calles está en el mismo sitio. No puedo decir más, una locura.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Comentando desde Mastodon en un blog estático con Hugo</title>
      <link>https://renegade.es/articulos/comentando-desde-mastodon-en-un-blog-estatico-con-hugo/</link>
      <pubDate>Tue, 03 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://renegade.es/articulos/comentando-desde-mastodon-en-un-blog-estatico-con-hugo/</guid>
      <description>&lt;p&gt;Si sois curiosos y alguna vez habéis trasteado con una página web entenderéis un poco el drama de usar un sitio web estático y agregarle un sistema de comentarios.&lt;/p&gt;
&lt;p&gt;Si tiramos a leer &lt;a href=&#34;https://gohugo.io/content-management/comments/&#34;&gt;la documentación de Hugo&lt;/a&gt; nos encontramos que no es muy difícil integrar algunos servicios como Disqus. Seguro que lo habéis encontrado bastante si navegáis por los lugares mas indies de internet. Hace un tiempo hice alguna búsqueda rápida para ver alternativas existían, pero acabé un poco desanimado.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Si sois curiosos y alguna vez habéis trasteado con una página web entenderéis un poco el drama de usar un sitio web estático y agregarle un sistema de comentarios.</p>
<p>Si tiramos a leer <a href="https://gohugo.io/content-management/comments/">la documentación de Hugo</a> nos encontramos que no es muy difícil integrar algunos servicios como Disqus. Seguro que lo habéis encontrado bastante si navegáis por los lugares mas indies de internet. Hace un tiempo hice alguna búsqueda rápida para ver alternativas existían, pero acabé un poco desanimado.</p>
<p>Usar un servidor de comentarios de terceros le quita bastante la gracia a esto de tener un blog estático autoalojado. Además, en casi todos, es obligatorio que iniciar sesión con la típica cuenta de Google o Facebook para comentar. Siendo sinceros, mi web tampoco es que vaya a tener mucho tráfico ni muchos comentarios, por lo que me pareció un despropósito montar algo así. Total, que lo dejé bastante de lado.</p>
<p>Pero algo me hizo click este finde viendo <a href="https://tilvids.com/a/thelinuxexperiment">el canal de PeerTube de Nick</a>, el señor tras <a href="https://mastodon.social/@thelinuxEXP">The Linux Experiment</a>. Caí en la cuenta que los comentarios del video venían directamente del Fediverso (obvio, es PeerTube). Si nos fijamos en ellos vemos gente de <a href="https://mastodon.social">mastodon.social</a>, <a href="https://fosstodon.org">fosstodon.org</a>&hellip; Me voló un poco la cabeza pensar que podía comentar esos videos directamente con mi cuenta de Mastodon. Y se me ocurrió que estaría muy chulo poder tener algo parecido en mi blog para los comentarios. Se que es posible federar blogs con cosillas como <a href="https://wordpress.org/plugins/activitypub/">plugins de Wordpress</a> o <a href="https://writefreely.org/">WriteFreely</a> y sus numerosas instancias, entre las que destacaría <a href="https://escritura.social">Escritura Social</a>. Pero la verdad, me llama bastante más la atención la sencillez de los blog estáticos.</p>
<p>Total, que me puse a buscar. Por que, en el Fediverso, siendo tan loco como es, fijo alguien que sí que sabe lo que hace, ha pensado lo mismo y lo ha colgado en su blog su solución. Y así fue. <a href="https://carlschwan.eu">Carl Schwan</a>, desarrollador en <a href="https://nextcloud.com/">Nextcloud</a> y <a href="https://kde.org/">KDE</a> (un máquina), en <a href="https://carlschwan.eu/2020/12/29/adding-comments-to-your-static-blog-with-mastodon/">este artículo</a> de su blog, explica como hacer justo eso.</p>
<p>Recomiendo leerlo, pero también quiero explicar un poco de manera más detallada como montar todo. En un blog con Hugo debería haber una estructura de carpetas más o menos así. Lo típico.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>~/blog$ tree -L1 
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>.  
</span></span><span style="display:flex;"><span>├── archetypes  
</span></span><span style="display:flex;"><span>├── content  
</span></span><span style="display:flex;"><span>├── hugo.yaml  
</span></span><span style="display:flex;"><span>├── layouts  
</span></span><span style="display:flex;"><span>├── public  
</span></span><span style="display:flex;"><span>├── README.md  
</span></span><span style="display:flex;"><span>├── static  
</span></span><span style="display:flex;"><span>└── themes
</span></span></code></pre></div><p>En mi caso, mi tema ya trae una plantilla <code>/themes/.../layouts/partials/comments.html</code>. Me viene en blanco prácticamente y lo voy a copiar en <code>/layouts/partials/comments.html</code> para poder sobreescribirlo con mis cambios. Antes de seguir, habría que asegurarse de tener este otro snippet. Si hay un <code>comments.html</code> o algo parecido en el tema, esto ya debería venir, pero si no, hay que ponerlo en la sección correspondiente de la web. De todos modos, no viene de más encontrarlo. En mi caso se encuentra al final de <code>/themes/.../layouts/_default/single.html</code> y no lo voy a modificar.</p>
<p><code># /themes/.../layouts/_default/single.html</code></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span>{{- if (.Param &#34;comments&#34;) }}
</span></span><span style="display:flex;"><span>{{- partial &#34;comments.html&#34; . }}
</span></span><span style="display:flex;"><span>{{- end }}
</span></span></code></pre></div><p>Ahora sí, el contenido del archivo <code>comments.html</code> es el siguiente. Aquí voy a poner tal cual el de <a href="https://carlschwan.eu">Carl</a>, pero en mi blog lo he toqueteado un pelín y lo he traducido. Mi versión se puede encontrar <a href="https://codeberg.org/peps/hugo-newspaper/src/branch/master/layouts/_partials/comments.html">aquí</a>.</p>
<p><code># /layouts/partials/comments.html</code></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span>{{ with .Params.comments }}
</span></span><span style="display:flex;"><span>&lt;<span style="color:#f92672">section</span> <span style="color:#a6e22e">id</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;comments&#34;</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;article-content&#34;</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">h2</span>&gt;Comments&lt;/<span style="color:#f92672">h2</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">p</span>&gt;With an account on the Fediverse or Mastodon, you can respond to this &lt;<span style="color:#f92672">a</span> <span style="color:#a6e22e">href</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;https://{{ .host }}/@{{ .username }}/{{ .id }}&#34;</span>&gt;post&lt;/<span style="color:#f92672">a</span>&gt;. Since Mastodon is decentralized, you can use your existing account hosted by another Mastodon server or compatible platform if you don&#39;t have an account on this one. Known non-private replies are displayed below.&lt;/<span style="color:#f92672">p</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">p</span>&gt;Learn how this is implemented &lt;<span style="color:#f92672">a</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;link&#34;</span> <span style="color:#a6e22e">href</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;/2020/12/29/adding-comments-to-your-static-blog-with-mastodon/&#34;</span>&gt;here.&lt;/<span style="color:#f92672">a</span>&gt;&lt;/<span style="color:#f92672">p</span>&gt;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">p</span> <span style="color:#a6e22e">id</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;mastodon-comments-list&#34;</span>&gt;&lt;<span style="color:#f92672">button</span> <span style="color:#a6e22e">id</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;load-comment&#34;</span>&gt;Load comments&lt;/<span style="color:#f92672">button</span>&gt;&lt;/<span style="color:#f92672">p</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">div</span> <span style="color:#a6e22e">id</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;comments-wrapper&#34;</span>&gt;
</span></span><span style="display:flex;"><span>    &lt;<span style="color:#f92672">noscript</span>&gt;&lt;<span style="color:#f92672">p</span>&gt;Loading comments relies on JavaScript. Try enabling JavaScript and reloading, or visit &lt;<span style="color:#f92672">a</span> <span style="color:#a6e22e">href</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;https://{{ .host }}/@{{ .username }}/{{ .id }}&#34;</span>&gt;the original post&lt;/<span style="color:#f92672">a</span>&gt; on Mastodon.&lt;/<span style="color:#f92672">p</span>&gt;&lt;/<span style="color:#f92672">noscript</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;/<span style="color:#f92672">div</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">noscript</span>&gt;You need JavaScript to view the comments.&lt;/<span style="color:#f92672">noscript</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">script</span> <span style="color:#a6e22e">src</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;/assets/js/purify.min.js&#34;</span>&gt;&lt;/<span style="color:#f92672">script</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">script</span> <span style="color:#a6e22e">type</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;text/javascript&#34;</span>&gt;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">function</span> <span style="color:#a6e22e">escapeHtml</span>(<span style="color:#a6e22e">unsafe</span>) {
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">unsafe</span>
</span></span><span style="display:flex;"><span>           .<span style="color:#a6e22e">replace</span>(<span style="color:#e6db74">/&amp;/g</span>, <span style="color:#e6db74">&#34;&amp;amp;&#34;</span>)
</span></span><span style="display:flex;"><span>           .<span style="color:#a6e22e">replace</span>(<span style="color:#e6db74">/&lt;/g</span>, <span style="color:#e6db74">&#34;&amp;lt;&#34;</span>)
</span></span><span style="display:flex;"><span>           .<span style="color:#a6e22e">replace</span>(<span style="color:#e6db74">/&gt;/g</span>, <span style="color:#e6db74">&#34;&amp;gt;&#34;</span>)
</span></span><span style="display:flex;"><span>           .<span style="color:#a6e22e">replace</span>(<span style="color:#e6db74">/&#34;/g</span>, <span style="color:#e6db74">&#34;&amp;quot;&#34;</span>)
</span></span><span style="display:flex;"><span>           .<span style="color:#a6e22e">replace</span>(<span style="color:#e6db74">/&#39;/g</span>, <span style="color:#e6db74">&#34;&amp;#039;&#34;</span>);
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">function</span> <span style="color:#a6e22e">emojify</span>(<span style="color:#a6e22e">input</span>, <span style="color:#a6e22e">emojis</span>) {
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">output</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">input</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">emojis</span>.<span style="color:#a6e22e">forEach</span>(<span style="color:#a6e22e">emoji</span> =&gt; {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">picture</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">createElement</span>(<span style="color:#e6db74">&#34;picture&#34;</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">source</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">createElement</span>(<span style="color:#e6db74">&#34;source&#34;</span>);
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">source</span>.<span style="color:#a6e22e">setAttribute</span>(<span style="color:#e6db74">&#34;srcset&#34;</span>, <span style="color:#a6e22e">escapeHtml</span>(<span style="color:#a6e22e">emoji</span>.<span style="color:#a6e22e">url</span>));
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">source</span>.<span style="color:#a6e22e">setAttribute</span>(<span style="color:#e6db74">&#34;media&#34;</span>, <span style="color:#e6db74">&#34;(prefers-reduced-motion: no-preference)&#34;</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">img</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">createElement</span>(<span style="color:#e6db74">&#34;img&#34;</span>);
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">img</span>.<span style="color:#a6e22e">className</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;emoji&#34;</span>;
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">img</span>.<span style="color:#a6e22e">setAttribute</span>(<span style="color:#e6db74">&#34;src&#34;</span>, <span style="color:#a6e22e">escapeHtml</span>(<span style="color:#a6e22e">emoji</span>.<span style="color:#a6e22e">static_url</span>));
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">img</span>.<span style="color:#a6e22e">setAttribute</span>(<span style="color:#e6db74">&#34;alt&#34;</span>, <span style="color:#e6db74">`:</span><span style="color:#e6db74">${</span> <span style="color:#a6e22e">emoji</span>.<span style="color:#a6e22e">shortcode</span> <span style="color:#e6db74">}</span><span style="color:#e6db74">:`</span>);
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">img</span>.<span style="color:#a6e22e">setAttribute</span>(<span style="color:#e6db74">&#34;title&#34;</span>, <span style="color:#e6db74">`:</span><span style="color:#e6db74">${</span> <span style="color:#a6e22e">emoji</span>.<span style="color:#a6e22e">shortcode</span> <span style="color:#e6db74">}</span><span style="color:#e6db74">:`</span>);
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">img</span>.<span style="color:#a6e22e">setAttribute</span>(<span style="color:#e6db74">&#34;width&#34;</span>, <span style="color:#e6db74">&#34;20&#34;</span>);
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">img</span>.<span style="color:#a6e22e">setAttribute</span>(<span style="color:#e6db74">&#34;height&#34;</span>, <span style="color:#e6db74">&#34;20&#34;</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">picture</span>.<span style="color:#a6e22e">appendChild</span>(<span style="color:#a6e22e">source</span>);
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">picture</span>.<span style="color:#a6e22e">appendChild</span>(<span style="color:#a6e22e">img</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">output</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">output</span>.<span style="color:#a6e22e">replace</span>(<span style="color:#e6db74">`:</span><span style="color:#e6db74">${</span> <span style="color:#a6e22e">emoji</span>.<span style="color:#a6e22e">shortcode</span> <span style="color:#e6db74">}</span><span style="color:#e6db74">:`</span>, <span style="color:#a6e22e">picture</span>.<span style="color:#a6e22e">outerHTML</span>);
</span></span><span style="display:flex;"><span>      });
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">output</span>;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">function</span> <span style="color:#a6e22e">loadComments</span>() {
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">commentsWrapper</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">getElementById</span>(<span style="color:#e6db74">&#34;comments-wrapper&#34;</span>);
</span></span><span style="display:flex;"><span>      document.<span style="color:#a6e22e">getElementById</span>(<span style="color:#e6db74">&#34;load-comment&#34;</span>).<span style="color:#a6e22e">innerHTML</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;Loading&#34;</span>;
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">fetch</span>(<span style="color:#e6db74">&#39;https://{{ .host }}/api/v1/statuses/{{ .id }}/context&#39;</span>)
</span></span><span style="display:flex;"><span>        .<span style="color:#a6e22e">then</span>(<span style="color:#66d9ef">function</span>(<span style="color:#a6e22e">response</span>) {
</span></span><span style="display:flex;"><span>          <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">response</span>.<span style="color:#a6e22e">json</span>();
</span></span><span style="display:flex;"><span>        })
</span></span><span style="display:flex;"><span>        .<span style="color:#a6e22e">then</span>(<span style="color:#66d9ef">function</span>(<span style="color:#a6e22e">data</span>) {
</span></span><span style="display:flex;"><span>          <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">descendants</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">data</span>[<span style="color:#e6db74">&#39;descendants&#39;</span>];
</span></span><span style="display:flex;"><span>          <span style="color:#66d9ef">if</span>(
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">descendants</span> <span style="color:#f92672">&amp;&amp;</span>
</span></span><span style="display:flex;"><span>            Array.<span style="color:#a6e22e">isArray</span>(<span style="color:#a6e22e">descendants</span>) <span style="color:#f92672">&amp;&amp;</span>
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">descendants</span>.<span style="color:#a6e22e">length</span> <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>
</span></span><span style="display:flex;"><span>          ) {
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">commentsWrapper</span>.<span style="color:#a6e22e">innerHTML</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;&#34;</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">descendants</span>.<span style="color:#a6e22e">forEach</span>(<span style="color:#66d9ef">function</span>(<span style="color:#a6e22e">status</span>) {
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#a6e22e">descendants</span>)
</span></span><span style="display:flex;"><span>              <span style="color:#66d9ef">if</span>( <span style="color:#a6e22e">status</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">display_name</span>.<span style="color:#a6e22e">length</span> <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span> ) {
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">status</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">display_name</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">escapeHtml</span>(<span style="color:#a6e22e">status</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">display_name</span>);
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">status</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">display_name</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">emojify</span>(<span style="color:#a6e22e">status</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">display_name</span>, <span style="color:#a6e22e">status</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">emojis</span>);
</span></span><span style="display:flex;"><span>              } <span style="color:#66d9ef">else</span> {
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">status</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">display_name</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">status</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">username</span>;
</span></span><span style="display:flex;"><span>              };
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>              <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">instance</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;&#34;</span>;
</span></span><span style="display:flex;"><span>              <span style="color:#66d9ef">if</span>( <span style="color:#a6e22e">status</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">acct</span>.<span style="color:#a6e22e">includes</span>(<span style="color:#e6db74">&#34;@&#34;</span>) ) {
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">instance</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">status</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">acct</span>.<span style="color:#a6e22e">split</span>(<span style="color:#e6db74">&#34;@&#34;</span>)[<span style="color:#ae81ff">1</span>];
</span></span><span style="display:flex;"><span>              } <span style="color:#66d9ef">else</span> {
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">instance</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;{{ .host }}&#34;</span>;
</span></span><span style="display:flex;"><span>              }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>              <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">isReply</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">status</span>.<span style="color:#a6e22e">in_reply_to_id</span> <span style="color:#f92672">!==</span> <span style="color:#e6db74">&#34;{{ .id }}&#34;</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>              <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">op</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">false</span>;
</span></span><span style="display:flex;"><span>              <span style="color:#66d9ef">if</span>( <span style="color:#a6e22e">status</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">acct</span> <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;{{ .username }}&#34;</span> ) {
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">op</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">true</span>;
</span></span><span style="display:flex;"><span>              }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">status</span>.<span style="color:#a6e22e">content</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">emojify</span>(<span style="color:#a6e22e">status</span>.<span style="color:#a6e22e">content</span>, <span style="color:#a6e22e">status</span>.<span style="color:#a6e22e">emojis</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>              <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">avatarSource</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">createElement</span>(<span style="color:#e6db74">&#34;source&#34;</span>);
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">avatarSource</span>.<span style="color:#a6e22e">setAttribute</span>(<span style="color:#e6db74">&#34;srcset&#34;</span>, <span style="color:#a6e22e">escapeHtml</span>(<span style="color:#a6e22e">status</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">avatar</span>));
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">avatarSource</span>.<span style="color:#a6e22e">setAttribute</span>(<span style="color:#e6db74">&#34;media&#34;</span>, <span style="color:#e6db74">&#34;(prefers-reduced-motion: no-preference)&#34;</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>              <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">avatarImg</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">createElement</span>(<span style="color:#e6db74">&#34;img&#34;</span>);
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">avatarImg</span>.<span style="color:#a6e22e">className</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;avatar&#34;</span>;
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">avatarImg</span>.<span style="color:#a6e22e">setAttribute</span>(<span style="color:#e6db74">&#34;src&#34;</span>, <span style="color:#a6e22e">escapeHtml</span>(<span style="color:#a6e22e">status</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">avatar_static</span>));
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">avatarImg</span>.<span style="color:#a6e22e">setAttribute</span>(<span style="color:#e6db74">&#34;alt&#34;</span>, <span style="color:#e6db74">`@</span><span style="color:#e6db74">${</span> <span style="color:#a6e22e">status</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">username</span> <span style="color:#e6db74">}</span><span style="color:#e6db74">@</span><span style="color:#e6db74">${</span> <span style="color:#a6e22e">instance</span> <span style="color:#e6db74">}</span><span style="color:#e6db74"> avatar`</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>              <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">avatarPicture</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">createElement</span>(<span style="color:#e6db74">&#34;picture&#34;</span>);
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">avatarPicture</span>.<span style="color:#a6e22e">appendChild</span>(<span style="color:#a6e22e">avatarSource</span>);
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">avatarPicture</span>.<span style="color:#a6e22e">appendChild</span>(<span style="color:#a6e22e">avatarImg</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>              <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">avatar</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">createElement</span>(<span style="color:#e6db74">&#34;a&#34;</span>);
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">avatar</span>.<span style="color:#a6e22e">className</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;avatar-link&#34;</span>;
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">avatar</span>.<span style="color:#a6e22e">setAttribute</span>(<span style="color:#e6db74">&#34;href&#34;</span>, <span style="color:#a6e22e">status</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">url</span>);
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">avatar</span>.<span style="color:#a6e22e">setAttribute</span>(<span style="color:#e6db74">&#34;rel&#34;</span>, <span style="color:#e6db74">&#34;external nofollow&#34;</span>);
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">avatar</span>.<span style="color:#a6e22e">setAttribute</span>(<span style="color:#e6db74">&#34;title&#34;</span>, <span style="color:#e6db74">`View profile at @</span><span style="color:#e6db74">${</span> <span style="color:#a6e22e">status</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">username</span> <span style="color:#e6db74">}</span><span style="color:#e6db74">@</span><span style="color:#e6db74">${</span> <span style="color:#a6e22e">instance</span> <span style="color:#e6db74">}</span><span style="color:#e6db74">`</span>);
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">avatar</span>.<span style="color:#a6e22e">appendChild</span>(<span style="color:#a6e22e">avatarPicture</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>              <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">instanceBadge</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">createElement</span>(<span style="color:#e6db74">&#34;a&#34;</span>);
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">instanceBadge</span>.<span style="color:#a6e22e">className</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;instance&#34;</span>;
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">instanceBadge</span>.<span style="color:#a6e22e">setAttribute</span>(<span style="color:#e6db74">&#34;href&#34;</span>, <span style="color:#a6e22e">status</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">url</span>);
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">instanceBadge</span>.<span style="color:#a6e22e">setAttribute</span>(<span style="color:#e6db74">&#34;title&#34;</span>, <span style="color:#e6db74">`@</span><span style="color:#e6db74">${</span> <span style="color:#a6e22e">status</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">username</span> <span style="color:#e6db74">}</span><span style="color:#e6db74">@</span><span style="color:#e6db74">${</span> <span style="color:#a6e22e">instance</span> <span style="color:#e6db74">}</span><span style="color:#e6db74">`</span>);
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">instanceBadge</span>.<span style="color:#a6e22e">setAttribute</span>(<span style="color:#e6db74">&#34;rel&#34;</span>, <span style="color:#e6db74">&#34;external nofollow&#34;</span>);
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">instanceBadge</span>.<span style="color:#a6e22e">textContent</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">instance</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>              <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">display</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">createElement</span>(<span style="color:#e6db74">&#34;span&#34;</span>);
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">display</span>.<span style="color:#a6e22e">className</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;display&#34;</span>;
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">display</span>.<span style="color:#a6e22e">setAttribute</span>(<span style="color:#e6db74">&#34;itemprop&#34;</span>, <span style="color:#e6db74">&#34;author&#34;</span>);
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">display</span>.<span style="color:#a6e22e">setAttribute</span>(<span style="color:#e6db74">&#34;itemtype&#34;</span>, <span style="color:#e6db74">&#34;http://schema.org/Person&#34;</span>);
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">display</span>.<span style="color:#a6e22e">innerHTML</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">status</span>.<span style="color:#a6e22e">account</span>.<span style="color:#a6e22e">display_name</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>              <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">header</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">createElement</span>(<span style="color:#e6db74">&#34;header&#34;</span>);
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">header</span>.<span style="color:#a6e22e">className</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;author&#34;</span>;
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">header</span>.<span style="color:#a6e22e">appendChild</span>(<span style="color:#a6e22e">display</span>);
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">header</span>.<span style="color:#a6e22e">appendChild</span>(<span style="color:#a6e22e">instanceBadge</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>              <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">permalink</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">createElement</span>(<span style="color:#e6db74">&#34;a&#34;</span>);
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">permalink</span>.<span style="color:#a6e22e">setAttribute</span>(<span style="color:#e6db74">&#34;href&#34;</span>, <span style="color:#a6e22e">status</span>.<span style="color:#a6e22e">url</span>);
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">permalink</span>.<span style="color:#a6e22e">setAttribute</span>(<span style="color:#e6db74">&#34;itemprop&#34;</span>, <span style="color:#e6db74">&#34;url&#34;</span>);
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">permalink</span>.<span style="color:#a6e22e">setAttribute</span>(<span style="color:#e6db74">&#34;title&#34;</span>, <span style="color:#e6db74">`View comment at </span><span style="color:#e6db74">${</span> <span style="color:#a6e22e">instance</span> <span style="color:#e6db74">}</span><span style="color:#e6db74">`</span>);
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">permalink</span>.<span style="color:#a6e22e">setAttribute</span>(<span style="color:#e6db74">&#34;rel&#34;</span>, <span style="color:#e6db74">&#34;external nofollow&#34;</span>);
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">permalink</span>.<span style="color:#a6e22e">textContent</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> Date( <span style="color:#a6e22e">status</span>.<span style="color:#a6e22e">created_at</span> ).<span style="color:#a6e22e">toLocaleString</span>(<span style="color:#e6db74">&#39;en-US&#39;</span>, {
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">dateStyle</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;long&#34;</span>,
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">timeStyle</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;short&#34;</span>,
</span></span><span style="display:flex;"><span>              });
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>              <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">timestamp</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">createElement</span>(<span style="color:#e6db74">&#34;time&#34;</span>);
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">timestamp</span>.<span style="color:#a6e22e">setAttribute</span>(<span style="color:#e6db74">&#34;datetime&#34;</span>, <span style="color:#a6e22e">status</span>.<span style="color:#a6e22e">created_at</span>);
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">timestamp</span>.<span style="color:#a6e22e">appendChild</span>(<span style="color:#a6e22e">permalink</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>              <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">main</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">createElement</span>(<span style="color:#e6db74">&#34;main&#34;</span>);
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">main</span>.<span style="color:#a6e22e">setAttribute</span>(<span style="color:#e6db74">&#34;itemprop&#34;</span>, <span style="color:#e6db74">&#34;text&#34;</span>);
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">main</span>.<span style="color:#a6e22e">innerHTML</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">status</span>.<span style="color:#a6e22e">content</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>              <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">interactions</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">createElement</span>(<span style="color:#e6db74">&#34;footer&#34;</span>);
</span></span><span style="display:flex;"><span>              <span style="color:#66d9ef">if</span>(<span style="color:#a6e22e">status</span>.<span style="color:#a6e22e">favourites_count</span> <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>) {
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">faves</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">createElement</span>(<span style="color:#e6db74">&#34;a&#34;</span>);
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">faves</span>.<span style="color:#a6e22e">className</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;faves&#34;</span>;
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">faves</span>.<span style="color:#a6e22e">setAttribute</span>(<span style="color:#e6db74">&#34;href&#34;</span>, <span style="color:#e6db74">`</span><span style="color:#e6db74">${</span> <span style="color:#a6e22e">status</span>.<span style="color:#a6e22e">url</span> <span style="color:#e6db74">}</span><span style="color:#e6db74">/favourites`</span>);
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">faves</span>.<span style="color:#a6e22e">setAttribute</span>(<span style="color:#e6db74">&#34;title&#34;</span>, <span style="color:#e6db74">`Favorites from </span><span style="color:#e6db74">${</span> <span style="color:#a6e22e">instance</span> <span style="color:#e6db74">}</span><span style="color:#e6db74">`</span>);
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">faves</span>.<span style="color:#a6e22e">textContent</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">status</span>.<span style="color:#a6e22e">favourites_count</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">interactions</span>.<span style="color:#a6e22e">appendChild</span>(<span style="color:#a6e22e">faves</span>);
</span></span><span style="display:flex;"><span>              }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>              <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">comment</span> <span style="color:#f92672">=</span> document.<span style="color:#a6e22e">createElement</span>(<span style="color:#e6db74">&#34;article&#34;</span>);
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">comment</span>.<span style="color:#a6e22e">id</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">`comment-</span><span style="color:#e6db74">${</span> <span style="color:#a6e22e">status</span>.<span style="color:#a6e22e">id</span> <span style="color:#e6db74">}</span><span style="color:#e6db74">`</span>;
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">comment</span>.<span style="color:#a6e22e">className</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">isReply</span> <span style="color:#f92672">?</span> <span style="color:#e6db74">&#34;comment comment-reply&#34;</span> <span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;comment&#34;</span>;
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">comment</span>.<span style="color:#a6e22e">setAttribute</span>(<span style="color:#e6db74">&#34;itemprop&#34;</span>, <span style="color:#e6db74">&#34;comment&#34;</span>);
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">comment</span>.<span style="color:#a6e22e">setAttribute</span>(<span style="color:#e6db74">&#34;itemtype&#34;</span>, <span style="color:#e6db74">&#34;http://schema.org/Comment&#34;</span>);
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">comment</span>.<span style="color:#a6e22e">appendChild</span>(<span style="color:#a6e22e">avatar</span>);
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">comment</span>.<span style="color:#a6e22e">appendChild</span>(<span style="color:#a6e22e">header</span>);
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">comment</span>.<span style="color:#a6e22e">appendChild</span>(<span style="color:#a6e22e">timestamp</span>);
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">comment</span>.<span style="color:#a6e22e">appendChild</span>(<span style="color:#a6e22e">main</span>);
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">comment</span>.<span style="color:#a6e22e">appendChild</span>(<span style="color:#a6e22e">interactions</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>              <span style="color:#66d9ef">if</span>(<span style="color:#a6e22e">op</span> <span style="color:#f92672">===</span> <span style="color:#66d9ef">true</span>) {
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">comment</span>.<span style="color:#a6e22e">classList</span>.<span style="color:#a6e22e">add</span>(<span style="color:#e6db74">&#34;op&#34;</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">avatar</span>.<span style="color:#a6e22e">classList</span>.<span style="color:#a6e22e">add</span>(<span style="color:#e6db74">&#34;op&#34;</span>);
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">avatar</span>.<span style="color:#a6e22e">setAttribute</span>(
</span></span><span style="display:flex;"><span>                  <span style="color:#e6db74">&#34;title&#34;</span>,
</span></span><span style="display:flex;"><span>                  <span style="color:#e6db74">&#34;Blog post author; &#34;</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">avatar</span>.<span style="color:#a6e22e">getAttribute</span>(<span style="color:#e6db74">&#34;title&#34;</span>)
</span></span><span style="display:flex;"><span>                );
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">instanceBadge</span>.<span style="color:#a6e22e">classList</span>.<span style="color:#a6e22e">add</span>(<span style="color:#e6db74">&#34;op&#34;</span>);
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">instanceBadge</span>.<span style="color:#a6e22e">setAttribute</span>(
</span></span><span style="display:flex;"><span>                  <span style="color:#e6db74">&#34;title&#34;</span>,
</span></span><span style="display:flex;"><span>                  <span style="color:#e6db74">&#34;Blog post author: &#34;</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">instanceBadge</span>.<span style="color:#a6e22e">getAttribute</span>(<span style="color:#e6db74">&#34;title&#34;</span>)
</span></span><span style="display:flex;"><span>                );
</span></span><span style="display:flex;"><span>              }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">commentsWrapper</span>.<span style="color:#a6e22e">innerHTML</span> <span style="color:#f92672">+=</span> <span style="color:#a6e22e">DOMPurify</span>.<span style="color:#a6e22e">sanitize</span>(<span style="color:#a6e22e">comment</span>.<span style="color:#a6e22e">outerHTML</span>);
</span></span><span style="display:flex;"><span>            });
</span></span><span style="display:flex;"><span>          }
</span></span><span style="display:flex;"><span>        });
</span></span><span style="display:flex;"><span>      }
</span></span><span style="display:flex;"><span>      document.<span style="color:#a6e22e">getElementById</span>(<span style="color:#e6db74">&#34;load-comment&#34;</span>).<span style="color:#a6e22e">addEventListener</span>(<span style="color:#e6db74">&#34;click&#34;</span>, <span style="color:#a6e22e">loadComments</span>);
</span></span><span style="display:flex;"><span>  &lt;/<span style="color:#f92672">script</span>&gt;
</span></span><span style="display:flex;"><span>&lt;/<span style="color:#f92672">section</span>&gt;
</span></span><span style="display:flex;"><span>{{ end }}
</span></span></code></pre></div><p>Hay que saber dos cositas más. Es necesario usar <a href="https://github.com/cure53/DOMPurify">DOMPurify</a> para limpiar un poco el input de los comentarios que se van a cargar con el script. En las primeras líneas se hace referencia al archivo de JavaScript <code>purify.min.js</code>. En el blog, este archivo debería ser accesible en <code>/assets/js/purify.min.js</code>.</p>
<p><code># /layouts/partials/comments.html</code></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span>&lt;<span style="color:#f92672">script</span> <span style="color:#a6e22e">src</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;/assets/js/purify.min.js&#34;</span>&gt;&lt;/<span style="color:#f92672">script</span>&gt;
</span></span><span style="display:flex;"><span>&lt;<span style="color:#f92672">script</span> <span style="color:#a6e22e">type</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;text/javascript&#34;</span>&gt;
</span></span></code></pre></div><p><code>purify.min.js</code> se puede descargar del <a href="https://github.com/cure53/DOMPurify">repo de DOMPurify</a>. El enlace concreto es <a href="https://github.com/cure53/DOMPurify/blob/main/dist/purify.min.js">este</a>. Pues nada, para que al compilar la web con Hugo, sea accesible en la ruta correcta, tenemos que copiar <code>purify.min.js</code> en <code>/static/assets/js/purify.min.js</code>, porque, recuerdo, todo lo que esté en la carpeta <code>/static/</code>, acabará en la raíz <code>/</code> del blog al compilarlo con el comando <code>hugo</code>.</p>
<p>Muy bien, ahora el único problemilla es que funciona, pero queda todo bastante feo. Falta el css. Este paso me ha costado un pelín, porque <a href="https://carlschwan.eu/">Carl Schwan</a> comparte <a href="https://gitlab.com/ognarb/blog/-/blob/master/assets/scss/partials/article.scss#L310">sus hojas de estilos escritos en SCSS</a>, no en CSS. Para usarlas en Hugo sin instalar nada adicional hay que compilarlas a CSS. Lo he dejado hecho <a href="https://codeberg.org/peps/hugo-newspaper/src/branch/master/assets/css/comments.css">aquí</a> con unas pequeñas modificaciones para usarlo directamente. De todos modos, si os da curiosidad, como se compila un SCSS, se explica en <a href="https://sass-lang.com/guide/">la web del lenguaje SASS</a>. Yo no tenía ni idea, la verdad.</p>
<p>El archivo <code>comments.css</code> puede ir en cualquier lugar, como en <code>/static/css/comments.css</code>, y hay que referenciarlo en el html del blog de este modo (esto puede escribirse perfectamente en algún sitio de <code>comments.html</code>).</p>
<p><code># /layouts/partials/comments.html</code></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span>&lt;<span style="color:#f92672">link</span> <span style="color:#a6e22e">rel</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;stylesheet&#34;</span> <span style="color:#a6e22e">href</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;{{ .Site.BaseURL }}/css/comments.css&#34;</span>&gt;
</span></span></code></pre></div><p>Aquí se usa <code>{{ .Site.BaseURL }}</code> para que al compilar el blog, el <code>href</code> quede tal que así <code>href=&quot;https://sudodnf.com/css/comments.css&quot;</code>. Con esto, lo único que falta, es modificar la configuración en <code>hugo.yaml</code>, y poner lo siguiente en la sección <code>params</code>.</p>
<p><code># /hugo.yaml</code></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">params</span>:
</span></span><span style="display:flex;"><span>	<span style="color:#f92672">comments</span>: <span style="color:#66d9ef">true</span>
</span></span></code></pre></div><p>Y ahora, en el YAML de cada entrada del blog, agregar el enlace de un toot de Mastodon, que es de donde se van a buscar los comentarios al pulsar el botón.</p>
<p><code># /content/articulo.md</code></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span>---
</span></span><span style="display:flex;"><span><span style="color:#f92672">comments</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">host</span>: <span style="color:#ae81ff">masto.es</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">username</span>: <span style="color:#ae81ff">peps</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">id</span>: <span style="color:#ae81ff">109774012599031406</span>
</span></span><span style="display:flex;"><span>---
</span></span></code></pre></div><p>Así queda todo listo. De todos modos, el <a href="https://code.renegade.es/peps/blog/src/branch/main">código fuente de este blog</a> es accesible, y si no, <a href="https://carlschwan.eu/2020/12/29/adding-comments-to-your-static-blog-with-mastodon/">la entrada de Carl</a> y <a href="https://gohugo.io/documentation/">la documentación de Hugo</a> deberían servir para resolver dudas. También podéis preguntar o escribir cualquier cosilla en la sección de comentarios, guiño guiño.</p>
<p>Y con esto y un bizcocho…</p>
]]></content:encoded>
    </item>
    <item>
      <title>Mi búsqueda de la soberanía digital en 2025</title>
      <link>https://renegade.es/articulos/mi-busqueda-de-la-soberania-digital-en-2025/</link>
      <pubDate>Wed, 07 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://renegade.es/articulos/mi-busqueda-de-la-soberania-digital-en-2025/</guid>
      <description>&lt;h3 id=&#34;introducción&#34;&gt;Introducción&lt;/h3&gt;
&lt;p&gt;Este 2025 ha sido un año en el que he aprendido muchísimas cosas y me he concienciado mucho sobre la dependencia que tenemos en tecnologías y servicios estadounidenses. Si hace un año el tema estaba caldeado, creo que ahora nadie puede negar que migrar hacía la soberanía digital europea es un movimiento que vamos a tener que hacer si no queremos depender de cualquier zumbado del otro lado del charco.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h3 id="introducción">Introducción</h3>
<p>Este 2025 ha sido un año en el que he aprendido muchísimas cosas y me he concienciado mucho sobre la dependencia que tenemos en tecnologías y servicios estadounidenses. Si hace un año el tema estaba caldeado, creo que ahora nadie puede negar que migrar hacía la soberanía digital europea es un movimiento que vamos a tener que hacer si no queremos depender de cualquier zumbado del otro lado del charco.</p>
<p>Por eso mismo, he pasado el último año aprendiendo y tratando de migrar todo lo que uso a alternativas o europeas o más privadas. Entre los servicios que usaba se encuentran bastantes de Google. Gmail y Drive siendo los servicios más importantes para mí. También usaba bastante Calendar, Photos o Maps.</p>
<p>También he tratado de depender menos de Microsoft. Este año ha sido mi primer año a tope con Linux, sin tener en cuenta que en el trabajo sigo usando Windows y Office. En principio Office debería de poderse sustituir fácilmente por <a href="https://www.libreoffice.org/">LibreOffice</a> y así es, pero si le mando a mis jefes un texto en .odt en vez de .docx y haya algo movido por culpa de no usar Word, seguro que les da algo. Hay luchas en las que es mejor no entrar y creo que el software que se usa para trabajar es una de ellas. En esto, estoy convencido de que el tiempo me dará la razón.</p>
<h3 id="self-host">Self-host</h3>
<p>En la búsqueda de alternativas y huyendo un poco de las empresas tecnológicas estadounidenses acabé descubriendo el mundo del self-host y todas las alternativas de código abierto que existen. A finales de 2024 me hice con una Raspberry Pi 5 y compré mi primer dominio, <a href="https://sudodnf.com">sudodnf.com</a>. No es el mejor nombre del mundo pero es de los pocos que se me ocurrieron y me convencía para probar. Gracias a eso he podido aprender a hostear un blog, el cual no uso, pero fue muy divertido montarlo y ver como funciona.</p>
<p>Aunque siendo sincero, lo que me hizo tomar esa decisión fue descubrir <a href="https://nextcloud.com/">Nextcloud</a> y su imagen de Docker <a href="https://github.com/nextcloud/all-in-one">Nextcloud AIO</a>, que es una alternativa directa a los servicios de Google super fácil de configurar en una Raspberry Pi (digo esto tras pasar horas teniendo que aprender a usar la Raspberry, aprender Docker de cero, aprender sobre reverse proxys y leer mucha documentación de todo lo que hago, una movida…).</p>
<p>El caso es que descubrir nuevas alternativas e intentar hostearlas en mi propia máquina ha sido uno de mis hobbies este último año, no por que me haya vuelto uno de los diez locos y no quiera dar mis datos a nadie, si soy un zumbado que ni redes sociales tiene, si no porque aprender cosas que puedo poner en práctica me parece algo genuinamente divertido.</p>
<p>Para hacer un resumen de que estoy corriendo en casa desde este último año que me parece interesante dejo por aquí una pequeña lista con enlaces:</p>
<ul>
<li>Nextcloud <a href="https://nextcloud.com/">Web</a>, <a href="https://github.com/nextcloud/all-in-one">Docker</a> (Reemplazo toda la suite de Google. Fuck Google.)</li>
<li>Forgejo <a href="https://forgejo.org/">Web</a>, <a href="https://forgejo.org/docs/latest/admin/installation/docker/">Docker</a> (Reemplazo de Github. Fuck Microsoft.)</li>
<li>Vaultwarden <a href="https://github.com/dani-garcia/vaultwarden">Repo</a> (Gestor de contraseñas reemplazo de Bitwarden)</li>
<li>Ejabberd <a href="https://www.ejabberd.im/">Web</a>, <a href="https://docs.ejabberd.im/CONTAINER/">Docker</a> (Reemplazo de WhatsApp. Fuck Meta. Aunque quizás montar un servidor XMPP en casa es algo más avanzado y no tan recomendable, es de lo que más uso.)</li>
</ul>
<p>Este año, hemos instalado en casa placas solares, por lo que además de que una Raspberry consume nada (calculo que unos 7 € de luz al año), en concreto la mía está 100 % corriendo con energía solar, así que también Fuck empresas eléctricas supongo. Todo esto que tengo montado es sostenible y tenerlo corriendo 24/7 tiene 0 impacto para el medio ambiente, lo cual mola mucho y me anima bastante.</p>
<p>Hay cosas que no se puede o no tiene sentido hostear por uno mismo, pero incluso en eso es posible buscar alternativas, creo que el mayor ejemplo que existe de esto es como he abandonado las redes sociales y ahora tengo mi cuenta de Mastodon en <a href="https://masto.es">masto.es</a>. O en vez de GitHub, se puede usar <a href="https://codeberg.org">Codeberg</a> (Alemania).</p>
<h3 id="videojuegos">Videojuegos</h3>
<p>Este último año estoy comprando más videojuegos en <a href="https://www.gog.com/">GOG</a>, una tienda de videojuegos digitales basada en Polonia donde todo lo que compras viene sin DRM. Esto es un tema aparte, pero básicamente te dan los archivos del juego sin restricciones de ningún tipo para descargarlos ni jugarlos ni nada. Steam me gusta, pero seguimos dependiendo en que no se vuelva un villano o nos prohíba el acceso a lo que hemos comprado. En GOG eso da igual, lo que has comprado te lo descargas y es tuyo, aunque GOG explote vas a seguir teniendo tus juegos. Eso mola.</p>
<h2 id="mail">Mail</h2>
<p>Una cosa que no quiero hostear en casa son los servidores de mail. Se que es posible, pero el mail es una cosa en la que tengo que poder depender. He ido explorando alternativas y de entre las gratuitas y basadas en Europa me he quedado con Infomaniak (Suiza), que ha pasado a ser mi mail principal, pero aún mantengo mis cuentas de Gmail. La solución ideal creo que sería tener un dominio propio para mails y usar Infomaniak o Tuta (Alemania) como servidor, pero esto cuesta dinero y de momento no se me ocurre ningún nombre de dominio que quiera usar.</p>
<h3 id="planes-a-futuro">Planes a futuro</h3>
<p>De momento sudodnf.com ha sido renovado un año más, por lo que tengo todo este 2026 para pensar en nombres, pero sí que me gustaría tener un nuevo dominio este año más premeditado, para poner por lo menos todas las cosas hosteadas que tengo. Y opcional, pero que sería ideal sería tener dominios independientes para el blog y otro para mails, que en verdad los .es son la mitad de baratos que los .com y tampoco me costaría más.</p>
<p>Para concluir, 2025 ha sido un año de aprender y de construir, pero eso tampoco quiere decir que todo sea perfecto. Por ello, este 2026 me gustaría afinar todo lo que ya tengo para que sea más robusto y fácil de mantener a largo plazo. Y por mi parte, ser más consciente con las cosas que compro y utilizo en mi día a día. Aunque parezca que no, existen alternativas mejores para todo.</p>
]]></content:encoded>
    </item>
    <item>
      <title>SaaSS como estilo de vida</title>
      <link>https://renegade.es/articulos/sass-como-estilo-de-vida/</link>
      <pubDate>Fri, 21 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://renegade.es/articulos/sass-como-estilo-de-vida/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Service as a Software Substitute, or SaaSS, is another way to give someone else power over your computing&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;— Richard Stallman (&lt;a href=&#34;https://www.gnu.org/philosophy/who-does-that-server-really-serve.en.html&#34;&gt;GNU Project&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;No se si os pasa lo mismo, pero tengo la impresión de que internet antes molaba. Se sentía como magia cuando aparecieron servicios como Google Drive o Dropbox y podías guardar tus archivos allí, en la «nube» y no tener que llevar más un pen drive para guardarte tus cosillas.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p><em>Service as a Software Substitute, or SaaSS, is another way to give someone else power over your computing</em></p>
<p>— Richard Stallman (<a href="https://www.gnu.org/philosophy/who-does-that-server-really-serve.en.html">GNU Project</a>)</p>
</blockquote>
<p>No se si os pasa lo mismo, pero tengo la impresión de que internet antes molaba. Se sentía como magia cuando aparecieron servicios como Google Drive o Dropbox y podías guardar tus archivos allí, en la «nube» y no tener que llevar más un pen drive para guardarte tus cosillas.</p>
<p>Después de estar años acostumbrados a Word y a trabajar en local, de repente podías editar documentos con otras personas usando un Google Docs o más tarde Microsoft 365. ¿Para qué usar PowerPoint cuando puedes usar Canva que es igual, pero gratis, en internet y más bonito? La gente en el instituto y la universidad se volvía loca haciendo presentaciones saturadísimas con un montón de stickers y animaciones. Magia…</p>
<p>Cuando descubrí Notion hace unos años me encantó. Es un bloc de notas super completo: fotos, iconos, notas dentro de notas y bases de datos en forma de tablita. La ostia. La aplicación móvil no estaba mal, pero la de escritorio era increíble y siempre sincronizado en tus dispositivos. Empecé a usarlo para todo. ¿La lista de videojuegos jugados y por jugar que tenía en un archivo de texto? Una base de datos. ¿La organización de las vacaciones? Una nota super chachi con un mapa interactivo incrustado y un par de listas. Notion sirve para todo.</p>
<p>Dicho así parece que os estoy vendiendo Notion, pero no, no os equivoquéis. Notion tiene un pequeño gran problema. No se puede usar sin internet. Es una cosa sin mucha importancia, si total, siempre tenemos acceso a internet. Siempre estamos conectados. Parece algo trivial, ya que cada vez más servicios lo requieren. Para mí también lo era, hasta que me empecé a preguntar por qué eso es así. ¿Por qué no puedo abrir sin internet unos archivitos que solo contienen un par de párrafos de texto y que deben de pesar uno o dos kilobytes?</p>
<p>La respuesta es fácil. Tus archivos no se guardan en tu ordenador. Están guardados en el algún lugar abstracto que llamamos nube y que cada vez se utiliza más como un término confuso para confundir a los usuarios. La nube no es un ente abstracto y nuestros datos no van volando por el cielo, libres y sin rumbo hasta que accedemos a ellos, no. La nube es simplemente el ordenador de otra persona. Haciendo una búsqueda rápida, todas las webs de Notion y la aplicación web que usamos en el navegador resuelven en las IPs de Notion Labs, Inc. en en San Francisco.</p>
<p>Si lo piensas es una locura. Hemos estado meses creando notas en Notion para que se guarden en un servidor en San Francisco a las que, si quieremos acceder, hay que pedir de vuelta por internet porque ni siquiera las tenemos descargadas en local. No es que se guarde una copia de seguridad allí, es que solo están allí. Es cierto que se pueden exportarlas, pero a mi toda esta situación me genera más preguntas que respuestas.</p>
<p>El tema es que Notion no es el villano aquí, son solo un reflejo de lo que está ocurriendo a un nivel más general. Poco a poco se han ido reemplazando los programas en local con SaaSS (<em>Service as a Software Substitute</em>). Todos esto servicios almacenan la información en sus servidores y la mayoría de ellos comienzan siendo super mega guays, pero estas cantinelas ya nos las conocemos. Empiezan siendo gratis y enfocándose en que la experiencia de usuario sea increíble, mientras que poco a poco meten suscripciones de pago, y esconden la suscripción gratis en una esquinita perdida. Llega un momento en el que tú solo quieres usar la aplicación, pero cada vez es más difícil esquivar la publicidad y los botoncitos para que pagues. Nos hacen sentir como si fuésemos unas sucias ratas que a las que les parece mucho 9.90 $ al mes por poder poner stickers más grandes, borrar el fondo de imágenes o tocar un botón y dejar que una IA se invente algunos párrafos con referencias falsas porque no sabe de que va tu presentación.</p>
<p>El problema aquí es que, como usuarios, cada vez tenemos menos control sobre nuestros datos y sobre los programas que utilizamos para llevar a cabo nuestras tareas. No sabemos quien tiene acceso a nuestros archivos, qué procesos realmente lleva a cabo el servidor donde se guardan nuestros datos, o cosas tan sencillas como saber si la contraseña que hemos usado para entrar en la página web se guarda tal cual en la base de datos con los futuros problemas que un leak podría causarnos.</p>
<p>¿En un mundo así, qué nos queda? ¿Resignarnos y darles nuestros datos y dinero a estas empresas que poco a poco nos canibalizan? No os voy a mentir, no confío en que la situación vaya a mejorar mucho, pero hay que decir que sí que hay alternativas.</p>
<p>La alternativa más sencilla pasa por dejar de utilizar estos servicios para buscar alternativas que puedan correr en nuestro ordenador offline. En este campo, el Open Source tiene mucho que decir. Por desgracia no está tan extendido como los SaaSS. Es posible que entre algunas de las razones sea que el software libre por su componente comunitaria tarda mucho tiempo en desarrollarse, además de no invertir dinero en publicidad o directamente que el software libre es gratis mientras que los SaaSS suelen ser bonitos, se publicitan y además tienen modelos de suscripción. Y queramos o no, si un servicio visualmente es más bonito y además cuesta dinero, es muy fácil pensar que es de mayor calidad que un programa de código abierto que sea gratis. Esto es un pensamiento falaz, ya que no siempre es así.</p>
<p>Estamos cambiando comodidad por privacidad y libertad. Este es un trabajo que cada uno tiene que hacer: valorar realmente que quiere usar y que esta dispuesto a dar a cambio.</p>
<p>La realidad es que es complicado huir de estos servicios y muchas veces es necesario informarse bien de lo que necesitamos y de que alternativas hay. Quiero finalizar este post con una pregunta: ¿De verdad necesitamos usar servicios para llevar a cabo nuestras tareas diarias con el ordenador?</p>
]]></content:encoded>
    </item>
    <item>
      <title>Sobre Mí</title>
      <link>https://renegade.es/about/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://renegade.es/about/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;mr bean&#34; loading=&#34;lazy&#34; src=&#34;https://vistapointe.net/images/mr-bean-7.jpg&#34;&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><img alt="mr bean" loading="lazy" src="https://vistapointe.net/images/mr-bean-7.jpg"></p>
]]></content:encoded>
    </item>
  </channel>
</rss>
