Zum Inhalt springen

Contract-first REST-APIs in TypeScript mit sicheren Standardeinstellungen, gebaut für Teams, die mit KI entwickeln

DaloyJS bringt sichere Standardeinstellungen mit, verweigert in Produktion den Start bei Fehlkonfigurationen, die es kennt, und läuft ohne eine einzige Laufzeitabhängigkeit, mit einer gehärteten, per Provenance signierten Veröffentlichungspipeline. Kein Framework macht eine Anwendung vollständig sicher oder stoppt jeden Angriff auf die Lieferkette, deshalb sagt die Dokumentation klar, was standardmäßig aktiv ist, was Sie selbst einschalten und welche Risiken bleiben.

Die Einstiegsseiten und Kernleitfäden (Routing, Validierung, Fehler, OpenAPI, typisierter Client, Sicherheit) gibt es auf Deutsch; der Rest der Doku und der Blog sind auf Englisch.

$ pnpm create daloy@latest my-api
  • Über 3.000 bestandene Framework-Tests
  • Coverage-Schwellen: ≥90 % Zeilen und Funktionen, ≥92 % Branches
  • 0 Laufzeitabhängigkeiten
  • Node 24 LTS, Node 26+, Bun, Deno, Cloudflare
  • MIT-Lizenz
ᜇᜎᜓᜌ᜔ Daloy bedeutet auf Tagalog „Fluss“ (ausgesprochen da-loy).Über unsZum NamenTutorial: API für einen Buchladen

Sicherheit und Lieferkette

Standardmäßig sicher: die Schutzschicht für KI-generierten Code

Wenn KI-Modelle den Code schreiben, ist nicht mehr die Tippgeschwindigkeit der Engpass, sondern Laufzeitsicherheit und die Integrität der Lieferkette. DaloyJS setzt Schutzmechanismen auf Laufzeitebene durch: Größenlimits für den Request-Body, Timeouts, Schutz vor Prototype Pollution, das Ausblenden von Details bei 5xx-Fehlern und die Verweigerung des Starts bei Fehlkonfigurationen, ganz ohne transitive Abhängigkeiten, die sich ausnutzen ließen.

Sichere Laufzeit-Standardeinstellungen

Anders als Frameworks, die grundlegende Schutzmaßnahmen Plugins oder manuellem Fehler-Routing überlassen, startet der Kern von DaloyJS mit aktiven Schutzmechanismen: Größenlimits für den Body, Request-Timeouts, gegen Prototype Pollution abgesichertes JSON, korrekte 405-Method-Not-Allowed-Antworten und das Ausblenden von 5xx-Details, das im Fehlerfall sicher bleibt (überall aktiv außer in einer ausdrücklich deklarierten Entwicklungs- oder Testumgebung). In Produktion verweigert es den Start bei Fehlkonfigurationen, die es kennt, etwa schwachen Session-Secrets oder Session-Cookies ohne CSRF-Schutz.
Body-Limits (Standard 1 MiB)Request-TimeoutsSchutz vor Prototype PollutionRFC 9457 problem+jsonStrikte Schema-ValidierungKonfigurationsprüfung beim Start

Null Laufzeitabhängigkeiten

Die Installation von @daloyjs/core fügt genau null transitive Pakete hinzu. Keine postinstall-Skripte zum Prüfen und keine überraschenden CVEs aus Abhängigkeiten, die Sie nie gewählt haben. Das Framework bringt keinen eigenen Abhängigkeitsbaum mit; die übrigen Abhängigkeiten Ihrer Anwendung prüfen Sie weiterhin selbst.
0transitive Pakete in @daloyjs/core

Gegen Lieferkettenangriffe gehärtete Vorlagen

Wählen Sie in create-daloy pnpm, und pnpm-workspace.yaml ist bereits gehärtet: ignoreScripts blockiert Schadcode in Installationsskripten (nicht Code, der beim Import läuft), ein minimumReleaseAge von 24 Stunden lässt frisch veröffentlichte schädliche Versionen verstreichen, die rechtzeitig entdeckt werden, und verifyStoreIntegrity hält Installationen ehrlich. Das optionale Sicherheitspaket ergänzt gehärtete GitHub Actions, Dependabot, CODEOWNERS, SECURITY.md, die Prüfung der Lockfile-Herkunft, Container-Vorlagen ohne Root mit tini und daloy doctor, einen Validator für die Produktionskonfiguration.
ignoreScriptsminimumReleaseAge 24 hverifyStoreIntegrityPer SHA gepinnte ActionsPrüfung mit daloy doctor

Für KI gemachte Vorlagen

Jedes mit create-daloy erstellte Projekt enthält eine AGENTS.md und Kontext-Skills, und diese Dokumentation ist über MCP lesbar. Coding-Agenten, die AGENTS.md lesen, übernehmen die Konventionen Ihres Frameworks, die Routing-Regeln und die Sicherheitsprimitiven ohne Prompt-Engineering-Ritual.
AGENTS.md enthaltenKontext-SkillsÜber MCP lesbar

Streaming und Observability

Hilfsfunktionen für SSE und NDJSON, die Backpressure respektieren, sowie ein OpenTelemetry-Tracing-Hook, der HTTP-Server-Spans mit den Attributen der semantischen Konventionen erzeugt.
SSE mit BackpressureNDJSON-StreamingOTel-HTTP-Server-Spans

Portabel zwischen Laufzeiten

Der Kern sieht nur Request → Response. Die Adapter leben am Rand: Node, Bun, Deno, Cloudflare Workers, Vercel, Fastly Compute und AWS Lambda. Dieselbe Anwendung, dieselben Tests.
Node 24+BunDenoCloudflare WorkersVercelAWS Lambda

Contract-first von Grund auf

Eine einzige Routendefinition ist die maßgebliche Quelle für Validierung, Typen, OpenAPI 3.1, den typisierten Client und eingebaute Vertragstests, sodass Abweichungen kaum noch Verstecke finden.
Validierung zur LaufzeitOpenAPI-3.1-SpezifikationTypisierter Hey-API-ClientEingebaute Vertragstests

Typisierte Clients mit Hey API

Führen Sie pnpm gen aus und erhalten Sie ein vollständig typisiertes fetch-SDK für jeden Consumer in jedem TS-Projekt, generiert aus Ihrer echten Spezifikation. Oder verzichten Sie mit dem typisierten In-Process-Client ganz auf Codegenerierung.
pnpm genOhne KonfigurationDurchgängig typisiertes fetch-SDK

Alles inklusive

Edge-taugliche Sessions, WebSockets, die aus denselben Rate-Limit-Kontingenten schöpfen wie HTTP, strukturierte Logs und ein geordnetes Herunterfahren: die Produktionsinfrastruktur, die Sie sonst aus Plugins zusammensetzen, weiterhin ohne Laufzeitabhängigkeiten.
Edge-SessionsRate-Limits für WebSocketStrukturierte LogsGeordnetes Herunterfahren

Benchmarks und Performance

Die Zahlen, mit Kleingedrucktem

Wenn KI-Agenten Tools in Schleifen aufrufen und Requests mit hoher Parallelität senden, werden Durchsatz und Kaltstartlatenz entscheidend. DaloyJS hat Sicherheitsprüfungen standardmäßig aktiv, und diese Benchmarks messen die Performance mit allen Schutzmechanismen eingeschaltet.

Wie DaloyJS im Vergleich abschneidet

Echte Zahlen aus der eigenen Benchmark-Suite des Repositorys. Wählen Sie eine Metrik, behalten Sie aber die Hinweise unten im Blick: Keiner dieser Vergleiche ist wirklich gleichwertig.

Installierte transitive Abhängigkeiten

Jedes Paket, das die Installation mitbringt, ist Angriffsfläche, der jemand vertrauen muss. DaloyJS und Hono sind die einzigen beiden, die keine einzige mitbringen.

Was das für Sie bedeutet: Weniger Pakete, denen man vertrauen muss, bedeuten weniger CVEs und keine überraschenden postinstall-Skripte. Null Abhängigkeiten heißt, dass das Framework keine eigenen Türen in der Lieferkette öffnet; den Rest Ihres Abhängigkeitsbaums müssen Sie weiterhin selbst prüfen.

Fazit: DaloyJS installiert 0 transitive Abhängigkeiten und teilt sich mit Hono die kleinste Angriffsfläche in der Lieferkette, während eine abgesicherte NestJS-Anwendung 86 mitzieht.

Apple M3 Max · 16 cores · Node v26.4.0 · Oktober 2026 · @daloyjs/core 1.5.4 · Code in bench/cross-framework

Warum das ein Vergleich von Äpfeln mit Birnen ist

Diese Frameworks sind nicht dasselbe Werkzeug, daher gleicht ein direkter Vergleich eher Äpfeln und Birnen als einem fairen Rennen. Hier steht verständlich, was diese Zahlen belegen und was nicht.
  • Äpfel und Birnen, kein Vergleich auf Augenhöhe. Es sind unterschiedliche Werkzeuge, die unterschiedlich viel Arbeit leisten. Bei jedem Request validiert DaloyJS den Body gegen Ihr Zod- oder Valibot-Schema und setzt sichere Header, eine Request-ID, Größenlimits für den Body und Timeouts, alles standardmäßig. Die „minimalen“ Anwendungen der anderen Frameworks tun davon kaum etwas, und selbst die „Sicherheitsparität“ entspricht dem selten Punkt für Punkt. Ein Teil jeder DaloyJS-Zahl ist also Sicherheit und Validierung, die Sie sonst selbst bauen müssten.
  • Die Größe wird unterschiedlich gemessen: DaloyJS ist ein einziges Paket ohne Abhängigkeiten, während die anderen transitive Bäume auflösen, deren genaue Größe davon abhängt, wann das Lockfile erzeugt wurde.
  • Der Durchsatz hängt von der Last ab: Mit vergleichbarem Middleware-Stack auf beiden Seiten liegt DaloyJS auf diesen GET-Routen rund 27 % und auf der POST-Route mit Body rund 58 % vor Hono, und DaloyJS validiert diesen Body zusätzlich mit Zod. Echte Dienste werden meist durch Datenbank und I/O begrenzt, nicht durch das Dispatching des Frameworks, daher sagen solche Mikrozahlen die Produktion selten voraus.
  • Unterschiedliche Ziel-Laufzeiten: Manche Frameworks (etwa Elysia) sind für Bun optimiert, werden hier aber über ihre Node-Adapter gemessen, um eine faire Basis auf einer einzigen Laufzeit zu haben.
  • Eine Maschine, ein Zeitpunkt: ein Apple M3 Max, Node v26.4.0, Oktober 2026, mit @daloyjs/core 1.5.4 und weiterer Last im Hintergrund (beide Frameworks wurden direkt nacheinander gemessen, der Vergleich ist also belastbarer als die absoluten Zahlen). Ihre Hardware, Laufzeit und Versionen werden diese Zahlen verschieben.

Für Maschinen gebaut: KI-Agenten und Tools

DaloyJS ist bereit für MCP

Das Model Context Protocol (MCP) ist der offene Standard, über den KI-Agenten wie Claude, Cursor und VS Code Tools aufrufen und Dokumentation lesen. DaloyJS unterstützt beide Seiten: Ihre Anwendung kann ein MCP-Server werden, und diese Dokumentation (auf Englisch) ist bereits einer.

Machen Sie Ihre API zum MCP-Server

DaloyJS baut MCP-Server allein mit @daloyjs/core, ohne SDK: Streamable-HTTP-Transport, Validierung der Eingabeschemas und eine Startsperre in Produktion, die nicht hochfährt, wenn in der Kette eines MCP-Endpunkts kein Auth-Hook steckt. Sie prüft, dass der Hook vorhanden ist und in Produktion bei jedem Request lief, nicht aber, dass er jemanden abweist; testen Sie Ihre Authentifizierung also auch selbst.

MCP-Server bauen →
ts
import { App, bearerAuth, createMcpHandler, mcpRoutes } from "@daloyjs/core";

const mcp = createMcpHandler({
  serverInfo: { name: "inventory-mcp", version: "1.0.0" },
  tools: [/* Ihre Tools, mit validierten Eingabeschemas */],
});

const app = new App();
app.use(bearerAuth({ validate: checkToken })); // ohne Auth-Hook verweigert die Produktion den Start
for (const route of mcpRoutes("/mcp", mcp)) {
  app.route(route); // Ihre API ist jetzt auch ein MCP-Server
}

Lesen Sie diese Dokumentation über MCP

Ein öffentlicher, schreibgeschützter Endpunkt, den Ihr Coding-Agent ohne Kopieren und Einfügen durchsuchen und lesen kann. Kein API-Schlüssel nötig.

Endpunkt

Richten Sie jeden MCP-kompatiblen Client auf diese URL:
https://daloyjs.dev/mcp
  • search_docsStichwortsuche über alle Dokumentationsseiten, sortiert nach Relevanz.
  • get_docDen vollständigen Text einer Seite über ihre Route oder ihren Slug lesen.
  • list_docsAlle verfügbaren Dokumentationsseiten mit einem Aufruf auflisten.

Fügen Sie ihn zur Konfiguration Ihres MCP-Clients hinzu

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

Ihr Client kann nur stdio? Verbinden Sie ihn über npx -y mcp-remote https://daloyjs.dev/mcp.

Den Schadensradius begrenzen

Verträge als Sicherheitsbarrieren, nicht als Syntaxschmuck

In einem KI-zentrierten Workflow sind Verträge kein ästhetischer Luxus für Menschen: Sie sind die von der Maschine durchgesetzte Grenze, die verhindert, dass halluzinierte Datenstrukturen zwischen Komponenten durchsickern. Ein einziger Routenvertrag validiert Requests strikt, begrenzt Antworten und liefert live die OpenAPI-3.1-Spezifikation und den typisierten Client.

Vertragsflusseinmal definieren -> den Rest generieren
01VertragGET /books/:id + z.object(...)
02Validierungzur Laufzeit, in beide Richtungen
03OpenAPI 3.1Live-Spezifikation + /docs
04typisierter Clientpnpm gen -> fetch-SDK
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() wendet requestId() und secureHeaders() bereits automatisch an;
// diese expliziten Aufrufe passen die Standardwerte nur an (und ersetzen sie).
app.use(requestId());
app.use(secureHeaders());
app.use(rateLimit({ windowMs: 60_000, max: 120 })); // standardmäßig pro Client-IP; hinter einem Proxy behindProxy oder keyGenerator setzen

app.get(
  "/books/:id",
  {
    request: { params: z.object({ id: z.string() }) },
    responses: {
      200: { description: "Gefunden", body: z.object({ id: z.string(), title: z.string() }) },
      404: { description: "Nicht gefunden" },
    },
  },
  async ({ params }) => ({
    status: 200,
    body: { id: params.id, title: `Buch ${params.id}` },
  }),
);

serve(app, { port: 3000 });

Scalar-API-Referenz in einer Zeile

Scalar ist der moderne Nachfolger von Swagger UI: schnell, aufgeräumt, mit nativem Dark Mode und eingebauten Test-Requests. In DaloyJS ist es die Standard-Oberfläche für die Dokumentation, kein Plugin: docs: true im Konstruktor von App bindet diese Seite automatisch unter /docs und die Live-Spezifikation OpenAPI 3.1 unter /openapi.json ein.

Generiert aus Ihren Routenverträgen, ohne zusätzlichen Code. Lieber Swagger UI oder Redoc? Beide sind nur ein Konfigurationsfeld entfernt. Leitfaden zu OpenAPI und Doku-Oberfläche →

Abwägungen im Ökosystem

Die Stärken der Konkurrenz, mit weniger Kompromissen

DaloyJS will nicht in einer einzelnen Disziplin gewinnen. Es will die Klebearbeit zwischen den besten Ideen beseitigen, die Entwickler ohnehin schätzen.

Sie wollenHeute: pnpm-Standards + Kern ohne Abhängigkeiten

Portable Härtung der Lieferkette für Ihre Anwendungen

Was DaloyJS Ihnen bietet

Gehärtete pnpm-Installationseinstellungen, Lockfiles mit geprüfter Herkunft, SBOM + npm-Provenance

Sie wollenHeute: Hono

Passend für Serverless / Edge

Was DaloyJS Ihnen bietet

Kern auf Basis von Webstandards, Adapter für mehrere Laufzeiten

Sie wollenHeute: Fastify

Ausgereifter Betrieb und Doku für Node

Was DaloyJS Ihnen bietet

Gekapselte Plugins, strukturierte Logs, geordnetes Herunterfahren

Sie wollenHeute: Elysia

Moderne TS-first-DX, Bun-tauglich

Was DaloyJS Ihnen bietet

Durchgängig typisierte Handler, typisierter Kontext und typisierter Client

Sie wollenHeute: FastAPI

Die beste OpenAPI-Ergonomie

Was DaloyJS Ihnen bietet

Eingebautes OpenAPI 3.1 aus einer einzigen Routendefinition

Sie wollenHeute: Hey API

Die beste Generierung typisierter Clients

Was DaloyJS Ihnen bietet

pnpm gen → vollständig typisiertes fetch-SDK

Bereit, mit sicheren Standardeinstellungen auszuliefern?

Legen Sie in Sekunden ein Projekt an, mit gehärteter Installation für Ihren Paketmanager, generierter CI, die Installationsskripte blockiert, gepinnten GitHub Actions, Dependabot, CODEOWNERS und Prüfung der Lockfile-Herkunft. Behalten Sie dann den Vertrag bei, während die Anwendung wächst: Dieselbe Anwendung läuft auf Node, Bun, Deno und Cloudflare Workers.

Das Projekt unterstützen

Wenn Ihnen DaloyJS Zeit spart, können Sie mir einen Kaffee spendieren

DaloyJS ist kostenlos und MIT-lizenziert. Wenn die Dokumentation, die Artikel oder das Framework selbst Ihnen geholfen haben, etwas mit etwas weniger Drama auszuliefern, ist ein Kaffee eine durchaus vernünftige Art, die Arbeit am Laufen zu halten.