Cómo instalar Karakeep, tu gestor de marcadores con etiquetado por IA
Índice de contenidos
- Puntos clave
- Qué guarda Karakeep y qué hace con cada enlace
- Cuánto disco cuesta el archivado
- Instalar Karakeep con Docker Compose
- Qué se ve en el primer arranque
- Etiquetado con IA: modelo alojado o modelo en tu máquina
- Importar lo que ya tienes y capturar lo nuevo
- Qué hay que copiar cuando haces una copia de seguridad
- Karakeep frente a Linkwarden y a los marcadores del navegador
- Preguntas frecuentes
- ¿Puedo instalar Karakeep sin ninguna IA?
- ¿Qué modelo local elijo para el etiquetado?
- ¿Cuánto disco necesito para diez mil marcadores?
- Conclusión
- Fuentes
Karakeep es un gestor de marcadores autoalojado que guarda enlaces, notas, imágenes y PDF, archiva la página entera con monolith y los vídeos con yt-dlp, y los etiqueta con un modelo de lenguaje. Se instala con un compose de tres contenedores y el etiquetado admite tanto un modelo alojado como un Ollama propio.
Tienes quince años de enlaces repartidos entre tres navegadores, un servicio de leer-luego que ya cerró y una carpeta de correos a ti mismo. Karakeep, que antes se llamaba Hoarder, se los queda todos en tu propio disco, archiva la página entera por si desaparece y les pone etiquetas con un modelo de lenguaje. Esta guía instala la versión v0.33.2 con el compose oficial, mide lo que cuesta en disco de verdad y configura el etiquetado con OpenAI y con un Ollama en tu propia máquina.
Puntos clave
- El compose oficial levanta tres contenedores: la aplicación en el puerto 3000, un Chrome sin ventana para rastrear y Meilisearch v1.41.0 para buscar.
- El archivado completo de páginas lo hace monolith y el de vídeos yt-dlp, ambos incluidos en la imagen. Los dos vienen desactivados por defecto, y con razón.
- Medido en la máquina de pruebas: un marcador con archivo completo, PDF y captura ocupa alrededor de 1,3 MB. Los ficheros pesan nueve veces más que la base de datos.
- El etiquetado con IA es opcional. Con OpenAI cuesta céntimos; con un modelo local en procesador es un proceso por lotes, no una función interactiva.
- La copia de seguridad que importa es el volumen de datos entero, no solo el fichero SQLite: dentro está el directorio de ficheros archivados.
Qué guarda Karakeep y qué hace con cada enlace
Karakeep se define en su documentación como una aplicación de código abierto de tipo guardar cualquier cosa que usa IA para etiquetar automáticamente el contenido que le lanzas. En la práctica acepta cuatro cosas: enlaces, notas de texto, imágenes y ficheros como PDF. El repositorio se abrió en febrero de 2024 y se publica bajo licencia AGPL-3.0. Acumula 28.670 estrellas y 1.468 bifurcaciones a finales de agosto de 2026, con 180 personas que han aportado código.

Lo interesante ocurre después de pegar la dirección. El rastreador abre la página en un Chrome sin ventana, extrae metadatos y texto legible y guarda una captura. Si se lo pides, añade una copia local completa hecha con monolith[1], que empaqueta la página con sus imágenes y estilos en un único fichero HTML.
Si la página lleva vídeo, yt-dlp[2] lo descarga. Si guardas una imagen, tesseract.js le pasa un reconocimiento óptico y el texto extraído entra también en el índice. Todo termina en Meilisearch, que es lo que mantiene rápida la búsqueda cuando la colección crece.
Comprobado dentro de la imagen que se está ejecutando: monolith 2.10.1, yt-dlp 2026.07.04 y Node v24.18.1. No son dependencias que tengas que instalar tú; el fichero de construcción compila monolith desde Rust y descarga el binario de yt-dlp.
Cuánto disco cuesta el archivado
Esta es la parte que casi nadie mira antes de importar diez mil marcadores. La documentación avisa en la fila de la variable correspondiente: "Whether to store a full local copy of the page or not. Disabled by default, as it can lead to much higher disk usage. If disabled, only the readable text of the page is archived". Traducido: si no lo activas, solo se guarda el texto legible, y el texto legible ocupa nada.
Activé CRAWLER_FULL_PAGE_ARCHIVE y CRAWLER_STORE_PDF y guardé páginas reales para medirlo. El desglose de un solo marcador, el artículo Marcador (web) de la Wikipedia en español:
| Fichero generado | Tamaño |
|---|---|
| Copia completa con monolith | 1.177.803 bytes |
| Captura de pantalla | 136.587 bytes |
| Instantánea en PDF | 86.079 bytes |
| Texto legible extraído | 12.938 bytes |
| Imagen de portada | 1.134 bytes |
Un marcador, 1,4 MB. El de la documentación de Docker Compose salió parecido: 962.341 bytes de archivo, 126.607 de captura y 120.402 de PDF. Con cinco marcadores guardados, el volumen de datos ocupaba 6,1 MB, de los cuales 5,5 MB eran ficheros archivados y solo 626.688 bytes la base de datos SQLite. La proporción es de nueve a uno.
Haz la cuenta antes de importar: cinco mil marcadores con archivo completo rondan los 6,5 GB, y cada vídeo descargado suma hasta 50 MB, que es el límite por defecto de CRAWLER_VIDEO_DOWNLOAD_MAX_SIZE. Con el archivado apagado, el mismo marcador se queda en unos 150 KB porque la captura de pantalla sí está activada de fábrica. Mi recomendación después de verlo: deja el archivo completo encendido y el PDF apagado, porque el PDF es una segunda copia de lo mismo con peor resultado.
Instalar Karakeep con Docker Compose
La instalación son cuatro pasos y ningún truco:
- Crea un directorio para la instalación y descarga en él el fichero de compose oficial.
- Genera los dos secretos con
openssl rand -base64 36, uno para cada variable. - Escribe el fichero
.envcon esas cuatro líneas mínimas. - Levanta la pila y entra en el puerto 3000 para crear la primera cuenta.
La descarga apunta al repositorio:
mkdir karakeep-app && cd karakeep-app
wget https://raw.githubusercontent.com/karakeep-app/karakeep/main/docker/docker-compose.yml
El fichero de variables mínimo tiene cuatro líneas. Copia el nombre con cuidado: la variable es MEILI_MASTER_KEY, y según el esquema de configuración del proyecto es la que leen tanto el contenedor de Meilisearch como el cliente de búsqueda de Karakeep.
KARAKEEP_VERSION=release
NEXTAUTH_SECRET=cadena_generada_con_openssl
MEILI_MASTER_KEY=otra_cadena_generada_con_openssl
NEXTAUTH_URL=http://localhost:3000
## Archivado (opcional, mira la seccion de disco antes)
CRAWLER_FULL_PAGE_ARCHIVE=true
CRAWLER_VIDEO_DOWNLOAD=true
KARAKEEP_VERSION=release sigue la última versión estable. Si prefieres controlar cuándo actualizas, fija el número de versión y súbelo a mano. Después, la orden de siempre:
docker compose up -d
Un detalle de la versión v0.33.2: el contenedor de Chrome cambió de imagen. Ya no es la vieja alpine-chrome, abandonada por su autor, sino ghcr.io/karakeep-app/karakeep-chrome:release, construida sobre el proyecto headless-shell de chromedp y con Chrome 151 en lugar de la 124 anterior. Si copiaste un compose de un artículo antiguo, esa línea es la que hay que cambiar.
Qué se ve en el primer arranque
Desplegué la pila en una máquina arm64 con 18 núcleos para escribir esto. El registro deja claro que la aplicación y los procesos de fondo viven en el mismo contenedor, supervisados por s6:
s6-rc: info: service svc-workers: starting
s6-rc: info: service svc-web: starting
Next.js 16.2.12
info: Workers version: 0.33.2
info: [crawler] Loading adblocker ...
info: Starting inference worker ...
info: [Crawler] Connecting to existing browser instance: http://chrome:9222/
Las cifras del despliegue, para que sepas dónde te metes. Las imágenes arm64 pesan 2,08 GB la de la aplicación, 517 MB la de Chrome y 261 MB la de Meilisearch.
En reposo, sin marcadores, el consumo de memoria medido fue de 681,6 MiB para la aplicación, 204,7 MiB para Chrome y 85,2 MiB para Meilisearch. Son cerca de 972 MiB entre los tres. Esto no cabe en una placa de dos gigas con otras cosas encima.
La primera cuenta que se registra queda como administradora automáticamente. Si vas a exponer la instancia, pon DISABLE_SIGNUPS=true justo después de crear la tuya.
Etiquetado con IA: modelo alojado o modelo en tu máquina
Sin proveedor configurado, el registro dice exactamente esto: [inference] No inference client configured, nothing to do now. El etiquetado es opcional y no falla en silencio, simplemente no ocurre.
La ruta alojada es una línea. El modelo por defecto es gpt-5.6-luna para texto y gpt-4o-mini para imágenes. El propio proyecto publica lo que cuesta: etiquetas para más de 6.000 marcadores por menos de un dólar, y más de 1.000 imágenes por menos de otro.
OPENAI_API_KEY=sk-...
La ruta local es la que interesa aquí, y tiene dos variantes. La recomendada por la documentación usa el punto final compatible con OpenAI que expone Ollama, porque se lleva mejor con modelos que formatean los mensajes a su manera:
OPENAI_API_KEY=ollama
OPENAI_BASE_URL=http://ollama.milab.local:11434/v1
INFERENCE_TEXT_MODEL=gemma3
INFERENCE_IMAGE_MODEL=llava
EMBEDDING_TEXT_MODEL=embeddinggemma
EMBEDDING_DIMENSIONS=768
INFERENCE_LANG=spanish
La variante nativa usa OLLAMA_BASE_URL y trae un aviso en mayúsculas en la documentación: "MAKE SURE YOU DON’T HAVE OPENAI_API_KEY set, otherwise it takes precedence". Si el modelo que eliges no admite salida estructurada, añade INFERENCE_OUTPUT_SCHEMA=plain. Y nunca pongas localhost en esa dirección: dentro del contenedor apunta al propio contenedor, no al anfitrión. Si todavía no tienes Ollama levantado, empieza por la guía de instalación de Ollama.
Ahora la parte honesta, porque la probé. Conecté un Ollama con gemma3 de 4.000 millones de parámetros y dejé que etiquetara un artículo de la Wikipedia. Tardó 259 segundos en procesador puro con 18 núcleos ocupados al máximo, para 1.109 tokens. El contador de Ollama lo confirma: 250.063 milisegundos.
Y el resultado fueron veinte etiquetas en inglés, con INFERENCE_LANG=spanish configurado, cuando la instrucción del programa pide entre diez y quince etiquetas y dice que deben estar en el idioma indicado.
Dos lecturas de ahí. La primera es que un modelo de 4.000 millones de parámetros ignora las instrucciones finas. En tu propia máquina conviene subir a un modelo mayor y aceptar que necesitas una tarjeta gráfica.
La segunda es que INFERENCE_NUM_WORKERS vale 1 por defecto, así que el etiquetado va en serie: importar diez mil marcadores y etiquetarlos en tu propio equipo es cuestión de días, no de una tarde. Como tarea de fondo funciona; como respuesta inmediata al guardar un enlace, no.
Importar lo que ya tienes y capturar lo nuevo
La importación acepta el formato HTML de Netscape, que es lo que exportan Chrome y Firefox, el CSV nuevo de Pocket y los JSON de Omnivore. Se conservan títulos, etiquetas y fecha de alta, y todo lo importado cae en una lista creada para la ocasión. Un aviso de la documentación que conviene leer dos veces: se importan todas las direcciones del fichero, sin posibilidad de elegir cuáles.
Para lo nuevo hay tres vías. Las extensiones oficiales de Chrome y Firefox añaden un botón de guardar. Las aplicaciones nativas de iOS y Android aparecen en el menú de compartir del sistema y permiten lectura sin conexión. Y los feeds RSS convierten esto en algo distinto: das de alta un feed en los ajustes, Karakeep lo revisa cada hora y crea un marcador por entrada nueva, saltándose las repetidas.
Con eso, un blog que sigues queda archivado entero sin que hagas nada, que es justo el caso en el que el archivado completo compensa el disco.
Qué hay que copiar cuando haces una copia de seguridad
El error habitual es respaldar la base de datos y quedarse tranquilo. DATA_DIR contiene dos cosas: el fichero db.db y el directorio assets, y ya hemos visto que el segundo pesa nueve veces más que el primero. La copia útil es el volumen data entero, parado el contenedor o con la base de datos en un estado consistente.
El volumen de Meilisearch es la excepción agradable: no hace falta respaldarlo. Si lo pierdes, se vacía la carpeta data.ms y se reconstruye desde el panel de administración con la tarea de reindexar todos los marcadores. Ojo con actualizar Meilisearch por tu cuenta, porque la versión está fijada en 1.41.0 y un salto de versión deja el índice ilegible.
Desde la versión v0.33 hay además un proceso de copias por usuario que genera un fichero de exportación programado. Es útil para llevarte tus datos, con un matiz que conviene tener claro. Ese fichero se guarda como un recurso más dentro del mismo directorio de datos, así que es una exportación, no una copia fuera de la máquina. Si ya tienes Nextcloud montado con Docker, el destino natural de esos volúmenes está resuelto.
Karakeep frente a Linkwarden y a los marcadores del navegador
Linkwarden es la comparación inevitable: misma licencia AGPL-3.0, mismo lenguaje, mismo Meilisearch por debajo y 19.631 estrellas. La diferencia que se nota el primer día es la base de datos.
| Karakeep v0.33.2 | Linkwarden | Marcadores del navegador | |
|---|---|---|---|
| Base de datos | SQLite en un fichero | PostgreSQL 16 aparte | Ninguna |
| Contenedores | 3 | 3 | 0 |
| Archivo de la página | monolith, PDF y captura | Sí | No |
| Vídeo con yt-dlp | Sí | No | No |
| Etiquetado con modelo local | Sí, con Ollama | Parcial | No |
| Búsqueda de texto completo | Meilisearch | Meilisearch | Solo por título |
| Coste en disco | Alto | Alto | Cero |
Contra los marcadores del navegador la comparación es más simple de lo que parece. Un marcador de navegador guarda una dirección; Karakeep guarda la página. El día que la página desaparece, uno se queda con una lápida y el otro con el contenido. Ese es todo el argumento, y es el que justifica el gigabyte de memoria y los seis gigas de disco.
Si lo que quieres archivar son documentos tuyos y no páginas ajenas, la herramienta no es esta: Paperless-ngx hace ese trabajo con reconocimiento óptico y clasificación propia. Acabar con las dos tiene sentido, y no se solapan tanto como parece.
Preguntas frecuentes
¿Puedo instalar Karakeep sin ninguna IA?
Sí, y funciona perfectamente. Sin OPENAI_API_KEY ni OLLAMA_BASE_URL el proceso de inferencia escribe que no hay cliente configurado y sigue adelante. Pierdes las etiquetas automáticas y los resúmenes, pero conservas el rastreo, el archivado, el reconocimiento óptico y la búsqueda de texto completo con Meilisearch.
¿Qué modelo local elijo para el etiquetado?
Los ejemplos de la documentación usan gemma3 para texto y llava para imágenes. Con un modelo de 4.000 millones de parámetros en procesador medí 259 segundos por marcador y etiquetas en inglés pese a pedirlas en español. Planifícalo como tarea nocturna o pon una tarjeta gráfica de por medio.
¿Cuánto disco necesito para diez mil marcadores?
Con archivado completo activado, alrededor de 13 GB según lo medido aquí, más lo que sumen los vídeos a 50 MB cada uno como máximo. Con el archivado apagado bajas a poco más de 1,5 GB, porque solo se guardan la captura y el texto legible.
Conclusión
Instalar Karakeep es descargar un compose, escribir cuatro variables y levantar tres contenedores. Lo que hay que decidir antes son dos cosas que el instalador no te pregunta. La primera, cuánto disco estás dispuesto a gastar en archivar páginas enteras. La segunda, si el etiquetado lo vas a pagar en céntimos a un proveedor o en horas de procesador propio.
Mi lectura tras medirlo es que el archivado completo vale cada byte y que el etiquetado local funciona mejor como proceso nocturno que como magia instantánea. La versión en inglés de esta guía está en How to install Karakeep.
Fuentes
- monolith
- yt-dlp
- Karakeep, introducción y funcionalidades
- karakeep-app/karakeep, repositorio y notas de versión
- Karakeep, instalación con Docker
- Karakeep, variables de entorno
- Karakeep, configurar distintos proveedores de IA
- Karakeep, coste del etiquetado
- Karakeep, importar tu biblioteca
- Karakeep, feeds RSS
- Meilisearch, documentación
Código fuente
Accede a todo el código fuente de este artículo en GitHub.
Ver en GitHub