1. Overview
  2. Docs
Toolchain to produce JS from Reason/OCaml







Melange compiles OCaml / Reason to JavaScript

Powered by the versatile OCaml type system, with best-in-class type inference,
Melange produces robust JavaScript code.


Melange is released to OPAM. You can obtain it in multiple ways:


$ opam install mel

provides a GitHub
template repository
that can be used as a project starter.

Note: mel build builds a Melange project. Before running the resulting
JavaScript, the Melange runtime library needs to be present in node_modules
so that it can be found by JavaScript based tooling:

ln -sfn $(opam var prefix)/lib/melange/runtime node_modules/melange
Manual setup

After installing Melange, you should now be able to run mel from your switch:

$ opam exec -- mel --help


Get Esy on NPM:

  • npm install -g esy installs Esy globally

  • if npm is installed, npx esy can be used to run Esy locally

An Esy project starter
also exists to get started quickly with Esy.

Once the repository has been cloned, run esy in the project root.


Melange has good support for Nix:

  • nix run github:melange-re/melange#mel -- --help runs melange.

  • nix shell github:melange-re/melange#mel -c $SHELL enters a shell with mel
    and melc in $PATH. Try out mel --help for available options.

  • github:melange-re/melange can be added as a
    flake input

OCaml version compatibility

The current Melange distribution targets OCaml 4.14. There's an
old version of Melange based on OCaml 4.12
that requires
version 4.12.0+mel
of melange-compiler-libs.

Editor integration

  • Until Melange has first-class support in Dune, editor integration is based on
    a .merlin file workflow.

    • Melange generates .merlin files automatically as part of the build

  • ocaml-lsp based Language Server Protocol support needs to be configured as


Install ocaml-lsp and dot-merlin-reader:

$ opam install ocaml-lsp dot-merlin-reader


Add the following to esy.json:

// esy.json
  "devDependencies": {
    "@opam/ocaml-lsp-server": ">= 1.12.0",
    "@opam/dot-merlin-reader": "*"

Pass --fallback-read-dot-merlin to ocaml-lsp

ocaml-lsp requires the --fallback-read-dot-merlin flag to look for
.merlin files.

  • Install the VSCode OCaml

  • Select the "Custom" sandbox option and provide the flag to ocaml-lsp via
    the following command template:

// .vscode/settings.json
  "ocaml.sandbox": {
    "kind": "custom",
    "template": "esy $prog $args --fallback-read-dot-merlin"



How does this project relate to other tools?

This project is forked from the
ReScript compiler,
focused on a deeper integration with the OCaml ecosystem. This allows sharing
code between backend and frontend using Dune's virtual libraries.

Melange also introduces a ReScript compatibility layer to maintain compatibility
with ReScript syntax - preserving access to ReScript's package ecosystem.

A small write-up with more details on the motivation behind this project can be
found in the announcement
blog post.

Below is a quick comparison between Melange and other tools:

Name Purpose Dependencies Notes
Esy Package manager Installed with NPM Obtaining dependencies such as dune or reason
OPAM Package manager None Obtaining dependencies such as dune or reason
Dune Build tool Installed with e.g. esy or opam Composable build tool for OCaml; supports composing custom rules to build any project
Reason Syntax Installed with e.g. esy or opam Alternative syntax to OCaml
Melange Compiler that emits Script Esy / OPAM (to install), Dune (to build) Supports OCaml, Reason and ReScript syntax; derived from ReScript, focused on deeper integration with OCaml
ReScript The brand around a syntax and a compiler that emits JavaScript None Distributed via NPM as prebuilt binaries; previously called BuckleScript

Can I use ReScript syntax?

Yes! ReScript syntax is supported, but ReScript won't have as many features as
the OCaml or Reason syntaxes due to ReScript being built on top of an old OCaml
version (4.06 - released in 2018).
(e.g. letop binding operators,
generalized module open expressions,
or local substitutions in signatures).




  • Thanks to the ReScript
    project, its author and maintainer @bobzhang,
    and its many
    Melange is a fork of ReScript, and continues to incorporate patches to
    ReScript on a regular basis.

  • Thanks to the OCaml team, obviously, without such a
    beautiful yet practical language, this project would not exist.

  • Thanks to Bloomberg and
    Facebook. The ReScript project began at
    Bloomberg and was published in 2016; without the support of Bloomberg, it
    would not have happened. ReScript was funded by Facebook since July 2017.

See also concerning some individual components of



See Credits for more details.