Build TypeScript backends and SDKs with up to less code. Faster, cheaper & easier to maintain.
// Auth, ACL, Validation, Sanitation,
// ORM & more out of the box
app.addEndpoint({
path: '/car',
method: 'POST',
inputSchema: sCar,
outputSchema: Schema.withInstance(sCar),
isLoggedIn: true,
run: async (system, input) => {
return system.models.car.create(input);
}
});
Generates
// Talk to API using generated async
// functions (100% type-safe)
const newCar = await createCar({
isLeased: false,
registrationNumber: 'ABC123'
});
console.log(newCar.id);
With JS20 you can eliminate boilerplate code and focus on business logic. This means faster development, less testing and easier maintenance.
code reduction
JS20 offers a solid framework that takes care of most of the heavy-lifting when building a backend app, designed to scale from prototype to millions of users. Start building your next app now.
Focus more on specifying what you need, less on how to implement it. This paves the way for automations & code generation.
Built-in authentication, authorization, validation & security. Deploy with confidence from day one.
JS20 is strict & rigid, but still offers full flexibility. Replace & modify any component. Use your own database, auth, or validation. Run on any cloud or web server.
Schema-driven validation, sanitation, and conversion with type-safe APIs that prevent injection and data corruption.
Define backend endpoints once to get versioned, typed frontend APIs automatically—no client code or docs required.
Writing less code makes it easier for AI to build your backend, cutting token costs and boosting quality.
Modular, high-level code with minimal boilerplate is optimal for generative AI to interpret and build upon. Less code leads to higher quality, lower costs, and greater efficiency.
Achieve greater readability through repeatable, validated chained actions that streamline business logic. With step-by-step validation, you can build critical systems with confidence.
async function transferCarOwnership({ run }, input) {
const taxDebt = await run(getTaxes, input);
await run(verifyNoUnpaidTaxes, taxDebt);
const oldOwner = await run(getOwner, input);
await run(verifyTransferApproved, { ...input, oldOwner });
const updated = await run(updateOwner, input);
return await run(getTransferCertificate, updated);
}
Because of JS20 ability to specify code, we can easily generate docs & versioned SDK for your frontend integration. No need to keep client SDK in sync with backend changes - generate it
// Generate frontend SDK
await app.generate(options);
Use app.generate() to automatically create an SDK based on your schemas, models & endpoints.