<?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>Fri, 17 Apr 2026 11:23:36 +0200</lastBuildDate><atom:link href="https://blog.bimbiribase.xyz/tags/selfhosting/index.xml" rel="self" type="application/rss+xml" />
    <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>
