Are you happy with your logging solution? Would you help us out by taking a 30-second survey? Click here


Elixir is a dynamic, functional language designed for building scalable and maintainable applications

Subscribe to updates I use elixir

Statistics on elixir

Number of watchers on Github 12469
Number of open issues 29
Average time to close an issue about 7 hours
Main language Elixir
Average time to merge a PR about 14 hours
Open pull requests 92+
Closed pull requests 162+
Last commit over 1 year ago
Repo Created almost 9 years ago
Repo Last Updated over 1 year ago
Size 34.5 MB
Homepage http://elixir-lan...
Organization / Authorelixir-lang
Latest Releasev1.6.3
Page Updated
Do you use elixir? Leave a review!
View open issues (29)
View elixir activity
View on github
Fresh, new opensource launches πŸš€πŸš€πŸš€
Trendy new open source projects in your inbox! View examples

Subscribe to our mailing list

Evaluating elixir for your project? Score Explanation
Commits Score (?)
Issues & PR Score (?)


Travis build

Elixir is a dynamic, functional language designed for building scalable and maintainable applications.

For more about Elixir, installation and documentation, check Elixir's website.

Compiling from source

To run Elixir from source, clone this repository to your machine, compile and test it:

git clone
cd elixir
make clean test

Note: if you are running on Windows, this article includes important notes for compiling Elixir from source on Windows.

If Elixir fails to build (specifically when pulling in a new version via git), be sure to remove any previous build artifacts by running make clean, then make test.

If tests pass, you are ready to move on to the Getting Started guide or to try Interactive Elixir by running bin/iex in your terminal.

However, if tests fail, it is likely you have an outdated Erlang version (Elixir requires Erlang 19.0 or later). You can check your Erlang version by calling erl in the command line. You will see some information as follows:

Erlang/OTP 19 [erts-8.0] [smp:2:2] [async-threads:10] [kernel-poll:false]

If you have properly set up your dependencies and tests still fail, you may want to open up a bug report, as explained next.

Bug reports

For reporting bugs, visit our issues tracker and follow the steps for reporting a new issue. Please disclose security vulnerabilities privately at

Proposing new features

For proposing new features, please start a discussion in the Elixir Core mailing list. Keep in mind that it is your responsibility to argue and explain why a feature is useful and how it will impact the codebase and the community.

Once a proposal is accepted, it will be added to the issues tracker. The issues tracker focuses on actionable items and it holds a list of upcoming enhancements and pending bugs. All entries in the tracker are tagged for clarity and to ease collaboration.

Features and bug fixes that have already been merged and will be included in the next release are marked as closed in the issues tracker and are added to the CHANGELOG.

Finally, remember all interactions in our official spaces follow our Code of Conduct.


We welcome everyone to contribute to Elixir. To do so, there are a few things you need to know about the code. First, Elixir code is divided in applications inside the lib folder:

  • elixir - Contains Elixir's kernel and stdlib

  • eex - Template engine that allows you to embed Elixir

  • ex_unit - Simple test framework that ships with Elixir

  • iex - IEx, Elixir's interactive shell

  • logger - The built-in logger

  • mix - Elixir's build tool

You can run all tests in the root directory with make test and you can also run tests for a specific framework make test_#{NAME}, for example, make test_ex_unit. If you just changed something in the Elixir's standard library, you can run only that portion through make test_stdlib.

If you are changing just one file, you can choose to compile and run tests only for that particular file for fast development cycles. For example, if you are changing the String module, you can compile it and run its tests as:

bin/elixirc lib/elixir/lib/string.ex -o lib/elixir/ebin
bin/elixir lib/elixir/test/elixir/string_test.exs

To recompile (including Erlang modules):

make compile

After your changes are done, please remember to run the full suite with make test and then mix format to guarantee all files are properly formatted.

If your contribution fails during the bootstrapping of the language, you can rebuild the language from scratch with:

make clean_elixir compile

Similarly, if you can't get Elixir to compile or the tests to pass after updating an existing checkout, run make clean compile. You can check the official build status on Travis-CI. More tasks can be found by reading the Makefile.

With tests running and passing, you are ready to contribute to Elixir and send a pull request. We have saved some excellent pull requests we have received in the past in case you are looking for some examples:

Reviewing changes

Once a pull request is sent, the Elixir team will review your changes. We outline our process below to clarify the roles of everyone involved.

All pull requests must be approved by two committers before being merged into the repository. If any changes are necessary, the team will leave appropriate comments requesting changes to the code. Unfortunately we cannot guarantee a pull request will be merged, even when modifications are requested, as the Elixir team will re-evaluate the contribution as it changes.

Committers may also push style changes directly to your branch. If you would rather manage all changes yourself, you can disable Allow edits from maintainers feature when submitting your pull request.

The Elixir team may optionally assign someone to review a pull request. If someone is assigned, they must explicitly approve the code before another team member can merge it.

When the review finishes, your pull request will be squashed and merged into the repository. If you have carefully organized your commits and believe they should be merged without squashing, leave a comment.

Building documentation

Building the documentation requires ExDoc to be installed and built alongside Elixir:

# After cloning and compiling Elixir, in its parent directory:
git clone git://
cd ex_doc && ../elixir/bin/mix do deps.get, compile
cd ../elixir && make docs

This will produce documentation sets for elixir, mix, etc. under the doc directory. If you are planning to contribute documentation, please check our best practices for writing documentation.

Development links


Elixir and the Elixir logo are copyright (c) 2012 Plataformatec.

Elixir source code is released under Apache 2 License.

Check NOTICE and LICENSE files for more information.

elixir open issues Ask a question     (View All Issues)
  • about 3 years Add @doc false to def init(_) in use Supervisor
  • about 3 years ExUnit: end-of-run test counts wrong when I run `mix test` in an umbrella app.
  • about 3 years Keyword.merge behaviour when a list is the second argument (docs/test)
  • about 3 years Improve error messages when something goes wrong
  • about 3 years Raise a detailed error for default implementations for behaviours that currently exit/1
  • about 3 years Make sure and/or raises badbool
  • about 3 years Merge DynamicSupervisor in
  • about 3 years Migrate ExUnit away from GenEvent
  • about 3 years Automatically inflect the list of applications
  • about 3 years Warn when apps folder contains things which are not applications
  • about 3 years Warning 'protocol has already been consolidated' when recompiling
  • about 3 years Whitespace differences are not highlighted by ExUnit
  • over 3 years rescue e in ErlangError will recue all exceptions
  • over 3 years Scoping issue in macros?
  • over 3 years Possible improvement for error messages on syntax error in maps
  • over 3 years Support conflict resolution in protocol consolidation
  • over 3 years mix bare compile
  • over 3 years Force disable warnings_as_errors for dependencies
  • over 3 years Update Elixir's Unicode support to Unicode 9.0
  • over 3 years Revisit usage of diff with =~ in assertions
  • over 3 years `mix deps.get` gets confused with "> 0.0.0"
  • over 3 years Support Erlang 19 new features
  • almost 4 years Suggesting the correct patterns to match
  • over 4 years Do not allow calls anymore
  • over 5 years Provide defguard
elixir open pull requests (View All Pulls)
  • Added load_module function to the Node module.
  • Better handling of elixirc_paths in compilation
  • Add a :make compiler
  • Adds support for optionalcallback and optionalmacrocallback
  • Add parse!/2 alternative in OptionParser
  • [WIP] Warn if variable is used as function call
  • [WIP] escript-related mix tasks
  • Update definition of Unicode Whitespace
  • Introduce calendar types
  • [WIP] Introduce String.pad_{leading,trailing}/3 and String.trim{,_leading,_trailing}/2
  • Formmating: Add white space around vertical bar
  • Allow guards in setup and skip non matching definitions
  • Allow binary second arg to String.{l,r}strip
  • improve option_parser.ex to support counter
  • Fix typo in Algebra doc
  • IO.warn/1 to unify warnings
  • Ensure args 2 and 3 to Enum,Stream.chunk/3,4 are integers
  • Friendly error message for duplicate ExUnit test names
  • Keep naming it enumerable for documentation consistency in Enumerable module
  • Clarify that flat_map only flattens one level deep
  • Replace "thing" arg with more appropriate "term" arg
  • Fix nfd normalization bug
  • [WIP] Correct inspect options
  • [WIP] complete list of modes
  • Some (possible) improvements to the Map module
  • mix archive.install from scm
  • Revert mix do to enforce space after comma
  • Use underscore in functions and variables
  • [WIP] Integer.(un)digits/2 improvements
  • Fix docs for \N and \g{N} in String.replace/4 and Regex.replace/4
  • Give helpful error message if a string is used to name a GenServer
  • Optimize Enum.slice/2 and Enum.slice/3
  • Add RemoteConverger.post_converge/0 callback
  • Undefined local structs report undef, not deadlock
  • add git sparse checkout
  • [WIP] Add a page in the docs about operators
  • New guard-safe implementation of `Integer.mod` and `Integer.floor_div`
  • Make ExUnit server timeout configurable
  • Minor grammatical improvements to documentation writing guide
  • Produce meaningful warning when with's else clauses have no effect
  • Update Logger.metadata\1 documentation
  • ExUnit includes tests when configured with [include: :skip]
  • Maintain an order in Calendar elements
  • Use singular time units
  • Correct arity in docs: functions and types
  • Enforce rule of only guards should start with "is_"
  • File.rmdir!/1: give a less confusing error message when directory is not empty
  • Support add() and diff() for NaiveDateTime
  • Update applications built by mix new
  • Syntax highlighting of IEx results
  • [WIP] Complete specs and guards for EEx
  • Avoid downloading archives when not needed in Mix.Local.Installer
  • Improve IEx autocompletion to handle variable names.
  • Add Integer.is_even/1 and Integer.is_odd/1 to Guards page.
  • Use proper case for proper nouns and acronysms
  • Link to internal section
  • Logger docs: recommend using thunks for expensive computations.
  • Fix translation of maps used as map keys
  • Fix Macro.camelize/1 for screaming snake case
  • Fix Macro.underscore/1 for screaming snake case
  • Correctly inspect function calls with weird atoms
  • Enable capturing another process's stdio
  • Add an integer date format to a support enumeration and comparison
  • Add!/2
  • Fix: ExUnit Setup_all fails with 0 exit status (#5967)
  • StringIO read_line performance and binread bug fix
  • Implement @impl directive
  • Split out the built-in knowledge of escript and archive locations and…
  • Test case for unused import inside conditional
  • Preserve attributes even if `strip_beam` is enabled
  • Reduce MapSet's space usage in Erlang term format
  • Improve specs for Process.flag/2-3
  • Do not truncate Logger timestamps
  • Adds Kernel.defguard/1 macro to build guard-safe macros (take 2)
  • Inspect Opts Printable String Limit
  • WIP: #5737 Improve no function clause error messages
  • Replace :gen_server process loop with own implementation
  • Add Unicode atoms and variables to the language
  • Mix.Tasks.Local.Hex: Clarify --if-missing docs
  • Replace Keyword.t/0-1 types with built-in keyword/0-1
  • [WIP] Provide Enum.chunk_by/4 and Stream.chunk_by/4
  • Flatten binary literals when optimizing concatenation
  • [WIP] Introduce __STACKTRACE__
  • Auto merging mix lock
  • Store the last_run_status of each test in a manifest
  • Revisit strictness of Access module #6515
  • [WIP] Support negative dates in Calendar
  • pass through __CALLER__ context into IEx.Introspection.decompose
  • Add support for "--only-failures" in ExUnit
  • Document how to programatically run profiling tasks
  • Improve error message when using pin operator on the left side <> operator
  • [WIP] Move illegal_bin_pattern to Elixir-land
elixir questions on Stackoverflow (View All Questions)
  • Using helper functions in Elixir macros
  • How to run Elixir application?
  • Elixir - Changing Behavior
  • Elixir: Installing Elixir on Ubuntu kills running Couch DB instance
  • Reconsolidate protocols in Elixir 1.2 or higher
  • Test exceptions using espec in Elixir app
  • elixir plug: correct way to get form data from a post request
  • Postgres - Phoenix/Elixir install errors
  • Unix Domain Sockets in Elixir
  • Elixir phoenix error when starting server
  • Elixir gulp tdd to run specific test
  • Laravel's Elixir asset cash/versioning does not load appropriate file
  • Does Elixir have coding standards or an authoritative style guide published by the language developers, like PEP8 or the Erlang Programming Rules?
  • How to implement a reset-able countdown timer with a GenServer in Elixir or Erlang
  • migrating elixir 1.0 app to 1.2 and having issues with derive Collectable for module struct
  • Gulp / elixir saying that tests have passed before they've taken place
  • How to make list of integers with a start, length and increment in Elixir?
  • How to write a list of integers to a file as 16 bit values in Elixir
  • Elixir macros and bind_quoted
  • Parse urlencoded data in Elixir (without Plug.Parsers)
  • In Elixir, why divide a token by 1?
  • Elixir distributed security and whitelisting allowed nodes
  • Laravel elixir always error when install and Gulp error
  • Erlang/Elixir guards and arity
  • Execute Shell Command Synchronously with Elixir/Erlang
  • Is there any way to send a string from Elixir to PHP securely?(no SSL)
  • Accessing variable bindings in Elixir/Erlang using the int module
  • Why is Elixir slower than javascript(nodejs)?
  • How to add plug in router in phoenix elixir
  • How do you conduct multiple trials in Elixir?
elixir list of languages used
elixir latest release notes

1. Enhancements


  • [Code.Formatter] Support comments in the middle of pipelines, when and | expressions

2. Bug fixes


  • [Code.Formatter] Consider commas when breaking groups
  • [Code.Formatter] Ensure proper precedence between & and operators
  • [Code.Formatter] Consider .formatter.exs when formatting stdin


  • [Logger.Translator] Ensure logger doesn't crash when reporting named DynamicSupervisor

1. Enhancements


  • [mix compile.erlang] Teach Mix erlang compiler alternative spelling for -behavior declaration
  • [mix format] Support the :subdirectories configuration that points to other directories with their own .formatter.exs file. This is useful in umbrella applications. mix new --umbrella has also been changed to use this new configuration by default
  • [mix format] Include the current environment for missing dependency errors

2. Bug fixes


  • [Code.Formatter] Ensure -> does not exceed line length
  • [DynamicSupervisor] Properly tag error reports generated by dynamic supervisors so they can be properly translated by Logger
  • [DynamicSupervisor] Consider extra arguments during child restart
  • [Kernel] Ensure arguments given to a guard defined with defguard are evaluated in the correct order
  • [Module] Do not remove docs for previous function declaration when @impl true is used
  • [Supervisor] Ensure use Supervisor properly adds the @behaviour Supervisor annotation


  • [Mix.Shell] Bring back Mix.Shell.cmd/2 - this arity was defined via a default argument that was accidentally removed

1. Enhancements


  • [DynamicSupervisor] Implement child_spec/1 for DynamicSupervisor
  • [Kernel] Raise better error messages on invalid map syntax

2. Bug fixes


  • [Code.Formatter] Only rearrange not in operator if explicitly opted-in
  • [Code.Formatter] Ensure do blocks do not exceed line length on calls with a single argument
  • [Collectable] Support bitstrings in Collectable and for-comprehensions (regression in v1.6.0)
  • [GenServer] Do not override user own @opts attribute
  • [Enum] Reintroduce zipping of any enumerable of enumerables in (regression in v1.6.0)
  • [Macro] Reorder kw blocks in Macro.to_string/1 to avoid warnings
  • [Protocol] Fix protocol consolidation when some chunks may be missing
  • [Stream] Reintroduce zipping of any enumerable of enumerables in (regression in v1.6.0)
  • [Supervisor] Do not override user own @opts attribute
  • [Supervisor] Add @spec to second clause of start_link/2


  • [ExUnit.Case] Reintroduce :case in ExUnit setup/setup_all/test context
Other projects in Elixir