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