Skip to main content

ZeltJS

Portable application framework with DI — swap adapters for different runtimes

Simple, Intuitive API

const UserSchema = v.object({
  name: v.string(),
  email: v.pipe(v.string(), v.email()),
});

@Controller('/users')
class UserController {
  @Get('/')
  list() {
    return { users: db.users.findMany() };
  }

  @Get('/:id')
  findOne(req = request()) {
    const id = req.pathParam('id');
    return { user: db.users.find(id) };
  }

  @Post('/')
  async create(req = request(UserSchema)) {
    const data = await req.body();
    return { user: db.users.create(data) };
  }
}

const app = createApp([http({ controllers: [UserController] })]);

// Node.js
const node = await onNode(app);
node.http.listen(3000);

// Cloudflare Workers
const workers = await onCloudflareWorkers(app);
export default { fetch: workers.fetch };

// Lambda
const lambda = await onLambda(app);
export const handler = lambda.handler;

Why Zelt?

Run Anywhere

Node, Bun, Workers, Lambda — portable across runtimes.

DI Built-in

First-class dependency injection, type-safe.

Fast Startup

Minimal wake-up time, serverless-ready.

Future-proof Decorators

TC39 & reflect-metadata dual support.

Test-friendly

DI-based testing, easy mock injection, Testcontainers integration.

Minimal Size

Tree-shakable, loads only what you need — no unused dependencies.

Benchmark

Performance comparison with popular TypeScript frameworks

Requests/sec

Higher is better

Cold Start (ms)

Lower is better

Get Started in Seconds

npm install @zeltjs/core
Read the Documentation →