Arquitectura: Sistema Multiblog y Frontmatter
Filosofía de Diseño
Principios Fundamentales
- El frontmatter es la verdad: Las carpetas solo sirven para organización interna. El tipo, clasificación y metadatos de cualquier contenido se definen exclusivamente en el frontmatter.
- Flexibilidad total: Un mismo contenido puede pertenecer a múltiples categorías (
categoriescomo array), aparecer en varios “blogs” o secciones simultáneamente. - Consistencia con el tema base: Mantenemos compatibilidad con el tema de David V. Kimball, ampliándolo con nuevos campos sin romper funcionalidades existentes.
- Estándares de la industria: Usamos formatos ISO 8601 para fechas, arrays para autores y categorías, y nombres de campos semánticos y claros.
Carpetas vs. Frontmatter
- Carpetas (
posts/,docs/,projects/,pages/,special/): Solo organización física de archivos. - Frontmatter (
type: post,categories: [biodanza], etc.): Define la naturaleza, clasificación y comportamiento del contenido.
Frontmatter Estándar (Núcleo Común)
Estos campos son válidos para todos los tipos de contenido:
title: 'Título del Contenido'
slug: slug-del-contenido
description: Descripción breve para SEO y tarjetas.
type: post | doc | project | page | special
lang: es-ES
draft: false
aliases:
- antigua-url
noIndex: false
hideTOC: false
showTOC: false
hideCoverImage: false
Descripción de campos:
title: Título principal del contenido.slug: URL amigable. Si no existe, se genera desde el título.description: Descripción para SEO, meta tags y tarjetas sociales.type: Tipo de contenido. Determina qué campos adicionales son válidos.lang: Idioma del contenido (formato BCP 47:es-ES,en-US, etc.).draft: Si estrue, el contenido no se publica. Si esfalse, se publica.aliases: Array de URLs antiguas que redirigen a este contenido (para SEO y compatibilidad).noIndex: Si estrue, el contenido no se indexa en buscadores.hideTOC: Si estrue, oculta la tabla de contenidos.showTOC: Si estrue, fuerza la muestra de la tabla de contenidos.hideCoverImage: Si estrue, oculta la imagen de portada (útil si la imagen ya está en el cuerpo del texto).
Extensiones por Tipo de Contenido
1. POSTS (Artículos del Blog)
---
title: 'La respiración: Mecánica biológica y control consciente'
slug: la-respiracion-mecanica-biologica-y-control-consciente
description: Análisis de la respiración como proceso fisiológico fundamental.
type: post
lang: es-ES
draft: false
# Autores (array para soportar co-autoría)
authors:
- 'Ernesto Uriszar'
# Fechas (ISO 8601 completo)
pubDate: 2026-06-01T10:21:00.000Z
updatedDate: 2026-06-01T10:21:00.000Z
# Clasificación (array para multiblog)
categories:
- biodanza
- bienestar
tags:
- respiracion
- fisiologia
- sistema-nervioso
# Visibilidad y Control
featured: false
allowComments: true
share: true
# Imagen de portada
image: '/articulos/la_respiracion.webp'
imageAlt: 'Representación gráfica de la caja torácica.'
# SEO
canonicalUrl: null
# Control de visualización
aliases:
- respiracion
noIndex: false
hideTOC: false
showTOC: false
hideCoverImage: false
---
Campos específicos de posts:
authors: Array de nombres de autores. Soporta co-autoría.pubDate: Fecha de publicación (ISO 8601).updatedDate: Fecha de última modificación (ISO 8601).categories: Array de categorías. Un post puede pertenecer a múltiples “blogs” o secciones.tags: Array de etiquetas para clasificación transversal.featured: Si estrue, el post se destaca en la portada.allowComments: Si estrue, se muestran los controles de comentarios (preparado para integración futura).share: Si estrue, se muestran los botones de compartir en redes sociales.image: Ruta a la imagen de portada (puede ser ruta absoluta/ruta.webpo sintaxis Obsidian[[imagen.png]]).imageAlt: Texto alternativo para la imagen (accesibilidad y SEO).canonicalUrl: URL canónica externa (si el contenido se publicó primero en otro sitio).nullsi no aplica.
2. DOCS (Documentación)
---
title: 'Configuración de SourceTree y Git'
slug: sourcetree-and-git-setup
description: Guía completa para configurar SourceTree y Git.
type: doc
lang: es-ES
draft: false
# Autores
authors:
- 'Ernesto Uriszar'
# Fechas
pubDate: 2024-01-15T00:00:00.000Z
updatedDate: 2024-01-15T00:00:00.000Z
# Clasificación (array)
categories:
- software-opcional
- git
# Orden y versión (específicos de docs)
order: 2
version: '1.0.0'
# Imagen
image: '[[sourcetree.png]]'
imageAlt: 'Logo de SourceTree con fondo azul.'
# Control de visualización
hideTOC: false
showTOC: false
hideCoverImage: false
noIndex: false
aliases:
- sourcetree-and-git
---
Campos específicos de docs:
order: Número para ordenar en la barra lateral de documentación.version: Versión del documento (ej:'1.0.0').categories: Array de categorías. La primera categoría se usa para agrupar en la barra lateral.
3. PROJECTS (Proyectos)
---
title: 'Astro Composer'
slug: astro-composer
description: Herramienta para componer sitios Astro modulares.
type: project
lang: es-ES
draft: false
# Autores
authors:
- 'Ernesto Uriszar'
# Fechas
pubDate: 2026-01-01T00:00:00.000Z
updatedDate: 2026-06-01T00:00:00.000Z
# Clasificación
categories:
- astro
- open-source
# URLs del proyecto
repositoryUrl: 'https://github.com/uriszarernesto-blip/astro-composer'
projectUrl: 'https://astro-composer.pages.dev'
demoUrl: 'https://demo.astro-composer.pages.dev'
status: 'Activo'
# Visibilidad
featured: true
# Imagen
image: '/projects/astro-composer.webp'
imageAlt: 'Captura de pantalla de Astro Composer.'
# Control
hideTOC: false
showTOC: false
hideCoverImage: false
noIndex: false
---
Campos específicos de projects:
repositoryUrl: URL del repositorio de código (GitHub, GitLab, etc.).projectUrl: URL del proyecto en producción.demoUrl: URL de una demo en vivo.status: Estado del proyecto (ej:'Activo','Archivado','En desarrollo').featured: Si estrue, el proyecto se destaca en la página de proyectos.
4. PAGES (Páginas Estáticas)
---
title: 'Acerca de'
slug: about
description: Conoce más sobre Astro Modular.
type: page
lang: es-ES
draft: false
# Imagen (opcional para pages)
image: null
imageAlt: null
# Control
hideTOC: false
showTOC: false
hideCoverImage: false
noIndex: false
aliases:
- about-me
- about-us
---
Notas sobre pages:
- Las páginas estáticas (Acerca de, Contacto, Política de Privacidad) no necesitan fechas, autores ni categorías.
- Solo usan el núcleo común + imagen opcional + control de visualización.
5. SPECIAL (Páginas Especiales)
---
title: 'Inicio'
description: Página principal del sitio.
type: special
lang: es-ES
hideTOC: true
---
Notas sobre special:
- Páginas con lógica especial (home, 404, índices de secciones).
- Solo necesitan el mínimo:
title,description,type,lang,hideTOC.
Reglas de Conversión (Migración)
Al migrar contenido antiguo, se aplican estas transformaciones automáticas:
| Campo Antiguo | Campo Nuevo | Transformación |
|---|---|---|
date | pubDate | Renombrar y convertir a ISO 8601 |
lastModified | updatedDate | Renombrar y convertir a ISO 8601 |
author | authors | Convertir string a array: 'Ernesto' → ['Ernesto'] |
subtype | categories | Convertir string a array: 'Biodanza' → ['biodanza'] |
published: true | draft: false | Invertir lógica booleana |
url: nulo | canonicalUrl: null | Renombrar y convertir 'nulo' a null |
heroImage | image | Renombrar (mantener ruta exacta) |
heroImageAlt | imageAlt | Renombrar |
id | (eliminar) | Redundante con el nombre del archivo |
readingTime | (eliminar) | Calculado automáticamente por Astro |
category (singular) | categories (array) | Convertir a array |
Formato de Fechas
Estándar: ISO 8601 completo con zona horaria UTC.
Ejemplo: 2026-06-01T10:21:00.000Z
Componentes:
2026-06-01: Fecha (YYYY-MM-DD)T: Separador10:21:00: Hora (HH:MM:SS).000: MilisegundosZ: Zona horaria UTC
Conversión automática:
- Si el campo antiguo es
2024-01-15(solo fecha), se convierte a2024-01-15T00:00:00.000Z. - Si el campo antiguo es
2024-01-15T10:30:00(sin zona), se asume UTC y se añadeZ.
Imágenes: Sintaxis Soportadas
El sistema acepta dos formatos de ruta en el campo image:
1. Ruta Absoluta (Recomendado)
image: '/articulos/la_respiracion.webp'
- Ruta desde la carpeta
public/. - Astro optimiza automáticamente la imagen.
- Recomendado para producción.
2. Sintaxis Obsidian (Wikilink)
image: '[[sourcetree.png]]'
- Sintaxis nativa de Obsidian.
- El tema busca la imagen en la bóveda y la copia a
public/. - Útil durante la edición en Obsidian.
Nota: Ambos formatos son válidos. El tema los procesa automáticamente.
Próximos Pasos de Implementación
- ✅ Documentación (este archivo): Definir la arquitectura completa.
- ⏳ Actualizar
src/content.config.ts: Validar el nuevo schema con todos los campos. - ⏳ Script de migración: Convertir automáticamente todos los archivos
.mdexistentes al nuevo formato. - ⏳ Adaptar componentes: Modificar
PostCard.astro,DocsSidebar.astro, etc., para leer los nuevos campos (authors,categories,pubDate, etc.). - ⏳ Crear páginas dinámicas: Implementar
/blog/[categoria]para listar posts por categoría.
Ejemplos Completos por Tipo
Ejemplo 1: Post de Blog
---
title: 'Introducción a la Biodanza'
slug: introduccion-biodanza
description: Descubre los principios fundamentales de la Biodanza.
type: post
lang: es-ES
draft: false
authors:
- 'Ernesto Uriszar'
pubDate: 2026-06-01T10:00:00.000Z
updatedDate: 2026-06-05T14:30:00.000Z
categories:
- biodanza
- bienestar
tags:
- introduccion
- principios
featured: false
allowComments: true
share: true
image: '/articulos/biodanza.webp'
imageAlt: 'Personas bailando en círculo.'
canonicalUrl: null
hideTOC: false
showTOC: false
hideCoverImage: false
noIndex: false
---
Ejemplo 2: Documentación Técnica
---
title: 'Instalación de Obsidian'
slug: installing-obsidian
description: Guía paso a paso para instalar Obsidian en tu sistema.
type: doc
lang: es-ES
draft: false
authors:
- 'Ernesto Uriszar'
pubDate: 2024-01-10T00:00:00.000Z
updatedDate: 2024-01-15T00:00:00.000Z
categories:
- instalacion
- obsidian
order: 1
version: '1.0.0'
image: '[[obsidian-logo.png]]'
imageAlt: 'Logo de Obsidian.'
hideTOC: false
showTOC: false
hideCoverImage: false
noIndex: false
---
Ejemplo 3: Proyecto
---
title: 'Vault CMS'
slug: vault-cms
description: Convierte tu bóveda de Obsidian en un CMS para blogs.
type: project
lang: es-ES
draft: false
authors:
- 'Ernesto Uriszar'
pubDate: 2026-01-01T00:00:00.000Z
updatedDate: 2026-06-01T00:00:00.000Z
categories:
- astro
- cms
repositoryUrl: 'https://github.com/uriszarernesto-blip/vault-cms'
projectUrl: 'https://vault-cms.pages.dev'
demoUrl: ''
status: 'Activo'
featured: true
image: '/projects/vault-cms.webp'
imageAlt: 'Captura de Vault CMS.'
hideTOC: false
showTOC: false
hideCoverImage: false
noIndex: false
---
Resumen de Campos por Tipo
| Campo | post | doc | project | page | special |
|---|---|---|---|---|---|
title | ✅ | ✅ | ✅ | ✅ | ✅ |
slug | ✅ | ✅ | ✅ | ✅ | ❌ |
description | ✅ | ✅ | ✅ | ✅ | ✅ |
type | ✅ | ✅ | ✅ | ✅ | ✅ |
lang | ✅ | ✅ | ✅ | ✅ | ✅ |
draft | ✅ | ✅ | ✅ | ✅ | ❌ |
authors | ✅ | ✅ | ✅ | ❌ | ❌ |
pubDate | ✅ | ✅ | ✅ | ❌ | ❌ |
updatedDate | ✅ | ✅ | ✅ | ❌ | ❌ |
categories | ✅ | ✅ | ✅ | ❌ | ❌ |
tags | ✅ | ❌ | ❌ | ❌ | ❌ |
featured | ✅ | ❌ | ✅ | ❌ | ❌ |
allowComments | ✅ | ❌ | ❌ | ❌ | ❌ |
share | ✅ | ❌ | ❌ | ❌ | ❌ |
image | ✅ | ✅ | ✅ | ✅ | ❌ |
imageAlt | ✅ | ✅ | ✅ | ✅ | ❌ |
canonicalUrl | ✅ | ❌ | ❌ | ❌ | ❌ |
order | ❌ | ✅ | ❌ | ❌ | ❌ |
version | ❌ | ✅ | ❌ | ❌ | ❌ |
repositoryUrl | ❌ | ❌ | ✅ | ❌ | ❌ |
projectUrl | ❌ | ❌ | ✅ | ❌ | ❌ |
demoUrl | ❌ | ❌ | ✅ | ❌ | ❌ |
status | ❌ | ❌ | ✅ | ❌ | ❌ |
aliases | ✅ | ✅ | ✅ | ✅ | ❌ |
noIndex | ✅ | ✅ | ✅ | ✅ | ❌ |
hideTOC | ✅ | ✅ | ✅ | ✅ | ✅ |
showTOC | ✅ | ✅ | ✅ | ✅ | ❌ |
hideCoverImage | ✅ | ✅ | ✅ | ✅ | ❌ |
Conclusión
Este sistema de frontmatter proporciona:
- Máxima flexibilidad: Un contenido puede aparecer en múltiples lugares sin duplicación.
- Compatibilidad total: Respeta el tema base y el flujo de trabajo con Obsidian.
- Escalabilidad: Fácil de ampliar con nuevos campos en el futuro.
- Claridad: Cada campo tiene un propósito específico y bien documentado.
El siguiente paso es actualizar src/content.config.ts para validar este schema y luego crear el script de migración.