OkapiDocs
Inicio GitHub ↗

Sanity + editor visual para Astro · open source

Okapi

Okapi se suma a un proyecto Astro, nuevo o ya empezado, y le da dos cosas: Sanity como base de datos y un editor visual propio donde el equipo y los clientes arman y editan las páginas sobre el diseño real.

Lo instala tu agente de código, el que uses, siguiendo una guía del repo. Esta vista explica cómo pedírselo y cómo se trabaja después.

  • Astro 7.3 · estático
  • Sanity 6.19+ · al día
  • React 19
  • Tailwind 4 sobre tokens
≈1 KBde JS en una página sin bloques que lo necesiten
91 KBde JS (gzip) en una página con slider o logo 3D
0 KBdel editor en el sitio público, controlado en cada build
2caminos: proyecto nuevo o proyecto Astro existente
Estás en la guía para trabajar con tu agente.
Estás en la documentación técnica.

Producto

Qué es

No es un template de sitio. Okapi es la capa de contenido y edición que se suma a un proyecto Astro. Tu proyecto sigue siendo tuyo: tus páginas, tu diseño y tu deploy. Okapi agrega:

Sanity como base de datos

Login, roles, borradores, historial, imágenes y CDN. No lo mantenemos nosotros. El Studio queda en /studio de tu sitio.

Okapi Editor

Nuestro editor visual en /studio#/editor. Se escribe sobre la página, se arrastran bloques, se estila con tus tokens y se arman componentes.

Páginas que salen del editor

Las rutas que elijas se arman en el editor y se sirven como HTML estático. Solo las secciones con slider o logo 3D cargan JavaScript.

Roles: los mismos nombres que en Sanity

Okapi usa los nombres de rol de Sanity tal cual. A cada persona le das un rol cuando la invitás al proyecto de Sanity, y src/okapi.policy.ts decide qué ve ese rol en el editor. Esto es lo que viene por defecto; la agencia lo cambia por proyecto. Un Administrator puede ver cualquier rol con View as.

Puede…AdministratorEditorContributor
Editar textos, rich text, links e imágenesSíSíSí
Reordenar bloques dentro de lo diseñadoSíSíSí
Insertar, duplicar y borrar bloquesSíAlgunos bloquesNo
Panel de estilo (espaciado, color, radio, breakpoints)SíNoNo
Crear, editar y separar componentesSíNoNo
Usar el chat con IA (si el proyecto lo tiene)SíSíNo
PublicarSíSíNo

Lo habitual: la agencia es Administrator, un cliente que publica es Editor, y alguien que solo deja borradores es Contributor. Viewer (y cualquier otro rol) solo mira. Editor y Contributor existen desde el plan Growth de Sanity; ver Roles e invitaciones.

Con tu agente

Sumarlo a tu proyecto

La instalación está escrita en el INSTALL.md del repo, pensado para que lo siga cualquier agente de código: Claude Code, Codex, Cursor u otro. Abrí tu agente en la carpeta del proyecto y pedíselo.

Cualquier agente

Cloná seba-seb/okapi-sanity en /tmp/okapi y seguí su INSTALL.md para sumar Okapi a este proyecto.
El agenteDetecta si el proyecto es nuevo o existente, te hace las preguntas que faltan, copia lo necesario sin pisar tus archivos, configura Sanity y corre verify.
Vos revisásQue tus páginas sigan igual, que /studio abra y que el editor muestre la página.

Claude Code, con la skill instalada

Sumá Okapi a este proyecto.
El agenteLa skill okapi-astro trae el mismo INSTALL.md y lo sigue.
Vos revisásLo mismo. La skill se instala una vez con cp -R skills/okapi-astro ~/.claude/skills/ desde el repo.

Proyecto nuevo o existente

  • Carpeta vacía: el agente parte del repo de Okapi, que ya es un proyecto Astro con bloques de ejemplo que después reemplazás.
  • Proyecto existente: antes de instalar nada, el agente lo analiza y te dice qué encaja y qué es riesgoso. Frena si el proyecto usa Tailwind 3, Preact o Solid, ya tiene Sanity o está en un Astro anterior al 7.3. Si sigue, tus páginas, tu layout y tu configuración quedan, y las páginas del editor se sirven en las rutas que no existan, o donde le indiques. Tus páginas actuales siguen en código: para editar una de sus secciones en el editor, hay que pasarla a bloque.

Qué te va a preguntar

  • En qué organización de Sanity va el proyecto, o el project ID si ya lo creaste.
  • Si el proyecto existe: qué rutas salen del editor y si la home sale del editor o queda la tuya.
  • Qué módulos querés: slider, logo 3D, componentes reutilizables y el chat con IA. Lo que no elegís no se instala.
  • Quién va a editar, con los nombres de rol de Sanity: solo Administrator (tu equipo), además Editor (un cliente que publica), además Contributor (alguien que solo deja borradores).
  • Si cargar contenido de ejemplo para ver el editor andando enseguida.

Antes de tocar nada te muestra el plan (qué bloques se van, qué dependencias se sacan, qué roles quedan) y espera tu OK. El chat y los componentes se pueden prender o apagar después en src/okapi.config.json.

Qué hacés vos

Lo que necesita tu cuenta. El agente te pasa el comando o los pasos exactos:

  • Entrar a Sanity y, si querés, importar la página de ejemplo.
  • Invitar al cliente.
  • En el hosting: variables de entorno (incluida la clave de IA, si usás el chat), el dominio en CORS y el webhook de publicación.
  • La prueba logueada del editor (Antes de entregar).
Nunca pegues tokens ni contraseñas en el chat

La guía está escrita para que ningún agente los necesite. Si te pide uno, no se lo des: decile que siga INSTALL.md.

Con tu agente

Qué pedirle después

Con Okapi instalado, esto es lo que más se pide. Sirve para cualquier agente: las reglas que sigue están en el AGENTS.md que queda en tu proyecto.

Conectar tu proyecto

Hacer editable un componente que ya tenés

Pasá el Hero de la home a un bloque de Okapi: título, bajada, botón e imagen editables desde el editor. El diseño tiene que quedar igual.
El agenteCrea el bloque con tu componente adaptado, lo registra, hace el texto editable sobre la página y corre verify.
Vos revisásEn el editor: + Add → Hero, escribir sobre la página y comparar con el original.

Tu diseño en el panel de estilo

Asigná nuestros colores, espaciados y radios a los tokens de Okapi, sin cambiar los nombres, para que el panel de estilo ofrezca nuestra paleta.
El agenteCompleta tokens.css con los valores de tu diseño. Los nombres quedan porque el editor los usa.
Vos revisásAbrir el panel de estilo de un bloque y ver tus colores y espaciados.

Tu header y footer

Que las páginas del editor usen nuestro header y footer en vez de los de Okapi.
El agenteCambia el layout de las páginas del editor para usar tus componentes.
Vos revisásUna página del editor y una tuya se ven con el mismo header.

Pasar una página al editor

Que /servicios salga del editor: armala en Sanity con bloques de Okapi y sacá la página hardcodeada.
El agenteArma la página con bloques existentes (o propone bloques nuevos) y quita la ruta vieja. Si tiene el MCP de Sanity, crea el documento; si no, te dice cómo.
Vos revisásQue /servicios se vea igual y se pueda editar.

Bloques

Un bloque nuevo

Creá un bloque Testimonios: foto, cita, nombre y cargo. Grid de 3 en desktop y una columna en mobile. La cita se edita sobre la página.
El agenteSchema, componente, registro, contenido inicial y texto editable en el canvas. Corre verify.
Vos revisás+ Add → Testimonios, y escribir la cita sobre la página.

Sacar los bloques de ejemplo

Borrá los bloques de ejemplo de Okapi que no usamos en este proyecto.
El agenteBorra carpetas y registros y corre verify. Menos bloques con JS = páginas más livianas.
Vos revisásQue ya no aparezcan en + Add.

Permisos y chat

Decidir quién puede qué

Que los clientes puedan agregar títulos, párrafos e imágenes, pero no cambiar estilos ni borrar secciones.
El agenteEdita src/okapi.policy.ts para el rol del cliente y corre verify.
Vos revisásEn el editor, View as ese rol: no aparecen el panel de estilo ni esas acciones.

Prender el chat con IA

Prendé el chat con IA del editor con Anthropic, ofrecé solo Sonnet y Haiku, y decime exactamente qué cargar en Vercel.
El agentePone features.chat en true y te pasa las variables del hosting (ANTHROPIC_API_KEY, AI_MODELS).
Vos revisásCargás la clave en el hosting, con tope de gasto en el proveedor, y redeployás. Aparece la pestaña ✦ Chat.

Publicar y mantener

Publicar = deployar

Conectá publicar en el editor con el deploy de Vercel y decime exactamente qué tengo que configurar yo.
El agenteTe pasa el deploy hook, el webhook de Sanity y las variables, paso a paso.
Vos revisásPublicar un cambio y verlo en el sitio unos minutos después.

Invitar al cliente

¿Cómo invito a Ana (ana@cliente.com) para que edite textos pero no publique?
El agenteTe da el comando con el rol contributor y te explica qué va a ver Ana.
Vos revisásCorrerlo y que Ana acepte la invitación.

Actualizar Okapi

Traé la última versión de Okapi a este proyecto: actualizá src/core desde el repo, avisame si cambió algún schema y corré verify.
El agenteReemplaza src/core por la versión nueva, revisa cambios de schema y corre verify.
Vos revisásQue el editor y las páginas sigan funcionando.

Un bug del editor

En el editor, al arrastrar una card dentro del grid se va al final. Esto es de Okapi: decime qué cambiar en el repo.
El agenteLo arregla en el repo de Okapi (no solo en tu proyecto), con un chequeo para que no vuelva.
Vos revisásProbar el caso en el editor.

Con tu agente

Para pedir bien

La división que más ordena el trabajo:

Se hace en el editorSe le pide al agente
Textos, links e imágenesBloques nuevos o hacer editable algo que ya existe
Agregar, ordenar y duplicar secciones y bloquesCómo se ve un bloque
Estilo de un bloque dentro de los tokensLos valores de los tokens (tu diseño)
Armar y reusar componentesRutas, layout, header y footer de las páginas del editor
PublicarConectar publicar con el deploy
  • Los nombres de los tokens no se cambian. Los valores sí. El panel de estilo usa esos nombres.
  • El editor solo ve bloques registrados. Para que algo se edite, tiene que ser un bloque.
  • Okapi no anima. Si tu proyecto ya usa GSAP, Motion o animaciones CSS, las mantiene: la animación vive en tu código, no en el editor.
  • Pedí que verifique. "Corré verify" antes de dar algo por terminado.
  • Publicar es salir online. Con el webhook configurado, cada publicación reconstruye el sitio en minutos. El agente nunca publica sin tu sí explícito.
  • El chat solo puede lo que tu rol puede. Sus cambios quedan como borrador y se deshacen en un paso. Nunca publica.
  • Okapi se arregla en su repo. src/core es igual en todos los proyectos: si algo del editor falla, el arreglo va al repo y después se trae a cada proyecto.
  • Sanity va al día. Okapi sigue las versiones actuales de Sanity; después de actualizar, pedile al agente que corra verify y abra el editor.

Producto

Arquitectura

La idea central: el mismo componente PageBuilder dibuja la página en el editor y en el sitio. Lo que ves mientras editás es el sitio real, con sus estilos.

Por qué un iframe

El canvas vive en su propia ruta (/edit-canvas), separado del Studio:

  • CSS aislado: el CSS del sitio no se mezcla con el del Studio.
  • Breakpoints reales: desktop, tablet y mobile cambian el ancho del iframe.
  • Sin borradores expuestos: la ruta es pública pero no tiene datos propios. Solo dibuja lo que le manda, por postMessage del mismo origen, un editor ya autenticado.

Rutas de un bloque

Cada bloque lleva en su raíz data-sanity-path con su ruta GROQ dentro del documento, por ejemplo:

sections[_key=="a1f3"].content[_key=="9c2e"].items[_key=="77d0"]

Esa ruta une el clic en el canvas, la capa seleccionada, el panel de propiedades y la escritura en Sanity. Las operaciones de estructura (core/editor/ops.ts) son funciones puras sobre esas rutas, validadas contra el registro de bloques. El historial de deshacer es una pila de snapshots del documento.

Producto

El sitio público

Las páginas son estáticas (output: "static"). Si el chat con IA está prendido y el hosting corre funciones (Vercel, Netlify, Cloudflare Pages), Astro agrega una sola función de servidor, /api/editor-chat; todo lo demás sigue prerenderizado. Con el chat apagado no hay adaptador. En el build, cada página pide su documento a Sanity y loadSite() trae settings, navegación, el mapa de rutas y la librería de componentes. Las lecturas del build salen sin la CDN de Sanity, a propósito, y un build de producción se frena si Sanity no responde o falta el env, así un fetch fallido nunca deploya un sitio vacío.

HTML primero, JavaScript solo donde hace falta

El PageBuilder se renderiza en el servidor. Cada sección de primer nivel que contiene un bloque con js en el registro se envuelve como isla:

<!-- display: contents → no altera el layout -->
<div data-island='{"section":{…},"ctx":{…},"components":{…}}'>
  <section class="ok-section" data-ok-theme="dark">…HTML ya renderizado…</section>
</div>

Base.astro incluye un script mínimo. Si la página tiene al menos una isla, importa core/render/hydrate.tsx, que hace hydrateRoot sobre cada isla con los mismos props. Si no tiene ninguna, la página no carga React.

Quién descarga quéJS (gzip)Cuándo
Página sin bloques con js≈1 KBSiempre (solo el script que busca islas)
Página con islas: React DOM, bloques, Portable Text91 KBSi hay al menos una isla (slider, logo 3D)
three.js del bloque 3D Logo140 KBSolo si la página tiene ese bloque
Studio + Okapi Editor≈1.650 KBSolo quien entra a /studio
Canvas del editor144 KBSolo dentro del editor

npm run verify controla esto en cada build: ningún HTML público referencia código del editor ni del Studio, y la home no supera 250 KB de JS.

SEO incluido

  • Títulos y descripción: cada página tiene metaTitle, metaDescription, ogImage y noindex. Si están vacíos, usan los valores de Settings, y si tampoco hay ahí, los del código.
  • Etiquetas generadas: canonical absoluto, og:*, Twitter card, sitemap.xml, robots.txt y JSON-LD Organization en la home.
  • URLs: todas salen de pageHref() y resolveLink(). Los links internos son referencias a páginas, no paths escritos a mano. Agregar idiomas más adelante es cambiar esas dos funciones.

Producto

Okapi Editor

Es la primera pestaña del Studio. Tiene tres columnas: páginas y capas, canvas y propiedades. Arriba están deshacer y rehacer, + Add, el selector de dispositivo y Publish. La columna derecha tiene dos pestañas, Properties y ✦ Chat. Las dos columnas laterales se agrandan arrastrando el borde (doble clic las resetea).

Qué se puede hacer

  • Texto en el lugar. Doble clic en headings, párrafos, eyebrows, botones, y título y cuerpo de cards. El rich text tiene una barra flotante con negrita, itálica, link y quitar link.
  • Capas. Árbol con arrastre (antes, después o adentro), insertar, duplicar, borrar, mover, y copiar y pegar entre páginas.
  • Arrastre en el canvas. El bloque seleccionado muestra un agarre ⠿. Una línea azul indica dónde cae, y se valida con las mismas reglas que las capas.
  • Selección múltiple. Con ⇧ o ⌘ + clic en el canvas o en capas. Borrar, duplicar, copiar y mover aplican a todos.
  • Imágenes. Se arrastra un archivo sobre una imagen, card o fondo de sección, o se sube desde el panel.
  • Propiedades generadas del schema. Cada campo de cada bloque tiene su control; verify falla si alguno queda sin control.
  • ✦ Chat. Pedís cambios con tus palabras y adjuntás hasta 3 imágenes. Solo lo que tu rol permite; los cambios quedan como borrador y se deshacen en un paso. Ver Permisos y chat con IA.

Atajos

AtajoAcción
⌘ Z · ⌘ ⇧ ZDeshacer · rehacer (el tipeo se agrupa)
⌘ DDuplicar la selección
⌘ C · ⌘ VCopiar · pegar bloques (también entre páginas)
⌫Borrar la selección
⌥ ↑ · ⌥ ↓Mover un lugar arriba · abajo
EscSeleccionar el bloque padre
⌘ B · ⌘ I · ⌘ KNegrita · itálica · link, mientras editás rich text

Guardar y publicar

Todo lo que hacés se guarda solo, como borrador. Nadie lo ve hasta que tocás Publish. Después de publicar, el sitio se actualiza en el próximo build: un par de minutos si el proyecto tiene el webhook configurado.

Cómo guarda

El editor usa el almacén de documentos del propio Studio, sin otro SDK. Los cambios se aplican al instante en local y se guardan como borrador. Publish publica el documento. Como el sitio es estático, publicar dispara un rebuild (ver Hosting y publicación).

Edición de texto sin saltos del cursor

Mientras escribís, el canvas retiene los renders que llegan del editor. Al terminar, restaura el DOM exacto que React espera y recién ahí aplica el valor nuevo. El rich text se convierte entre Portable Text y HTML editable en core/editor/richtext.ts, y mantiene los destinos de los links existentes por su clave.

Protocolo editor ⇄ canvas

Son mensajes postMessage del mismo origen, tipados en core/editor/protocol.ts.

DirecciónMensajePara qué
Editor → canvasrenderDocumento, rutas y componentes a dibujar
Editor → canvasselectResaltar la selección, con scroll opcional
Canvas → editorreadyEl iframe cargó
Canvas → editorselectClic en un bloque (con add para multi-selección)
Canvas → editortextTexto editado (string o Portable Text)
Canvas → editormoveArrastre en el canvas: antes o después de otro bloque
Canvas → editordropArchivo de imagen soltado sobre un bloque
Canvas → editorkeyAtajos presionados con el foco en el canvas

Producto

Estilos y tokens

Todo el diseño sale de src/theme/tokens.css, el primer archivo que se toca en cada proyecto. Ahí están los colores por tema (light, dark, brand), los radios, la escala tipográfica, el espaciado y el ancho de página. Tailwind 4 los expone como utilities (bg-ok-surface text-ok-fg gap-ok-md rounded-ok-main), y como los colores leen el data-ok-theme de la sección, cada bloque se adapta solo al tema. La paleta por defecto de Tailwind no está, a propósito: un color nuevo se agrega como token. Todo lo que define Okapi lleva prefijo (variables --ok-*, clases ok-*, utilities ok-), así que no choca con el Tailwind, shadcn o DaisyUI del proyecto.

Panel de estilo

Cada bloque tiene un campo design que el editor muestra como panel de estilo. Hay solo tokens, no CSS libre, y se puede definir para todas las pantallas, tablet y mobile.

PropiedadValores
Margin, paddingnone xs sm md lg xl 2xl 3xl
Fondo, color de textobg surface surface-2 fg muted brand brand-contrast border
Radionone sm md lg main pill
Ancho máximoprose 65ch · narrow 40rem · page · full
Alineación de texto, ocultarleft center right · ocultar por breakpoint
Breakpointstablet ≤ 1023px · mobile ≤ 767px (desktop-first)

core/style/stylesheet.ts convierte esos valores en una sola hoja de estilos por página, con un selector por bloque. Los valores del panel van con !important porque el panel es la autoridad final sobre ese bloque:

[data-b="9c2e"][data-b] { padding-top: var(--ok-space-lg) !important; }
@media (max-width: 767px) {
  [data-b="9c2e"][data-b] { padding-top: var(--ok-space-sm) !important; }
}

Box

Es el contenedor libre: apila, pone en fila o arma una grilla, con gaps de token, alineación y wrap. Se puede anidar. En tablet las grillas pasan a 2 columnas y en mobile a 1; las filas se apilan en mobile.

Producto

Componentes

Un componente es un documento component con secciones. Una página lo usa con un bloque componentRef (una instancia). Si editás el componente, cambian todas sus instancias.

En el editor

  • Make component: guarda la sección seleccionada en la librería y la reemplaza por una instancia.
  • + Add: lista los componentes de la librería para insertarlos como instancia.
  • Edit component: abre el componente original para editarlo.
  • Detach: convierte la instancia en una copia suelta y editable.
  • El canvas selecciona una instancia como un solo bloque.

Overrides por instancia

Si hacés doble clic en un texto o soltás una imagen dentro de una instancia, el cambio se guarda solo en esa instancia, en su lista overrides. El original no se toca. Cada override apunta a "<claveDelBloque>.<campo>", se aplica al renderizar (core/render/overrides.ts) y el panel los lista con un botón Reset.

Límite actual

Los componentes son secciones enteras y solo viven en el primer nivel de una página. No se anidan ni se insertan adentro de otra sección. Ver Lo que sigue.

Producto

Permisos y chat con IA

Cada proyecto decide quién puede qué en src/okapi.policy.ts: cada rol de Sanity tiene una lista de permisos y, opcionalmente, los tipos de bloque que puede agregar. El editor y el chat lo respetan. El chat nunca puede más que la persona que lo usa.

Roles e invitaciones

El rol se pone en Sanity, no en Okapi. Las personas se invitan en sanity.io/manage → el proyecto → Members → Invite, eligiendo el rol ahí (se cambia después desde la misma lista), o desde la terminal: npx sanity users invite ana@cliente.com --role editor.

Rol de SanityPlan de SanityQué permite SanityEn Okapi (por defecto)
administratorTodosTodo, incluida la configuración del proyectoTodo
editorGrowth o superiorLeer, escribir y publicarTextos, imágenes, reordenar, algunos bloques, publicar, chat
contributorGrowth o superiorEscribir borradores, sin publicarTextos, imágenes, reordenar
viewerTodos (asiento gratis)Solo leerSolo mirar
developer y otrosGrowth o superiorSegún el rolSolo mirar, salvo que la política lo nombre
En el plan gratis de Sanity

Solo existen administrator y viewer, así que un cliente que edite tiene que ser administrator y ve todo. Para separar agencia y cliente hace falta el plan Growth.

PermisoPermite
textEditar textos, rich text y links
imagesCambiar imágenes
styleEl panel de estilo (solo tokens)
settingsAjustes de bloque: variantes, tamaños, layout
reorderMover bloques arriba y abajo
structureAgregar, duplicar y borrar bloques (limitado por blocks)
componentsCrear, separar e insertar componentes de la librería
publishPublicar
chatUsar el chat con IA
La política ordena el editor; no es un candado

El límite real es el rol de Sanity: lo que la API le deja escribir a esa persona. Alguien técnico puede escribir lo que su rol permita sin pasar por el editor. Dale a cada cliente el rol de Sanity más chico que alcance.

Cómo funciona el chat

  • El editor manda el pedido, con la sesión de Sanity de la persona, a una función del propio sitio: /api/editor-chat.
  • La función verifica la sesión con Sanity, calcula los permisos, lee la página de Sanity y le pregunta al modelo con la clave del proyecto, guardada en el hosting. La clave nunca llega al navegador.
  • El modelo solo propone cambios. El editor revisa cada uno contra los permisos, el registro de bloques y el schema, y aplica los válidos como un solo paso de deshacer, como borrador. El chat nunca publica.
  • Imágenes: hasta 3 por mensaje (📎, pegar o arrastrar). La original se sube a Sanity; el modelo ve una copia chica.
  • Selector de modelo: aparecen los proveedores que tengan clave en el hosting (Anthropic, OpenAI, OpenRouter). AI_MODELS limita la lista; el primero es el predeterminado.

Costo y privacidad

  • Una clave por proyecto, con su propio tope de gasto en el proveedor. Cada pedido tiene un tope de tokens y un límite por persona; el rol que solo deja borradores no tiene chat por defecto.
  • La página que se edita y las imágenes adjuntas se mandan al proveedor elegido. Avisale al cliente.
  • El chat es opcional: con features.chat: false en src/okapi.config.json el sitio queda 100% estático.

Producto

Bloques

Okapi trae estos bloques de ejemplo. Al instalar, npm run okapi:setup saca los opcionales que no elegiste (Slider, Logo 3D); después cada proyecto suma los suyos. El registro único está en src/blocks/meta.ts. Define qué tipos existen, qué pueden contener, cuáles necesitan JS y qué ofrece el editor en cada lugar. schemas.ts y components.tsx están tipados contra el registro: si falta algo, el compilador lo marca.

BloqueContieneJSEn el canvas
SectionCualquier bloqueNoTema, espaciado, fondo (soltar imagen)
Component componentRefUna instancia de la librería (si los componentes están prendidos)Según contenidoOverrides de texto e imagen
Eyebrow—NoTexto en el lugar
Heading—NoRich text en el lugar
Paragraph—NoRich text en el lugar
Button GroupButtonNo—
Button—NoLabel en el lugar
Image—NoSoltar imagen
Looping Video—No—
ContentEyebrow, Heading, Paragraph, Button GroupNo—
Card—NoTítulo y cuerpo en el lugar, soltar imagen
GridCard, Content, Image, 3D LogoNo—
BoxCualquier bloqueNo—
SliderCard, ImageSíOpcional al instalar
3D Logo—Sí · three.js aparteOpcional al instalar

Todos los bloques tienen además el panel de estilo. "JS" indica si hacen que su sección se hidrate en el sitio público.

Integración

Instalación

La guía completa es INSTALL.md, en la raíz del repo, escrita para que la siga cualquier agente. Hay dos caminos y los dos terminan en los mismos pasos comunes: Sanity, .env, arranque, roles, producción y verify.

Camino A: proyecto nuevo

El repo de Okapi ya es un proyecto Astro completo: se clona, se le saca el .git y se corre npm install.

Camino B: proyecto existente

Primero el agente analiza el proyecto y muestra un informe con ✅, ⚠️ y 🛑. 🛑 es que no instala: Astro anterior al 7.3, Preact o Solid (Okapi pone el JSX del proyecto en React), Tailwind 3 (Okapi necesita Tailwind 4 y un proyecto no puede tener los dos) o Sanity ya montado. ⚠️ es que sigue solo si lo aceptás: Vue o Svelte, varios idiomas, rutas dinámicas en la raíz. El [slug] de Okapi le gana al [...slug] de un blog o de Starlight, así que los slugs del proyecto van en reservedSlugs, o las páginas del editor pasan a /p/<slug> con pagesBase. Un proyecto sin Tailwind no tiene problema: el Tailwind de Okapi va sin preflight y solo en sus layouts. El trailingSlash del proyecto queda como está: las rutas, links, canonicals y sitemap de Okapi lo siguen.

Después se copian piezas al proyecto sin pisar nada que ya exista. Si una ruta choca, el agente frena y pregunta.

Se copiaQué es
src/core/El producto: editor, render, estilos, Sanity. No se modifica por proyecto
src/blocks/Registro y bloques de ejemplo. Se borran o se suman bloques
src/documents/, src/schema.tspage, component, settings, navigation
src/theme/Tokens (nombres que usa el editor) y CSS de los bloques. Solo lo cargan las páginas del editor
src/layouts/Base.astroLayout de las páginas del editor (o OkapiBase.astro si ya hay un Base)
src/pages/[slug].astro, edit-canvas.astroPáginas del editor y el canvas. index.astro solo si la home sale del editor
sanity.config.ts, sanity.cli.tsEl Studio
scripts/verify.mjs, check-editor-schema.tsChequeos
src/okapi.config.json, src/okapi.policy.ts, scripts/okapi-setup.mjsQué usa el proyecto, quién puede qué, y el script que aplica las respuestas de la instalación
src/chrome/, public/placeholder.svgHeader y footer de las páginas del editor (reemplazables) e imagen por defecto de bloques nuevos
AGENTS.mdReglas para agentes. Si el proyecto ya tiene uno, se agrega como sección

Probado sobre el template de blog oficial de Astro: build y verify en verde, el blog intacto y src/core sin cambios.

Elegir qué instalar

Antes de instalar, el agente pregunta qué módulos quiere la persona y corre npm run okapi:setup con las respuestas: primero con --dry-run para mostrar el plan, después con --yes. Si falta una respuesta, el script no hace nada y dice cuál. Corrido en una terminal sin flags, hace las preguntas solo. Se niega a correr dentro del repo de Okapi.

FlagPreguntaSi es no
--slider¿Slider / carrusel?Se borran el bloque y embla-carousel-react
--logo3d¿Logo 3D? (~140 KB, solo en las páginas que lo usan)Se borran el bloque y three
--components¿Componentes reutilizables?features.components: false: sin librería ni instancias
--chat¿Chat con IA en el editor?features.chat: false: sin adaptador ni función de servidor, 100% estático
--roles¿Quién edita? administrator · administrator+editor · administrator+editor+contributor · keep (los nombres de rol de Sanity)Escribe okapi.policy.ts con esos roles
--demo¿Contenido de ejemplo?Sin archivo de seed; la primera página se crea en el editor

Los bloques se borran, así el sitio carga menos código. El chat y los componentes son flags que lee el core (core/config.ts), así el core es igual en todos los proyectos y se pueden cambiar después. Los chequeos pasan con cualquier combinación: probado con todo apagado, el JS de la página bajó y un build para Vercel salió 100% estático.

Configuración que se integra

  • package.json: dependencias de Sanity, React 19 y Tailwind 4 (más Embla y three si quedan el slider y el logo 3D, y los adaptadores de hosting si el chat está prendido), engines: node >=22.12 y el script okapi:setup. Sanity en sus versiones actuales: sanity ^6.19, @sanity/client 8, @sanity/ui 4, @sanity/icons 5. Si el proyecto tiene más nuevas, se respetan; las más viejas se suben dentro de la misma mayor.
  • astro.config: no se pega nada. Importa okapi(), okapiSanity(), okapiAdapter() y okapiSite() de src/core/astro/okapi.ts y los suma junto a react() y el plugin de Tailwind. okapi() trae la ruta del chat, el trailingSlash final del proyecto, el CDN de imágenes de Sanity y la lista de optimizeDeps, fusionados con lo del proyecto. El output y el site del proyecto se respetan.
  • tsconfig: JSX de React y el alias @/* → ./src/*.

Integración

Contrato con tu proyecto

Lo que tu código tiene que respetar para que el editor funcione. Todo lo demás es libre.

ReglaPor qué
Todo lo editable es un bloque registrado en src/blocks/meta.ts, schemas.ts y components.tsxEl registro define qué existe, qué contiene qué y qué ofrece el editor
Un bloque recibe { block, path, ctx }, nunca hace fetch y pone {...editable(…)} en su raízEl canvas dibuja el documento que recibe y selecciona por data-sanity-path
js en meta.ts si el bloque corre algo en el navegadorSi no, el sitio lo sirve como HTML y nunca se hidrata
Cada layout que renderiza <PageBuilder islands /> incluye <Islands />Es el que hidrata las secciones que necesitan JS (slider, logo 3D), y en dev instala el preámbulo de React
Los nombres de tokens.css no cambian; los valores síEl panel de estilo ofrece esos nombres
Links con resolveLink() y pageHref()Una sola fuente de URLs: links, sitemap, canonical, futuros idiomas
Okapi no trae librería de animaciónSi el proyecto ya anima (GSAP, Motion, CSS), sigue con lo suyo y bajo su licencia. El editor no tiene controles de animación
Las elecciones del proyecto viven en src/okapi.config.json y src/okapi.policy.tsEl core las lee, así nunca hay que editarlo por proyecto
Íconos desde su ruta propia (@sanity/icons/Cube) y piezas de UI movidas desde la suya (@sanity/ui/tooltip)Así las exportan las versiones actuales de Sanity

Un proyecto no toca src/core: el texto editable y el soltar imagen se declaran por bloque en meta.ts. La única excepción es pageHref() si las páginas del editor se montan bajo un prefijo.

Trabajar con él

El código

La regla que sostiene el producto: src/core es igual en todos los proyectos. Un arreglo en core se hace en el repo de Okapi y después se trae a cada proyecto. Lo propio de cada proyecto vive en blocks, theme y sus layouts. Cuando haya 3 o más proyectos en producción, core pasa a ser un paquete privado y los arreglos llegan con npm update.

src/core/ el producto · igual en todos los proyectos editor/ EditorTool, CanvasApp, FieldControls, ops, paths, protocol, richtext render/ PageBuilder, BlockRenderer, instancias, overrides, Islands.astro + hydrate style/ tokens del panel, stylesheet por página, schema del campo design sanity/ client + loadQuery, site loader, queries, editable(), env studio/ inputs propios del Studio (sliders, enums, responsive) lib/ routes (pageHref/resolveLink), clean, staleChunkReload, types src/okapi.config.json qué usa el proyecto: features.chat, features.components src/okapi.policy.ts quién puede qué, por rol de Sanity (editor + chat) src/blocks/ una carpeta por bloque · meta.ts = el registro src/theme/ tokens.css (lo primero que se cambia) + globals.css src/chrome/ header y footer del proyecto src/documents/ page, component, settings, navigation src/pages/ [slug] = páginas del editor · /edit-canvas = canvas scripts/ verify, check-editor-schema, seeds skills/ skill okapi-astro (Claude Code): sigue INSTALL.md docs/ esta documentación INSTALL.md instalación en un proyecto nuevo o existente, para cualquier agente AGENTS.md reglas para trabajar en el código (CLAUDE.md lo importa)

Reglas que más se rompen

  • Los bloques reciben todo por props y llevan {...editable(…)} en su raíz. Nunca hacen fetch: el canvas los dibuja con el documento que recibe.
  • Estilos con utilities de Tailwind sobre tokens. Sin colores literales.
  • Los assets de diseño (logos, texturas) son código, no van al CMS.
  • macOS no distingue mayúsculas: nunca Foo.tsx y foo.ts en la misma carpeta.

Trabajar con él

Agregar un bloque

  1. Schema y componente

    src/blocks/<tipo>/schema.ts con defineType y un ícono de @sanity/icons, más <Tipo>.tsx, que recibe { block, path, ctx }.

  2. Registro

    Entrada en meta.ts: título, slot si contiene otros bloques, margin, y js si corre algo en el navegador.

  3. Mapas

    Registrarlo en schemas.ts y components.tsx. El compilador marca error hasta que esté.

  4. Editor (opcional)

    Contenido al insertarlo en defaults.ts, texto editable (text) y soltar imagen (imageField) en la entrada del bloque en meta.ts. Si un rol tiene lista blocks, sumá el tipo ahí también.

// src/blocks/meta.ts
quote: { title: "Quote", margin: true },
ticker: { title: "Ticker", js: true },
gallery: { title: "Gallery", js: (b) => b.layout === "carousel" },
// src/blocks/quote/Quote.tsx
export function Quote({ block, path, ctx }: BlockProps<QuoteData>) {
  return (
    <blockquote className="text-ok-h-lg text-ok-fg"
      {...editable(ctx.documentId, ctx.documentType, path, block._type)}>
      {block.text}
    </blockquote>
  );
}

Si el componente ya existe en tu proyecto, es el mismo camino: el componente pasa a leer todo de block en vez de props o texto fijo, y si era .astro se pasa a .tsx.

Para borrar un bloque: su carpeta, su entrada en meta.ts, las dos entradas de los mapas y cualquier accepts que lo nombre. El compilador te lleva a cada una.

Trabajar con él

Hosting y publicación

Sirve cualquier hosting. Build con npm run build, salida dist, Node 22.12+ y npm. Con el chat con IA prendido, usá Vercel o Netlify (incluidos) o Cloudflare Pages (npm i @astrojs/cloudflare wrangler una vez): Okapi elige el adaptador según dónde corre el build y suma la única función del chat. En otro hosting el sitio anda y el chat aparece como no disponible.

Publicar no cambia el sitio hasta el próximo build

Sin el webhook, el cambio queda publicado en Sanity pero el sitio sigue mostrando la versión anterior. El webhook se crea en sanity.io/manage → API → Webhooks, con filtro _type in ["page","settings","navigation","component"].

VariablePara qué
PUBLIC_SANITY_PROJECT_IDProyecto de Sanity
PUBLIC_SANITY_DATASETNormalmente production
PUBLIC_SANITY_API_VERSIONFecha de la API, por ejemplo 2024-10-01
PUBLIC_SITE_URLOrigen para canonical, og:url y sitemap. En Vercel, Netlify y Cloudflare usa la URL del deploy si falta. Vacía cuenta como no definida.
SANITY_API_READ_TOKENSolo si el dataset es privado: token Viewer, leído en el build
ANTHROPIC_API_KEY · OPENAI_API_KEY · OPENROUTER_API_KEYSolo con el chat prendido: la clave del proyecto por proveedor, nunca PUBLIC_. Ponele tope de gasto en el proveedor
AI_MODELSOpcional: los modelos que ofrece el chat, por ejemplo anthropic:claude-sonnet-5-5, anthropic:claude-haiku-5-5. El primero es el predeterminado

Cada dominio desde el que se abra /studio tiene que estar en los orígenes CORS del proyecto, con credenciales. Sin eso, el Studio pide "Connect this studio to your project".

La URL del deploy hook es un secreto: quien la tenga puede disparar builds. Guardala solo en el webhook de Sanity y en el hosting.

Trabajar con él

Calidad y pruebas

npm run verify

Corre antes de cada entrega y después de cualquier cambio en core. Revisa lo que se rompe sin avisar:

  • La versión de Sanity instalada tiene su parche.
  • Los links y las rutas resuelven bien (routes.check).
  • Cada campo de cada bloque tiene un control en el panel (check-editor-schema).
  • Insertar, mover, borrar y duplicar mantienen el documento válido, y la detección de islas es correcta (ops.check).
  • Los tokens generan el CSS esperado, sin inyección de selectores (stylesheet.check).
  • Los overrides se aplican al bloque correcto y nunca tocan el original (overrides.check).
  • Los permisos de cada rol filtran cada cambio que propone el chat, y los pedidos a los proveedores tienen la forma correcta (chat.check).
  • El rich text va y vuelve como HTML editable sin escaparse de los atributos (richtext.check).
  • El build pasa, el HTML público no tiene código del editor ni del Studio, y la home queda en 250 KB de JS o menos.
  • La home tiene contenido real, canonical absoluto, sitemap y robots.
  • Con una URL (npm run verify -- https://dominio), además responden /, /studio y /edit-canvas.

Smoke test logueado

Los flujos que necesitan login no se pueden automatizar sin credenciales. Se prueban a mano, en una página descartable, antes de entregar un sitio:

  1. Escribir en un heading sobre la página, recargar, y que el texto siga ahí.
  2. Negrita, itálica y link en un párrafo. Insertar, duplicar, borrar y arrastrar una capa. Deshacer y rehacer.
  3. Soltar una imagen sobre un bloque Image: se sube y aparece.
  4. Make component sobre una sección. Editar texto en una instancia: cambia solo esa. Reset. Edit component: cambian todas.
  5. Publish, después npm run build, y el cambio está en la página estática.
  6. Entrar con un usuario de rol cliente: no ve estilos ni acciones de estructura.
  7. Con View as en cada rol, solo aparece lo que permite okapi.policy.ts; el chat rechaza el resto.
  8. ✦ Chat: "hacé más corto el título seleccionado" se aplica, y Deshacer lo revierte.

Trabajar con él

Problemas conocidos

Todos ya aparecieron alguna vez y tienen solución.

SíntomaCausaArreglo
"Connect this studio to your project"El origen no está en CORS. Cada puerto cuenta como un origen distinto.Agregar el origen exacto con credenciales. En local se usa :4321.
Studio o canvas en blanco + 504 (Outdated Optimize Dep)Vite re-optimizó dependencias con la pestaña abierta.Parar el server, rm -rf node_modules/.vite, npm run dev, ⌘⇧R.
Studio en blanco justo después del loginLa pestaña pide chunks de un server o deploy anterior.staleChunkReload recarga una vez sola. Si sigue: ⌘⇧R.
Studio en blanco solo en BraveShields y el routing.Resuelto con hash routing y basePath: "/".
La home muestra la pantalla de bienvenidaFalta .env o el contenido.Completar .env e importar el seed.
El build se frena con [loadQuery] …Sanity no respondió o falta el env. Frena a propósito para no deployar un sitio vacío.Revisar PUBLIC_SANITY_* en el hosting y el estado de Sanity, y volver a buildear.
"can't detect preamble" en devEl layout no incluye <Islands />.Agregarlo al final del <body>.
Publiqué y el sitio no cambióEl sitio es estático.Revisar el webhook al deploy hook o correr un build.
La pestaña ✦ Chat dice que no está disponibleNo hay clave de IA en el hosting, el hosting no corre funciones, o features.chat está apagado.Cargar una clave (ANTHROPIC_API_KEY…), usar Vercel/Netlify/Cloudflare y redeployar.

Contexto

Decisiones

Por qué está hecho así. Antes de cambiar alguna de estas, conviene leer el motivo.

Editor propio en vez de Sanity Presentation

Problema. Presentation era lento para editar: había que hacer clic en el overlay, buscar el campo en un formulario y esperar la ida y vuelta. No se podía escribir sobre la página y dependía de 7 parches.

Decisión. Reemplazar solo la UI de edición, con APIs públicas del Studio. Presentation, /preview, el draft mode y visual-editing se eliminaron.

Sanity como base de datos

Problema. Login, roles, borradores, historial, tiempo real e imágenes son meses de infraestructura.

Decisión. No construir eso: Sanity lo resuelve y el Studio sigue disponible para settings, menús y colecciones.

Canvas en iframe, sin datos propios

Problema. El CSS del sitio y el del Studio no pueden mezclarse, y una ruta del canvas con datos expondría borradores.

Decisión. Un iframe del mismo origen que solo dibuja lo que le manda el editor autenticado. Además da breakpoints reales.

Sitio estático con islas por sección

Problema. Hidratar toda la página costaba 138 KB de JS aunque casi nada se moviera.

Decisión. Sin Presentation ya no hace falta hidratar todo: HTML puro y React solo en las secciones con js.

Sanity al día, sin parches

Problema. Okapi fijaba sanity@6.3.0 por parches escritos para Presentation. Los proyectos con un Sanity más nuevo no podían instalarlo limpio.

Decisión. Presentation ya no está, así que los parches también se fueron. Okapi sigue las versiones actuales de Sanity; typecheck y verify detectan los cambios que rompen.

Estilos solo con tokens

Problema. El CSS libre y el posicionamiento absoluto equivalen a construir un page builder entero, y rompen la consistencia de la marca.

Decisión. El panel solo ofrece tokens. Los bloques nuevos se escriben en código y el editor compone y estila con ellos.

Se copia, todavía no es un paquete

Problema. Un paquete privado desde el día uno agrega versionado antes de saber qué cambia por proyecto.

Decisión. Instalar copiando con una guía para agentes, con src/core intacto. Pasarlo a paquete cuando haya 3 o más sitios en producción.

Instalación para cualquier agente

Problema. El equipo no usa un solo agente, y una instalación atada a uno se desactualiza en los demás.

Decisión. Un INSTALL.md y un AGENTS.md en markdown plano. La skill de Claude Code solo los trae y los sigue.

Sin i18n, pero preparado

Problema. Ningún proyecto actual lo pide.

Decisión. Todas las URLs pasan por pageHref() y resolveLink(). Agregar idiomas se hace en un solo lugar.

Sin librería de animación

Problema. Traer GSAP y bloques animados ataba cada proyecto a una librería y a sus condiciones de licencia para constructores visuales, y sumaba peso.

Decisión. Okapi no anima. Los proyectos que ya animan siguen con sus herramientas. El JS de una página con islas pasó de 139 KB a 91 KB.

El chat con IA corre en el servidor del sitio

Problema. Una clave en el navegador la puede leer cualquier script del Studio, y el cliente la vería.

Decisión. Una función por sitio, /api/editor-chat, con la clave del proyecto en el hosting. Verifica la sesión de Sanity y el rol antes de preguntarle al modelo.

Preguntar antes de instalar

Problema. Instalar todo por defecto dejaba proyectos con módulos y dependencias que nadie pidió.

Decisión. El agente pregunta primero y okapi:setup aplica las respuestas siempre igual.

Contexto

Historial

Los hitos, agrupados. El detalle está en los commits del repo.

  1. Port a Astro y base

    • Page builder de Next.js portado a Astro 7. Separación en core, blocks y theme, con el registro tipado de bloques.
    • Tipo link, Settings y Navigation, header y footer, SEO completo, npm run verify y CLAUDE.md.
    • Tailwind 4 sobre los tokens. Primeras animaciones con SplitText.
  2. Bloques de motion y banco de pruebas

    • Horizontal Scroll, Stacked Cards, Marquee, Scroll Text, Big Type y Parallax Media, más /lab con sus tres sitios de estrés.
    • Ajustes de velocidad en el entorno de dev.
  3. Okapi Editor

    • Fase 0: herramienta del Studio con canvas en vivo y panel generado del schema.
    • Fase 1: texto en el lugar, capas con arrastre, operaciones de estructura, deshacer e imágenes.
    • Salen Presentation, Vision, /preview y visual-editing. El sitio pasa a ser 100% estático.
    • Fase 2: panel de estilo con tokens y breakpoints, bloque Box y componentes con instancias.
    • Fase 3: rich text en el lugar, overrides por instancia, selección múltiple, arrastre en el canvas y ▶ Play.
  4. Peso y robustez

    • El sitio público no importa nada del editor.
    • Islas por sección: las páginas sin motion bajan de 138 KB a ≈1 KB de JS.
    • Install y verify fallan si Sanity se desvía de su parche.
    • Instalable en proyectos Astro existentes, con INSTALL.md y AGENTS.md para cualquier agente. Esta documentación.
  5. Permisos y chat con IA

    • Permisos por rol en okapi.policy.ts, con View as.
    • ✦ Chat en la función de servidor del sitio, con la clave del proyecto, selector de modelo e imágenes adjuntas.
    • Columnas laterales del editor que se agrandan.
  6. Okapi, sin GSAP, auditoría

    • Remarkable pasa a llamarse Okapi; repo seba-seb/okapi-sanity, licencia MIT, marca y sitio en inglés y español.
    • Salen GSAP, los bloques animados y ▶ Play. JS de una página con islas: 139 KB → 91 KB.
    • Auditoría: JSON-LD y HTML del canvas escapados, el build se frena si Sanity no responde, topes de costo del chat, publicar = salir online.
  7. La instalación pregunta primero

    • El agente pregunta qué módulos instalar; npm run okapi:setup deja solo esos y escribe okapi.config.json.
    • Sanity al día (6.19, client 8, ui 4, icons 5): se fueron el pin a 6.3.0 y la carpeta patches/.

Con tu agente

Si algo falla

Contale a tu agente lo que ves, tal cual. Estos ya pasaron y tienen solución.

VesLo más probableDecile al agente
"Connect this studio to your project"Entraste por otro puerto. El local es :4321."Me aparece Connect this studio en localhost:<puerto>"
El Studio queda en blancoLa pestaña quedó vieja después de reiniciar el server.Primero ⌘⇧R. Si sigue: "El Studio queda en blanco, mirá la consola"
La home muestra "Your visual page builder is ready"Falta la configuración o el contenido."La home muestra la pantalla de bienvenida"
La pestaña ✦ Chat dice que no está disponibleEl proyecto no tiene clave de IA en el hosting, o el chat está apagado."El chat dice que no está disponible"
Publiqué y el sitio no cambióFalta el webhook o el build todavía no terminó."Publiqué y el sitio no cambió"
Una página mía dejó de verse igualEl CSS de Okapi se cargó fuera de sus páginas."Desde que sumamos Okapi, /<ruta> se ve distinta"

Con tu agente

Antes de entregar

Pedile al agente "corré verify". Después, con tu usuario y en una página descartable:

  1. Escribir en un título sobre la página, recargar, y que el texto siga ahí.
  2. Negrita, itálica y link en un párrafo. Insertar, duplicar, borrar y arrastrar un bloque. Deshacer y rehacer.
  3. Soltar una imagen sobre un bloque Image: se sube y aparece.
  4. Crear un componente, cambiar el texto de una instancia (cambia solo esa) y editar el original (cambian todas).
  5. Publicar y ver el cambio en el sitio después del build.
  6. Entrar como el cliente: no ve estilos ni acciones de estructura.
  7. Con View as en cada rol, solo aparece lo que permite okapi.policy.ts; el chat rechaza el resto.
  8. ✦ Chat: "hacé más corto el título seleccionado" se aplica, y Deshacer lo revierte.
  9. Settings completos: nombre del sitio, descripción e imagen para redes.
  10. El dominio está en CORS y el webhook de publicación funciona.

Con tu agente

Glosario

Bloque
Una pieza de la página: título, párrafo, imagen, card, slider…
Sección
Una franja de la página que contiene bloques. Tiene tema (claro, oscuro o brand), espaciado y fondo.
Box
Un contenedor libre para poner bloques en columna, en fila o en grilla.
Componente
Una sección guardada en la librería para reusarla en varias páginas.
Instancia
Cada uso de un componente en una página. Si cambiás el componente, cambian todas.
Override
Un texto o una imagen cambiados solo en una instancia, sin tocar el componente.
Token
Un valor de diseño con nombre: un color, un espaciado, un radio. Cambiarlo cambia todo el sitio.
Borrador
Lo que editaste y todavía no publicaste. Solo lo ve el equipo.
Publicar
Salir online. Con el webhook, el sitio se reconstruye en minutos.
Build
Cuando se genera el sitio con el contenido publicado. Tarda unos segundos más la instalación.
Webhook
El aviso que manda Sanity al publicar para que el hosting haga un build.
Studio
El panel de Sanity en /studio. Adentro está el editor.
Canvas
La vista de la página dentro del editor, donde hacés clic y escribís.
verify
El chequeo automático del proyecto: si pasa, lo importante funciona.
INSTALL.md
La guía que sigue cualquier agente para sumar Okapi a un proyecto.
AGENTS.md
Las reglas que el agente lee antes de trabajar en el proyecto. Claude Code las lee a través de CLAUDE.md.
Skill
Atajo para Claude Code: okapi-astro trae INSTALL.md y lo sigue.
Core
src/core, el código del editor. Es igual en todos los proyectos y se arregla en el repo de Okapi.
okapi:setup
El script de instalación: deja solo los módulos que elegiste.
okapi.config.json
Qué usa el proyecto: el chat y los componentes, prendidos o apagados.
Rol
Administrator, Editor, Contributor o Viewer: se pone en Sanity al invitar a alguien. Okapi usa los mismos nombres.
okapi.policy.ts
Quién puede qué en el editor y en el chat, por rol de Sanity.
✦ Chat
El asistente con IA del editor. Propone cambios; vos los dejás o los deshacés.

Contexto

Lo que sigue

Ordenado por impacto. Ninguno bloquea el uso actual.

QuéPor quéTamaño
Galería de la libreríaVer los componentes con una miniatura en vivo y arrastrarlos al canvas. Hoy son una lista de nombres.Chico
Componentes de cualquier tamañoGuardar una card o un botón como componente e insertarlo dentro de secciones, grids o boxes.Medio
Insertar como copia o enlazadoElegirlo al insertar desde la librería.Chico
UI propia del StudioReemplazar la barra y el marco de Sanity con la API oficial (studio.components) para que el editor sea la app entera.Medio
JS por bloqueQue una sección con solo un slider no cargue todos los bloques. Baja los 91 KB en páginas con poco JS.Medio
Paquete npm privadoInstalar y actualizar con npm en vez de copiar src/core. Cuando haya 3 o más sitios en producción.Medio
IdiomasCuando un cliente lo pida. La base está en pageHref y resolveLink.Medio
Gizmo 3D en el canvasRotar el 3D Logo directamente en el canvas. Postergado.Pausado
Okapi · repo seba-seb/okapi-sanity · instalación en INSTALL.md · reglas en AGENTS.md · actualizado el 19 de octubre de 2026