mrkeyoor.com_
Tue 01 Sept 17:43 UTC
Dev Toolsevaluationupdated 26 Aug 2026

gleam review

Gleam is a statically typed programming language that compiles to Erlang or JavaScript. It aims to give application developers friendly compiler errors and type safety while keeping access to the Erlang and JavaScript ecosystems.

+29stars / 7d
Verdict

Our Gleam build took 235 seconds and 12,129 of 12,137 tests passed, so the compiler is substantial and close to green in our sandbox, but contributors should reproduce the 8 failures before trusting a change. Gleam is a persuasive choice for teams that want static types on the Erlang VM and accept a younger ecosystem. Existing Elixir or Erlang shops should prototype one service first because the language choice affects libraries, hiring, and debugging habits.

We ran it

Lab card: what happened when we ran gleamScreenshot of gleam (gleam.run)
Install✓ · 33s493 packages
Build✓ · 235s
Tests✗ · 120s12129 passed · 8 failed of 12137 (cargo test)
Repo5282 files~242,386 lines of source · 11.3 MB · 5 CI workflows · tests dir

Answers from our run

Does gleam build from source?

Dependencies installed in 33 seconds (493 packages), and the build succeeded in 235 seconds. We cloned commit 0de3c7a into a clean Debian container with 3 CPUs and no project-specific setup.

Do gleam's tests pass?

Not all of them: 12129 of 12137 passed and 8 failed when we ran the project's own test command (cargo test). Some failures need services or credentials a bare container does not have.

Who should not use gleam?

Teams that require a fully green upstream test run in a plain Rust container: our sandbox run ended with 8 failures out of 12,137 tests.

What are the alternatives to gleam?

Elixir, Erlang/OTP, Rust. Our Gleam build took 235 seconds and 12,129 of 12,137 tests passed, so the compiler is substantial and close to green in our sandbox, but contributors should reproduce the 8 failures before trusting a change.

Setup3/5Build succeeded, but 8 of 12,137 tests failed in our sandbox
Docs4/5Official guides are clear; the repository README itself is sparse
Community5/5Recent pushes, current releases, and active issue and PR work
Maturity4/5A serious compiler and toolchain, with a younger package ecosystem

Discussed on

  1. hnGleam OTP – Fault Tolerant Multicore Programs with Actors197 points
  2. hnGleam v1.12166 points
  3. hnMy first experience with Gleam Language59 points
  4. hnGleam v1.3.0 Released10 points
  5. hnGleam v1.0.09 points

Who it’s for

Teams that want Erlang VM concurrency without adopting Erlang syntax or Elixir's dynamic types.
Full-stack developers who value one typed language that can target Erlang and JavaScript.
Language-tooling contributors prepared to work in a large Rust compiler codebase.

Who it’s NOT for

Teams that require a fully green upstream test run in a plain Rust container: our sandbox run ended with 8 failures out of 12,137 tests.
Developers who need broad hiring pools and years of production history comparable with Erlang, Elixir, or Rust: Gleam is a younger language with a smaller ecosystem.
Projects that depend heavily on metaprogramming or runtime type tricks: Gleam's appeal is its small, static language design, so those patterns work against the grain.
Contributors seeking a small compiler to learn in a weekend: the checkout contained 5,282 files and about 242,386 source lines in our run.

Setup reality

In our sandbox, installing 493 Rust packages took 33 seconds and the build completed in 235 seconds. The test command ran for 120 seconds, then exited with code 101: 12,129 of 12,137 tests passed, while 8 failed. The log tail identifies 4 failures in test-commands, but it does not show a cause for the full set.

Using the released language is easier than building its compiler. Gleam's official installation guide provides package-manager and prebuilt-binary routes, while contributors need Rust and the repository toolchain. Projects targeting the Erlang VM also need Erlang installed; JavaScript output needs the relevant JavaScript runtime and package workflow.

The repository has 5 CI workflows and a tests directory, but no Dockerfile. That makes the 11.3 MB source checkout straightforward to inspect, yet there is no project-supplied container that reproduces the compiler's development environment exactly.

Static types are the reason to choose Gleam

Gleam compiles one small functional language to Erlang or JavaScript. The Erlang target gives programs access to the BEAM virtual machine, OTP libraries, lightweight processes, and the operational model behind Erlang and Elixir systems. The JavaScript target lets the same language reach browsers and JavaScript runtimes. Gleam adds algebraic data types, exhaustive pattern matching, inferred types, and compiler diagnostics intended for application developers rather than language researchers.

That combination is specific enough to drive a decision. An Elixir team gains static checking without leaving the Erlang VM, while a TypeScript team gets a functional language that can share code across server and browser targets. The repository we inspected had 5,282 files and roughly 242,386 lines of source, so this is a full compiler and toolchain, not a thin transpiler. It includes a compiler, build tool, package manager integration, formatter, documentation generator, and language server work.

Erlang interoperability is useful, but migration still costs

Gleam can call Erlang and Elixir code through its foreign-function interface, which changes the adoption calculation. A team does not need Gleam-native replacements for every database driver or OTP component before writing its first service. JavaScript projects have a comparable escape hatch for code on that target. The type checker cannot make foreign code safe by itself, though. Boundary declarations must match what the called function returns, and mistakes surface at runtime.

The language's smaller package market remains the practical tradeoff. Gleam packages use the Hex ecosystem, and existing BEAM libraries fill many gaps, but their APIs may feel less natural than libraries designed around Gleam types. Version 1.18.1 was the latest GitHub release we fetched, published on 2026-08-01. Teams should check the exact packages needed for authentication, databases, observability, and deployment before treating interoperability as a complete migration plan.

The language stays deliberately small

Gleam avoids several features developers may expect from larger languages. Its value comes partly from what is absent: less metaprogramming, fewer ways to express the same control flow, and compiler-enforced handling of data variants. That can make review easier and error messages more useful. It can also frustrate developers who rely on macros, inheritance, exceptions as normal control flow, or runtime reflection. This is a design choice, not a missing checkbox.

The two compilation targets also impose discipline. A package can target Erlang, JavaScript, or both, and foreign code can tie it to one side. Cross-target libraries need to stay within the shared language surface or maintain separate implementations. Gleam's promise is portable source, not identical runtime behavior across 2 ecosystems. Teams planning shared browser and server code should verify each dependency's supported targets instead of assuming every Hex package works everywhere.

What happened when we ran it

Our install completed in 33 seconds and pulled 493 Rust packages. Building the compiler then succeeded in 235 seconds inside an unprivileged container with 3 CPUs and 12 GB of RAM. The checkout at commit 0de3c7a occupied 11.3 MB and contained about 242,386 source lines. Those figures describe compiler development from source, not the simpler experience of installing a published Gleam binary.

The test step failed after 120 seconds with exit code 101. Cargo reported 12,129 passing tests and 8 failures out of 12,137. The supplied log tail shows several suites completing cleanly, then a result with 4 failures in the test-commands library and the rerun hint -p test-commands --lib. It does not include the failed test names or error messages, so we cannot responsibly assign a cause.

Five CI workflow files and a dedicated tests directory show that maintainers exercise the project through automation. There is no Dockerfile in the repository. A contributor who needs exact parity with upstream CI must therefore follow its workflow configuration or construct a matching environment. The failed sandbox run is a reason to reproduce the command and inspect the full failure output before submitting compiler changes, not evidence that normal Gleam programs cannot run.

Current activity supports adoption better than the README does

The repository was pushed on 2026-08-25, one day before this review, and GitHub reported 21,819 stars. Its open count was 219 issues and pull requests combined. Recently updated work included language-server function labels, module import behavior, compiler warnings, and a JavaScript code-generation bug involving bit arrays. That spread suggests active work across editor support and compiler correctness rather than maintenance limited to dependency updates.

The main README is only 906 bytes and sends readers to the official website for useful documentation. The website is where installation, language syntax, package publishing, JavaScript compilation, and Erlang interoperability are explained. That split is fine for users, but it makes the GitHub landing page a weak guide for a contributor deciding how the repository fits together. The 5 CI workflows provide more concrete development evidence than the README's short pitch.

Choose Gleam for the type system, not novelty

Gleam makes the most sense when a team already values the Erlang VM but wants the compiler to catch missing cases and mismatched data before deployment. It is also appealing for functional full-stack experiments where a JavaScript target matters. The Apache 2.0 license is friendly to commercial use, and current push plus issue activity lowers the risk of adopting an idle language project.

The decision becomes harder for an established Elixir codebase with productive conventions and no type-related pain. Rewriting working services for static types alone rarely pays. Start with a bounded service, check its required Hex packages, and make the team operate it through one release cycle. For compiler contributors, first rerun the 12,137-test suite and resolve whether the 8 failures are environment-specific. That result matters more than the star count.

Alternatives

ProjectWhat it isPick it when
ElixirA dynamic functional language with mature tooling on the Erlang VM.pick this instead when Phoenix, macros, and a larger BEAM community matter more than static typing.
Erlang/OTPThe original language and runtime stack for fault-tolerant concurrent systems.pick this instead when direct OTP access and decades of operational history outweigh friendlier syntax.
Rust gh↗A systems language with static types, native performance, and a much larger package base.pick this instead when native binaries, low-level control, and ecosystem breadth matter more than BEAM deployment.

What people are saying

  1. [hackernews] Fuzzing the Gleam Compiler
  2. [github-trending] gleam-lang/gleam
  3. [lobsters] The cool things of Gleam
  4. [lobsters] A field day for Gleam’s language server | Gleam v.1.18.0 release

Sources

  1. Gleam repository README
  2. Gleam language documentation
  3. Gleam v1.18.1 release
  4. Gleam open issues and pull requests

More dev tools reviews

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