Guia completa de instalacion y configuracion. Syncthing, Obsidian, Templater, scripts de deploy y automatizacion.
Tabla de Contenidos 36 secciones
Orden de lectura recomendado: doc-readme → doc-guia → doc-arquitectura → doc-operacion → doc-auditoria
| Herramienta | Versión mínima | Verificación |
|---|---|---|
| Node.js | 20+ | node --version |
| npm | 10+ | npm --version |
| Git | 2+ | git --version |
| Syncthing | Cualquiera | syncthing --version |
| ffmpeg | 4+ | ffmpeg -version |
| watchman | Cualquiera | watchman --version |
| Python | 3.9+ | python3 --version |
| Ollama | latest | ollama --version |
| Modelo Ollama | qwen2.5-coder:7b-64k | ollama list |
- Obsidian instalado desde Google Play
- Syncthing instalado desde F-Droid o Google Play
- Plugin Templater instalado en Obsidian
Syncthing sincroniza la carpeta src/content/posts/ entre Android y Mac de forma peer-to-peer.
- Instalar Syncthing:
brew install syncthing - Iniciar el servicio:
brew services start syncthing - Abrir interfaz web: http://localhost:8384
- Añadir carpeta: ruta
~/markeup/src/content/posts/ - En la pestaña “Compartir”, seleccionar el dispositivo Android
- Abrir Syncthing, ir a “Dispositivos” → añadir el Mac (por ID)
- Añadir carpeta con ID idéntica a la del Mac
- Ruta de la carpeta en Android: donde Obsidian guarda el vault
Verificar sincronización: Crear un archivo de prueba en Android. Debe aparecer en src/content/posts/ del Mac en 1-5 segundos.
El plugin Templater automatiza la creación de nuevos posts generando el frontmatter correcto y el slug.
vault/
├── posts/ ← Se sincroniza con src/content/posts/
├── templates/ ← Plantillas de Templater
└── img/ ← Imágenes para posts
Crear templates/post-template.md:
---
title: <% tp.file.title %>
slug: <% tp.file.title.toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9áéíóúüñ-]/g, '') %>
description:
type: post
lang: es-ES
draft: true
authors:
- Admin
pubDate: <% tp.date.now("YYYY-MM-DDTHH:mm:ss.000Z") %>
updatedDate: <% tp.date.now("YYYY-MM-DDTHH:mm:ss.000Z") %>
categories: []
tags: []
featured: false
image: /img/placeholder.webp
imageAlt:
---
- En Obsidian → Settings → Templater
- Template folder location:
templates/ - Activar “Trigger Templater on new file creation”
- Activar “Folder templates”: asignar
post-template.mda la carpetaposts/
Con esto, cada nuevo archivo creado en posts/ tendrá el frontmatter completo automáticamente.
# Clonar el repositorio
git clone https://github.com/uriszarernesto-blip/markeup.git
cd markeup
# Instalar dependencias
npm ci
# Verificar que todo funciona
npm run build
El build debe completarse con 192 páginas y 0 errores.
El script generar_articulo.py permite crear posts completos a partir de una URL usando Ollama como motor de generación. Requiere configuración adicional independiente del ecosistema npm.
# Instalar Ollama (servidor local de LLMs)
brew install ollama
# Iniciar el servicio
ollama serve
# Descargar el modelo requerido (7B params, 64K contexto)
ollama pull qwen2.5-coder:7b-64k
# Verificar que el modelo está disponible
ollama list
# Instalar librerías Python necesarias
uv pip install requests trafilatura beautifulsoup4
# Probar que Ollama responde
curl http://localhost:11434/api/tags
# Probar que el script se ejecuta (modo interactivo)
uv run python src/generar_articulo.py
Si todo está correcto, el script pedirá una URL. Pega cualquier URL de prueba (ej. Wikipedia) y espera 3-6 minutos a que genere el artículo.
- En Obsidian (Android o desktop), crear nueva nota en
posts/ - Templater genera el frontmatter automáticamente
- Escribir el contenido en Markdown
- Cambiar
draft: falsecuando esté listo para publicar - Syncthing sincroniza el archivo al Mac
# Con URL como argumento
uv run python src/generar_articulo.py "https://es.wikipedia.org/wiki/Inteligencia_artificial"
# Modo interactivo (pide la URL)
uv run python src/generar_articulo.py
El script automáticamente:
- Descarga y extrae el texto de la URL
- Detecta la categoría más adecuada (Biodanza, Documentación, Tecnología, Opinión, Literatura)
- Genera entre 3 y 8 tags relevantes a partir del contenido
- Construye un prompt detallado y lo envía a Ollama
- Recibe el artículo Markdown completo (3000-5000 palabras)
- Guarda el archivo en
src/content/posts/<Categoría>/[slug].md
Aviso: La generación tarda entre 3 y 6 minutos. El script muestra mensajes de estado en cada etapa.
- Colocar la imagen en
src/content/posts/img/ - Ejecutar
npm run images(o esperar al build, que lo hace automáticamente) - Referenciar en el frontmatter:
image: /img/nombre.webp
# Verificar build local
npm run build
# Si todo OK, publicar
git add .
git commit -m "Nuevo post: título del post"
git push origin main
GitHub Actions hace el build y despliega automáticamente en Cloudflare Pages.
Hermes Agent es el Editor Jefe del vault: un asistente IA que corre sobre Ollama y gestiona el contenido de forma inteligente. Usa el mismo modelo qwen2.5-coder:7b-64k que el generador de artículos.
- Ollama corriendo en
http://127.0.0.1:11434(misma instalación de la sección 5.1) - Modelo
qwen2.5-coder:7b-64kdescargado (ollama pull qwen2.5-coder:7b-64k) - Hermes Agent instalado (
which hermes→/Users/ernestouriszar/.local/bin/hermes)
# Iniciar chat interactivo (Hermes usará la config en ~/.hermes/config.yaml)
hermes chat
La configuración de Hermes (~/.hermes/config.yaml) ya apunta a Ollama:
model:
default: qwen2.5-coder:7b-64k
provider: custom
base_url: http://127.0.0.1:11434/v1
api_key: ollama
api_mode: chat_completions
context_length: 65536
Hermes lee y escribe en src/content/posts/hermes/:
SOUL.md— su personalidad y reglasmemory/vault-index.md— índice de los 63 posts del vaultmemory/backlog.md— 22 ideas de posts priorizadasskills/— flujos de trabajo (crear, ampliar, wikilinks, auditar, documentar)
| Comando | Qué hace |
|---|---|
Crea un post sobre [tema] en [categoría] | Genera nota con frontmatter + wikilinks |
Amplía [slug] con una sección sobre [X] | Expande contenido existente |
Revisa los wikilinks de [slug] | Escanea y enriquece enlaces |
Audita el vault | Informe completo de salud del vault |
Revisa la documentación | Verifica que los docs estén actualizados |
El sitio incluye 6 temas DaisyUI. El tema por defecto para modo oscuro es dark. Los temas están configurados en tailwind.config.cjs:
daisyui: {
themes: ["light", "cupcake", "corporate", "dark", "dim", "sunset"],
darkTheme: "dark",
}
Los posts sin imagen usan /img/placeholder.webp. Para cambiar la imagen por defecto, modificar content.config.ts:
image: z.string().optional().default('/img/placeholder.webp'),
- Crear la carpeta en
src/content/posts/<categoria>/ - Los posts dentro usarán automáticamente esa categoría en el frontmatter
- La página
/category/<categoria>se genera automáticamente en el build
Para añadir o modificar las categorías que detecta generar_articulo.py, editar las variables en el script:
CATEGORIAS = ["Biodanza", "Documentación", "Tecnología", "Opinión", "Literatura"]
KEYWORDS_CATEGORIAS = {
"Biodanza": ["biodanza", "danza", "movimiento", ...],
"Tecnología": ["tecnología", "software", "ia", ...],
# Añadir nueva categoría aquí
}
- Verificar que ambos dispositivos están en la misma red
- En Android, desactivar optimización de batería para Syncthing
- Verificar permisos de carpeta en Mac:
ls -la src/content/posts/
- Verificar que el frontmatter tiene todos los campos requeridos
draft: trueevita que posts incompletos aparezcan en producción- Las fechas
pubDatedeben ser válidas (formato ISO 8601)
- Ejecutar
npm run images -- --force - Verificar que la ruta en frontmatter empieza con
/img/ - La extensión debe ser
.webp - Imágenes externas (Unsplash) se referencian con URL completa:
https://images.unsplash.com/...
Síntoma: ❌ No se pudo extraer contenido o error de conexión.
Causas y soluciones:
| Error | Causa probable | Solución |
|---|---|---|
❌ No se pudo extraer contenido | URL inaccesible, sin internet, o página bloquea scrapers | Verificar URL en navegador. Probar con otra URL |
⚠️ El contenido es muy corto (<500 caracteres) | La página tiene poco texto o es principalmente JS | Probar otra URL o responder s para continuar igual |
| Error de conexión a Ollama | Ollama no está corriendo | ollama serve o brew services start ollama |
model not found | El modelo no está descargado | ollama pull qwen2.5-coder:7b-64k |
| Timeout (>10 min) | El modelo tardó demasiado o se colgó | Verificar que Ollama tiene recursos suficientes. Reintentar |
| El artículo no tiene bloque ````markdown` | El modelo devolvió la respuesta sin el bloque de código | El script usa toda la respuesta como fallback. Revisar el archivo generado |
| Documento | Contenido |
|---|---|
| doc-readme | Visión general y stack |
| doc-arquitectura | Arquitectura y componentes |
| doc-operacion | Comandos y troubleshooting |
| doc-auditoria | Auditoría y deuda técnica |