Dashboard inicial de Linkding

¿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.

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. Linkding

Hay un montón de alternativas pero mi intención era encontrar algo sencillo y que no tuviera muchas fricciones a la hora de poner en marcha todo lo que me interesa.

Instalación

La instalacion basica de Linkding usa como base de datos de almacenamiento SQLite, para un solo usuario es una buena opcion y evita tener que preparar otro aplicativo mas para instalar una base de datos aparte.

Para ponerlo en marcha utilizaremos las implementaciones que ofrece linux por contenedores, tanto podman como docker son opciones validas.

Segun la documentacion del programa de Linkding y revisando su Dockerfile, tenemos que crear un volumen de almacenamiento persistente, que es donde se alojarán la base de datos y las imágenes.

podman volume create linkding
---
sudo docker volume create linkding

Una vez creado no tenemos mas que poner el contenedor en marcha indicando el puerto de comunicación para acceder y mapear el volumen de datos de nuestra maquina con el de la imagen del contenedor:

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

Pantalla de login de Linkding

Entra a localhost:9090 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 crear un usuario para acceder al software, así que ejecutamos el comando que esta incluido a tal efecto.

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

Te habrá solicitado una contraseña para ese usuario, usando createsuperuser 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.

Muy bien, ahora puedes ir añadiendo nuevos marcadores, ¿no? ¿No tienes un montón acumulados de otros lugares?

Importando los marcadores de otras herramientas

Mis enlaces han ido botando a lo largo del tiempo por diferentes sitios, desde el mítico delicious a tener una burrada de marcadores desorganizados en Firefox.

No fue hasta un tiempo después que me lo pasé todo a buku que es un gestor de marcadores que se concentra en el terminal aunque tiene varias interfaces web, pero no consiguió convencerme del todo.

También tuve una larga época con Evernote aunque tuve la suerte de salirme de algo corporativo para gestionar mi conocimiento con vimwiki, aunque esto es una historia para otra ocasión.

También estuve jugando con gestores que archivan la web como Pocket o Shiori. Al final buscaba una idea más cercana a un gestor de marcadores muy simplificado.

Toda esta historia es para decir sí, se pueden importar tus marcadores de otros sitios a Linkding. Los marcadores se intercambian con un estándar de facto, el Netscape Bookmark File

Pongo dos ejemplos para exportar los marcadores, con buku y shiori como si lo tuvieras bajo contenedores.

# Buku
buku -e buku.html

# Shiori
sudo docker exec -it shiori shiori export shiori.html
sudo docker cp  shiori:/shiori/shiori.html .

Importación desde el dashboard

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.

Importación desde settings

Importación mediante línea de comandos

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

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

Exponiéndolo al mundo exterior

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:

  • Comprar un dominio en internet, por ejemplo namecheap
  • Usar un proxy para redirigir la comunicación entre Linkding y el exterior
  • Un certificado para habilitar la conexión segura con la aplicación

Ejemplo de proxy inverso de aplicación

Si usáis nginx, desde el directorio /etc/nginx/conf.d/ podéis crear un nuevo fichero de esta guisa:

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 "upgrade";
      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
}

Con sudo nginx -t verificais que la sintaxis es correcta.

Y si tenéis systemd en vuestro sistema, con sudo systemctl restart nginx haréis que tengan efecto los cambios.

Generando certificado para conexiones seguras HTTPs

certbot de LetsEncrypt 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:

$ 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's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Integrando Linkding en el internet diario

Ya tenemos accesible desde cualquier lugar de internet nuestro gestor de marcadores. 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.

Esa no es la solución, evidentemente, lo que queremos es que desde nuestro navegador del PC o móvil si vemos una web que nos interesa guardarla al momento, o si estamos leyendo nuestros feeds de RSS guardar lo que nos interesa.

Para ello hay que preparar las integraciones para hacerlo funcionar 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.

Generación de API Tokens

Para ello la mayoría de esas integraciones no te pedirán usuario y contraseña, si no un token de la API. Ese chorizo de caracteres alfanuméricos lo generas directamente desde tu instancia de linkding. Accesible desde Settings -> Integrations.

Pantalla de generación de API Token

Extensión de firefox

En Firefox hay una extension instalable desde su gestor de add-ons. Como requisito para hacerlo funcionar habrá que poner la url donde tienes apuntando tu instancia de Linkding y un api token que hayas generado.

Configuración de la extensión de firefox

Ademas la extension ya te indica si ya has incluido previamente la url a tu listado de marcadores, por lo que te sirve como buen recordatorio.

Aplicación de Android

Lo otro sería añadir los marcadores fácilmente desde el teléfono o el navegador, existen unas cuantas aplicaciones de android como Linkdy que se configura igual que la extensión del navegador.

Aquí sería tan sencillo como darle al botón de compartir desde tu navegador, seleccionar Linkdy y ya lo tienes para incluirlo a tu gestor de marcadores.

Su repositorio de código

Integración con miniflux

Miniflux es un lector de feeds RSS, 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.

Integracion de miniflux con linkding

Configurable de la misma manera que los anteriores, cuando le das a Save en el artículo que te interese este te crea automáticamente el marcador en tu instancia de linkding.

Lo he llegado a probar con una app de android que sincroniza con miniflux llamada miniflutt y todo va perfecto, es la que uso para leer desde el móvil.

Integración con newsboat

Esta integración es café para los muy cafeteros. Newsboat 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.

¿Cómo integrar que si quieres marcar algo que te ha gustado se seleccione con Linkding? Pues ésta proporciona una API REST donde gestionar tus marcadores mediante peticiones HTTP.

Entonces es entender qué se necesita del recurso de bookrmarks para que se cree:

curl --request POST \
  --url <HOST>/api/bookmarks/ \
  --header 'authorization: Token <API_TOKEN>' \
  --header 'content-type: application/json' \
  --data '{
  "url": "https://example.com",
  "title": "Example title",
  "description": "Example description",
  "notes": "Example notes",
  "is_archived": false,
  "unread": false,
  "shared": false,
  "tag_names": [
    "tag1",
    "tag2"
  ]
}'

Si tienes tu host bien puesto https://example.com y un api token generado, la respuesta debería ser un 201 CREATED con tu nuevo bookmark en base de datos.

{
  "id": 853,
  "url": "https://example.com",
  "title": "Example title",
  "description": "Example description",
  "notes": "Example notes",
  "web_archive_snapshot_url": "https://web.archive.org/web/20260408174541/https://example.com",
  "favicon_url": null,
  "preview_image_url": null,
  "is_archived": false,
  "unread": false,
  "shared": false,
  "tag_names": [
    "tag1",
    "tag2"
  ],
  "date_added": "2026-04-08T17:45:41.357799Z",
  "date_modified": "2026-04-08T17:45:41.357813Z",
  "website_title": null,
  "website_description": null
}

Bien, ya sabemos que el contenido de la petición funciona y responde correctamente. Así que nuestro siguiente plan es crear un script para nuestro ordenador recoja la información de newsboat y la transmita a linkding cuando se guarda como marcador, en newsboat suele ser Ctrl+b

#!/usr/bin/python

import json
import http.client
import sys
import subprocess


conn = http.client.HTTPSConnection("<YOUR_LINKDING_HOST>")
api_token = subprocess.check_output(["pass", "linkding"])

url = sys.argv[1]
title = sys.argv[2]

payload = {
    "url": f"{url}",
    "title": f"{title}",
    "description": "",
    "notes": "From newsboat",
    "is_archived": False,
    "unread": False,
    "shared": False,
    "tag_names": [
        "newsboat",
    ]
}

headers = {
    'Authorization': f"Token {api_token.decode('utf-8').replace('\r', '').replace('\n', '')}",
    'Content-Type': "application/json"
}

conn.request("POST", "/api/bookmarks/", json.dumps(payload), headers)
res = conn.getresponse()
data = res.read()
if res.status not in [200, 201]:
    raise SystemExit(f'Error from server {res.status} - {data}')

La línea a discutir aquí es api_token = subprocess.check_output(["pass", "linkding"]). Estoy almacenando en una bóveda cifrada el api token de linkding para no tenerlo expuesto en texto claro. Si queréis ponéis api_token = "VUESTRO_API_TOKEN" y para adelante. O si no lo integráis con algún gestor de claves como pass.

Una vez listo lo ponéis en modo ejecutable el script.

chmod +x linkding_save.py

Y ahora configuramos newsboat la declaración En ~/.newsboat/config

bookmark-cmd linkding_save.py

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 .zshrc o .bashrc dependiendo el que uses la siguiente línea.

export PATH="$PATH:/home/<USER>/.local/bin"

Significa que ese directorio también será tomado como lugar para alojar comandos que serán listos para ejecutar en tu sesión de terminal sin necesidad de incluir la ruta.

Backup de tus datos

Al igual que vimos en la importación que pueden exportarse los datos en formato estándar con Linkding también se puede exportar desde settings en el dashboard.

Exportación en el formato HTML Netscape de tus marcadores

También se puede hacer un backup completo del aplicativo de tu base de datos, assets y notas, por lo que tendrías la información completa.

Conclusiones

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 necesito una nube de etiquetas, tener los enlaces a mano y agrupar por tipo 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.

Linkding, cuyo nombre no consigo recordar ya que tendrá alguna propiedad anti-memética, ha sido la herramienta que he instalado al momento sin ningún error inesperado y ha concluido en las integraciones de lectura de feeds RSS y navegación de internet tanto móvil como en PC que necesitaba.

Y ya que he conseguido importar todos mis enlaces desde tiempo ha, ahora podré acceder a ciertas cosas que tenia olvidadas en mi mente.

Espero que os sirva a alguno de vosotros, y os sirva de inspiración.