# Elixir: the language repository, from source build to first project

> Elixir is a programming language for scalable, maintainable applications, and the elixir-lang/elixir repository is its source tree. Here is what the repository actually contains, how to compile it, and where it stops being the right tool.

**elixir-lang/elixir** — Simple from zero to scale

- Repository: https://github.com/elixir-lang/elixir
- Website: https://elixir-lang.org/
- Stars: 26,676 · Forks: 3,670
- Language: Elixir
- License: Apache-2.0
- Published: 2026-09-21 · Updated: 2026-09-21 · Language: en
- Canonical page: https://hysenlabs.com/projects/elixir-lang-elixir

## What the elixir-lang/elixir repository is, and who it is for

The README opens with a single sentence: "Elixir is a programming language designed for building scalable and maintainable applications." The repository is the implementation of that language, not an application framework and not a library you add to a project. Its top level holds bin/, lib/, man/, a Makefile, a VERSION file, and the policy documents (CONTRIBUTING.md, SECURITY.md, OPEN_SOURCE_POLICY.md, CODE_OF_CONDUCT.md, RELEASE.md).

The audience is therefore narrower than the language's user base. Two groups get value from cloning it. The first is contributors: the README says plainly that "if you want to contribute to Elixir, you will need to compile from source." The second is people who want to run a specific revision of the compiler and standard library rather than a packaged release, for example to test against a fix that is on main but not yet in a tagged release.

Everyone else is better served elsewhere. For the many different ways to install Elixir, the README defers to the installation instructions on elixir-lang.org. That distinction matters: the repository README is a contributor document, and it assumes you already know what Elixir is.

## How the source tree is organised and what make actually builds

The build is driven by a Makefile with a small set of variables at the top. PREFIX defaults to /usr/local, SHARE_PREFIX is derived from it as $(PREFIX)/share, and MAN_PREFIX as $(SHARE_PREFIX)/man. VERSION is read from the VERSION file with $(shell cat VERSION). The compiler invocations are defined as ELIXIRC := bin/elixirc --ignore-module-conflict $(ELIXIRC_OPTS) and ERLC := erlc -I lib/elixir/include, so the build bootstraps: it uses the bin/elixirc in the tree to compile the tree.

The Makefile is marked .NOTPARALLEL:, which tells you the maintainers expect the steps to be ordered rather than fanned out. There is a dedicated check for the Erlang dependency. The CHECK_ERLANG_RELEASE macro calls erl to read erlang:system_info(otp_release) and, if the integer is below 27, prints "At least Erlang/OTP 27.0 is required to build Elixir" and exits 1. That is a hard floor, not a warning.

Reproducibility is handled explicitly. There is a SOURCE_DATE_EPOCH_PATH of lib/elixir/tmp/ebin_reproducible with a SOURCE_DATE_EPOCH_FILE inside it, and a check_reproducible target. The README adds that for deterministic builds you should set the environment variable ERL_COMPILER_OPTIONS=deterministic. The target list also includes build_plt, dialyze, cover, format, docs, Docs.zip, Precompiled.zip and zips, so packaging and static analysis live in the same file as compilation.

## Compiling Elixir from source: a first real build

The README's compile-from-source section is short and assumes Erlang is already present: first install Erlang, then clone, then make. The three commands below are exactly that sequence. Run them from a directory where you want the source to live. On success you get a bin/ directory inside the clone containing elixir and elixirc.

```sh
git clone https://github.com/elixir-lang/elixir.git
cd elixir
make
```

If Erlang is missing or too old, make stops with the message quoted above rather than producing a partial build. Once the build finishes, the README says that to use this version as your system version you need to add the bin directory to your PATH environment variable. When you update the repository later, the README suggests running make clean before recompiling, which matters because the build is not parallelised and stale beam files are a plausible source of confusing failures. For a build whose artifacts you intend to compare byte for byte, set the deterministic compiler option:

```sh
make clean
```

```sh
ERL_COMPILER_OPTIONS=deterministic make
```

Windows users get a pointer rather than instructions: the README links to a wiki article with "important notes for compiling Elixir from source on Windows." That is the extent of what the repository itself documents for that platform.

## The contribution process is deliberately gated

The README spends more words on process than on code, and the process is restrictive by design. The issue tracker is described as a place for actionable items, including planned enhancements in the short and medium term. Feature proposals and support requests are explicitly pushed out: they "must be done in their own spaces." Issues judged outside Elixir's scope, an upstream bug for instance, get closed. Maintainers say they actively close unrelated and non-actionable issues to keep the tracker tidy, and that a comment can reopen one if they got it wrong.

The intended path for a feature is a community discussion first, then a proposal to the Elixir Core mailing list, with a clear problem description, a comparison against existing alternatives in the Elixir ecosystem and in other languages, and an assessment of impact on the codebase and community. Only after acceptance does something land in the tracker, and merged work is marked closed and added to the changelog before release.

One rule stands out for anyone used to contributing to open source in 2026: contributors "must disclose the use of coding agents and AI written code." CONTRIBUTING.md carries the detail. If your workflow depends on undisclosed agent-written patches, this is not the project for it.

## Where Elixir from source is the wrong tool

The clearest failure mode is a version floor you do not control. If your machine has Erlang/OTP 26 or earlier, make will not proceed, and the fix is to change your Erlang installation, not to pass a flag. Nothing in the README suggests an override for the 27.0 requirement, and the check is written to exit 1.

The second case is simpler: if you want to write Elixir rather than work on Elixir, compiling from source is unnecessary work. The README routes installation to the website precisely because the repository is not the distribution channel. You inherit the maintenance of a source tree, a non-parallel build, and manual PATH configuration in exchange for nothing you needed.

The third case is platform. Windows support in the repository is a link to a wiki article, not a documented procedure. If Windows is your primary environment and you are not prepared to read that article and adapt, a packaged install is the lower-risk route.

Finally, the versioning is not linear in the way a casual reader might assume. The release list includes v1.20.4 and v1.19.6, both dated 2026-08-28, alongside a main-latest tag from 2024-09-17. Two maintained lines at once means a patch you need may exist on one line and not the other, and you should read the changelog rather than assume the newest tag is the only one receiving fixes.

## How this compares with a general-purpose runtime like Go

The honest comparison is with a language whose toolchain ships as a single self-contained binary. Go's compiler and standard library arrive together from the Go project, and building a Go program does not require a separately installed runtime of a minimum version. Elixir's build requires Erlang/OTP 27.0 or later to be present first, and the Makefile enforces that before anything else runs.

That difference is not a defect, it is the architecture. Elixir runs on the Erlang virtual machine, so the VM is a prerequisite rather than a bundled component, and the language version and the OTP version move on separate schedules. The practical consequence is that upgrading Elixir can mean upgrading OTP, and vice versa, which is a real planning cost that a single-binary toolchain does not impose.

Where the two converge is reproducibility. Both ecosystems care about deterministic artifacts, and Elixir's answer is visible in the Makefile: a SOURCE_DATE_EPOCH file, a check_reproducible target, and the ERL_COMPILER_OPTIONS=deterministic setting the README calls out. If reproducible builds are a requirement, that machinery is documented and testable in this repository rather than implied.

## Licence, maintenance and the cost of tracking main

The source is released under Apache License 2.0, with LICENSES/ and project.spdx.yml in the tree and SPDX headers in the files themselves. The README notes that "Elixir" and the Elixir logo are registered trademarks of The Elixir Team, which is a separate matter from the code licence: Apache-2.0 covers the source, and the trademark claim concerns the name and logo. If you redistribute a build or ship a product carrying the name, read LICENSE and the trademark sentence together rather than treating the Apache grant as covering everything. This is a description of what the repository states, not legal advice.

Maintenance is easy to state from the facts: the repository is not archived, and the last push was on 2026-09-20. Releases v1.20.4 and v1.19.6 are dated 2026-08-28, so two lines were patched within the last month. Security releases are announced on the announcement mailing list and tagged with [security], and there is a SECURITY.md and a security page for private disclosure.

The upgrade cost of tracking main is the part people underestimate. You get the non-parallel build, the make clean step on update, and the need to keep Erlang/OTP at 27.0 or above. In exchange you get a revision that may contain fixes not yet in a tagged release. For most teams the tagged releases are the better trade; for contributors, main is the only option.

## Conclusion

Adopt Elixir if you want a language whose repository is small, buildable with make, and licensed under Apache-2.0, and you already have Erlang/OTP 27 or later. Do not clone this repository if you only want to write Elixir: the README points to the installation instructions on the website for that. Before committing, verify which Erlang/OTP release your machine has, because the Makefile refuses to build below 27.0, and check the VERSION file to know which line you compiled.

## FAQ

### What is Elixir?

The README describes it as a programming language designed for building scalable and maintainable applications. The repository holds the language implementation, its standard library, build files and policy documents, and the project's website carries the wider documentation.

### How do I install Elixir?

The README does not list installation methods itself; it points to the installation instructions on elixir-lang.org for the many different ways to install Elixir. Compiling from source is described as the path for people who want to contribute.

### How do I install Elixir on Windows?

The README's only Windows-specific guidance for compiling from source is a link to a wiki article described as containing important notes for compiling Elixir from source on Windows. For normal installation it defers to the website's installation instructions.

## Sources

- [elixir-lang/elixir on GitHub](https://github.com/elixir-lang/elixir)
- [License: Apache-2.0](https://github.com/elixir-lang/elixir/blob/main/LICENSE)
- [Project website](https://elixir-lang.org/)
- [README](https://github.com/elixir-lang/elixir/blob/main/README.md)
- [Releases](https://github.com/elixir-lang/elixir/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/elixir-lang-elixir
