Pular para o conteúdo

APIs REST em TypeScript orientadas a contrato e seguras por padrão, feitas para equipes que desenvolvem com IA

O DaloyJS traz configurações seguras por padrão, se recusa a iniciar em produção diante dos erros de configuração que conhece e roda com zero dependências em tempo de execução, com um pipeline de publicação reforçado e assinado com proveniência. Nenhum framework torna um aplicativo totalmente seguro nem impede todos os ataques à cadeia de suprimentos, então a documentação diz o que vem ativado por padrão, o que você ativa e quais riscos permanecem.

Primeiros passos, instalação, tutorial e os guias principais (roteamento, validação, erros, OpenAPI, cliente tipado, segurança) estão em português; o resto da documentação e o blog, em inglês.

$ pnpm create daloy@latest my-api
  • Mais de 3.000 testes do framework passando
  • Limites de cobertura: ≥90% de linhas e funções, ≥92% de branches
  • 0 dependências em tempo de execução
  • Node 24 LTS, Node 26+, Bun, Deno, Cloudflare
  • Licença MIT
ᜇᜎᜓᜌ᜔ Daloy significa fluxo em tagalo (se pronuncia da-loy).SobreO nomeTutorial: a API de uma livraria

Segurança e cadeia de suprimentos

Seguro por padrão: a camada de defesa para código gerado por IA

Quando modelos de IA geram o código, a velocidade de digitação do desenvolvedor deixa de ser o gargalo: o que importa é a segurança em tempo de execução e a integridade da cadeia de suprimentos. O DaloyJS aplica proteções na camada de execução: limites de tamanho do corpo da requisição, timeouts, proteção contra poluição de protótipo, ocultação dos detalhes de erros 5xx e recusa em iniciar com configurações incorretas, sem nenhuma dependência transitiva para explorar.

Configurações de execução seguras por padrão

Ao contrário dos frameworks que deixam as proteções básicas para plugins ou para um roteamento de erros manual, o núcleo do DaloyJS já começa com as proteções ativadas: limites de tamanho do corpo, timeouts de requisição, JSON protegido contra poluição de protótipo, respostas 405 Method Not Allowed corretas e ocultação dos detalhes de erros 5xx que falha de forma segura (ativa em todo lugar, exceto em um ambiente de desenvolvimento ou de teste declarado explicitamente). Em produção, ele se recusa a iniciar diante dos erros de configuração que conhece, como segredos de sessão fracos ou cookies de sessão sem CSRF.
Limites do corpo (1 MiB por padrão)Timeouts de requisiçãoDefesa contra poluição de protótipoRFC 9457 problem+jsonValidação estrita de schemasVerificações de configuração na inicialização

Zero dependências em tempo de execução

Instalar o @daloyjs/core adiciona exatamente zero pacotes transitivos. Nenhum script postinstall para auditar e nenhuma CVE surpresa vinda de dependências que você nunca escolheu. O framework não traz uma árvore de dependências própria; as outras dependências do seu aplicativo continuam sendo sua responsabilidade.
0pacotes transitivos no @daloyjs/core

Templates reforçados para a cadeia de suprimentos

Escolha o pnpm no create-daloy e o pnpm-workspace.yaml já vem reforçado: ignoreScripts bloqueia cargas maliciosas em scripts de instalação (não o código que roda no import), um minimumReleaseAge de 24 horas deixa passar as versões maliciosas recém-publicadas que são detectadas a tempo, e verifyStoreIntegrity mantém as instalações íntegras. O pacote de segurança opcional adiciona GitHub Actions reforçadas, Dependabot, CODEOWNERS, SECURITY.md, verificação da origem do lockfile, templates de contêiner sem root e com tini, e o daloy doctor, um validador da configuração de produção.
ignoreScriptsminimumReleaseAge de 24 hverifyStoreIntegrityActions fixadas por SHAAuditoria com daloy doctor

Templates feitos para IA

Todo projeto criado pelo create-daloy inclui um AGENTS.md e skills de contexto, e esta documentação pode ser lida via MCP. Agentes de código que leem o AGENTS.md aprendem as convenções do seu framework, as regras de roteamento e as primitivas de segurança sem nenhum ritual de prompt engineering.
AGENTS.md incluídoSkills de contextoLegível via MCP

Streaming e observabilidade

Utilitários de SSE e NDJSON que respeitam backpressure, além de um hook de tracing do OpenTelemetry que emite spans de servidor HTTP com os atributos das convenções semânticas.
SSE com backpressureStreaming NDJSONSpans HTTP do OTel

Portável entre runtimes

O núcleo só enxerga Request → Response. Os adaptadores ficam na borda: Node, Bun, Deno, Cloudflare Workers, Vercel, Fastly Compute e AWS Lambda. O mesmo aplicativo, os mesmos testes.
Node 24+BunDenoCloudflare WorkersVercelAWS Lambda

Orientado a contrato desde o design

Uma única definição de rota é a fonte da verdade para a validação, os tipos, o OpenAPI 3.1, o cliente tipado e os testes de contrato integrados, então as divergências têm menos onde se esconder.
Validação em tempo de execuçãoEspecificação OpenAPI 3.1Cliente tipado com Hey APITestes de contrato integrados

Clientes tipados com Hey API

Rode pnpm gen e tenha um SDK fetch totalmente tipado, para qualquer consumidor e em qualquer projeto TS, gerado a partir da sua especificação real. Ou dispense a geração de código com o cliente tipado em processo.
pnpm genZero configuraçãoSDK fetch tipado de ponta a ponta

Tudo incluído

Sessões prontas para a edge, WebSockets que consomem das mesmas cotas de rate limit que o HTTP, logs estruturados e desligamento gracioso: a infraestrutura de produção que você normalmente monta com plugins, ainda com zero dependências em tempo de execução.
Sessões na edgeRate limit em WebSocketLogs estruturadosDesligamento gracioso

Benchmarks e desempenho

Os números, com os asteriscos incluídos

Quando agentes de IA encadeiam ferramentas e disparam requisições com alta concorrência, o throughput e a latência de cold start passam a ser críticos. O DaloyJS vem com as verificações de segurança ativadas por padrão, e estes benchmarks medem o desempenho com todas as proteções ligadas.

Como o DaloyJS se compara

Números reais da própria suíte de benchmarks do repositório. Escolha uma métrica, mas tenha em mente as ressalvas abaixo, porque nenhuma destas é uma comparação perfeitamente justa.

Dependências transitivas instaladas

Cada pacote que a instalação puxa é uma superfície de ataque em que alguém precisa confiar. DaloyJS e Hono são os únicos dois que não trazem nenhuma.

O que isso significa para você: Menos pacotes em que confiar significa menos CVEs e nenhum script postinstall inesperado. Zero dependências significa que o framework não abre portas próprias na cadeia de suprimentos; o restante da sua árvore de dependências continua sendo sua responsabilidade.

Conclusão: O DaloyJS instala 0 dependências transitivas, empatado com o Hono como a menor superfície na cadeia de suprimentos, enquanto um aplicativo NestJS seguro traz 86.

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

Por que isto é comparar laranjas com maçãs

Esses frameworks não são a mesma ferramenta, então um gráfico lado a lado se parece mais com comparar laranjas com maçãs do que com uma corrida justa. Veja, em palavras simples, o que esses números provam e o que não provam.
  • Laranjas com maçãs, não uma comparação em pé de igualdade. São ferramentas diferentes fazendo quantidades diferentes de trabalho. Em cada requisição, o DaloyJS valida o corpo contra seu schema Zod ou Valibot e aplica cabeçalhos seguros, um ID de requisição, limites de tamanho do corpo e timeouts, tudo por padrão. Os aplicativos “mínimos” dos outros frameworks não fazem quase nada disso, e mesmo a “paridade de segurança” raramente equivale item por item. Então parte de cada número do DaloyJS é segurança e validação que você teria de construir por conta própria.
  • A forma de medir o tamanho é diferente: o DaloyJS é um único pacote sem dependências, enquanto os outros resolvem árvores transitivas cujo tamanho exato depende de quando o lockfile foi gerado.
  • O throughput depende da carga: com uma pilha de middlewares comparável dos dois lados, o DaloyJS fica cerca de 27% à frente do Hono nessas rotas GET e cerca de 58% na rota POST com corpo, e ainda valida esse corpo com Zod. Serviços reais costumam ser limitados pelo banco de dados e por I/O, não pelo despacho do framework, então esses micronúmeros raramente preveem o comportamento em produção.
  • Runtimes-alvo diferentes: alguns frameworks (por exemplo, o Elysia) são otimizados para Bun, mas aqui são medidos com seus adaptadores de Node para ter uma base justa em um único runtime.
  • Uma única máquina, um único momento: um Apple M3 Max, Node v26.4.0, outubro de 2026, com @daloyjs/core 1.5.4 e outra carga em segundo plano na máquina (os dois frameworks foram medidos um logo após o outro, então a comparação se sustenta melhor do que os números absolutos). Seu hardware, seu runtime e suas versões vão mudar esses números.

Feito para máquinas: agentes e ferramentas de IA

O DaloyJS está pronto para MCP

O Model Context Protocol (MCP) é o padrão aberto que agentes de IA como Claude, Cursor e VS Code usam para chamar ferramentas e ler documentação. O DaloyJS suporta os dois lados: seu aplicativo pode se tornar um servidor MCP, e esta documentação (em inglês) já é um.

Transforme sua API em um servidor MCP

O DaloyJS cria servidores MCP apenas com o @daloyjs/core, sem SDK: transporte Streamable HTTP, validação de schemas de entrada e uma proteção de inicialização em produção que se recusa a iniciar quando um endpoint MCP não tem um hook de autenticação na sua cadeia. Ela verifica se o hook está lá e, em produção, se ele rodou em cada requisição, não se ele rejeita alguém, então teste também a sua autenticação.

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

const mcp = createMcpHandler({
  serverInfo: { name: "inventory-mcp", version: "1.0.0" },
  tools: [/* suas ferramentas, com schemas de entrada validados */],
});

const app = new App();
app.use(bearerAuth({ validate: checkToken })); // sem hook de autenticação, a produção se recusa a iniciar
for (const route of mcpRoutes("/mcp", mcp)) {
  app.route(route); // sua API agora também é um servidor MCP
}

Leia esta documentação via MCP

Um endpoint público e somente leitura em que seu agente de código pode pesquisar e ler sem copiar e colar. Não precisa de chave de API.

Endpoint

Aponte qualquer cliente compatível com MCP para esta URL:
https://daloyjs.dev/mcp
  • search_docsBusca por palavras-chave em todas as páginas da documentação, ordenada por relevância.
  • get_docLê o texto completo de uma página pela rota ou pelo slug.
  • list_docsLista todas as páginas de documentação disponíveis em uma única chamada.

Adicione à configuração do seu cliente MCP

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

Usa um cliente que só aceita stdio? Faça a ponte com npx -y mcp-remote https://daloyjs.dev/mcp.

Limitar o raio de impacto

Contratos como barreiras de segurança, não como sintaxe decorativa

Num fluxo de trabalho centrado em IA, contratos não são um luxo estético para humanos: são a fronteira imposta pela máquina que impede que estruturas de dados alucinadas vazem entre componentes. Um único contrato de rota valida as requisições com rigor, delimita as respostas e gera ao vivo a especificação OpenAPI 3.1 e o cliente tipado.

fluxo do contratodefina uma vez -> gere o resto
01contratoGET /books/:id + z.object(...)
02validaçãoem execução, nos dois sentidos
03OpenAPI 3.1especificação ao 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() já aplica requestId() e secureHeaders() automaticamente;
// estas chamadas explícitas só personalizam (e substituem) os valores padrão.
app.use(requestId());
app.use(secureHeaders());
app.use(rateLimit({ windowMs: 60_000, max: 120 })); // por IP do cliente por padrão; atrás de um proxy, configure behindProxy ou 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: "Não encontrado" },
    },
  },
  async ({ params }) => ({
    status: 200,
    body: { id: params.id, title: `Livro ${params.id}` },
  }),
);

serve(app, { port: 3000 });

Referência de API com Scalar, em uma linha

O Scalar é o sucessor moderno do Swagger UI: rápido, limpo, com modo escuro nativo e requisições de teste integradas. No DaloyJS, ele é a interface de documentação padrão, não um plugin: docs: true no construtor de App monta automaticamente esta página em /docs e a especificação OpenAPI 3.1 ao vivo em /openapi.json.

Gerada a partir dos contratos das suas rotas, sem código extra. Prefere Swagger UI ou Redoc? Os dois estão a um campo de configuração de distância. Guia de OpenAPI e da interface de documentação →

Escolhas do ecossistema

O melhor de cada concorrente, com menos concessões

O DaloyJS não tenta vencer em um único quesito. Ele tenta eliminar o trabalho de cola entre as melhores ideias de que os desenvolvedores já gostam.

Você querHoje: padrões do pnpm + núcleo sem dependências

Reforço portável da cadeia de suprimentos para os aplicativos que você cria

O que o DaloyJS oferece

Configurações de instalação do pnpm reforçadas, lockfiles com origem verificada, SBOM + proveniência do npm

Você querHoje: Hono

Encaixe em serverless / edge

O que o DaloyJS oferece

Núcleo baseado em padrões web, adaptadores para vários runtimes

Você querHoje: Fastify

Operação e documentação maduras em Node

O que o DaloyJS oferece

Plugins encapsulados, logs estruturados, desligamento gracioso

Você querHoje: Elysia

DX moderna focada em TS, compatível com Bun

O que o DaloyJS oferece

Handlers, contexto e cliente tipados de ponta a ponta

Você querHoje: FastAPI

A melhor ergonomia de OpenAPI

O que o DaloyJS oferece

OpenAPI 3.1 integrado a partir de uma única definição de rota

Você querHoje: Hey API

A melhor geração de clientes tipados

O que o DaloyJS oferece

pnpm gen → SDK fetch totalmente tipado

Tudo pronto para entregar com configurações seguras por padrão?

Crie um projeto em segundos com a instalação reforçada para o seu gerenciador de pacotes, uma CI gerada que bloqueia scripts de instalação, GitHub Actions fixadas, Dependabot, CODEOWNERS e verificação da origem do lockfile. Depois, mantenha o contrato enquanto o aplicativo cresce: o mesmo aplicativo roda em Node, Bun, Deno e Cloudflare Workers.

Apoie o projeto

Se o DaloyJS economiza seu tempo, você pode me pagar um café

O DaloyJS é gratuito e tem licença MIT. Se a documentação, os artigos ou o próprio framework ajudaram você a entregar algo com um pouco menos de drama, um café é uma ótima forma de manter o trabalho andando.