Guía de MarkeUP: requisitos, Syncthing y Obsidian con Templater
La guía de instalación de MarkeUP: requisitos previos, la configuración de Syncthing en Mac y Android, Obsidian con Templater y el generador automático de artículos.
Navegando en el blogver navegación en todos los blogs
Orden de lectura recomendado: doc-readme → doc-guia → doc-arquitectura → doc-buscador → doc-operacion → doc-publicar → 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.
Atajo: todo esto se puede hacer con
npm run syncthing, que detecta la instalación, arranca el servicio y muestra los pasos guiados (npm run syncthing -- check | id | folder | open).
- Comprobar si ya está instalado:
npm run [[syncthing-solucion-segura-abierta|syncthing]] -- check - Si no lo está, instalarlo:
npm run [[syncthing-solucion-segura-abierta|syncthing]] -- install(o manualmente:brew install [[syncthing-solucion-segura-abierta|syncthing]]) - Arrancar:
npm run [[syncthing-solucion-segura-abierta|syncthing]](con Homebrew también valebrew services start [[syncthing-solucion-segura-abierta|syncthing]]) - Ver los pasos de emparejamiento:
npm run [[syncthing-solucion-segura-abierta|syncthing]] -- folder - Abrir la interfaz web:
npm run [[syncthing-solucion-segura-abierta|syncthing]] -- open(http://localhost:8384) - Añadir carpeta:
src/content/posts/y marcar 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
Obtener el ID del Mac: npm run [[syncthing-solucion-segura-abierta|syncthing]] -- id
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)
python3 scripts/py/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
python3 scripts/py/generar_articulo.py "https://es.wikipedia.org/wiki/Inteligencia_artificial"
# Modo interactivo (pide la URL)
python3 scripts/py/generar_articulo.py
El script automáticamente:
- Descarga y extrae el texto de la URL
- Detecta la categoría más adecuada (Humano, Documentación, Máquina, 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
En cualquier artículo puedes embeder otro post enlazable con la sintaxis Obsidian de embebido (usa el slug del destino):
![[silva-mind-control]]
Resultado: una rich format card con imagen, categoría, autor·fecha, minutos de lectura y enlace «Ir al artículo». También puedes hacer un enlace simple y el lector obtendrá hover-preview sobre él ([[slug]] o [texto](/posts/slug) dentro del cuerpo). Ejemplo real en Máquina/obsidian-embeds-demo.md.
Los tooltips/cards leen
/api/posts.jsongenerado pornpm run build. Si acabas de publicar otro post y no aparece preview, regenera el build para actualizar el manifiesto.
# 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/hermes/:
memory/vault-index.md— índice de los posts del vaultmemory/backlog.md— ideas de posts priorizadasmemory/conventions.md— decisiones editorialesrules/—frontmatter-spec.md,style-guide.md,wikilinks-spec.mdtemplates/post-template.md— plantilla canónicaskills/— las 9 skills (symlink a~/.hermes/skills/)
Una sola carpeta
hermes/: toda la infraestructura vive ensrc/content/hermes/, ysrc/content/posts/contiene solo posts del blog.
| 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 10 temas DaisyUI. El tema por defecto es light y el de modo oscuro dark. Se configuran en src/styles/base.css (Tailwind v4 CSS-first):
@plugin 'daisyui' {
themes: light --default, cupcake, corporate, pastel, retro, dark --prefersdark, dim, sunset, luxury, coffee;
}
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 = ["Humano", "Documentación", "Máquina", "Opinión", "Literatura"]
KEYWORDS_CATEGORIAS = {
"Humano": ["biodanza", "danza", "movimiento", ...],
"Máquina": ["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 | README]] |
| [[doc-arquitectura | Arquitectura]] |
| [[doc-operacion | Operación]] |
| [[doc-auditoria | Auditoría]] |
Véase también: la arquitectura y la auditoría para el detalle del sistema.
Enlaces: arquitectura, operación y Vault CMS.
En esta misma línea, 5 Ritmos aborda gabrielle Roth y la Danza de los 5 Ritmos (5Rhythms): una práctica de movimiento meditativo y somático basada en las olas.
doc-guia-MarkeUp
Explora las ramas del artículo
