There's JavaScript in my framework!

mojo.js is a fresh take on JavaScript web development, based on decades of experience developing the Mojolicious and Catalyst frameworks, and utilizing the latest web standards and technologies. Providing performance and stability for mission critical web applications you can count on, today and in ten years from now.

Join us, and be a part of a friendly and knowledgeable community of developers!


  • 3x faster than Express.js.
  • A real-time web framework, allowing you to easily grow single file prototypes into well-structured MVC web applications.
    • Powerful out of the box with RESTful routes, WebSockets, plugins, commands, logging, templates, content negotiation, session management, form and JSON validation, testing framework, static file server, cluster mode, CGI detection, first class Unicode support and much more for you to discover.
  • A powerful web development toolkit, that you can use for all kinds of applications, independently of the web framework.
    • High performance HTTP and WebSocket client/server implementation with support for HTTPS/WSS, cookies, redirects, urlencoded/multi-part forms, file uploads, JSON/YAML, HTML/XML, mocking, API testing, HTTP/SOCKS proxies, and gzip compression.
    • HTML/XML parser with CSS selector support.
  • No frontend framework, mojo.js is for the backend.
  • Written in TypeScript, with very clean class and async/await based APIs.
  • Very few dependencies, to avoid supply chain attacks and allow for "Perl-grade" long term support.
  • Fresh code based upon decades of experience developing Mojolicious and Catalyst, free and open source.


All you need is Node.js 16.0.0 (or newer).

$ npm install @mojojs/core

Getting Started

These four lines are a whole web application.

import mojo from '@mojojs/core';

const app = mojo();

app.get('/', ctx => ctx.render({text: 'I ♥ Mojo!'}));


Use the built-in command system to start your web server.

$ node index.mjs server
[77264] Web application available at

Test it with any HTTP client you prefer.

$ curl
I ♥ Mojo!

Duct Tape for the Web

Use all the latest Node.js and HTML features in convenient single file prototypes like this one, and grow them easily into well-structured Model-View-Controller web applications.

import mojo from '@mojojs/core';

const app = mojo();

app.get('/', async ctx => {
  await ctx.render({inline: inlineTemplate});

app.websocket('/title', ctx => {
  ctx.plain(async ws => {
    for await (const url of ws) {
      const res   = await;
      const html  = await res.html();
      const title ='title').text();
      await ws.send(title);


const inlineTemplate = `
  const ws = new WebSocket('<%= ctx.urlFor('title') %>');
  ws.onmessage = event => { document.body.innerHTML += };
  ws.onopen    = event => { ws.send('') };

Want to know more?

Take a look at our excellent documentation!