Desplegando Astro Obsidian en Netlify
Obsidian
- Obsidian - Sharpen your thinking
- Obsidian permite desarrollar un “segundo cerebro”.
- Un sistema de anotación donde las notas se pueden independizar e ir relacionando orgánicamente.
- Eventualmente, se llega a material que se puede compartir con otras personas.
- Las notas se almacenan en archivos markdown.
- Maneja tags.
- Tiene un amplio ecosistema de plugins.
- Se puede usar libremente de manera local.
- La publicación directa en web requiere el pago de una membresía.
Astro
- Astro
- Astro es un framework que permite publicar sites de contenido.
- El contenido se puede almacenar en archivos markdown.
- Además de html
- Puede manejar tags.
- Tiene un amplio sistema de plugins.
- Se puede usar libremente.
- Se puede desplegar con relativa facilidad en diversos ambientes.
- Local
- Netlify
- Vercel
Idea
- Qué tal si usamos astro para publicar notas que podamos desarrollar y mantener fácilmente con obsidian.
- Que funcione bien:
- Hacer links en obsidian que sean reconocidos en el site publicado en astro
- Copiar y pegar imagenes en obsidian que sea reconocidos en el site publicado en astro
- Que bloques especiales de obsidian sean reconocidos en el site publicado en astro
- code
- mermaid
- math
Estrategia
- Crear un vault obsidian
- Configurarlo para aumentar su compatibilidad con astro
- Files and links
- Default Location for new notes: Same folder as current file
- New link format: Relative path to file
- Use [[Wikilinks]]: NO
- Default location for new attachments: In the folder specified below.
- Attachment folder path:
astro/images(para imágenes estáticas que no serán procesadas por Astro).
- Files and links
- Configurarlo para aumentar su compatibilidad con astro
- Crear un proyecto astro del tipo blog
- Ya tiene una configuración de ejemplo que funciona para blogging.
- Tener un content que apunte a una carpeta de contenido de un vault de obsidian
- Tener un assets que apunte a una carpeta de assets de un vault de obsidian
Tecnología
Se utiliza una configuración que permite usar un vault (bóveda) de Obsidian para facilitar la edición del contenido para un sitio web de Astro.
Aquí se detallan algunos aspectos técnicos importantes.
Astro + Obsidian
- akobashikawa/astro-obsidian: Integrando astro para usarlo con obsidian
- El repositorio está organizado en dos directorios principales:
loqueaprendihoy/: Contiene el proyecto de Astro (el sitio web).loqueaprendihoy-vault/: Contiene la bóveda de Obsidian (el contenido).
- Para que obsidian pueda acceder al contenido de astro, se están utilizando enlaces simbólicos.
loqueaprendihoy-vault/astro/contentes un enlace simbólico aloqueaprendihoy/src/contentloqueaprendihoy-vault/astro/assetses un enlace simbólico aloqueaprendihoy/src/assets- Uso: Para imágenes que quieres que Astro optimice (compresión, generación de formatos modernos, etc.). Ideal para imágenes de contenido como
heroImageen el frontmatter. - Consideración: El hot-reloading de Astro puede fallar si se renombra o elimina un archivo de esta carpeta desde Obsidian (por ejemplo, con el plugin “Paste image rename”).
- Uso: Para imágenes que quieres que Astro optimice (compresión, generación de formatos modernos, etc.). Ideal para imágenes de contenido como
loqueaprendihoy-vault/astro/imageses un enlace simbólico aloqueaprendihoy/public/images- Uso: Para imágenes estáticas que se servirán tal cual. Es la carpeta recomendada para los adjuntos automáticos de Obsidian.
- Consideración: El hot-reloading funciona de manera fiable con esta carpeta.
Flujo de trabajo recomendado:
- Configura Obsidian para que guarde las imágenes en
astro/images. La mayoría de tus imágenes vivirán aquí.- Si necesitas que una imagen específica sea optimizada por Astro (por ejemplo, la imagen principal de un post), muévela manualmente de la carpeta
imagesaassetsy actualiza la ruta en tu archivo Markdown.
Configurando Obsidian
cd loqueaprendihoy
mklink /D content \loqueaprendihoy\src\content
mklink /D assets \loqueaprendihoy\src\assets
mkdir \loqueaprendihoy\public\images
mklink /D images \loqueaprendihoy\public\images
- Plugin Files and Links
- New link format: Relative path to file
- Previene que recorte la ruta del link
- Use Wikilinks: NO
- Default location for file attachments: In the folder specified below
- Attachment folder path: loqueaprendihoy/images
- New link format: Relative path to file
- Plugin Tag Folder
- Always Open: YES
- Files
- Use title: NO
- Tags
- Store tags in frontmatter for new notes: YES
- Actions
- Search tags inside TagFolder when clocking tags: YES
- Arrangements
- Merge redundant combinations: YES
Configurando Astro
- rehype-mermaid
- Permite visualizar gráficos hechos con mermaid code
- rehype-katex
- Para visualizar fórmulas matemáticas latex
- remark-math
- Para visualizar fórmulas matemáticas latex
- katex
- requerido por rehype-katex
- playwright-core (compatible con netlify)
- requerido por rehype-katex
- plugins/remark-obsidian-links.js
- plugin adhoc para las conversiones de enlaces y urls de imágenes
npx astro add react
npx astro add vue
npm install --save astro-loader-obsidian
npm install --save rehype-mermaid
npm install --save playwright-core
npm install --save remark-math rehype-katex
package.json
{
"name": "loqueaprendihoy",
"type": "module",
"version": "0.0.1",
"scripts": {
"dev": "astro dev",
"build": "astro build",
"preview": "astro preview",
"astro": "astro",
"postinstall": "npx playwright-core install chromium"
},
"dependencies": {
"@astrojs/mdx": "^4.3.7",
"@astrojs/react": "^4.4.0",
"@astrojs/rss": "^4.0.12",
"@astrojs/sitemap": "^3.6.0",
"@astrojs/vue": "^5.1.1",
"@types/react": "^19.2.2",
"@types/react-dom": "^19.2.1",
"astro": "^5.14.4",
"astro-loader-obsidian": "^0.10.0",
"playwright-core": "^1.56.0",
"react": "^19.2.0",
"react-dom": "^19.2.0",
"rehype-katex": "^7.0.1",
"rehype-mermaid": "^3.0.0",
"remark-math": "^6.0.0",
"sharp": "^0.34.3",
"vue": "^3.5.22"
}
}
tsconfig.json
Para facilitar la importación de componentes desde los archivos de contenido (MDX), se ha configurado un alias de ruta en loqueaprendihoy/tsconfig.json:
@/* apunta a loqueaprendihoy/src/*
Esto permite importar componentes de forma consistente, sin importar la profundidad del archivo de contenido.
{
"extends": "astro/tsconfigs/strict",
"include": [
".astro/types.d.ts",
"**/*"
],
"exclude": [
"dist"
],
"compilerOptions": {
"strictNullChecks": true,
"baseUrl": ".",
"paths": {
"@/*": [
"src/*"
]
},
"jsx": "preserve",
"jsxImportSource": "react"
}
}
src\plugins\remark-obsidian-links.js
- Se encarga de corregir los enlaces de obsidian para que aparezcan correctamente publicados en astro.
import { visit } from 'unist-util-visit';
import path from 'path';
export default function remarkObsidianLinks() {
return (tree, file) => {
// Visit both links and images
visit(tree, ['link', 'image'], (node) => {
// Handle Markdown links
if (node.type === 'link' && node.url.endsWith('.md')) {
// Extract filename without extension
const slug = path.basename(node.url, '.md');
// Transform to absolute blog path
node.url = `/blog/${slug}/`;
return; // Continue to the next node
}
// Handle image links
if (node.type === 'image' && node.url.includes('/images/')) {
const pathParts = node.url.split('/');
const imageIndex = pathParts.findIndex(part => part === 'images');
node.url = '/' + pathParts.slice(imageIndex).join('/');
}
});
};
}
astro.config.mjs
- Indica el soporte para mdx, react, vue, mermaid, math, etc
// @ts-check
import mdx from '@astrojs/mdx';
import sitemap from '@astrojs/sitemap';
import { defineConfig } from 'astro/config';
import react from '@astrojs/react';
import vue from '@astrojs/vue';
import rehypeMermaid from 'rehype-mermaid';
import remarkMath from 'remark-math';
import rehypeKatex from 'rehype-katex';
import remarkObsidianLinks from './src/plugins/remark-obsidian-links';
// https://astro.build/config
export default defineConfig({
site: 'https://loqueaprendihoy.akcstudio.com',
integrations: [mdx(), sitemap(), react(), vue()],
markdown: {
syntaxHighlight: {
type: 'shiki',
excludeLangs: ['mermaid', 'math'],
},
rehypePlugins: [
rehypeMermaid,
rehypeKatex
],
remarkPlugins: [
remarkObsidianLinks,
remarkMath
]
}
});
src\content.config.ts
- Indica la carga de los archivos md y mdx, su esquema, etc
- Aunque probé
ObsidianMdLoaderrecomendado, me fue mejor con elglobpor default.
import { defineCollection, z } from 'astro:content';
// import { ObsidianDocumentSchema, ObsidianMdLoader } from "astro-loader-obsidian";
import { glob } from 'astro/loaders';
const blog = defineCollection({
// Load Markdown and MDX files in the `src/content/blog/` directory.
loader: glob({ base: './src/content/blog', pattern: '**/*.{md,mdx}' }),
// loader: ObsidianMdLoader({ base: './src/content/blog', pattern: '**/*.{md,mdx}' }),
// Type-check frontmatter using a schema
schema: ({ image }) =>
z.object({
title: z.string(),
description: z.string(),
// Transform string to Date object
pubDate: z.coerce.date(),
updatedDate: z.coerce.date().optional(),
heroImage: image().optional(),
}),
});
export const collections = { blog };
Repositorio en Github
Desplegando en Netlify
Despliegue básico
- Creo el proyecto
akc-loqueaprendihoy- Indico que deseo importar el repositorio de github
- Acepto las opciones de despliegue por default
npm run build- tomar el resultado de la carpeta
dist
- Esto permitirá obtener https://akc-loqueaprendihoy.netlify.app/
Custom domain
- Domain management
- Production domain
loqueaprendihoy.akcstudio.com
- HTTPS
- SSL/TSL certificate
- Verify: OK
- Letsencrypt: requested (puede tardar, chequear en 24h)
- SSL/TSL certificate
- Production domain
- Tengo el DNS manager en DigitalOcean:
- DNS akcstudio.com
- CNAME
loqueaprendihoy.akcstudio.com- is alias of
akc-loqueaprendihoy.netlify.app
- CNAME
- DNS akcstudio.com