Skip to content
Development
Skill

/api-framework-elysia

Bun-native HTTP framework — routing, TypeBox validation, Eden Treaty, plugins, lifecycle hooks

From plugin
skills
26200 skills

Claude Code

$ npx -y skills add agents-inc/skills --skill api-framework-elysia --agent claude-code

SKILL.md

api-framework-elysia.SKILL.md
name: api-framework-elysia
description: Bun-native HTTP framework — routing, TypeBox validation, Eden Treaty, plugins, lifecycle hooks

API Development with Elysia

> **Quick Guide:** Elysia is a Bun-native HTTP framework with end-to-end type safety. Use method chaining (not separate statements) so TypeScript infers the full route tree. Import `t` from `elysia` for TypeBox validation. Export the app type (`export type App = typeof app`) for Eden Treaty clients. Use `status()` (not the deprecated `error()` function) for error responses with type narrowing.

---

<critical_requirements>

CRITICAL: Before Using This Skill

**(You MUST use method chaining on the Elysia instance -- separate `.get()` calls break type inference for Eden Treaty)**

**(You MUST use `status()` for error responses -- `error()` is deprecated since 1.3, prefer `status()`)**

**(You MUST export the app type (`export type App = typeof app`) for Eden Treaty client generation)**

</critical_requirements>

---

**Auto-detection:** Elysia, elysia, ElysiaJS, Eden Treaty, @elysiajs/eden, @elysiajs/openapi, t.Object, t.String, t.Number, t.File, TypeBox, .derive(), .decorate(), .guard(), .macro(), .ws(), onBeforeHandle, onAfterHandle, onRequest, treaty, bun:test

**When to use:**

  • Building APIs on Bun runtime with end-to-end type safety
  • Need RPC-style client with zero code generation (Eden Treaty)
  • TypeBox validation with AOT compilation (~18x faster than Zod on Bun)
  • Plugin-based architecture with automatic type propagation
  • WebSocket support with schema validation

**When NOT to use:**

  • Deploying to Node.js-only environments without Bun (use a Node-first framework)
  • Need OpenAPI-first design with `createRoute` patterns (other frameworks with Zod-OpenAPI integration are more mature for this)
  • Team already committed to Express/Fastify ecosystem

**Key patterns covered:**

  • Route definitions with method chaining and TypeBox validation
  • Plugin architecture with `.use()`, `.derive()`, `.decorate()`, `.macro()`
  • Scoping rules (local, scoped, global) and `.guard()`
  • End-to-end type safety with Eden Treaty
  • Lifecycle hooks (onRequest, onBeforeHandle, onAfterHandle, onError)
  • Error handling with custom error classes and `status()`
  • WebSocket with schema validation
  • Testing with `bun:test` and `.handle()` or Eden Treaty

**Detailed Resources:**

  • [examples/core.md](examples/core.md) - Route setup, method chaining, validation, plugins
  • [examples/eden-treaty.md](examples/eden-treaty.md) - End-to-end type-safe client
  • [examples/lifecycle-errors.md](examples/lifecycle-errors.md) - Lifecycle hooks, error handling, custom errors
  • [examples/websocket-testing.md](examples/websocket-testing.md) - WebSocket patterns and unit testing
  • [reference.md](reference.md) - Decision frameworks, anti-patterns, production checklist

---

<philosophy>

Philosophy

**Method chaining IS the type system.** Elysia infers the entire route tree through chained calls. Breaking the chain (separate `app.get()` statements) loses type information for Eden Treaty clients. This is the single most important architectural constraint.

**TypeBox over Zod for Bun.** While Elysia 1.4+ supports Standard Schema (Zod, Valibot, etc.), TypeBox (`t` from `elysia`) uses AOT compilation inside Bun for ~18x faster validation. Use TypeBox as default; use Zod only when sharing schemas with a non-Bun codebase.

**Plugins are Elysia instances.** Every `new Elysia()` is a plugin. There is no separate plugin API -- you compose by chaining `.use()`. The `name` property deduplicates plugins across the tree.

</philosophy>

---

<patterns>

Core Patterns

Pattern 1: Route Setup with Method Chaining

Chain route definitions on the Elysia instance. Each `.get()`, `.post()`, etc. returns the instance with updated type information.

import { Elysia, t } from "elysia";

const app = new Elysia()
  .get("/", () => "hello")
  .get("/user/:id", ({ params: { id } }) => id, {
    params: t.Object({
      id: t.Number(),
    }),
  })
  .post("/user", ({ body }) => body, {
    body: t.Object({
      name: t.String(),
      email: t.String({ format: "email" }),
    }),
  })
  .listen(3000);

export type App = typeof app;

**Why good:** method chaining preserves type inference across the entire route tree, `export type App` enables Eden Treaty, TypeBox validates at runtime with AOT compilation

See [examples/core.md](examples/core.md) for complete route setup with modular plugins.

---

Pattern 2: Plugin Architecture

Every Elysia instance is a plugin. Use `.use()` to compose, `name` to deduplicate.

import { Elysia } from "elysia";

const userPlugin = new Elysia({ name: "user", prefix: "/user" })
  .get("/", () => "list users")
  .get("/:id", ({ params: { id } }) => `user ${id}`);

const app = new Elysia().use(userPlugin).listen(3000);

**Why good:** `name` prevents duplicate registration when a plugin is `.use()`-d multiple times, `prefix` scopes routes cleanly

See [examples/core.md](examples/core.md) for `.derive()`, `.decorate()`, and `.macro()` patterns.

---

Pattern 3: Scoping with Guard

Apply validation schemas and lifecycle hooks to groups of routes.

import { Elysia, t } from "elysia";

const app = new Elysia()
  .guard(
    {
      headers: t.Object({
        authorization: t.String(),
      }),
    },
    (app) =>
      app
        .get("/protected", ({ headers }) => headers.authorization)
        .post("/admin", ({ body }) => body, {
          body: t.Object({ action: t.String() }),
        }),
  )
  .get("/public", () => "no auth needed");

**Why good:** guard encapsulates validation for route groups without repeating schema definitions, public routes outside the guard are unaffected

---

Pattern 4: Error Handling with status()

Use `status()` for typed error responses. Register custom error classes with `.error()`.

import { Elysia } from "elysia";

const HTTP_UNAU
Read more
@agents-inc
Ships withskills

The official skills marketplace for Agents Inc. 230+ skills covering everything from React and Prisma to Redis, ElevenLabs, and infrastructure tooling. Pick the skills that match your stack and install them via Claude Code. Need more control?

Stars on GitHub

Momentum

stars in total
26
Star history of agents-inc/skills on GitHub, a chart by star-history.com

Other skills on skills.

ai-infrastructure-litellm

ai-infrastructure-lite…

LiteLLM proxy server setup, TypeScript client patterns via OpenAI SDK, model routing, fallbacks, load balancing, spend tracking,…

@agents-inc@agents-incInstall Skill
ai-infrastructure-modal

ai-infrastructure-moda…

Serverless GPU compute platform for AI model deployment — web endpoints, GPU functions, model serving, and TypeScript client…

@agents-inc@agents-incInstall Skill
ai-infrastructure-ollama

ai-infrastructure-olla…

Local LLM inference with the Ollama JavaScript client -- chat, streaming, tool calling, vision, embeddings, structured output,…

@agents-inc@agents-incInstall Skill

More skills from other plugins.

brainstorming
Auto-invoked

brainstorming

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…

@obra@obraInstall Skill
ask-matt

ask-matt

Ask which skill or flow fits your situation. A router over the skills in this repo.

skills10d309k
@mattpocock@mattpocockInstall Skill
accessibility
Auto-invoked

accessibility

Design, implement, and audit accessible UI to WCAG 2.2 Level AA across Web, iOS, and Android — semantic ARIA roles and labels,…

ecc12d293k
@affaan-m@affaan-mInstall Skill
compiler-commit

compiler-commit

Use when you want to verify compiler changes and commit with the correct convention. Runs tests, lint, and format, then commits…

react1d252k
@facebook@facebookInstall Skill

Questions about api-framework-elysia.

Which coding agents can use api-framework-elysia?
api-framework-elysia installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.