Saltar al contenido

APIs REST en TypeScript basadas en contratos, seguras por defecto y pensadas para equipos que programan con IA

DaloyJS trae valores seguros por defecto, se niega a arrancar en producción ante las configuraciones erróneas que conoce y funciona sin dependencias en tiempo de ejecución, con un proceso de publicación reforzado y firmado con procedencia. Ningún framework hace que una aplicación sea totalmente segura ni detiene todos los ataques a la cadena de suministro, así que la documentación explica qué viene activado por defecto, qué activas tú y qué riesgos quedan.

Los primeros pasos, la instalación, el tutorial y las guías básicas (enrutado, validación, errores, OpenAPI, cliente tipado y seguridad) están en español; el resto de la documentación y el blog, de momento, solo en inglés.

$ pnpm create daloy@latest my-api
  • Más de 3000 pruebas del framework en verde
  • Umbrales de cobertura: ≥90 % de líneas y funciones, ≥92 % de ramas
  • 0 dependencias en tiempo de ejecución
  • Node 24 LTS, Node 26+, Bun, Deno, Cloudflare
  • Licencia MIT
ᜇᜎᜓᜌ᜔ Daloy significa flujo en tagalo (se pronuncia da-loy).Acerca deEl nombreTutorial: la API de una librería

Seguridad y cadena de suministro

Valores seguros por defecto: la capa de defensa para el código generado por IA

Cuando un modelo de IA genera el código, la velocidad a la que teclea el desarrollador deja de ser el cuello de botella: lo que importa es la seguridad en tiempo de ejecución y la integridad de la cadena de suministro. DaloyJS aplica las barreras en la capa de ejecución: límites de tamaño del cuerpo de la petición, tiempos de espera, protección frente a la contaminación de prototipos, ocultación de los detalles de los errores 5xx y negativa a arrancar ante configuraciones erróneas, sin dependencias transitivas que explotar.

Valores de ejecución seguros por defecto

A diferencia de los frameworks que dejan las protecciones básicas en manos de plugins o de un enrutado de errores manual, el núcleo de DaloyJS arranca con las barreras activadas: límites de tamaño del cuerpo, tiempos de espera por petición, JSON a salvo de la contaminación de prototipos, respuestas 405 Method Not Allowed correctas y ocultación de los detalles de los errores 5xx que falla de forma segura (activa en todas partes salvo en un entorno de desarrollo o de pruebas declarado explícitamente). En producción se niega a arrancar ante las configuraciones erróneas que conoce, como secretos de sesión débiles o cookies de sesión sin CSRF.
Límites del cuerpo (1 MiB por defecto)Tiempos de espera por peticiónDefensa contra la contaminación de prototiposRFC 9457 problem+jsonValidación estricta de esquemasComprobaciones de configuración al arrancar

Cero dependencias en tiempo de ejecución

Instalar @daloyjs/core añade exactamente cero paquetes transitivos. Ni scripts postinstall que auditar ni CVE inesperados en dependencias que nunca elegiste. El framework no aporta un árbol de dependencias propio; las demás dependencias de tu aplicación siguen siendo cosa tuya.
0paquetes transitivos en @daloyjs/core

Plantillas reforzadas para la cadena de suministro

Elige pnpm en create-daloy y pnpm-workspace.yaml ya viene reforzado: ignoreScripts bloquea las cargas maliciosas en scripts de instalación (no el código que se ejecuta al importar), un minimumReleaseAge de 24 horas deja pasar de largo las versiones maliciosas recién publicadas que se detectan a tiempo, y verifyStoreIntegrity mantiene honestas las instalaciones. El paquete de seguridad opcional añade GitHub Actions reforzadas, Dependabot, CODEOWNERS, SECURITY.md, verificación del origen del lockfile, plantillas de contenedor sin root y con tini, y daloy doctor, un validador de la configuración de producción.
ignoreScriptsminimumReleaseAge de 24 hverifyStoreIntegrityActions fijadas por SHAAuditoría con daloy doctor

Plantillas preparadas para la IA

Todo proyecto creado con create-daloy incluye un AGENTS.md y skills de contexto, y esta documentación se puede leer por MCP. Los agentes de programación que leen AGENTS.md aprenden las convenciones de tu framework, las reglas de enrutado y las primitivas de seguridad sin rituales de prompt engineering.
Incluye AGENTS.mdSkills de contextoLegible por MCP

Streaming y observabilidad

Utilidades de SSE y NDJSON que respetan la contrapresión, y un hook de trazas de OpenTelemetry que emite spans de servidor HTTP con los atributos de las convenciones semánticas.
SSE con contrapresiónStreaming NDJSONSpans HTTP de OTel

Portable entre entornos de ejecución

El núcleo solo ve Request → Response. Los adaptadores viven en el borde: Node, Bun, Deno, Cloudflare Workers, Vercel, Fastly Compute y AWS Lambda. La misma aplicación y las mismas pruebas.
Node 24+BunDenoCloudflare WorkersVercelAWS Lambda

Basado en contratos desde el diseño

Una sola definición de ruta es la fuente de verdad para la validación, los tipos, OpenAPI 3.1, el cliente tipado y las pruebas de contrato integradas, así que las discrepancias tienen menos sitios donde esconderse.
Validación en tiempo de ejecuciónEspecificación OpenAPI 3.1Cliente tipado con Hey APIPruebas de contrato integradas

Clientes tipados con Hey API

Ejecuta pnpm gen y obtén un SDK fetch totalmente tipado, para cualquier consumidor y en cualquier proyecto TS, generado a partir de tu especificación real. O sáltate la generación de código con el cliente tipado en proceso.
pnpm genSin configuraciónSDK fetch tipado de extremo a extremo

Pilas incluidas

Sesiones aptas para el edge, WebSockets que gastan de los mismos cupos de limitación de peticiones que HTTP, logs estructurados y apagado ordenado: la fontanería de producción que normalmente montas a base de plugins, y aun así sin dependencias en tiempo de ejecución.
Sesiones en el edgeLímites de peticiones en WebSocketLogs estructuradosApagado ordenado

Benchmarks y rendimiento

Las cifras, con la letra pequeña incluida

Cuando los agentes de IA encadenan herramientas y lanzan peticiones con mucha concurrencia, el rendimiento y la latencia del arranque en frío pasan a ser críticos. DaloyJS trae las comprobaciones de seguridad activadas por defecto, y estos benchmarks miden el rendimiento con todas las protecciones en marcha.

Cómo se compara DaloyJS

Cifras reales del propio conjunto de benchmarks del repositorio. Elige una métrica, pero ten en cuenta las advertencias de abajo, porque ninguna es una comparación limpia de igual a igual.

Dependencias transitivas instaladas

Cada paquete que arrastra la instalación es superficie de ataque en la que alguien tiene que confiar. DaloyJS y Hono son los dos únicos que no añaden ninguno.

Qué significa para ti: Menos paquetes en los que confiar significa menos CVE y ningún script postinstall inesperado. Cero dependencias significa que el framework no abre puertas propias en la cadena de suministro; el resto de tu árbol de dependencias sigue siendo cosa tuya.

Conclusión: DaloyJS instala 0 dependencias transitivas, empatado con Hono como la menor superficie en la cadena de suministro, mientras que una aplicación NestJS segura arrastra 86.

Apple M3 Max · 16 cores · Node v26.4.0 · octubre de 2026 · @daloyjs/core 1.5.4 · código en bench/cross-framework

Por qué esto es comparar peras con manzanas

Estos frameworks no son la misma herramienta, así que una gráfica cara a cara se parece más a comparar peras con manzanas que a una carrera justa. Esto es lo que estas cifras demuestran y lo que no, en lenguaje llano.
  • Peras con manzanas, no una comparación de igual a igual. Son herramientas distintas que hacen cantidades de trabajo distintas. En cada petición, DaloyJS valida el cuerpo contra tu esquema de Zod o Valibot y aplica cabeceras seguras, un ID de petición, límites de tamaño del cuerpo y tiempos de espera, todo de serie. Las aplicaciones «mínimas» de los demás frameworks no hacen casi nada de esto, e incluso la «paridad de seguridad» rara vez lo iguala punto por punto. Así que parte de cada cifra de DaloyJS es seguridad y validación que, de otro modo, tendrías que construir tú.
  • La metodología del tamaño difiere: DaloyJS es un único paquete sin dependencias, mientras que los demás resuelven árboles transitivos cuyo tamaño exacto depende de cuándo se generó el lockfile.
  • El rendimiento depende de la carga de trabajo: con una pila de middleware comparable en ambos lados, DaloyJS saca un 27 % de ventaja a Hono en estas rutas GET y un 58 % en la ruta POST con cuerpo, y además DaloyJS valida ese cuerpo con Zod. Los servicios reales suelen estar limitados por la base de datos y la E/S, no por el despacho del framework, así que estas microcifras rara vez predicen lo que pasará en producción.
  • Entornos de ejecución distintos: algunos frameworks (por ejemplo, Elysia) están optimizados para Bun, pero aquí se miden con sus adaptadores de Node para tener una base justa con un único runtime.
  • Una sola máquina, un solo momento: un Apple M3 Max, Node v26.4.0, octubre de 2026, con @daloyjs/core 1.5.4 y otra carga de fondo en la máquina (los dos frameworks se midieron uno detrás de otro, así que la comparación se sostiene mejor que las cifras absolutas). Tu hardware, tu runtime y tus versiones moverán estas cifras.

Nativo para máquinas: para agentes y herramientas de IA

DaloyJS está listo para MCP

El Model Context Protocol (MCP) es el estándar abierto que usan agentes de IA como Claude, Cursor y VS Code para llamar a herramientas y leer documentación. DaloyJS lo soporta en ambos extremos: tu aplicación puede convertirse en un servidor MCP, y esta documentación (en inglés) ya lo es.

Convierte tu API en un servidor MCP

DaloyJS crea servidores MCP solo con @daloyjs/core, sin SDK: transporte Streamable HTTP, validación de los esquemas de entrada y una protección al arrancar en producción que se niega a iniciar si un endpoint MCP no tiene un hook de autenticación en su cadena. Comprueba que el hook está ahí y, en producción, que se ha ejecutado en cada petición, no que rechace a nadie, así que prueba también tu autenticación.

Crea un servidor MCP →
ts
import { App, bearerAuth, createMcpHandler, mcpRoutes } from "@daloyjs/core";

const mcp = createMcpHandler({
  serverInfo: { name: "inventory-mcp", version: "1.0.0" },
  tools: [/* tus herramientas, con esquemas de entrada validados */],
});

const app = new App();
app.use(bearerAuth({ validate: checkToken })); // sin hook de autenticación, producción se niega a arrancar
for (const route of mcpRoutes("/mcp", mcp)) {
  app.route(route); // tu API ya es también un servidor MCP
}

Lee esta documentación por MCP

Un endpoint público de solo lectura en el que tu agente de programación puede buscar y leer sin copiar y pegar. No hace falta clave de API.

Endpoint

Apunta cualquier cliente compatible con MCP a esta URL:
https://daloyjs.dev/mcp
  • search_docsBúsqueda por palabras clave en todas las páginas de la documentación, ordenada por relevancia.
  • get_docLee el texto completo de una página por su ruta o su slug.
  • list_docsConsulta todas las páginas de documentación disponibles en una sola llamada.

Añádelo a la configuración de tu cliente MCP

json
{
  "mcpServers": {
    "daloyjs-docs": {
      "url": "https://daloyjs.dev/mcp"
    }
  }
}

¿Usas un cliente que solo admite stdio? Conéctalo con npx -y mcp-remote https://daloyjs.dev/mcp.

Contener el radio de impacto

Contratos como recintos de seguridad, no como sintaxis decorativa

En un flujo de trabajo centrado en la IA, los contratos no son un lujo estético para humanos: son la frontera que la máquina hace cumplir y que impide que estructuras de datos alucinadas se filtren entre componentes. Un solo contrato de ruta valida estrictamente las peticiones, acota las respuestas y genera en vivo la especificación OpenAPI 3.1 y el cliente tipado.

flujo del contratodefínelo una vez -> genera el resto
01contratoGET /books/:id + z.object(...)
02validaciónen ejecución, en ambos sentidos
03OpenAPI 3.1especificación en vivo + /docs
04cliente tipadopnpm gen -> SDK fetch
ts
import { z } from "zod";
import { App, secureHeaders, rateLimit, requestId } from "@daloyjs/core";
import { serve } from "@daloyjs/core/node";

const app = new App({ bodyLimitBytes: 1 << 20, requestTimeoutMs: 5_000 });

// new App() ya aplica requestId() y secureHeaders() automáticamente;
// estas llamadas explícitas solo personalizan (y sustituyen) los valores por defecto.
app.use(requestId());
app.use(secureHeaders());
app.use(rateLimit({ windowMs: 60_000, max: 120 })); // por IP de cliente por defecto; detrás de un proxy, configura behindProxy o keyGenerator

app.get(
  "/books/:id",
  {
    request: { params: z.object({ id: z.string() }) },
    responses: {
      200: { description: "Encontrado", body: z.object({ id: z.string(), title: z.string() }) },
      404: { description: "No encontrado" },
    },
  },
  async ({ params }) => ({
    status: 200,
    body: { id: params.id, title: `Libro ${params.id}` },
  }),
);

serve(app, { port: 3000 });

Referencia de API con Scalar, en una línea

Scalar es el sucesor moderno de Swagger UI: rápido, limpio, con modo oscuro nativo y peticiones de prueba integradas. En DaloyJS es la interfaz de documentación por defecto, no un plugin: docs: true en el constructor de App monta automáticamente esta página en /docs y la especificación OpenAPI 3.1 en vivo en /openapi.json.

Se genera a partir de los contratos de tus rutas, sin código extra. ¿Prefieres Swagger UI o Redoc? Ambos están a un campo de configuración de distancia. Guía de OpenAPI y de la interfaz de documentación →

Compromisos del ecosistema

Lo mejor de cada competidor, con menos renuncias

DaloyJS no intenta ganar en una sola casilla. Intenta eliminar el trabajo de pegamento entre las mejores ideas que a los desarrolladores ya les gustan.

QuieresHoy: valores por defecto de pnpm + núcleo sin dependencias

Refuerzo portable de la cadena de suministro para las aplicaciones que creas

Lo que te da DaloyJS

Ajustes de instalación de pnpm reforzados, lockfiles con origen verificado, SBOM + procedencia de npm

QuieresHoy: Hono

Encaje en serverless / edge

Lo que te da DaloyJS

Núcleo basado en estándares web, adaptadores para varios runtimes

QuieresHoy: Fastify

Operaciones y documentación maduras en Node

Lo que te da DaloyJS

Plugins encapsulados, logs estructurados, apagado ordenado

QuieresHoy: Elysia

DX moderna centrada en TS, compatible con Bun

Lo que te da DaloyJS

Handlers, contexto y cliente tipados de extremo a extremo

QuieresHoy: FastAPI

La mejor ergonomía de OpenAPI

Lo que te da DaloyJS

OpenAPI 3.1 integrado a partir de una sola definición de ruta

QuieresHoy: Hey API

La mejor generación de clientes tipados

Lo que te da DaloyJS

pnpm gen → SDK fetch totalmente tipado

¿Todo listo para desplegar con valores seguros por defecto?

Crea un proyecto en segundos con la instalación reforzada para tu gestor de paquetes, una CI generada que bloquea los scripts de instalación, GitHub Actions fijadas, Dependabot, CODEOWNERS y verificación del origen del lockfile. Después, mantén el contrato a medida que la aplicación crece: la misma aplicación funciona en Node, Bun, Deno y Cloudflare Workers.

Apoya el proyecto

Si DaloyJS te ahorra tiempo, puedes invitarme a un café

DaloyJS es gratuito y tiene licencia MIT. Si la documentación, los artículos o el propio framework te han ayudado a sacar algo adelante con un poco menos de drama, un café es una forma perfectamente razonable de mantener vivo el trabajo.