El stack headless oficial de Shopify (no es Remix).
En una frase
Hydrogen es el framework React de Shopify para storefronts headless. Corre sobre React Router v7 en modo framework (la evolución directa de Remix), se despliega en Oxygen — el runtime edge de Shopify basado en Workers — y se conecta al Storefront API con caché integrado, componentes optimizados para e-commerce, y un sistema de sesión para el carrito. En 2026, la versión es 2026.4.0 y el cliente-side proxy del Storefront API es obligatorio.
✓ Qué vas a ejecutar en esta sección
npm create @shopify/hydrogen@latest— Scaffoldear el proyecto desde ~/proyectos/shopify/brew-atlas/
npx shopify hydrogen link— Vincularlo a un storefront del Partner Dashboard (desde brew-atlas-hydrogen/)
npx shopify hydrogen deploy— Desplegar a un environment de preview en Oxygen (desde brew-atlas-hydrogen/)
Buscá los bloques con badge ✓ Ejecutar
en el contenido. Los bloques con 📖 Referencia son ilustrativos — no los ejecutes.
Esta sección es mayormente referencia. Brew Atlas no requiere un storefront Hydrogen para llegar al final del tutorial — la ruta principal del proyecto usa un theme OS 2.0 (sección 05 en adelante). Los bloques de referencia muestran el flujo canónico de Hydrogen para que lo tengas a mano cuando sí lo necesites.
Qué es y por qué existe
Cuando un comerciante necesita control total sobre el diseño y la experiencia del storefront — más del que permite un theme de Online Store 2.0 — tiene dos opciones: un theme altamente customizado con JavaScript propio, o un storefront headless. La ruta headless le da control completo sobre el HTML, el CSS, y el JavaScript del sitio. Puede usar cualquier framework, cualquier sistema de diseño, y puede componer datos de múltiples fuentes además de Shopify.
El precio de esa libertad es real: tienes que construir y mantener el carrito, gestionar el handoff al checkout de Shopify, resolver la autenticación de clientes con el Customer Account API, manejar el caché del catálogo, y asegurarte de que las métricas de performance sean competitivas con las de un theme nativo. Un theme OS 2.0 bien optimizado tiene de base años de trabajo de Shopify en performance. Un storefront headless empieza desde cero en esos frentes.
Hydrogen existe para reducir ese costo. Es el framework opinionado de Shopify para storefronts React: te da el cliente del Storefront API con caché integrado, componentes optimizados (<Money>, <Image>), manejo de sesión para el carrito, y una integración directa con Oxygen. No tienes que resolver esos problemas desde cero — pero sí tienes que entender el modelo de datos y el ciclo de vida de las requests.
Contexto de migración: de Remix a React Router v7
Si lees documentación de Hydrogen anterior a septiembre de 2025, vas a encontrar referencias a Remix: remix.config.ts, @remix-run/react, useLoaderData de @remix-run/react. Todo eso cambió.
En septiembre de 2025, el equipo de Remix finalizó la fusión de Remix con React Router v7. El resultado práctico: React Router v7 en modo framework ES la continuación de Remix. El proyecto Remix como entidad separada dejó de existir. Hydrogen migró a React Router v7 en esa misma ventana.
Para el desarrollador, el impacto es mínimo pero el cambio de imports es consistente:
Antes (Hydrogen ≤ 2025.x): import { useLoaderData } from '@remix-run/react'
Ahora (Hydrogen 2026.x): import { useLoaderData } from 'react-router'
El remix.config.ts se convirtió en react-router.config.ts. Los loader y action functions siguen siendo funciones del servidor, las rutas siguen estando en app/routes/, y useLoaderData sigue siendo el hook para acceder a los datos del loader. El 95% del código es idéntico; el 5% que cambia son los imports.
Si encontrás documentación o tutoriales que dicen “Hydrogen usa Remix” en 2026, están desactualizados. El CLI y los templates del 2026 no contienen nada de @remix-run/*.
Scaffold: crear un proyecto Hydrogen
El comando oficial es:
Desde ~/proyectos/shopify/brew-atlas/:
📖Referencia Scaffold Hydrogen
cd ~/proyectos/shopify/brew-atlasnpm create @shopify/hydrogen@latest# Project name? brew-atlas-hydrogen# Link a store? Y (pegar la URL de tu dev store)# Install deps? Y
Esto crea el proyecto con la versión 2026.4.0 de Hydrogen y configura la conexión con tu Storefront API automáticamente.
Estructura del proyecto
# ~/proyectos/shopify/brew-atlas/brew-atlas-hydrogen/ (raíz del storefront headless)app/├── root.tsx # Root layout; <ShopifyProvider> configurado aquí├── entry.server.tsx # SSR entry; adaptador de Oxygen├── routes/│ ├── _index.tsx # Página principal│ ├── products.$handle.tsx # Página de detalle de producto (PDP)│ ├── cart.tsx # Carrito│ └── account.tsx # Área de cuenta (Customer Account API)├── lib/│ ├── fragments.ts # Fragments de GraphQL reutilizables│ └── session.server.ts # Gestión de sesión para el carrito└── graphql/ └── codegen.ts # Generación de tipos TypeScript desde queriesshopify.config.ts # Configuración: store domain, version, private tokenreact-router.config.ts # Configuración del framework (antes remix.config.ts)
La raíz del proyecto tiene un shopify.config.ts donde se fija la versión del Storefront API y las credenciales. La versión tiene que coincidir con la versión que usas en tus queries GraphQL — un mismatch produce errores en campos que no existen en esa versión.
Rutas y loaders
React Router v7 en modo framework opera con un modelo de datos simple: cada archivo de ruta puede exportar una función loader que corre en el servidor, y el componente default del archivo corre en el cliente (o en el servidor durante SSR). El hook useLoaderData conecta ambos.
context.storefront.query: el objeto context.storefront es el cliente del Storefront API que Hydrogen inyecta en cada request. No lo instancias manualmente — está disponible en loader, action, y en las llamadas al servidor desde clientLoader. Tiene métodos query y mutate.
cache: context.storefront.CacheShort(): la caché es por request, no global. CacheShort() configura una ventana de caché de ~10 segundos para datos que cambian frecuentemente. Para páginas de colección que no cambian tanto, usas CacheLong() (~900 segundos). Para datos que nunca deben cachearse (carrito, datos del cliente), usas CacheNone().
@inContext: la directiva de contexto en la query pasa el país y el idioma al Storefront API, que responde con precios y contenido localizados. Sin @inContext, los compradores fuera del mercado primario de la tienda ven precios y textos del mercado por defecto. Es el error más frecuente en storefronts headless — se olvida en el calor del desarrollo y produce bugs de precios difíciles de reproducir.
Sistema de caché
Hydrogen tiene cuatro modos de caché integrados en el cliente del Storefront API:
Modo
TTL aproximado
Cuándo usarlo
CacheShort()
~10s
Datos que cambian con frecuencia (disponibilidad, precios en tiempo real)
CacheLong()
~900s (15min)
Catálogo, colecciones, contenido editorial
CacheNone()
Sin caché
Carrito, datos del cliente, checkout
CacheCustom({ maxAge: N })
N segundos
Cualquier TTL específico
La caché de Hydrogen usa la Cache API del runtime web (disponible en Oxygen y en navegadores). No es Redis, no es Memcached — es la misma abstracción que un Service Worker usaría para cachear resources. Funciona per-request basado en la URL y las variables de la query.
Carrito y sesión
Hydrogen gestiona el estado del carrito en una sesión cookie-based en el servidor. El carrito se crea en el Storefront API mediante la mutación cartCreate, y el cartId se almacena en la sesión. Las operaciones de carrito (agregar, eliminar, actualizar) son mutations del Storefront API que reciben el cartId.
El checkout ocurre fuera de tu storefront: cuando el comprador va a pagar, tu app redirige a cart.checkoutUrl, que es la URL del checkout nativo de Shopify. El checkout en sí no es personalizable desde Hydrogen — para eso están las Checkout UI Extensions del lado de la app.
Storefront API proxy (obligatorio desde 2026.4)
En versiones de Hydrogen anteriores a 2026.4, era posible hacer queries al Storefront API directamente desde el navegador usando el Storefront API public token. A partir de 2026.4, Shopify cambió esto como breaking change: el Storefront API token del servidor no se expone al cliente. Todas las queries al Storefront API desde código del cliente tienen que pasar por una ruta server-side.
El patrón correcto: las queries que antes corrían en useEffect del cliente ahora van en loader o en clientLoader (que puede llamar a un endpoint de tu propio servidor). El cliente nunca llama a myshopify.com/api/storefront/graphql directamente — llama a tu propia ruta /api/storefront-proxy que a su vez llama al Storefront API con el token de servidor.
Si tienes código de Hydrogen ≤ 2026.3 con queries en useEffect, eso rompió en 2026.4. La solución es mover esas queries a loaders o a rutas de API server-side.
Deploy a Oxygen
Oxygen es el runtime edge de Shopify para storefronts Hydrogen. Está basado en Workerd (el runtime de V8 Isolates de Cloudflare), distribuido globalmente, con cold starts bajo los 50ms. Cada environment de Hydrogen en Oxygen tiene su propia URL.
Desde ~/proyectos/shopify/brew-atlas/brew-atlas-hydrogen/:
El deploy crea un environment de preview con una URL del tipo https://brew-atlas-hydrogen-preview.shopify.io. La promoción de preview a producción se hace desde el dashboard de Hydrogen en el Partner Dashboard — no hay un comando CLI para esto. El ambiente anterior de producción queda como snapshot para rollback instantáneo.
Limitaciones de Oxygen
Oxygen es un runtime Workerd, lo que implica restricciones que hay que entender antes de diseñar la arquitectura:
Sin filesystem: no puedes leer archivos en tiempo de runtime. Los assets estáticos se sirven como CDN assets desde el build.
Sin Node.js APIs: dispones de las Web Standard APIs (fetch, WebStreams, Cache API, Crypto). Si tu código usa fs, path, o módulos de Node.js que no están en la Web Platform, va a fallar en Oxygen.
Sin WebSockets: Oxygen no soporta conexiones WebSocket. Para datos en tiempo real (stock, precios), usas SSE (Server-Sent Events) o un servicio externo, o simplemente aceptas que el storefront se revalida por polling.
~128MB de memoria por isolate: suficiente para la mayoría de storefronts, limitante si intentas pre-cargar el catálogo completo en memoria.
Si alguna de estas limitaciones es bloqueante para tu caso de uso, Hydrogen puede desplegarse en cualquier entorno que hable Web Request/Response — Cloudflare Workers, Vercel Edge, o un servidor Node.js estándar. Oxygen es el default, no el único.
Puentes mentales
Desde Next.js / GraphQL backend genérico
Hydrogen es a Shopify lo que Next.js es a un backend GraphQL genérico: un framework optimizado para SSR, caché por ruta, y SEO sobre tu API. React Router v7 en modo framework es literalmente la evolución de Remix — si conoces Remix, ya sabes el 95% de lo que cambia en Hydrogen 2026. Los conceptos de loader, action, rutas basadas en archivos, y useLoaderData son idénticos. Lo que Hydrogen agrega encima es el cliente del Storefront API con caché integrado, los componentes <Money> e <Image> optimizados para e-commerce, y la integración con Oxygen.
La diferencia más importante respecto a usar Next.js con el Storefront API manualmente es el sistema de caché: en Hydrogen, el caché está integrado en el cliente del Storefront API y se configura por query. En Next.js, tendrías que implementarlo tú mismo con revalidate, fetch cache, o una librería externa. Hydrogen hace esa decisión por ti con CacheShort, CacheLong, CacheNone.
Versión: 2026.4.0. Hydrogen sigue el mismo calendario de versiones trimestral que el Storefront API. El campo apiVersion en shopify.config.ts debe coincidir con la versión del Storefront API que usas en las queries.
React Router v7: desde septiembre 2025, los imports son de react-router, no de @remix-run/react. El react-router.config.ts reemplaza al remix.config.ts.
Proxy obligatorio: desde 2026.4, las queries al Storefront API desde el cliente tienen que pasar por una ruta server-side. El Storefront API public token no se expone al navegador.
Codegen: el template de Hydrogen incluye generación de tipos TypeScript desde las queries GraphQL. Los tipos generados están en graphql/ y se actualizan con npx shopify hydrogen codegen.
Proyecto · Brew Atlas
Brew Atlas · Paso 15
El paso 15 establece el esqueleto del storefront headless de Brew Atlas. El proyecto completo es demasiado grande para checkear en el repositorio del tutorial, pero los archivos clave están en ~/proyectos/shopify/brew-atlas/brew-atlas-hydrogen/ como referencia de arquitectura.
Qué vas a crear/tocar (archivos — referencia):
~/proyectos/shopify/brew-atlas/brew-atlas-hydrogen/README.md — instrucciones de scaffold y pinning de versión.
~/proyectos/shopify/brew-atlas/brew-atlas-hydrogen/app/routes/products.$handle.tsx — loader + componente de la PDP.
~/proyectos/shopify/brew-atlas/brew-atlas-hydrogen/app/lib/fragments.ts — fragments de GraphQL reutilizables.
~/proyectos/shopify/brew-atlas/brew-atlas-hydrogen/shopify.config.ts — configuración con versión fijada a 2026-04.
Comandos (opcionales — solo si decidís scaffoldear Hydrogen):
Desde ~/proyectos/shopify/brew-atlas/:
📖Referencia Scaffold Hydrogen en tu entorno
cd ~/proyectos/shopify/brew-atlasnpm create @shopify/hydrogen@latest# Nombre: brew-atlas-hydrogen# Vincular store: si (usar dev store)# Instalar dependencias: si
El README del proyecto detalla el proceso de linking con Oxygen y el primer deploy de preview.
Errores comunes
Cuidado
No uses imports de @remix-run/react en Hydrogen 2026.x. Esos imports son del sistema legacy anterior a la migración de septiembre 2025. El paquete puede seguir siendo instalable, pero produce inconsistencias de versión con React Router v7 y el comportamiento de las rutas puede ser impredecible. El import correcto en 2026 para useLoaderData, useNavigate, Link, y similares es import { ... } from 'react-router'.
Cuidado
El proxy obligatorio del Storefront API (2026.4) rompió proyectos que ejecutaban queries desde useEffect del cliente usando el public token. Si actualizas Hydrogen desde una versión anterior a 2026.4, revisa todos los useEffect y useFetcher que llamen al Storefront API. La migración es mover esas queries a loader o a rutas /api/ server-side. No es difícil pero requiere un audit sistemático del código.
Cuidado
<Money> e <Image> de @shopify/hydrogen son componentes con lógica interna de Shopify. <Money> formatea precios según el locale del comprador usando el currencyCode del Storefront API. <Image> genera la URL con los parámetros de tamaño y formato correctos para la CDN de Shopify. No los reemplaces con <img> o con formateo de moneda manual — perdés el optimizado automático y la consistencia con los precios del checkout.
Nota
Oxygen no tiene WebSocket support. Si tu caso de uso requiere actualización de stock en tiempo real (un ticket limitado, una subasta), el modelo correcto en Oxygen es SSE (Server-Sent Events con ReadableStream) o aceptar que el dato se actualiza en el próximo page load o refetch. Para casos de ultra-alta frecuencia, considerá si Oxygen es el runtime correcto o si una porción del storefront necesita un servidor dedicado.
Tip
Para paralelizar queries del Storefront API en un loader, usa Promise.all. Dos queries independientes que se ejecutan en secuencia duplican la latencia del loader sin necesidad. Un loader que carga el producto y las colecciones relacionadas en paralelo es la diferencia entre 200ms y 400ms de TTFB en condiciones reales.
Puedes explicar la diferencia entre un theme OS 2.0 y un storefront headless con Hydrogen: qué ganás en control, qué perdés en comodidad, y en qué casos el headless justifica la complejidad adicional
Sabes que Hydrogen 2026 usa React Router v7, que los imports vienen de react-router, y que @remix-run/react es legacy
Entiendes el rol de loader en React Router v7: corre en el servidor, recibe context.storefront, retorna datos, y el componente los consume con useLoaderData
Conoces los cuatro modos de caché de Hydrogen (CacheShort, CacheLong, CacheNone, CacheCustom) y sabes cuándo aplicar cada uno
Sabes que @inContext(country:, language:) en el Storefront API es obligatorio para mercados internacionales, y que olvidarlo produce precios incorrectos para compradores fuera del mercado principal
Entiendes el cambio de 2026.4: el Storefront API proxy es obligatorio — el cliente no puede llamar al Storefront API directamente
Puedes scaffoldear un proyecto Hydrogen con npm create @shopify/hydrogen@latest y desplegarlo a Oxygen con npx shopify hydrogen deploy
Conoces las limitaciones de Oxygen: sin filesystem, sin Node.js APIs, sin WebSockets, ~128MB por isolate
Sabes usar <Money> e <Image> de @shopify/hydrogen y por qué no reemplazarlos con elementos HTML crudos
Quiz
Quiz · ¿Lo tenés claro?
5 preguntas · respondé para marcar la sección como completada.
1. ¿De qué paquete vienen los imports de `useLoaderData`, `Link`, etc. en Hydrogen 2026?
Desde la fusión Remix → React Router v7 en septiembre 2025, los imports son de `react-router`. `@remix-run/*` es legacy.
2. Estás listando 24 productos de una colección que cambia pocas veces al día. ¿Qué modo de caché usarías?
CacheLong (~15 min) es el default para catálogo y contenido editorial que cambia poco. CacheShort se reserva para precios/stock en tiempo real; CacheNone para carrito y datos de cliente.
3. ¿Cuál es el breaking change que introdujo Hydrogen 2026.4 respecto a queries al Storefront API?
El Storefront API server token no se expone al cliente. Queries que vivían en useEffect con el public token deben moverse a loader/action o a una ruta de proxy propia.
4. Un comprador desde México ve precios en la moneda y locale equivocados. ¿Cuál es la causa más probable?
Es el error más frecuente en headless. Sin @inContext, el Storefront API responde con el mercado primario de la tienda. Pasar country+language en las variables y declararlos con @inContext resuelve precios localizados.
5. Necesitas abrir una conexión WebSocket para mostrar stock en tiempo real. Estás desplegando en Oxygen. ¿Qué haces?
Oxygen (Workerd) no soporta WebSockets. El patrón canónico es SSE con ReadableStream, o aceptar polling. Si el caso lo requiere sí o sí, Hydrogen se puede desplegar en otros runtimes — Oxygen es el default, no el único.
Siguiente
Con Hydrogen cubriendo el stack headless, el bloque siguiente aborda los temas que separan al desarrollador competente del desarrollador senior en el ecosistema Shopify: Core Web Vitals actualizados para 2026, Markets, B2B, localización, accesibilidad, y observabilidad en producción.