Referencia técnica
Una live app es una aplicación React guardada más un conjunto de scripts de datos almacenados que se ejecutan del lado del servidor contra las fuentes que la app declaró al construirse. Esta página describe el modelo de ejecución, sus restricciones y las superficies que expone.
Modelo de ejecución
Ningún modelo de lenguaje se ejecuta cuando se usa una app. La IA participa únicamente en el momento de la construcción; después la app es un bundle fijo cuyos scripts de datos ejecuta un runner aislado (sandbox).
- Los scripts de datos se almacenan del lado del servidor y se ejecutan sin acceso de red a nada que no sean sus fuentes declaradas. Cada script declara sus fuentes, sus parámetros y la forma de su salida; esa declaración es el límite de mínimo privilegio de la app.
- Las credenciales se resuelven en el servidor. Nunca están presentes en el bundle de la app ni en el navegador. Quien ve una app compartida tampoco las recibe.
- El vínculo con las fuentes queda fijado al construir. Un script solo puede alcanzar las herramientas, tablas de base de datos y áreas de datos de Nirvai que declaró. Agregar una fuente es una edición, no una decisión en tiempo de ejecución.
- El acceso a base de datos es de solo lectura. Las fuentes de tipo tabla exponen un select filtrado. No existe camino de escritura desde una app hacia una tabla.
El ciclo de vida de una actualización
De este diseño se desprenden dos propiedades:
- Semántica de snapshot. Una ejecución con los parámetros por defecto de la app actualiza el snapshot almacenado — la copia que todos ven al abrirla. Una ejecución con parámetros distintos a los por defecto (un filtro o rango de tiempo cambiado) se devuelve solo a quien la pidió y no lo sobrescribe.
- Renderizado a prueba de fallos. Una actualización fallida nunca deja en blanco una sección que ya tiene datos. Los valores anteriores permanecen, con un aviso de error encima. Solo una primera carga sin snapshot se renderiza vacía.
La concurrencia es de una ejecución por script de datos a la vez. Una segunda actualización mientras hay una en vuelo se rechaza en lugar de encolarse; una ejecución que excede su ventana se considera obsoleta y se libera.
Modelo de acceso
| Propiedad | Comportamiento |
|---|---|
| Propiedad de la app | Una sola persona dueña por app. La propiedad no se transfiere. |
| Visibilidad | personal u organization. No hay lista de permisos por usuario ni URL pública o basada en token. |
| Acceso de miembros | Ver y actualizar. Editar, renombrar, eliminar y volver a compartir son exclusivos de la persona dueña. |
| Identidad de ejecución | Las actualizaciones compartidas se ejecutan como la persona dueña. Las herramientas, credenciales y tablas se resuelven contra su cuenta, no contra la de quien mira — con la identidad del espectador no se resolvería ninguna. |
| Estado | draft, published, o needs_attention cuando un script de datos está fallando. |
Límites
| Límite | Valor |
|---|---|
| Tiempo total de ejecución por script de datos | 5 minutos |
| Una sola llamada a un servicio externo | 150 segundos |
| Llamadas externas por ejecución | 25 |
| Filas devueltas a la interfaz | Agrega del lado del servidor a aproximadamente 200 filas por script; los resultados más grandes se dividen en trozos |
| Ejecuciones concurrentes por script | 1 |
Las apps se construyen para agregar antes de devolver. Un script que necesita miles de filas para responder una pregunta debería reducirlas del lado del servidor en vez de paginarlas hacia el navegador.
Tipos de error
Las fallas se devuelven como resultados tipados que la app renderiza, no como páginas rotas.
| Tipo | Significado |
|---|---|
auth_expired | La credencial de un servicio conectado venció o fue rechazada. Reconéctala. |
tool_error | El servicio externo devolvió un error para esta llamada. |
tool_missing | Una herramienta o tabla declarada ya no se resuelve — eliminada, renombrada o ya no es tuya. Deja la app en Requiere atención. |
timeout | El script, o una llamada dentro de él, excedió su ventana de tiempo. |
already_running | Ya hay una ejecución de este script en vuelo. |
no_snapshot | Todavía no hay datos almacenados para este script; nunca se ha ejecutado. |
invalid_params | Un valor de filtro entregado está fuera de los parámetros declarados del script. |
script_error | El script mismo lanzó un error. |
output_too_large | El resultado excedió el límite de tamaño. |
Construir desde un asistente externo
Un asistente conectado por MCP — Claude Code, Codex, Cursor — puede construir una live app en tu cuenta. La división del trabajo es deliberada: el asistente escribe y prueba, tú apruebas y guardas.
| Puede | Notas |
|---|---|
| Listar tus apps y leer el contrato completo de una | Manifiesto, parámetros por script, fuentes declaradas, historial de ejecuciones |
| Listar qué datos hay disponibles para construir | Los mismos tres tipos de fuente que el generador dentro de la app |
| Proponer fuentes y proponer una apariencia | Cada una abre una página de revisión en Nirvai que tú apruebas |
| Probar un script de datos y validar la app completa | La misma batería de validación que corre el generador dentro de la app |
| Dejar un borrador listo | Solo después de que pase la validación; produce una vista previa real con un botón de Guardar |
| Publicar | Está disponible, pero el Guardar revisado dentro de Nirvai es el camino previsto |
Estas acciones aparecen una por una en tu Feed de Actividad, cada una con enlace directo a lo que produjo. Leer la app compartida de otro miembro a través del plugin no está expuesto — un asistente alcanza únicamente las apps de la cuenta a la que pertenece.
El generador nativo es una conversación en streaming, no una sola operación. Un asistente externo reproduce el mismo pipeline paso a paso en vez de invocarlo de golpe.