Skip to content

ElysiaJS

Ergonomic Framework for Humans

TypeScript with End-to-End Type Safety, unified type system and outstanding developer experience. Supercharged by Bun.

Get Started
bun create elysia app

See why developers love Elysia

21x faster than Express

Supercharged by Bun runtime, Static Code Analysis, and Dynamic Code Injection

Being one of the top-performing TypeScript frameworks. Comparable to Go and Rust.

  1. Elysia Bun

    2,454,631 req/s
  2. Warp Rust

    1,439,141
  3. Swoole PHP

    1,035,418
  4. Echo Go

    684,368
  5. Gin Go

    676,019
  6. Chi Go

    609,492
  7. FastAPI PyPy

    448,130
  8. Fastify Node

    415,600
  9. Express Node

    113,117

Measure in requests/second. Result from official TechEmpower Benchmark Round 22 (2023-10-17) in PlainText.

Made for Humans

Focus on productivity ++

If you found yourself writing code for the framework, then there's something wrong with the framework.

That's why Elysia invests time to experiment with design decisions to craft the most ergonomic way possible for everyone

From built-in strict-type validation to a unified type system, and documentation generation, making an ideal framework for building servers with TypeScript.

typescript
import { Elysia } from 'elysia'

new Elysia()
    .get('/', () => 'Hello World')
    .get('/json', () => ({
        hello: 'world'
    }))
    .listen(3000)
import { Elysia } from 'elysia'

new Elysia()
    .get('/', () => 'Hello World')
    .get('/json', () => ({
        hello: 'world'
    }))
    .listen(3000)

Just Function

No need for an additional method, just return the value to send data back to the client.

Whether it's a regular string, or complex JSON, just return the value and Elysia will handle the rest

typescript
import { Elysia, t } from 'elysia'

new Elysia()
    .post(
        '/profile',
        ({ body }) => body,
        {
            body: t.Object({
                username: t.String()
            })
        }
    )
    .listen(3000)
import { Elysia, t } from 'elysia'

new Elysia()
    .post(
        '/profile',
        ({ body }) => body,
        {
            body: t.Object({
                username: t.String()
            })
        }
    )
    .listen(3000)

Type Safety

Powered by TypeBox, Elysia enforces type-strict validation to ensure type integrity by default

Elysia infers types to TypeScript automatically to create unified type system like statically typed language

ts
import { Elysia, t } from 'elysia'
import { swagger } from '@elysiajs/swagger'
import { users, feed } from './controllers'

new Elysia()
    .use(swagger())
    .use(users)
    .use(feed)
    .listen(3000)
import { Elysia, t } from 'elysia'
import { swagger } from '@elysiajs/swagger'
import { users, feed } from './controllers'

new Elysia()
    .use(swagger())
    .use(users)
    .use(feed)
    .listen(3000)

OpenAPI / Swagger

Elysia generates OpenAPI 3.0 specs automatically to integrate with various tools across multiple languages

Thanks to OpenAPI compliance, Elysia can generate Swagger in one line with the Swagger plugin.

End–to-End Type Safety

Synchronize types across all applications.
Move fast and break nothing like tRPC.

See how it works
ts
// server.ts
import { Elysia, t } from 'elysia'

const app = new Elysia()
    .patch(
        '/user/age',
        ({ body }) => signIn(body), 
        {
            body: t.Object({
                name: t.String(),
                age: t.Number()
            })
        }
    )
    .listen(80)
    
export type App = typeof app
// server.ts
import { Elysia, t } from 'elysia'

const app = new Elysia()
    .patch(
        '/user/age',
        ({ body }) => signIn(body), 
        {
            body: t.Object({
                name: t.String(),
                age: t.Number()
            })
        }
    )
    .listen(80)
    
export type App = typeof app
ts
// client.ts
import { edenTreaty } from '@elysiajs/eden'
import type { App } from 'server'
    
const eden = edenTreaty<App>('http://localhost')

await eden.user.age.patch({
    name: 'saltyaom',
    age: '21'
})
// client.ts
import { edenTreaty } from '@elysiajs/eden'
import type { App } from 'server'
    
const eden = edenTreaty<App>('http://localhost')

await eden.user.age.patch({
    name: 'saltyaom',
    age: '21'
})

Type 'string' is not assignable to type 'number'

Try it out

Being WinterCG compliant, Elysia can run in your browser!
Edit the code and see live update immediately.

Can't find what you're looking for?

Join the community

Elysia is one of the biggest communities for Bun first web frameworks.

You can ask your questions / propose a new feature / file a bug with our community and mainters.

Made possible by you

Elysia is not backed by any organization
Made possible by the support of the community and you


Elysia Feature Sheet

Start in minutes

Scaffold your project, and run server in no time

bun create elysia app

Built with 💖 dear

```