Our Principle
Design for Humans
Our goal is to design an ergonomic, sensible, and productive framework that even beginners can use easily
Designed to avoid unnecessary complexity and type complexity for you to focus on building
A framework that feels just like JavaScript
import { Elysia, file } from 'elysia'
new Elysia()
.get('/', 'Hello World')
.get('/image', file('mika.webp'))
.get('/stream', function* () {
yield 'Hello'
yield 'World'
})
.ws('/realtime', {
message(ws, message) {
ws.send('got:' + message)
}
})
.listen(3000)
The Next Level of Type Safety
Your own documentation in 1 line
It's not magic
With deep integration with OpenAPI schema
Elysia can generate API documentation for out of the box

import { Elysia } from 'elysia'
import openapi from '@elysiajs/openapi'
new Elysia()
.use(openapi())
.use(character)
.use(auth)
.listen(3000)
11.88ms
POST /character/:id/chat
Playback
For DevOps
OpenTelemetry
Elysia has 1st party support for OpenTelemetry. Instrumentation is built-in, so you can easily monitor your services on regardless of the platform.
import { treaty } from '@elysiajs/eden'
import type { App } from './server'
const api = treaty<App>('api.elysiajs.com')
const { data } = await api.profile.patch({
age: 21
})
For Frontend
End-to-end Type Safety
Like tRPC, Elysia provides type-safety from the backend to the frontend without code generation. The interaction between frontend and backend is both type-checked on compile and runtime.
21x
faster than Express
6x
faster than Fastify
Elysia Bun
2,454,631 reqs/sGin Go
676,019
Spring Java
506,087
Fastify Node
415,600
Express Node
113,117
Nest Node
105,064
Measured in requests/second. Result from TechEmpower Benchmark Round 22 (2023-10-17) in PlainText
Test with Confidence
Type safe with auto-completion
Elysia provides a type-safe layer to interact with and test your server, from routes to parameters.
With auto-completion, you can easily write tests for the server without any hassle.
import { treaty } from '@elysiajs/eden'
import { app } from './index'
import { test, expect } from 'bun:test'
const server = treaty(app)
test('should handle duplicated user', async () => {
const { error } = await server.user.put({ username: 'mika',
})
expect(error?.value).toEqual({
success: false,
message: 'Username already taken'
})
})
To summarize
Only the best
for the bold
For builders, inventors, and visionaries
We spent years studying the strengths and weaknesses of JavaScript frameworks, all to deliver an exceptional experience
At the speed of light
Up to 21x faster than Express
Supercharged by Bun,
Elysia is one of top performing JavaScript frameworks
Maximum Type Safety
Dynamic type safety
Built from type to runtime
Elysia learns from your codebase, adapts, and enforces your types
Productive in a reach
The best experience of today
Ergonomically designed for humans, prioritizing DX. No technical nonsense