mrkeyoor.com_
Tue 01 Sept 17:40 UTC
Dev Toolsevaluationupdated 27 Aug 2026

flow review

Flow is a static type checker for JavaScript. It lets teams annotate selected files, catches type mistakes before runtime, and keeps checking changes through a background process.

+2 / 5dstars / 7d
Verdict

Our sandbox installed Flow's 126 Yarn packages in 20 seconds, but the checkout exposed no build or test target to run. Existing Flow teams should keep using the pinned checker and judge upgrades against their own code, especially around stricter releases. For a new project, TypeScript's package ecosystem is usually the easier default unless Flow's React syntax or incremental adoption model is a specific requirement.

We ran it

Lab card: what happened when we ran flowScreenshot of flow (flow.org)
Install✓ · 20s126 packages · 37 MB
Buildn/ano build script
Testsn/ano test script
Repo18817 files~1,045,799 lines of source · 67.3 MB · 1 CI workflows · tests dir

Answers from our run

Does flow build from source?

Dependencies installed in 20 seconds (126 packages), and the project has no separate build step. We cloned commit 3b35c53 into a clean Debian container with 3 CPUs and no project-specific setup.

Does flow have tests you can run?

Not through a standard command: the project exposes no test script or target that our harness could run.

Who should not use flow?

Greenfield teams whose dependencies already publish TypeScript declarations: Flow's docs say most library definitions are not bundled and instead come from flow-typed.

What are the alternatives to flow?

TypeScript, Closure Compiler. Our sandbox installed Flow's 126 Yarn packages in 20 seconds, but the checkout exposed no build or test target to run.

Setup3/520-second Yarn install, but source checks require the Rust path
Docs4/5Clear user setup and Rust build instructions, split across two sites
Community4/522,279 stars and active work, with 523 issues and PRs open
Maturity5/5A decade-old checker with current releases and platform binaries

Discussed on

  1. hnFacebook's Flow is being ported to Rust3 points
  2. hnFlow Match Statements3 points
  3. hnFlow v0.53.0 released3 points

Who it’s for

Teams maintaining an existing Flow codebase that need the current checker, parser, and editor tooling.
JavaScript projects that want to adopt static checks file by file with the @flow marker.
React teams that specifically value Flow syntax such as component and match.
Tool authors who need the separately published flow-parser package.

Who it’s NOT for

Greenfield teams whose dependencies already publish TypeScript declarations: Flow's docs say most library definitions are not bundled and instead come from flow-typed.
Contributors expecting yarn build and yarn test to exercise the checker: our checkout had neither target, while the README requires nightly Rust commands under rust_port.
Projects that cannot add a source transform: Flow annotations must be removed with Babel or flow-remove-types before ordinary JavaScript runs.
Teams using export from import attributes without a compatibility check: open issue #9346 reports that Flow's parser rejects that syntax.

Setup reality

Our sandbox installed 126 Yarn packages in 20 seconds, using 37 MB on disk. The 67.3 MB checkout contained 18,817 files and about 1,045,799 source lines. There was no build script or target and no test script or target, so both steps were skipped.

Using Flow in an application means pinning flow-bin, adding a script, running flow init, and configuring Babel or flow-remove-types to strip annotations. It needs no account, hosted service, API key, or secret for local checking. Most library definitions come from flow-typed.

The published binaries cover macOS arm64, Linux x86_64 and arm64, and Windows x86_64. Building this repository is a different path: the README requires Rust nightly inside rust_port; the optional JavaScript build also needs Emscripten 3.1.44 and a pinned nightly toolchain.

Flow checks selected JavaScript files before they run

Flow adds static checking to JavaScript without requiring an all-at-once rewrite. Put // @flow at the top of a file, annotate the places that need explicit types, and the checker analyzes that file against the rest of the typed project. A background server watches changes and makes later status checks incremental. That model still makes sense for a large JavaScript codebase where conversion must happen one directory at a time.

The current documentation describes Flow as a typed dialect with familiar features such as keyof, conditional types, mapped types, type guards, and indexed access. It also has its own React component syntax and a match construct for pattern matching. Version 0.329.0 added flow-parser and flow-eslint as replacements for the Hermes-named packages. This is more than a frozen compatibility tool, although adopting its syntax ties source code to the Flow compiler path.

A project needs both the checker and a type-stripping compiler

The normal application setup is modest. Install flow-bin as a development dependency, add a flow package script, and run flow init to create .flowconfig. Flow recommends a per-project version rather than a global install, which is sensible because releases can tighten checks. Only marked files are checked by default, so a team can choose its migration boundary instead of converting every JavaScript file on day 1.

Typed source cannot go straight to an ordinary JavaScript runtime. The getting-started guide offers Babel with @babel/preset-flow and flow-parser, or the lighter flow-remove-types command. Most library definitions are not bundled either; the docs direct users to flow-typed and a flow-typed.config.json environment list. The checker itself requires no hosted account or secret, but a working project also needs those compiler and definition choices.

What happened when we ran it

Our sandbox installed 126 packages with Yarn in 20 seconds, and the dependency tree used 37 MB on disk. The checked-out commit was 3b35c53, run in an unprivileged Debian container with 3 CPUs and 8 GB of RAM. Installation succeeded without a reported error. These numbers cover the repository's available Node install, not the flow-bin experience inside an unrelated application.

The checkout itself was much larger than that dependency folder: 18,817 files, about 1,045,799 lines of source, and 67.3 MB checked out. Our runner found no build script or target, so it skipped the build. It also found no test script or target and skipped tests. There is a tests directory and 1 CI workflow file, but neither fact gives Yarn a command that our harness could execute.

That result should not be read as a failed compiler build. The repository README now documents a Rust route under rust_port: install nightly Rust, use cargo +nightly build, then run cargo +nightly test. An optimized binary uses another Cargo command. We did not run those commands because the supplied lab measurement defines the install, build, and test results for this review. The honest conclusion is narrower: the Node workspace installs, while its root scripts do not expose the project's real build or tests.

Building Flow itself requires nightly Rust, not just Yarn

Contributing to the checker has a heavier toolchain than installing it in an app. GitHub CI builds the Rust workspace with nightly Rust. The optional flow.js build also needs Emscripten 3.1.44, Node, Yarn, the wasm32-unknown-emscripten target, and a specifically dated Rust nightly. That distinction belongs in onboarding notes because a successful 20-second package install does not prepare a machine to compile the checker.

The test documentation adds another layer. Rust's flow dev-tools runtests runner executes the fixtures under tests, where cases store expected output beside source files and .flowconfig files. Contributors must build a Flow binary before invoking that suite. The instructions are usable once found, but standard JavaScript conventions point at empty targets. A newcomer following only yarn will stop before reaching the code that matters.

TypeScript interoperability remains the main adoption cost

Flow's syntax now overlaps substantially with TypeScript, and the project documents the comparison directly. Package compatibility is less equal. Most JavaScript packages publish TypeScript declarations, while Flow tells users to obtain most definitions from a separate flow-typed repository. Open discussion #9091 asks for better TypeScript ecosystem interoperability and describes manual conversion of definitions as a burden. That discussion is user evidence, not a maintainer promise that a converter is coming.

Syntax support also deserves a trial against the actual application. Open issue #9346 reports that an export from statement with a JSON import attribute is rejected by Flow's parser. The report concerns version 0.295.0, so it should not be generalized to every newer parser behavior without retesting. Its open status is enough reason to include modern module syntax in an upgrade fixture before rolling version 0.329.0 across a large repository.

Current releases show maintenance, while upgrades can add errors

The last push was August 27, 2026, and release v0.329.0 was published on August 22. GitHub showed 22,279 stars and 523 open issues and pull requests; a separate issue search counted 516 open issues. The release shipped binaries for Linux on x86_64 and arm64, macOS arm64, and Windows x86_64. Those dates and artifacts show active maintenance rather than a project living on old tags.

Release notes also warn that upgrades may surface new errors. Version 0.329.0 tightened unique symbol use and legacy variance syntax, changed some diagnostic locations, and fixed a server race that could leave it hanging. Existing users should pin the checker, read each release note, and run it across their own typed files before updating CI. New projects should compare that ongoing migration cost with TypeScript's wider declaration supply before choosing Flow-specific language features.

Alternatives

ProjectWhat it isPick it when
TypeScript gh↗A typed JavaScript language and compiler with broad package declaration support.pick this instead when third-party type declarations and mainstream JavaScript tooling matter more than Flow-specific syntax.
Closure CompilerA JavaScript compiler that combines type checking with advanced code optimization.pick this instead when aggressive compilation and size optimization are part of the same job as type analysis.

What people are saying

  1. [velocity-scout] facebook/flow
  2. [producthunt] Wispr Flow Notetaker
  3. [github-trending] bytedance/deer-flow
  4. [hackernews] Gpiozero Flow

Sources

  1. Flow repository and README
  2. Flow getting started guide
  3. Flow v0.329.0 release notes
  4. Flow issue 9346 on export attributes
  5. Flow discussion 9091 on TypeScript interoperability

More dev tools reviews

workmux · v2rayNG · SecLists · hashcat · eslint · fastfetch · the whole board →