Angel 2 is out now! Brings Dart 2 support, GraphQL support, and more. Read more .

A polished, production-ready backend framework in Dart.

Get Started Video Tutorials

Install it right away:
# Install the Angel CLI, and scaffold a project.
$ pub global activate angel_cli
$ angel init hello
Ready for showtime.
With features like hot reloading , GraphQL, and ORM, Angel is the perfect Dart backend to power production apps.

Angel also provides support for server-side templating, WebSockets, authentication, and much, much more.
See Angel in production...
import 'package:angel_framework/angel_framework.dart';
import 'package:angel_framework/http.dart';

main() async {
  var app = Angel(), http = AngelHttp();
    ..get('/', (req, res) => res.writeln('Hello, Angel!'));
    ..fallback((req, res) => throw AngelHttpException.notFound());
  await http.startServer('', 3000);
  print('Listening at ${http.uri}');
class AccountsController extends Controller {
  // Auto-injected by Angel
  final QueryExecutor executor;


  renderProfile(String username, ResponseContext res) async {
    var query = UserQuery()..where.username.equals(username);
    var user = await query.getOne(executor);
    await res.render('profile', {'user': user});
Batteries included.
With over 3 dozen official extension packages and counting, and the flexibility to easily add functionality, Angel has all the tools you need to build an application of any size.
Angel is designed with extensibility in mind, so even when you need a feature that's not officially supported, you can easily implement it yourself.
View all packages...
It just works.
Angel is stable, and won't unexpectedly break you. What's more, components like ORM and serialization are designed from the ground-up to work together, seamlessly.

And thanks to its unit testing support, you can ensure that your product works as expected, before hitting production. Spend less time worrying about unforeseen bugs, and more time getting your product to market.
Learn about testing...
void main() {
  TestClient client;

  setUp(() async {
      var app = Angel();
      await app.configure(myApp.configureServer);
      client = await connectTo(app);

  tearDown(() => client.close());

  test('cannot view secret content', () async {
      var response = await client.get('/secret');
      expect(response, hasStatus(403));