[![](https://github.com/mojolicious/mojo/workflows/linux/badge.svg)](https://github.com/mojolicious/mojo/actions) [![](https://github.com/mojolicious/mojo/workflows/macos/badge.svg)](https://github.com/mojolicious/mojo/actions) [![](https://github.com/mojolicious/mojo/workflows/windows/badge.svg)](https://github.com/mojolicious/mojo/actions)
Mojolicious is a fresh take on **Perl** web development, based on years of experience developing the Catalyst
framework, and utilizing the latest web standards and technologies. You can get started with your project quickly,
with a framework that grows with your needs.
The Mojo stack provides a consistent set of components that can be used in any project. The guides cover most aspects
of using the framework and the components have comprehensive reference documentation. Mojolicious is a real-time web
framework, which allows a new class of web applications using WebSockets and having long-running requests without
blocking.
Join us now, and be a part of a friendly and knowledgeable community of developers!
## Features
* Most [popular](https://metacpan.org/favorite/leaderboard) distribution on **CPAN**.
* An amazing **real-time web framework**, allowing you to easily grow single file prototypes into well-structured MVC
web applications.
* Everything you need to build cloud-native web applications for state of the art container environments.
* Powerful out of the box with RESTful routes, plugins, commands, Perl-ish templates, content negotiation, session
management, form validation, testing framework, static file server, CGI/[PSGI](http://plackperl.org) 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.
* Full stack HTTP and WebSocket client/server implementation with IPv6, TLS, SNI, IDNA, HTTP/SOCKS5 proxy, UNIX
domain socket, Comet (long polling), Promises/A+, async/await, keep-alive, connection pooling, timeout, cookie,
multipart, and gzip compression support.
* Built-in non-blocking I/O web server, supporting multiple event loops as well as optional pre-forking and hot
deployment, perfect for building highly scalable web services.
* JSON and HTML/XML parser with CSS selector support.
* Very clean, portable and object-oriented pure-Perl API with no hidden magic and no requirements besides Perl 5.26.0
(versions as old as 5.16.0 can be used too, but may require additional CPAN modules to be installed)
* Also available for [JavaScript](https://mojojs.org).
* Fresh code based upon years of experience developing [Catalyst](http://catalyst.perl.org), free and open source.
* Hundreds of 3rd party [extensions](https://metacpan.org/requires/distribution/Mojolicious) and high quality spin-off
projects like the [Minion](https://metacpan.org/pod/Minion) job queue.
## Installation
All you need is a one-liner, it takes less than a minute.
$ curl -L https://cpanmin.us | perl - -M https://cpan.metacpan.org -n Mojolicious
We recommend the use of a [Perlbrew](http://perlbrew.pl) environment.
## Getting Started
These three lines are a whole web application.
```perl
use Mojolicious::Lite;
get '/' => {text => 'I ♥ Mojolicious!'};
app->start;
```
To run the example with the built-in development web server, just put the code into a file and start it with `morbo`.
$ morbo hello.pl
Web application available at http://127.0.0.1:3000
Test it with any HTTP client you prefer.
$ curl http://127.0.0.1:3000/
I ♥ Mojolicious!
## Duct tape for the HTML5 web
Use all the latest Perl and HTML features in beautiful single file prototypes like this one, and
[grow](https://docs.mojolicious.org/Mojolicious/Guides/Growing#Differences) them easily into well-structured
**Model-View-Controller** web applications.
```perl
use Mojolicious::Lite -signatures;
# Render template "index.html.ep" from the DATA section
get '/' => sub ($c) {
$c->render(template => 'index');
};
# WebSocket service used by the template to extract the title from a website
websocket '/title' => sub ($c) {
$c->on(message => sub ($c, $msg) {
my $title = $c->ua->get($msg)->result->dom->at('title')->text;
$c->send($title);
});
};
app->start;
__DATA__
@@ index.html.ep
% my $url = url_for 'title';
```
## Want to know more?
Take a look at our excellent [documentation](https://docs.mojolicious.org)!