Publicación: GitHub Pages, Netlify, QuartoPub
Tres rutas
| Plataforma | Cuándo | Pros | Contras |
|---|---|---|---|
| GitHub Pages | Sitio open, hospedaje gratis | Simple, gratis, ilimitado | Solo HTTPS via *.github.io. Dominio custom requiere config |
| Netlify | Sitio profesional, dominio propio | Build automático en push, dominios, formularios, redirects | Free tier con límites. Configuración inicial más larga |
| QuartoPub | Drafts, prototipos | Un comando, instant publish | Limitado a sitios pequeños, no es para producción |
Para 80 % de los casos serios, Netlify. Para libros open + colaboración con GitHub, GitHub Pages. Para mostrar algo a un cliente rápidamente, QuartoPub.
Antes de publicar: lo que pasa al renderizar
Quarto renderiza tu proyecto a la carpeta _site/ (websites) o _book/ (libros). Es lo que vas a publicar, HTML, CSS, JS, imágenes ya generados.
quarto renderDespués de esto, _site/ (o _book/) tiene todo lo necesario. Las tres rutas de publicación difieren en cómo sirven esos archivos.
Ruta 1: GitHub Pages
Setup inicial
- Tu proyecto vive en un repo de GitHub.
- Configura GitHub Pages del repo para servir desde la rama
gh-pages. - Renderiza y publica con Quarto.
quarto publish gh-pagesQuarto:
- Renderiza el proyecto.
- Crea (o actualiza) la rama
gh-pagescon el output. - Pushea esa rama.
- Te da la URL:
https://usuario.github.io/repo/.
La primera vez te pregunta si quieres confirmar. Después de eso es quarto publish gh-pages y listo.
CI automático con GitHub Actions
Para que cada push a main regenere y publique:
# .github/workflows/publish.yml
on:
push:
branches: main
workflow_dispatch:
name: Publish
jobs:
build-deploy:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Check out repository
uses: actions/checkout@v4
- name: Set up Quarto
uses: quarto-dev/quarto-actions/setup@v2
- name: Render and Publish
uses: quarto-dev/quarto-actions/publish@v2
with:
target: gh-pages
render: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}Con esto, push a main → CI renderiza → push a gh-pages → sitio actualizado. Tres minutos sin tocar nada.
Si tu render necesita R o Python
Añadir setup al workflow:
- name: Set up R
uses: r-lib/actions/setup-r@v2
- name: Set up R dependencies
uses: r-lib/actions/setup-renv@v2
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'Para R, renv es la solución estándar (lo vemos en el siguiente tutorial). Sin renv, el CI no sabe qué paquetes instalar.
Alternativa más simple: usa freeze: auto y commit _freeze/, el CI no necesita ejecutar R/Python, solo renderiza desde los outputs pre-computados. Patrón ideal para sitios donde R es solo para el análisis local.
Ruta 2: Netlify
Setup inicial
- Cuenta en netlify.com.
- Conecta tu repo de GitHub.
- Configura el build:
- Build command:
quarto render - Publish directory:
_site(o_bookpara libros)
- Build command:
Netlify detectará pushes a main y disparará builds automáticos.
_site ya generado vs Netlify renderizando
Dos modos de uso:
A) Netlify renderiza (necesita Quarto + R/Python en CI):
# netlify.toml en raíz del repo
[build]
command = "quarto render"
publish = "_site"
[build.environment]
QUARTO_VERSION = "1.5.57"Netlify instala Quarto y ejecuta el render. Si tu sitio necesita R/Python, configura también en netlify.toml. Funciona pero el build es más lento (5-10 minutos cada vez).
B) Tú renderizas localmente, Netlify solo sirve estáticos:
[build]
command = "echo 'Site already built'"
publish = "_site"Renderizas con quarto render localmente, commiteas _site/ (o usas _freeze/ + freeze auto), Netlify solo sirve. Build instantáneo, pero requiere disciplina al commitear.
Para proyectos donde el render lleva minutos, B es mejor. Para sitios sencillos, A.
Dominio custom
Netlify hace esto bien y sencillo:
- En la dashboard del sitio: Domain management → Add custom domain.
- Sigue las instrucciones para configurar DNS.
- SSL/HTTPS automático con Let’s Encrypt.
Funciona con tu dominio comprado en cualquier registrar.
Otras features útiles de Netlify
- Formularios: sin backend, Netlify captura submissions de formularios HTML.
- Redirects y rewrites en
_redirectsonetlify.toml. - Deploy previews: cada PR genera una preview URL temporal.
- Branch deploys: branches alternativas (
develop,staging) sirven en URLs separadas.
Es la elección más completa para sitios profesionales. Free tier suficiente para tráfico bajo-medio.
Ruta 3: QuartoPub
QuartoPub es el servicio de hosting propio de Quarto (de Posit). Diseñado para publicar rápido sin configurar nada.
quarto publish quarto-pubLa primera vez:
- Te pide login con email.
- Renderiza y sube.
- Te da una URL
https://usuario.quarto.pub/proyecto/.
Después es instantáneo:
quarto publish quarto-pubRenderiza local, sube, listo en 30 segundos.
Cuándo merece la pena
- Prototipos: mostrar algo a un cliente sin setup.
- Drafts: iterar rápido con un colega.
- Slides: presentaciones Quarto con URL compartible.
Cuándo no
- Sitio público con tráfico real (no es plan de pago serio).
- Dominio custom (no se soporta).
- SEO (no se controla bien).
- Cualquier libro o sitio que vaya a perdurar.
QuartoPub es la “Heroku free tier” del mundo Quarto. Útil para lo que es, no para producción.
Otros destinos
Quarto soporta más targets:
quarto publish posit-cloud # Posit Cloud (gratis con límites)
quarto publish connect # Posit Connect (corporativo)
quarto publish confluence # Confluence (corporativo Atlassian)posit-connect es lo que muchas empresas usan internamente. Si tu organización paga Posit Connect, es la mejor opción: hosting privado, autenticación, scheduled re-renders, integración con SSO corporativo.
Workflow recomendado
Para un sitio público open-source:
- Repo en GitHub.
freeze: auto, commit_freeze/.- GitHub Actions con
quarto publish gh-pagesautomático en push a main. - Si quieres dominio custom, configurar GitHub Pages con CNAME.
Para un sitio profesional con dominio:
- Repo en GitHub.
- Netlify conectado al repo, modo “Quarto renderiza en CI” o “estáticos ya generados”.
- Dominio configurado en Netlify.
- Deploy previews automáticas en PRs.
Para un draft que muestras a un cliente esta tarde:
quarto publish quarto-pub. URL en 30 segundos.
URL absolutas y SEO
Cuando publicas, asegúrate de que site-url: en _quarto.yml apunta al dominio real:
website:
site-url: https://misitio.comSin esto, los enlaces internos pueden ser relativos pero los de Open Graph (compartir en redes) usarán localhost. Síntoma típico: al pegar el enlace en Slack, la preview aparece rota.
Tracking y analytics
Para Google Analytics o Plausible:
format:
html:
include-in-header:
- file: analytics.htmlanalytics.html contiene el snippet del proveedor. Quarto lo inyecta en el <head> de cada página.
Para opciones built-in de Quarto:
website:
google-analytics: "G-XXXXXX"Trampas habituales
site-urlapuntando a localhost al publicar. Open Graph y RSS rotos.- CI que tarda 10 minutos porque renderiza todo desde cero cada push. Usa
freeze: auto+ commit_freeze/. .gitignorecon_site/y luego intentar commitearlo. Decide: o renderiza en CI (ignora_site/) o renderiza localmente (commitea_site/). Pero_freeze/siempre se commitea.- GitHub Pages activado en la rama equivocada. Quarto usa
gh-pagespor defecto, pero hay que activarlo en Settings → Pages del repo apuntando a esa rama. - HTTPS no activado en GitHub Pages con dominio custom. En Settings → Pages, marca “Enforce HTTPS”. Sin esto, queda HTTP normal.
En la siguiente entrega
Última entrega de la ruta: reproducibilidad real. Hasta ahora has aprendido a publicar el output. Pero si dentro de tres años alguien quiere regenerar tu análisis y obtener exactamente lo mismo, necesitas más: renv para bloquear versiones de paquetes R, Docker para bloquear el sistema operativo. Lo siguiente.