Adds static typing to JavaScript to improve developer productivity and code quality.
OCaml JavaScript C Shell CSS HTML Other
Latest commit 9ae5f03 Aug 17, 2017 @mroch mroch committed with facebook-github-bot [PR] Fix endless loop when running tests
`` wrote its log file into the test directory. dfind is watching the test directory, and wakes up flow every time //any// file changes, even if it is then ignored by flow. every time flow wakes up, it sends any updates to its persistent connections and, critically, logs that it is doing so. this log change is picked up by dfind, making flow wake up and log, and on and on and on.

this changes to writing the log to the parent directory, which is also a temp dir created and cleaned up by the test runner.
Closes #4636

Differential Revision: D5653835

Pulled By: mroch

fbshipit-source-id: 78a2b7c7797325dc31ad6bb0ff95df5fa4abb255
Failed to load latest commit information.
.github [PR] Jun 7, 2017
examples [flow docs] Main page, "Getting Started", & "Five Simple Examples" re… Mar 5, 2016
flow-typed ./tool test --watch Jul 22, 2016
hack [Hack] Help `` survive sigalrm Aug 16, 2017
js [Hack] Update Timeout.Alarm_timeout to use Timer Jul 18, 2017
lib Update SyntheticEvents Aug 17, 2017
newtests Add strict typing for React children Aug 17, 2017
npm-flow-lib Small improvements to `./tool cherry-pick` Apr 28, 2017
packages/flow-upgrade Publish workflow for flow-upgrade Aug 14, 2017
resources [PR] [travis] build with Trusty Aug 16, 2017
scripts [PR] script to serve the website Aug 17, 2017
src v0.53.0 Aug 17, 2017
testgen function mutation Aug 4, 2017
tests v0.53.0 Aug 17, 2017
tsrc Fix add-comments for adding JSX suppressions. Aug 16, 2017
website [PR] Add new libdef to the tryflow list of libdefs Aug 17, 2017
.flowconfig Ignore ./packages in root .flowconfig Aug 9, 2017
.gitattributes [PR] Mark "tests/malformed_code/text.js" as binary Apr 27, 2017
.gitignore [parser] add script to test flow against esprima3 tests Oct 18, 2016
.merlin Replace ocamllex with sedlex, mostly support unicode Apr 6, 2017
.travis.yml [PR] [travis] build with Trusty Aug 16, 2017
00_config.ocp Update build system and some fixes on the test-suite on Windows Dec 17, 2015 Add contributing rules Apr 24, 2015 v0.53.0 Aug 17, 2017
LICENSE Updated all copyright license headers Feb 8, 2016
Makefile [Hack] Build_mode module to expose if this is a dev build or not Aug 10, 2017
PATENTS Sync changes to upstream Apr 16, 2015 Remove libelf dependency May 27, 2017
_tags fix deprecation warnings Jun 4, 2017
appveyor.yml [PR] Another try to get Appveyor to publish binary May 25, 2017
ocp_build_flow.ocp.fb Fix license headers Aug 15, 2017
ocp_build_hack.ocp.fb Fix license headers Aug 15, 2017
opam v0.53.0 Aug 17, 2017
package.json Small improvements to `./tool cherry-pick` Apr 28, 2017 [PR] Fix endless loop when running tests Aug 17, 2017
tool ./tool babel Sep 1, 2016
yarn.lock Fix yarn.lock in the hopes of fixing appveyor Apr 30, 2017

Flow Build Status Windows Build Status

Flow is a static typechecker for JavaScript. To find out more about Flow, check out

For a background on the project, please read this overview.


Flow works with:

  • Mac OS X
  • Linux (64-bit)
  • Windows (64-bit)

There are binary distributions for each of these platforms and you can also build it from source on any of them as well.

Installing Flow

Flow is simple to install: all you need is the flow binary on your PATH and you're good to go.

Installing Flow Per Project

The recommended way to install Flow is via the flow-bin npm package. Adding flow-bin to your project's package.json:

  • provides a smoother upgrade experience, since the correct version of Flow is automatically used based on the revision you check out
  • installs Flow as part of your existing npm install workflow
  • lets you use different versions of Flow on different projects
npm install --save-dev flow-bin

Installing Flow Globally

Although not recommended, you can also install Flow globally (for example, perhaps you don't use npm or package.json).

The best way to install globally is via flow-bin:

npm install -g flow-bin
flow # make sure `npm bin -g` is on your path

On Mac OS X, you can install Flow via the Homebrew package manager:

brew update
brew install flow

You can also build and install Flow via the OCaml OPAM package manager. Since Flow has some non-OCaml dependencies, you need to use the depext package like so:

opam install depext
opam depext --install flowtype

If you don't have a new enough version of OCaml to compile Flow, you can also use OPAM to bootstrap a modern version. Install OPAM via the binary packages for your operating system and run:

opam init --comp=4.03.0
opam install flowtype
eval `opam config env`
flow --help

Getting started

Getting started with flow is super easy.

  • Initialize Flow by running the following command in the root of your project
flow init
  • Add the following to the top of all the files you want to typecheck
/* @flow */
  • Run and see the magic happen
flow check

More thorough documentation and many examples can be found at

Building Flow

Flow is written in OCaml (OCaml 4.03.0 or higher is required). You can install OCaml on Mac OS X and Linux by following the instructions at

For example, on Ubuntu 16.04 and similar systems:

sudo apt-get install opam
opam init --comp 4.03.0

On OS X, using the brew package manager:

brew install opam
opam init --comp 4.03.0

Then, restart your shell and install these additional libraries:

opam update
opam install -y ocamlfind sedlex

Once you have these dependencies, building Flow just requires running


This produces a bin folder containing the flow binary.

In order to make the flow.js file, you first need to install js_of_ocaml:

opam install -y js_of_ocaml

After that, making flow.js is easy:

make js

The new flow.js file will also live in the bin folder.

Note: at this time, the OCaml dependency prevents us from adding Flow to npm. Try flow-bin if you need a npm binary wrapper.

Flow can also compile its parser to JavaScript. Read how here.

Building Flow on Windows

This is a little more complicated. Here is a process that works, though it probably can be simplified.

The general idea is that we build in Cygwin, targeting mingw. This gives us a binary that works even outside of Cygwin.

Install Cygwin

  1. Install Cygwin 64bit from
  2. In powershell, run iex ((new-object net.webclient).DownloadString("")) which will likely run a cygwin setup installer with a bunch of cygwin packages and stuff. This helps make sure that every package that opam needs is available.

Install Opam

  1. Open the cygwin64 terminal
  2. Download opam with curl -fsSL -o opam64.tar.xz
  3. tar -xf opam64.tar.xz
  4. cd opam64.tar.xz
  5. Install opam ./
  6. Initialize opam to point to a mingw fork: opam init -a default "" --comp "4.03.0+mingw64c" --switch "4.03.0+mingw64c"
  7. Make sure opam stuff is in your path: eval `opam config env`

Install Flow

  1. Clone flow: git clone
  2. cd flow
  3. Tell opam to use this directory as the flowtype project: opam pin add flowtype . -n
  4. Install system dependencies opam depext -u flowtype
  5. Install Flow's dependencies opam install flowtype --deps-only
  6. We need these too: opam install camlp4 ocp-build
  7. Finally, build Flow: make all-ocp

Using Flow's parser from JavaScript

While Flow is written in OCaml, its parser is available as a compiled-to-JavaScript module published to npm, named flow-parser. Most end users of Flow will not need to use this parser directly (and should install flow-bin from npm above), but JavaScript packages which make use of parsing Flow-typed JavaScript can use this to generate Flow's syntax tree with annotated types attached.

Running the tests

To run the tests, first compile flow using make. Then run bash ./ bin/flow

There is a make test target that compiles and runs tests.

To run a subset of the tests you can pass a second argument to the file.

For example: bash bin/flow class | grep -v 'SKIP'

Join the Flow community


Flow is BSD-licensed. We also provide an additional patent grant.