<?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>Dev on Viti Blog</title>
    <link>https://blog.bimbiribase.xyz/tags/dev/</link>
    <description>Recent content in Dev 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/dev/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>
    
    <item>
      <title>El portátil de dieciséis euros (I) - Introducción</title>
      <link>https://blog.bimbiribase.xyz/posts/0050-portatil-16-euros/</link>
      <pubDate>Sun, 18 May 2025 11:56:11 +0200</pubDate>
      
      <guid>https://blog.bimbiribase.xyz/posts/0050-portatil-16-euros/</guid>
      <description>Nota informativa: Este post no contiene configuraciones, comandos de terminal ni cuestiones programáticas. En próximos episodios proporcionaré material relacionado :P
Status quo electrónico en casa El portátil que disponía era un MacBook Pro de 2011, ese portátil es un auténtico disparate de rendimiento, incluso a día de hoy vale para cualquier cosa. Ha recibido muchas actualizaciones por mi parte, discos duros SSD, memoria RAM, cambio de batería e incluso un reemplazo de teclado porque dejó de funcionar.</description>
      <content:encoded><![CDATA[<p><strong>Nota informativa</strong>: Este post no contiene configuraciones, comandos de terminal ni cuestiones programáticas. En próximos episodios proporcionaré material relacionado :P</p>
<p><img loading="lazy" src="/dieciseis-euros/blogging.jpg" alt="Post escribiéndose con el editor VIM"  />
</p>
<h1 id="status-quo-electrónico-en-casa">Status quo electrónico en casa</h1>
<p>El portátil que disponía era un <strong>MacBook Pro de 2011</strong>, ese portátil es un auténtico disparate de rendimiento, incluso a día de hoy vale para cualquier cosa. Ha recibido muchas actualizaciones por mi parte, discos duros SSD, memoria RAM, cambio de batería e incluso un reemplazo de teclado porque dejó de funcionar. El siguiente cambio que tenía en la recámara era sustituir el sistema operativo de OSX por uno de Linux, ya que Apple no da soporte a dispositivos tan antiguos.</p>
<p>Desafortunadamente, el slot donde se <strong>insertan los módulos de memoria RAM empezaron a fallar</strong> como una escopeta de feria, y ese arreglo ya no es fácil, lo he llevado a una tienda de reparación de confianza y cruzar dedos si dedican el tiempo suficiente y lo pueden reparar.</p>
<h1 id="encontrando-la-comodidad-para-escribir-un-post">Encontrando la comodidad para escribir un post</h1>
<p>Uno de los motivos que me apetecía reutilizarlo era por el tema de <strong>escribir posts para el blog</strong>, le he vuelto a coger el gusto y quería encontrar algo cómodo. Por razones obvias no quería utilizar el dispositivo proporcionado por mi empleador.</p>
<p>Así que sin portátil, empecé un periplo por los <strong>dispositivos que tenía en mi casa</strong>. Lo primero que pensé fue en la <strong>tablet</strong> que tengo e introducirle un teclado. Cuan fue mi sorpresa que lo encontré tremendamente incómodo, navegar entre aplicaciones con el teclado y gestionar la ofimática rutinaria es un suplicaio acostumbrado a usar terminal por defecto.</p>
<p>Por otro lado tenemos un madurito <strong>ordenador de sobremesa</strong>, el único con Windows para juegos y programas que sólo se pueden usar con él, y por otro lado la <strong>Steam Deck</strong>. Ambos con dos problemas, uno que está fijo en su sitio, y el otro que requiere conectarle teclado de cierta manera e incluso conectarle un hub de conexión, haciendo una operación aparentemente simple en un jaleo.</p>
<p>Entonces llegamos a la cuestión de <strong>pensar en comprar</strong>, estuve tanteando en portátiles reacondicionados, pero es que llegado el caso de que mi viejo MacBook vuelva a ser el que era, es un gasto para mí algo injustificado.</p>
<p>Como veis son <strong>problemas del primer mundo</strong>.</p>
<p>Pero entonces recordé, hubo una época, a finales de los 00 principio de los 10, que <strong>los netbooks</strong> estaban a la orden del día y fueron súper populares. ¿Podría hacer algo con uno de ellos?</p>
<h1 id="rebuscando-en-el-viejo-internet-sobre-netbooks">Rebuscando en el viejo internet sobre netbooks</h1>
<p>Un par de búsquedas por internet, mirando sobre marcas de netbook que no dieran muchos problemas de <a href="https://alancarr.co.za/content/linux/samsung-nc10.html">instalación con linux encontré que era posible</a> sólo que con una salvedad, la <strong>arquitectura de esos portátiles era de 32bit</strong>, y desde hace un tiempo ya hemos superado la transición a arquitecturas 64bit. Por suerte, hay varias distribuciones de linux como Antix o la propia Debian que ofrecen versiones actuales para estas configuraciones, gracias comunidad de Linux.</p>
<p>Una de las series de netbook en la que reparé era la serie <strong>&ldquo;Samsung Nxx&rdquo;</strong>, en su momento se les consideraba buenos portátiles y además que disponían de un buen teclado, cosa de agradecer en un portátil.</p>
<p>En cuanto a <strong>mejoras</strong>, casi todos admiten una <strong>ampliación de RAM</strong> de 1GB a 2GB, cambiar el <strong>disco duro a SSD</strong>. También hay <strong>reemplazos de batería</strong> e incluso de <strong>teclados</strong>, que ya comentaré un poco más adelante. Además quedan vídeos de hace 15 años sobre cómo reparar estos portátiles.</p>
<p><img loading="lazy" src="/dieciseis-euros/cerrado.jpg" alt="El netbook cerrado con la marca Samsung"  />
</p>
<h1 id="la-sorpresa-en-la-jungla-de-segunda-mano">La sorpresa en la jungla de segunda mano</h1>
<p>Así que empecé a asomar la patita en Wallapop, y mi sorpresa fue que estos netbooks <strong>están tiradísimos de precio</strong>. La mayoría de los problemas que presentan estos portátiles son tres principalmente.</p>
<p>La primera es <strong>la batería</strong>, que en muchos casos está degradada o que directamente no funciona, esto se espera y habiendo reemplazos de batería a precios decentes no es algo preocupante.</p>
<p>La segunda, son los <strong>discos duros mecánicos</strong>, tras la aparición de los discos de estado sólido el rendimiento de manejo de ficheros ha sido espectacular, como la primera razón, si el acceso a las tripas del portátil es asequible el cambio solo implica un destornillador adecuado. Sin embargo el problema del disco duro mecánico es provocado en gran medida por el tercer problema.</p>
<p>La tercera, es que muchos de ellos tienen una <strong>versión actualizada de Windows</strong>. Lasactualizaciones de XP a 7 y 8 degradó el rendimiento de los discos duros mecánicos una barbaridad. Y esto es porque Microsoft tiene una cantidad de tareas en segundo plano ejecutándose para váyase usted a saber qué. Estas dos cuestiones convierten en inusable el dispositivo.</p>
<p>Este desconocimiento, la gran bajada de precio de los dispositivos electrónicos y su cambio de uso a otras formas, ha hecho que estos netbooks se les considere ladrillos.</p>
<p>Así que encontré un &ldquo;Samsung N130&rdquo; que por azares del destino, el precio final se quedó en sólo <strong>dieciséis (16) euros</strong>.</p>
<h1 id="llegada-sorpresas-y-puesta-en-marcha">Llegada, sorpresas y puesta en marcha</h1>
<p><img loading="lazy" src="/dieciseis-euros/rotura.jpg" alt="Rotura de la carcasa del portátil"  />
</p>
<p>El netbook arribó, caja original, cargador, mochilita en muy buen estado inicial. La carcasa tiene ciertas partes rotas, el portátil arrancó con un Windows XP (esos sonidos me trajeron recuerdos de viejas épocas).</p>
<p>Sin hacer ningún cambio, decidí probar a <strong><a href="https://www.debian.org/distrib/netinst">instalar Debian 12</a></strong> para ver si no ocurría nada extraño y resultado fue satisfactorio.</p>
<p>Sin embargo, el portátil presentó una falla, y es que <strong>varias series de teclas no funcionan ocasionalmente</strong>, otras veces parece que tira bien, he pedido un reemplazo de teclado a ver si es porque algo le va mal y crucemos dedos que no sea del conector de la placa.</p>
<p>Ya con el disco duro SSD (disco duro SSD y reemplazo de teclado cuestan cada uno lo mismo que el propio portátil xDDD), empezó la odisea de cambiarlo. Me las vi tan feliz cuando me encontré que un <strong>tornillo trasero estaba atascado</strong> y empezaron a caer trocitos de plástico, uno de los embellecedores de plástico de la bisagra del monitor está suelta y rota. &gt;.&lt;</p>
<p>Fue un poco pesadilla porque estaba viendo venir que, gracias a mi torpeza, podría quebrar el plástico y liarla aún más, <strong>conseguí cambiar el disco duro</strong> y sacar ese tornillo reivindicativo, con el único problema que ahora ese tornillo no quiere volver a enganchar, a saber cómo estará el plástico.</p>
<p>Por suerte, cuando vea que ruede con el portátil, el <strong>reemplazo de la memoria RAM es más sencillo</strong>.</p>
<p>Mi sorpresa es, contrario a lo que uno pensaría, la batería tiene muy buen aguante para la edad que tiene, y estoy teniendo resultados de <strong>aguante de 3 a 4 horas</strong>. Fantástico.</p>
<h1 id="instalación-satisfactoria">Instalación satisfactoria</h1>
<p><img loading="lazy" src="/dieciseis-euros/debian.jpg" alt="Instalación de Debian 12 en el portátil"  />
</p>
<p>Antes de nada, soy un <strong>poco extravagante en mis cuestiones ofimáticas</strong>, cuando continúe esta serie y nos metamos en harina quizás os extrañéis algunos.</p>
<p>Termino con este post diciendo que la instalación ha sido satisfactoria, como logros en este portátil, tenemos lo siguiente</p>
<ul>
<li>Escritorio instalado, suelo usar <strong>basados en tiles como i3</strong>, no he utilizado Regolith por la arquitectura 32bit y rendimiento.</li>
<li>Mi editor de texto querido <strong>VIM compilado a la última versión</strong> y la mayoría de mis plugins funcionando</li>
<li>El <strong>sistema de blogs Hugo</strong> funciona, sincroniza y publica. El post anterior a éste ya lo he hecho desde el netbook</li>
<li>Escucho mi <strong>música</strong> desde mi biblioteca particular, haciendo scrobbling y todo</li>
<li>Etiquetado y organizador de música</li>
<li>Leo y escribo posts del <strong>fediverso</strong></li>
<li>Leo mis feeds <strong>RSS</strong></li>
<li><strong>Libreoffice</strong> funciona perfectamente</li>
<li>Chat <strong>XMPP</strong> e IRC</li>
<li>Instalado <strong>firefox</strong> para ciertas necesidades, pero no para uso continuo</li>
<li><strong>Sincronización de directorios y ficheros</strong> con otros dispositivos como PCs y teléfono móvil</li>
<li>Gestor de <strong>contraseñas</strong></li>
<li>Gestor de ficheros y directorios</li>
<li>Lanzador de aplicaciones</li>
<li>Capturas de pantalla</li>
<li>Montado de directorios remotos en el NAS</li>
<li>Docker (aunque desactivado de base, por si acaso necesito algo)</li>
</ul>
<p><strong>Me falta</strong>, puesto que requiere algo más de consideración o investigación:</p>
<ul>
<li>Soporte teclado japonés</li>
<li>Sincronizar mis bookmarks de manera decente</li>
<li>Intergar bien las notificaciones de escritorio</li>
<li>Gestor de correo electrónico</li>
<li>Telegram&hellip; sigh</li>
</ul>
<h1 id="conclusiones">Conclusiones</h1>
<p>Esta semana no he estado aburrido como podéis ver, y además el resultado ha quedado algo funcional y cómodo en mis estándares.</p>
<p>Hay mucho material tecnológico que se puede recuperar con sólo un poco de atención, además de ahorrarte un dinero, descubres cómo funcionan las cosas tanto en software y podrás cambiar cosas sin muchos reparos.</p>
<p>Intentaré contar más cosas sobre esta aventura en próximos posts, seguramente los siguientes ya serán más técnicos que éste. Cualquier duda os leo en la caja de comentarios o desde el fediverso ;)</p>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
