Embla on GitHub

Easy-to-use server side framework for Dart

Nothing complicated.

get embla => [

Instead of a "main" function, Embla requires an "embla" getter in the script, that returns a list of Bootstrappers.

  new HttpBootstrapper(

Bootstrappers are plugins to the application. Out of the box, Embla comes with an HTTP specific one.

    pipeline: pipe(

The HTTP bootstrapper has a "pipeline" parameter, representing the HTTP pipeline.

      // Middleware

This middleware redirects all requests that have a trailing slash (like /about/) to the corresponding url without the slash (/about).


This middleware logs all requests to the terminal along with some statistics and a timestamp.


This middleware handles all errors thrown in the route handlers or subsequent middleware. You can also add handlers for specific types of exceptions, like HttpNotFoundException.


This middleware parses the body of the requests and saves it to an "Input" object, which can then be injected in the route handlers, by the Dependency Injection system.

      // Routes

A route is a middleware that creates a fork in the pipeline. All requests that start with "/auth" now flows through this new pipeline. Only if it doesn't find any matching handler within, it will be passed on the the "Hello, world!" handler below.


Controllers, just like routes, are middleware too. They contain collections of routes, which they map to methods with special annotations.

Since this "AuthController" is routed to the "auth/*" namespace, all controller routes will be relative to that prefix.


      Route.get('about', () => 'About page!'),

Routes can specify the method it requires. This one only matches GET requests.

Routes that doesn't end with an asterisk requires the URL to match exactly. Requests to the URL "about/something-else" would fall through to the "Hello, world!" handler.

      // Fallback handler
      () => 'Hello, world!'

A simple pipeline containing a single handler that will respond to every request—Hello world!
All requests that don't get a response from middleware above this line will fall through to this handler.

Add some middleware
Add some middleware
Add some routes
Add some routes
Get started!