<?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>Selfhosting on Viti Blog</title>
    <link>https://blog.bimbiribase.xyz/tags/selfhosting/</link>
    <description>Recent content in Selfhosting on Viti Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>es-es</language>
    <lastBuildDate>Thu, 25 Jun 2026 17:51:08 +0200</lastBuildDate><atom:link href="https://blog.bimbiribase.xyz/tags/selfhosting/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Fediplan - Planificando posts en el fediverso</title>
      <link>https://blog.bimbiribase.xyz/posts/0064-fediplan/</link>
      <pubDate>Thu, 25 Jun 2026 17:51:08 +0200</pubDate>
      
      <guid>https://blog.bimbiribase.xyz/posts/0064-fediplan/</guid>
      <description>Siempre ha sido un problema complicado planificar publicaciones en redes sociales. Se tiene que hacer dentro de la propia aplicación de móvil, o está muy restringido, cuando se va a publicar no funciona y falla por vete a saber qué.
También webs externas ofrecen planificar publicaciones pero siempre con diferentes planes de suscripción. Existe todo un negocio para una gestión que debería ser en teoría sencilla.
Entonces me vino la pregunta, ¿cómo está el estado del arte de planificar posts en el fediverso?</description>
      <content:encoded><![CDATA[<p><strong>Siempre ha sido un problema complicado planificar publicaciones en redes sociales</strong>. Se tiene que hacer dentro de la propia aplicación de móvil, o está muy restringido, cuando se va a publicar no funciona y falla por vete a saber qué.</p>
<p>También webs externas ofrecen planificar publicaciones pero siempre con diferentes <strong>planes de suscripción</strong>. Existe todo un negocio para una gestión que debería ser en teoría sencilla.</p>
<p>Entonces me vino la pregunta, ¿<strong>cómo está el estado del arte de planificar posts en el <a href="https://es.wikipedia.org/wiki/Fediverso">fediverso</a></strong>?. ¿Cuál es la opción que más se adapta a lo que me gustaría?</p>
<p>Una búsqueda rápida apareció un <a href="https://fedi.tips/scheduling-posts-on-mastodon/">estupendo post en fedi.tips</a> el cual resuelve las dudas que tenía. <strong>Hay bastantes opciones para planificar posts</strong>, tanto en aplicaciones móviles, sitios profesionales de pago, y montándote tu servicio desde casa.</p>
<p>Y como podéis imaginar, elegí probar la <strong>opción autoalojada conocida como <a href="https://framagit.org/tom79/fediplan">Fediplan</a></strong>. El resultado fue exitoso ya que en 5 minutos lo tuve funcionando.</p>
<h1 id="montando-fediplan">Montando Fediplan</h1>
<p>Como premisa inicial, debéis tener instalado en vuestro sistema lo siguiente:</p>
<ul>
<li><strong>docker</strong> o <strong>podman</strong></li>
<li><strong>git</strong> (opcional)</li>
</ul>
<p>Esta aplicación <strong>no está preparada para que sea expuesta públicamente en internet</strong>, por lo que intentar que su acceso mejor hacerlo desde redes privadas.</p>
<p>Primero tenéis que haceros con el código de la aplicación, hay que ir a su <a href="https://framagit.org/tom79/fediplan">reposiotorio</a> y descargarlo o clonarlo.</p>
<pre tabindex="0"><code>git clone https://framagit.org/tom79/fediplan.git
</code></pre><p>Ya teniendo el código en tu sistema donde vas a ponerlo en marcha, hay que <strong>construir la imagen del proyecto</strong>.</p>
<p>Con <strong>docker</strong></p>
<pre tabindex="0"><code>cd /path/to/fediplan
sudo docker build --tag fediplan .
</code></pre><p>Con <strong>podman</strong> es casi similar pero hay que editar la primera línea del fichero <code>Dockerfile</code> con:</p>
<pre tabindex="0"><code>FROM docker.io/composer as composer
</code></pre><p>Una vez modificada esa línea procedemos casi igual que docker</p>
<pre tabindex="0"><code>cd /path/to/fediplan
podman build --tag fediplan .
</code></pre><p>Esperamos, se construirá la imagen y ahora sólo tenemos que <strong>ponerlo en marcha</strong>.</p>
<pre tabindex="0"><code>sudo docker run --detach --restart unless-stopped -p 8080:8080 --name fediplan fediplan:latest

o 

podman run --detach --restart unless-stopped -p 8080:8080 --name fediplan fediplan:latest
</code></pre><p>El puerto que hay a la izquierda puede ser el que tú desees por encima del <code>1024</code> si ya lo tienes en uso para otra cosa.</p>
<p>Si usáis un <code>docker-compose</code>, dentro de la sección <strong>services</strong> podéis incluirlo</p>
<pre tabindex="0"><code>  fediplan:
    image: fediplan:latest
    container_name: fediplan
    restart: unless-stopped
    ports:
      - 9090:8080
</code></pre><p>Y ya <code>docker-compose up -d fediplan</code> para ponerlo en marcha si ya tenemos construida la imagen con lo mencionado anteriormente.</p>
<p>Si desde un navegador accedéis con <code>http://&lt;IP_DONDE_LO_ESTAIS_EJECUTANDO&gt;:&lt;PUERTO&gt;</code>.</p>
<p><img loading="lazy" src="/fediplan/home2.png" alt="Página principal de Fediplan"  />
</p>
<h1 id="planificano-un-post">Planificano un post</h1>
<p>Para planificar un post <strong>hay que autorizar a Fediplan para que publique posts como si fuera tu usuario</strong>. En este caso, en la primera imagen de arriba hay que poner la dirección de tu instancia de <strong>Mastodon</strong> o <strong>Pleroma</strong>.</p>
<p>Tras ponerlo saldrá un botón que pone <strong>Get authorization code</strong>, dándole al botón te llevará a tu instancia, (volveremos a esta web después).</p>
<p><img loading="lazy" src="/fediplan/authcode.png" alt="Página principal de Fediplan"  />
</p>
<p>Tendrás que hacer login en tu instancia si no lo estás. A continuación tendrás la <strong>página de autorización para que Fediplan postee por ti</strong>.</p>
<p><img loading="lazy" src="/fediplan/oauth.png" alt="Página principal de Fediplan"  />
</p>
<p>Una vez presionado <strong>Autorizar</strong> te llevará a otra página con un código de autorización Cópialo y pégalo en la página de fediplan anterior.</p>
<p><img loading="lazy" src="/fediplan/code.png" alt="Página principal de Fediplan"  />
</p>
<p>Presiona <strong>Next</strong> y si todo ha ido bien habrás vinculado tu aplicación de Fediplan con tu instancia del Fediverso. Llegarás a un formulario para publicar tu post planificado.</p>
<p><img loading="lazy" src="/fediplan/home.png" alt="Página principal de Fediplan"  />
</p>
<p>Con un diseño sencillo y funcional, planificar el post es sencillo, incluso tienes acceso a los emojis personalizados de tu instancia y autocompletado de las etiquetas. <strong>La clave es esa fecha y el huso horario</strong>. Ahí planificas el post. Además <strong>puedes subir imágenes</strong> y añadir texto alternativo sin problema.</p>
<p><img loading="lazy" src="/fediplan/schedule.png" alt="Página principal de Fediplan"  />
</p>
<p>Y un vez presionado <strong>Send</strong> si vas a la sección <strong>Scheduled</strong> tendrás tu post listado para ser publicado en tu fecha.</p>
<p><img loading="lazy" src="/fediplan/scheduled.png" alt="Página principal de Fediplan"  />
</p>
<p>Tengo ya un par de días en marcha la aplicación y planificado un par de publicaciones y han funcionado satisfactoriamente. Por lo que ha sido más sencillo de lo ue pensaba y una opción muy a tener en cuenta.</p>
<h1 id="conclusión">Conclusión</h1>
<p>Cuando tenía en instagram la cuenta de mis jueguitos o cuando publicaba fotos de los viajes, echaba de menos publicar de manera planificada. <strong>Normalmente quería dejarlo en una tanda todo listo y planificar para publicarlo poco a poco</strong>. Al tener que hacerlo manual eso requeria mucho más esfuerzo y atención, desistiendo al final.</p>
<p>Así puedes publicar cosas que te apetezcan con cierta regularidad sin saturar tu timeline si lo deseas. A su vez quería dejar constancia de una experiencia satisfactoria.</p>
<p>Espero que os haya sido útil.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Linkding - Decidiendo un gestor de marcadores</title>
      <link>https://blog.bimbiribase.xyz/posts/0061-linkding/</link>
      <pubDate>Fri, 17 Apr 2026 11:23:36 +0200</pubDate>
      
      <guid>https://blog.bimbiribase.xyz/posts/0061-linkding/</guid>
      <description>¿Cuántas miles de webs guardas para consultarlas después? ¿Cuántas se te han olvidado? Mi navegación de internet consiste en acumular pestañas y más pestañas en mi navegador. Hubo tiempos en los que metía mis marcadores en el navegador y no había manera de encontrar nada. Otras veces usaba un gestor e iba copiando y pegando. Otras veces los guardaba en una wiki, y otras veces intentaba usar algo para sincronizar que no cubría todos mis casos.</description>
      <content:encoded><![CDATA[<p><img loading="lazy" src="/linkding/linkding.png" alt="Dashboard inicial de Linkding"  />
</p>
<h1 id="cuántas-miles-de-webs-guardas-para-consultarlas-después-cuántas-se-te-han-olvidado">¿Cuántas miles de webs guardas para consultarlas después? ¿Cuántas se te han olvidado?</h1>
<p>Mi <strong>navegación de internet consiste en acumular pestañas y más pestañas en mi navegador</strong>. Hubo tiempos en los que metía mis marcadores en el navegador y no había manera de encontrar nada. Otras veces usaba un gestor e iba copiando y pegando. Otras veces los guardaba en una wiki, y otras veces intentaba usar algo para sincronizar que no cubría todos mis casos.</p>
<p>Bueno, pues hoy voy con otro más, el cual he configurado muy rápido todos mis casos de uso y cubre lo único que necesito, guardar enlaces y etiquetar, sin necesidad de almacenar el contenido inicialemente. <a href="https://linkding.link/">Linkding</a></p>
<p>Hay un montón de <a href="https://alternativeto.net/software/linkding/">alternativas</a> pero mi intención era <strong>encontrar algo sencillo y que no tuviera muchas fricciones</strong> a la hora de poner en marcha todo lo que me interesa.</p>
<h1 id="instalación">Instalación</h1>
<p>La instalacion basica de Linkding <strong>usa como base de datos de almacenamiento SQLite, para un solo usuario es una buena opcion</strong> y evita tener que preparar otro aplicativo mas para instalar una base de datos aparte.</p>
<p>Para ponerlo en marcha utilizaremos las implementaciones que ofrece linux por contenedores, <strong>tanto podman como docker</strong> son opciones validas.</p>
<p>Segun la documentacion del programa de Linkding y revisando su <code>Dockerfile</code>, tenemos que <strong>crear un volumen de almacenamiento persistente</strong>, que es donde se alojarán la base de datos y las imágenes.</p>
<pre tabindex="0"><code>podman volume create linkding
---
sudo docker volume create linkding
</code></pre><p>Una vez creado no tenemos mas que poner el contenedor en marcha indicando <strong>el puerto de comunicación para acceder y mapear el volumen de datos</strong> de nuestra maquina con el de la imagen del contenedor:</p>
<pre tabindex="0"><code>podman run -d --rm -p 9090:9090 --name linkding -v linkding:/etc/linkding/data docker.io/sissbruecker/linkding
---
sudo docker run -d --rm -p 9090:9090 --name linkding -v linkding:/etc/linkding/data docker.io/sissbruecker/linkding
</code></pre><p><img loading="lazy" src="/linkding/login.png" alt="Pantalla de login de Linkding"  />
</p>
<p>Entra a <code>localhost:9090</code> desde tu navegador. ¿Ves la web de linkding pidiendo usuario y contraseña? ¡Genial, ya lo tienes! Aunque ahora mismo tendrás una pantalla de login-password, por lo que el siguiente paso directo es <strong>crear un usuario para acceder al software</strong>, así que ejecutamos el comando que esta incluido a tal efecto.</p>
<pre tabindex="0"><code>podman exec -it linkding python manage.py createsuperuser --username=VITIMan --email=viti@viti.com
---
sudo docker exec -it linkding python manage.py createsuperuser --username=VITIMan --email=viti@viti.com
</code></pre><p>Te habrá solicitado una contraseña para ese usuario, usando <code>createsuperuser</code> estás indicando que vas a crear un usuario de tipo administrador, por lo que podrás administrar cuestiones internas de Linkding aparte de tus marcadores.</p>
<p>Muy bien, ahora puedes ir añadiendo nuevos marcadores, ¿no? ¿<strong>No tienes un montón acumulados de otros lugares</strong>?</p>
<h1 id="importando-los-marcadores-de-otras-herramientas">Importando los marcadores de otras herramientas</h1>
<p><strong>Mis enlaces han ido botando a lo largo del tiempo por diferentes sitios</strong>, desde el mítico <a href="https://es.wikipedia.org/wiki/Delicious">delicious</a> a tener una burrada de marcadores desorganizados en Firefox.</p>
<p>No fue hasta un tiempo después que me lo pasé todo a <a href="https://github.com/jarun/Buku">buku</a> que es un gestor de marcadores que se concentra en el terminal aunque tiene varias interfaces web, pero no consiguió convencerme del todo.</p>
<p>También tuve una larga época con <a href="https://evernote.com/es-es">Evernote</a> aunque tuve la suerte de salirme de algo corporativo para gestionar mi conocimiento con <a href="https://vimwiki.github.io/">vimwiki</a>, aunque esto es una historia para otra ocasión.</p>
<p>También estuve jugando con gestores que archivan la web como Pocket o <a href="https://github.com/go-shiori/shiori">Shiori</a>. Al final buscaba una idea más cercana a un gestor de marcadores muy simplificado.</p>
<p>Toda esta historia es para decir sí, <strong>se pueden importar tus marcadores de otros sitios a Linkding</strong>. Los marcadores se intercambian con un estándar de facto, el <a href="https://learn.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/aa753582(v=vs.85)">Netscape Bookmark File</a></p>
<p>Pongo dos ejemplos para exportar los marcadores, con <strong>buku</strong> y <strong>shiori</strong> como si lo tuvieras bajo contenedores.</p>
<pre tabindex="0"><code># Buku
buku -e buku.html

# Shiori
sudo docker exec -it shiori shiori export shiori.html
sudo docker cp  shiori:/shiori/shiori.html .
</code></pre><h2 id="importación-desde-el-dashboard">Importación desde el dashboard</h2>
<p>Ya con tus ficheros si entras al dashboard de la herramienta y haces clic en settings tienes una opción para hacer la importación de todos tus marcadores de otros sitios.</p>
<p><img loading="lazy" src="/linkding/import.png" alt="Importación desde settings"  />
</p>
<h2 id="importación-mediante-línea-de-comandos">Importación mediante línea de comandos</h2>
<p>Una vez ya tenemos los ficheros con nuestros marcadores, los vamos copiando al volumen del contenedor de linkding y ejecutamos el comando de importación</p>
<pre tabindex="0"><code>podman cp shiori.html linkding:/etc/linkding/data/shiori.html
podman exec -it linkding python manage.py import_netscape /etc/linkding/data/shiori.html VITIMan

----

sudo docker cp shiori.html linkding:/etc/linkding/data/shiori.html
sudo docker exec -it linkding python manage.py import_netscape /etc/linkding/data/shiori.html VITIMan
</code></pre><h1 id="exponiéndolo-al-mundo-exterior">Exponiéndolo al mundo exterior</h1>
<p>Aquí entran varias cuestiones que están repetidas en muchos otros posts. Pero si ponéis Linkding expuesto hacia el exterior, normalmente necesitaréis tres cosas:</p>
<ul>
<li>Comprar un dominio en internet, por ejemplo <a href="https://www.namecheap.com/">namecheap</a></li>
<li>Usar un proxy para redirigir la comunicación entre Linkding y el exterior</li>
<li>Un certificado para habilitar la conexión segura con la aplicación</li>
</ul>
<h2 id="ejemplo-de-proxy-inverso-de-aplicación">Ejemplo de proxy inverso de aplicación</h2>
<p>Si usáis <strong>nginx</strong>, desde el directorio <code>/etc/nginx/conf.d/</code> podéis crear un nuevo fichero de esta guisa:</p>
<pre tabindex="0"><code>server {
    if ($host = bookmarks.example.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


  listen 80;
  server_name bookmarks.example.com;
  return 301 https://$server_name$request_uri;
  client_max_body_size 8M;


}
server {
  listen 443 ssl http2;
  server_name bookmarks.example.com;
  client_max_body_size 8M;

  ssl_protocols TLSv1.1 TLSv1.2;

  access_log /var/log/nginx/bookmarks-access.log;

  location / {
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      # websocket support
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection &#34;upgrade&#34;;
      proxy_pass http://127.0.0.1:9090/;  # linkding
  }

    ssl_certificate /etc/letsencrypt/live/bookmarks.example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/bookmarks.example.com/privkey.pem; # managed by Certbot
}
</code></pre><p>Con <code>sudo nginx -t</code> verificais que la sintaxis es correcta.</p>
<p>Y si tenéis <strong>systemd</strong> en vuestro sistema, con <code>sudo systemctl restart nginx</code> haréis que tengan efecto los cambios.</p>
<h2 id="generando-certificado-para-conexiones-seguras-https">Generando certificado para conexiones seguras HTTPs</h2>
<p><strong>certbot de LetsEncrypt</strong> es la manera más sencillita para firmar certificados sin mucho drama. Instaláis el paquete y desde línea de comandos tras tener vuestra configuración de nginx lista y el dominio comprado:</p>
<pre tabindex="0"><code>$ sudo certbot --nginx -d bookmarks.example.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for bookmarks.example.com

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/bookmarks.example.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/bookmarks.example.com/privkey.pem
This certificate expires on 2027-03-27.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

Deploying certificate
Successfully deployed certificate for bookmarks.example.com to /etc/nginx/conf.d/cards.conf
Congratulations! You have successfully enabled HTTPS on https://bookmarks.example.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let&#39;s Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
</code></pre><h1 id="integrando-linkding-en-el-internet-diario">Integrando Linkding en el internet diario</h1>
<p>Ya tenemos accesible <strong>desde cualquier lugar de internet nuestro gestor de marcadores</strong>. Pero ahora mismo tienes que acceder a la web de linkding, poner tu usuario y contraseña, y después agregar tu enlace a mano.</p>
<p>Esa no es la solución, evidentemente, <strong>lo que queremos es que desde nuestro navegador del PC o móvil si vemos una web que nos interesa guardarla al momento</strong>, o si estamos leyendo nuestros feeds de RSS guardar lo que nos interesa.</p>
<p>Para ello <strong>hay que preparar las integraciones para hacerlo funcionar</strong> en los diferentes sitios. Os voy a mostrar los que uso, unos pueden ser más interesantes que otros según los usos y herramientas que uséis.</p>
<h2 id="generación-de-api-tokens">Generación de API Tokens</h2>
<p>Para ello la mayoría de esas integraciones <strong>no te pedirán usuario y contraseña, si no un token de la API</strong>. Ese chorizo de caracteres alfanuméricos lo generas directamente desde tu instancia de linkding. Accesible desde <strong>Settings -&gt; Integrations</strong>.</p>
<p><img loading="lazy" src="/linkding/apitoken.png" alt="Pantalla de generación de API Token"  />
</p>
<h2 id="extensión-de-firefox">Extensión de firefox</h2>
<p>En <a href="https://addons.mozilla.org/en-US/firefox/addon/linkding-extension/">Firefox hay una extension</a> <strong>instalable desde su gestor de add-ons</strong>. Como requisito para hacerlo funcionar habrá que poner la url donde tienes apuntando tu instancia de Linkding y un api token que hayas generado.</p>
<p><img loading="lazy" src="/linkding/firefox.png" alt="Configuración de la extensión de firefox"  />
</p>
<p>Ademas la extension <strong>ya te indica si ya has incluido previamente la url</strong> a tu listado de marcadores, por lo que te sirve como buen recordatorio.</p>
<h2 id="aplicación-de-android">Aplicación de Android</h2>
<p>Lo otro sería añadir los marcadores fácilmente desde el teléfono o el navegador, existen unas cuantas aplicaciones de android como <a href="https://play.google.com/store/apps/details?id=com.jgeek00.linkdy&amp;hl=es">Linkdy</a> que se configura igual que la extensión del navegador.</p>
<p>Aquí sería tan sencillo como <strong>darle al botón de compartir desde tu navegador</strong>, seleccionar Linkdy y ya lo tienes para incluirlo a tu gestor de marcadores.</p>
<p>Su <a href="https://github.com/JGeek00/linkdy">repositorio de código</a></p>
<h2 id="integración-con-miniflux">Integración con miniflux</h2>
<p><a href="https://miniflux.app/">Miniflux</a> es <strong>un lector de feeds RSS</strong>, que puedes ponerlo en un servidor privado e integrarlo con tu PC, tu móvil o verlo desde el navegador. Además dispone de un montón de integraciones, entre ellas Linkding.</p>
<p><img loading="lazy" src="/linkding/miniflux.png" alt="Integracion de miniflux con linkding"  />
</p>
<p>Configurable de la misma manera que los anteriores, cuando le das a <strong>Save</strong> en el artículo que te interese este te crea automáticamente el marcador en tu instancia de linkding.</p>
<p>Lo he llegado a probar con una app de android que sincroniza con miniflux llamada <a href="https://play.google.com/store/apps/details?id=be.martinelli.miniflutt&amp;hl=es">miniflutt</a>  y todo va perfecto, es la que uso para leer desde el móvil.</p>
<h2 id="integración-con-newsboat">Integración con newsboat</h2>
<p><strong>Esta integración es café para los muy cafeteros</strong>. <a href="https://newsboat.org/index.html">Newsboat</a> es un lector RSS desde terminal que lo tengo sincronizado con miniflux para leer mis feeds directamente desde mi PC sin necesidad de reconfigurar toda mi lista de sitios para leer.</p>
<p>¿Cómo integrar que si quieres marcar algo que te ha gustado se seleccione con Linkding? Pues ésta proporciona una <strong><a href="https://linkding.link/api/">API REST</a> donde gestionar tus marcadores mediante peticiones HTTP.</strong></p>
<p>Entonces es entender qué se necesita del recurso de bookrmarks para que se cree:</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-bash" data-lang="bash"><span style="display:flex;"><span>curl --request POST <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>  --url &lt;HOST&gt;/api/bookmarks/ <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>  --header <span style="color:#e6db74">&#39;authorization: Token &lt;API_TOKEN&gt;&#39;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>  --header <span style="color:#e6db74">&#39;content-type: application/json&#39;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>  --data <span style="color:#e6db74">&#39;{
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">  &#34;url&#34;: &#34;https://example.com&#34;,
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">  &#34;title&#34;: &#34;Example title&#34;,
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">  &#34;description&#34;: &#34;Example description&#34;,
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">  &#34;notes&#34;: &#34;Example notes&#34;,
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">  &#34;is_archived&#34;: false,
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">  &#34;unread&#34;: false,
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">  &#34;shared&#34;: false,
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">  &#34;tag_names&#34;: [
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    &#34;tag1&#34;,
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    &#34;tag2&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">  ]
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">}&#39;</span>
</span></span></code></pre></div><p>Si tienes tu host bien puesto <code>https://example.com</code> y un api token generado, la respuesta debería ser un <strong><code>201 CREATED</code> con tu nuevo bookmark en base de datos.</strong></p>
<pre tabindex="0"><code>{
  &#34;id&#34;: 853,
  &#34;url&#34;: &#34;https://example.com&#34;,
  &#34;title&#34;: &#34;Example title&#34;,
  &#34;description&#34;: &#34;Example description&#34;,
  &#34;notes&#34;: &#34;Example notes&#34;,
  &#34;web_archive_snapshot_url&#34;: &#34;https://web.archive.org/web/20260408174541/https://example.com&#34;,
  &#34;favicon_url&#34;: null,
  &#34;preview_image_url&#34;: null,
  &#34;is_archived&#34;: false,
  &#34;unread&#34;: false,
  &#34;shared&#34;: false,
  &#34;tag_names&#34;: [
    &#34;tag1&#34;,
    &#34;tag2&#34;
  ],
  &#34;date_added&#34;: &#34;2026-04-08T17:45:41.357799Z&#34;,
  &#34;date_modified&#34;: &#34;2026-04-08T17:45:41.357813Z&#34;,
  &#34;website_title&#34;: null,
  &#34;website_description&#34;: null
}
</code></pre><p>Bien, ya sabemos que el contenido de la petición funciona y responde correctamente. Así que nuestro siguiente plan es <strong>crear un script</strong> para nuestro ordenador recoja la información de newsboat y la transmita a linkding cuando se guarda como marcador, en newsboat suele ser <code>Ctrl+b</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-python" data-lang="python"><span style="display:flex;"><span><span style="color:#75715e">#!/usr/bin/python</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> json
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> http.client
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> sys
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> subprocess
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>conn <span style="color:#f92672">=</span> http<span style="color:#f92672">.</span>client<span style="color:#f92672">.</span>HTTPSConnection(<span style="color:#e6db74">&#34;&lt;YOUR_LINKDING_HOST&gt;&#34;</span>)
</span></span><span style="display:flex;"><span>api_token <span style="color:#f92672">=</span> subprocess<span style="color:#f92672">.</span>check_output([<span style="color:#e6db74">&#34;pass&#34;</span>, <span style="color:#e6db74">&#34;linkding&#34;</span>])
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>url <span style="color:#f92672">=</span> sys<span style="color:#f92672">.</span>argv[<span style="color:#ae81ff">1</span>]
</span></span><span style="display:flex;"><span>title <span style="color:#f92672">=</span> sys<span style="color:#f92672">.</span>argv[<span style="color:#ae81ff">2</span>]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>payload <span style="color:#f92672">=</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;url&#34;</span>: <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>url<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;title&#34;</span>: <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>title<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;description&#34;</span>: <span style="color:#e6db74">&#34;&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;notes&#34;</span>: <span style="color:#e6db74">&#34;From newsboat&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;is_archived&#34;</span>: <span style="color:#66d9ef">False</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;unread&#34;</span>: <span style="color:#66d9ef">False</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;shared&#34;</span>: <span style="color:#66d9ef">False</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;tag_names&#34;</span>: [
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;newsboat&#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>headers <span style="color:#f92672">=</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#39;Authorization&#39;</span>: <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Token </span><span style="color:#e6db74">{</span>api_token<span style="color:#f92672">.</span>decode(<span style="color:#e6db74">&#39;utf-8&#39;</span>)<span style="color:#f92672">.</span>replace(<span style="color:#e6db74">&#39;</span><span style="color:#ae81ff">\r</span><span style="color:#e6db74">&#39;</span>, <span style="color:#e6db74">&#39;&#39;</span>)<span style="color:#f92672">.</span>replace(<span style="color:#e6db74">&#39;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#39;</span>, <span style="color:#e6db74">&#39;&#39;</span>)<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#39;Content-Type&#39;</span>: <span style="color:#e6db74">&#34;application/json&#34;</span>
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>conn<span style="color:#f92672">.</span>request(<span style="color:#e6db74">&#34;POST&#34;</span>, <span style="color:#e6db74">&#34;/api/bookmarks/&#34;</span>, json<span style="color:#f92672">.</span>dumps(payload), headers)
</span></span><span style="display:flex;"><span>res <span style="color:#f92672">=</span> conn<span style="color:#f92672">.</span>getresponse()
</span></span><span style="display:flex;"><span>data <span style="color:#f92672">=</span> res<span style="color:#f92672">.</span>read()
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> res<span style="color:#f92672">.</span>status <span style="color:#f92672">not</span> <span style="color:#f92672">in</span> [<span style="color:#ae81ff">200</span>, <span style="color:#ae81ff">201</span>]:
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">raise</span> <span style="color:#a6e22e">SystemExit</span>(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#39;Error from server </span><span style="color:#e6db74">{</span>res<span style="color:#f92672">.</span>status<span style="color:#e6db74">}</span><span style="color:#e6db74"> - </span><span style="color:#e6db74">{</span>data<span style="color:#e6db74">}</span><span style="color:#e6db74">&#39;</span>)
</span></span></code></pre></div><p>La línea a discutir aquí es <code>api_token = subprocess.check_output([&quot;pass&quot;, &quot;linkding&quot;])</code>. Estoy almacenando en una bóveda cifrada el api token de linkding para no tenerlo expuesto en texto claro. Si queréis ponéis <code>api_token = &quot;VUESTRO_API_TOKEN&quot;</code> y para adelante. O si no lo integráis con algún gestor de claves como <a href="https://www.passwordstore.org/">pass</a>.</p>
<p>Una vez listo lo ponéis en modo ejecutable el script.</p>
<pre tabindex="0"><code>chmod +x linkding_save.py
</code></pre><p>Y ahora configuramos newsboat la declaración En <code>~/.newsboat/config</code></p>
<pre tabindex="0"><code>bookmark-cmd linkding_save.py
</code></pre><p>Dónde quieres situar tu script, si observas la declaración no incluyo ninguna ruta. Eso es que tengo en mi fichero de configuración de terminal <code>.zshrc</code> o <code>.bashrc</code> dependiendo el que uses la siguiente línea.</p>
<pre tabindex="0"><code>export PATH=&#34;$PATH:/home/&lt;USER&gt;/.local/bin&#34;
</code></pre><p>Significa que ese directorio también será tomado como lugar para alojar comandos que serán <strong>listos para ejecutar en tu sesión de terminal sin necesidad de incluir la ruta</strong>.</p>
<h1 id="backup-de-tus-datos">Backup de tus datos</h1>
<p>Al igual que vimos en la importación que pueden exportarse los datos en formato estándar con Linkding <strong>también se puede exportar desde settings en el dashboard</strong>.</p>
<p><img loading="lazy" src="/linkding/export.png" alt="Exportación en el formato HTML Netscape de tus marcadores"  />
</p>
<p>También se puede hacer un <a href="https://linkding.link/backups/">backup completo del aplicativo</a> de tu base de datos, assets y notas, por lo que tendrías la información completa.</p>
<h1 id="conclusiones">Conclusiones</h1>
<p>Muchas de las opciones que se consideran son guardar el contenido para leerlo después, eso implica una gran información de datos a alojar y consultar. En mi caso yo <strong>necesito una nube de etiquetas, tener los enlaces a mano y agrupar por tipo</strong> de llamémosle hiperfijación del momento. Sólo así consigo reducir el increíble número de pestañas en mi navegador con todos los temas que he ido investigando en diferentes temporadas.</p>
<p>Linkding, cuyo nombre no consigo recordar ya que tendrá alguna propiedad anti-memética, ha sido la herramienta que <strong>he instalado al momento sin ningún error inesperado y ha concluido en las integraciones</strong> de lectura de feeds RSS y navegación de internet tanto móvil como en PC que necesitaba.</p>
<p>Y ya que he conseguido importar todos mis enlaces desde tiempo ha, ahora podré acceder a ciertas cosas que tenia olvidadas en mi mente.</p>
<p>Espero que os sirva a alguno de vosotros, y os sirva de inspiración.</p>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
