Why Denali?

Choosing a framework is tricky business. Let's run through what makes Denali unique, and when it might be a good choice for you.

Developer Experience

Features that make Denali a joy to build with.

Write in any language

Want to use Typescript, Flow, or something more exotic? Denali apps can be written in any language that compiles down to JavaScript. It's just an addon install away.

Browse language addons

Extensive documentation

Denali is thoroughly documented, and Denali addons generate automatic API documentation out of the box, making good docs for community libraries a trivial effort.

Start with the Quickstart

Powerful CLI

The Denali CLI will automatically watch your source files and rebuild on changes in development (for addons too!). It also supports in debug mode, even for running production servers!

Learn more about the CLI

Extensibility

Leverage the experience of the community to move faster and build better apps.

ORM Agnostic

Don't tie yourself down to a single "blessed" ORM or database. Denali understands that modern apps are often data polyglots, and lets you choose the right tool for the job.

Explore ORM addons

Addons

Like mini, self-contained apps, addons let you leverage a growing ecosystem of community solutions, freeing you to focus on building what matters: your app.

Browse addons

Express Middleware

Drop in support for Express middleware lets you get all the benefits of Denali, while tapping into the massive Express ecosystem when you need it.

Learn about middleware

Testing

Testing is a first-class citizen in Denali, with powerful tools that make writing & maintaining tests easy.

Acceptance Testing

Built in testing primitives let you simulate requests to your app end-to-end with ease. And support for snapshot testing makes getting good coverage even easier.

Learn about acceptance testing

Unit Testing

Easily inject mocks and stubs with Denali's unit test primitives, while precisely dialing in the level of isolation needed. Start off leaning on your app code, then gradually mock those dependencies over time.

Learn about unit testing

Parallel & Isolated Tests

Automatically parallelized tests with process level isolation help you maintain a tight testing feedback loop and clean, leak free tests.

Learn about testing

Parsing & Rendering

Move data in and out of your app with ease. Drop in support for standards like JSON-API, or go fully custom.

Serializers

Serializers give you fine grained control over your API responses, as well as help protect sensitive data from leaking.

Get started with Serializers

JSON-API 1.0 Support

Denali ships out of the box with a standard JSONSerializer for a simple response format, as well as a JSON-API 1.0 compliant Serializer.

Customize the JSONAPISerializer

Parsers

The twin sibling to Serializers, Parsers give you the ability precisely control how incoming requests are translated into something your Actions can use.

Get started with Parsers

Community

Feel welcome, get help, and contribute back. At the end of the day, it's all about the people

Get help on Slack

Come hang out on our community Slack. Get help starting with Denali, provide feedback on the roadmap, learn best practices, and contribute back!

Join the conversation

Core contributor office hours

Each week, core contributors graciously spend time in office hours. Got a particularly tough problem to crack, or looking to understand the best way to handle something in Denali? Stop by and ask!

Schedule a time

Be treated with respect

Our core community tenet is: "Treat everyone with respect." Feel welcome from day one, and don't hesitate to ask for help!

Get involved

Coming Soon

We're constantly working to ship new features and improvements. Here's a sneak peek of what's on our radar.

HTTPS Support

No more fighting SSL certificates: easily run your development server with HTTPS locally thanks to devcert, and in production with LetsEncrypt support baked in.

Check out the roadmap

Websockets

Leverage Node's powerful evented model to handle Websockets with ease. Built in primitives for soft-realtime socket communication make modern apps a breeze.

Check out the roadmap

Advanced Testing

Use built in primitives for discovering performance regressions, diagnosing memory leaks, and load testing.

Check out the roadmap

Framework Comparison

See how Denali stacks up against other popular frameworks, and the pros/cons for each.

Ruby on Rails (Ruby)

Rails and Denali have very similar approachs and philosophy (though not exactly the same). Most of the difference here comes down to maturity vs. runtime. The biggest advantage by far for Rails is the size of it's ecosystem, while Denali's is the Node runtime.

Advantages for Denali
  • Write your app in JavaScript - a single language throughout your stack
  • Node's evented model, and JavaScript's async nature, are much better suited to handling the concurrency of modern web applications
Advantages for Rails
  • Rails is a vastly larger ecosystem, with lots of mature solutions, help, and talent

The Denali Doctrine

The Rails Doctrine describes how technological advantages erode over time. Today's features are important, but Denali's vision for tomorrow is just as much so. With that in mind, here's a few philosophical points that help guide our direction, partially inspired by that same article. Expect these to evolve over time.

  1. Optimize for developer productivity

    Using Denali is a user experience - and we should treat it as such. We should be continually asking ourselves: what can Denali do to help developers work faster, smarter, happier?

    A great user experience is one that feels effortless. It anticpates failure scenarios and handles them gracefully. It leaves the user with a clear picture of "what's next", of how to solve the problem, and how to accomplish their goals. With each aspect of Denali, try to keep this at the heart.

  2. Find the right abstractions

    Denali is a framework for leveraging shared solutions to shared problems. The way to leverage shared solutions is to find the right abstractions. The right abstraction exposes just the right levers in just the right places; too many levers, and you haven't fully captured the <em>shared</em> aspect of the solution. Too few, and you've over-simplified the problem.

    Put differently, a good abstraction minimizes accidental complexity while maximizing control over essential complexity. It provides a simple approach to solving the common use cases, while exposing more power to those that need it.

    Finding the right abstraction is hard; inventing it from whole cloth is even harder. Instead, Denali tries to leverage it's core/userland model (see #3) to allow for experimentation to <em>discover</em> the best abstractions through real world application, without subjecting users to too much API churn.

  3. Stability without stagnation

    Denali aims to foster a stable core, while encouraging progress, experimentation, and innovation through "userland" addons.

    We often talk about “core” versus “userland”, terms inspired by language used to describe an operating system kernel. “Core” (or, "kernel" in OS-talk) is a minimal set of highly trusted, rock solid code that exposes basic primitives (the right abstractions - see #2). “Userland”, meanwhile, refers to Denali apps and addons, which are less bound by the strict stability guarantees of core. This reduce stability guarantee in turn allows for greater experimentation.

    By allowing userland code to experiment and move quickly, we can uncover the right abstractions, even occasionally adopting them back into core, without excessive API churn.

  4. Follow the 80/18 rule

    Denali attempts to solve 80% of use cases well. We should plan features and interfaces with this group in mind, and aim make their experience delightful.

    For most of the remaining 20% (the “18%”), we make sure to provide “escape hatches”. These use cases might not be the principal ones we design around, but they should be possible to accomplish without feeling like you are fighting the framework.

    We purposefully leave out the remaining small fraction of use cases (the “2%”). This is an admission that we’re never going to solve every use case, nor should we. There are other choices out there besides Denali that are likely better suited.

  5. Marketing matters

    Most of us would like to think that technology adoption is a purely rational, well thought out process of weighing tradeoffs and picking the best technical solution. Unfortunately, that’s usually not reality.

    This can be frustrating: vanity metrics and microbenchmarks often don't measure realistic metrics, and most users would never come close to those limits in any case. It's tempting to dismiss such discussion as "unimportant", and instead focus on a "purer" implementation of Denali.

    We reject this approach. Perception and marketing matter, to some extent. To phrase it more concretely: Denali will probably never be the fastest web framework out there by any microbenchmark standard. But we at least want to show up on the same graph.

  6. Respect

    The Internet is a challenging place to foster great culture, so we have to be intentional about it. A great culture can help a project like Denali blossom and thrive - and a caustic one will kill it off before it can even germinate.

    The cardinal rule for participating in Denali's community is: treat everyone with respect. Behavior to the contrary is not welcome here.

    We aim to treat everyone with respect, to always remember the human on the other side of the keyboard, to start with the assumption of good faith motivation, and the always argue the best intepretation.

Many of these ideas borrow heavily from the philosophies of other great frameworks, especially Rails and Ember. We readily admit that we stand on the shoulders of those giants.