Skip to content

Elm, compiled for today's browser.

Same language, same types, same error messages. The output is modern JavaScript, and the view updates without a virtual DOM.
1.18on js-framework-benchmark, next to Solid and Svelte. Elm scores 1.52.
0 lineschanged in the upstream Elm TodoMVC to build it with dartea.
No VDOMThe view compiles to a DOM template. Only changed values are written.
npm iOne install, macOS and Linux. Packages come from npm too.

The Elm you know

Same syntax, same type system, same friendly errors, same Html library. The upstream TodoMVC compiles without a single change.

No virtual DOM

The compiler sees the shape of every view. The static part becomes a template that is cloned once. Only the values in the holes are checked and written.

JavaScript as people write it now

ES modules, const and arrow functions, async/await. Http is fetch, a Task gets an AbortSignal.

Dead code is gone

Code nobody calls is removed across all modules, packages included. You ship what your program uses.

The counter init writes, and the code dartea makes from its view. This is real compiler output. Only the list of hole paths is shortened.

view : Int -> Html Msg
view model =
div []
[ button [ onClick Decrement ] [ text "-" ]
, text (String.fromInt model)
, button [ onClick Increment ] [ text "+" ]
]

The div and both buttons are built once. On every update the runtime asks one question, is model the same value as last time?, and touches the text node only when it is not. Elm values never change in place, so that question is a single reference check.

Weighted geometric mean of slowdowns on js-framework-benchmark, keyed. Lower is better.

vanilla
1.00
Solid
1.12
Svelte
1.12
dartea
1.18
Elm
1.52
React
1.58
Official runner, official implementations of the other frameworks. Apple M5, headless Chrome, August 30, 2026. One machine, not the published table. Details.
  1. Add the compiler to a project.

    Terminal window
    npm install --save-dev @dartea/cli
  2. Start one.

    Terminal window
    npx dartea init
  3. Build a page and open it.

    Terminal window
    npx dartea make src/Main.elm --output index.html