Elixir Open Source Projects
Reading production code is the fastest way to graduate from exercises to engineering. Each
project below is actively maintained, and the last column names the specific thing worth
reading it for. Star counts are approximate, from the GitHub API.
The Core Stack
| Project | What it is | Stars | What to study in the code |
| elixir-lang/elixir | The language and standard library | ~26.6k | How Enum/Stream build on protocols; the compiler's AST passes in lib/elixir |
| erlang/otp | Erlang/OTP — the runtime and behaviours | ~12.3k | gen_server.erl source — the behaviour you have used since lesson 18 |
| phoenixframework/phoenix | The web framework | ~23.2k | Plug pipeline composition in Phoenix.Router; contexts as conventions |
| phoenix_live_view | Server-rendered rich UI | ~6.8k | The diff engine: changed assigns become minimal DOM patches |
| elixir-ecto/ecto | Data toolkit (schemas, changesets, queries) | ~6.5k | Changesets as validation pipelines; query compilation to SQL |
| elixir-plug/plug | The web abstraction beneath Phoenix | ~3.0k | Plug.Builder — pipelines compiled into one function |
| elixir-lang/ex_doc | Documentation generator | ~1.6k | Parsing @doc attributes and running doctests |
Infrastructure Libraries
| Project | What it is | Stars | What to study in the code |
| oban-bg/oban | Job processing on Postgres/SQLite/MySQL | ~4.0k | Retries and backoff encoded as job state transitions |
| dashbitco/broadway | Data ingestion pipelines (GenStage-based) | ~3.5k | Back-pressure via max_demand; batcher supervision |
| elixir-lang/gen_stage | Producer/consumer with demand | ~1.6k | The demand protocol — Broadway's foundation |
| bitwalker/libcluster | Automatic cluster formation | ~2.2k | Each discovery strategy as a supervised process |
| quantum-elixir/quantum-core | Cron-like job scheduler | ~2.4k | Running a job on exactly one node via global locks |
| opentelemetry-erlang | Distributed tracing SDK | ~0.4k | Trace propagation across processes and nodes |
| elixir-ecto/postgrex | PostgreSQL driver | ~1.2k | Binary protocol parsing with bitstream pattern matching |
| swoosh/swoosh | Email delivery abstraction | ~1.5k | Adapter pattern via behaviours; testing adapters |
Whole Applications
| Project | What it is | Stars | What to study in the code |
| plausible/analytics | Privacy-first web analytics, self-hostable | ~29k | A full Phoenix product: contexts, ClickHouse usage, deployment |
| livebook-dev/livebook | Interactive notebooks for Elixir | ~5.9k | LiveView at scale; Mix.install runtime; Kino widgets |
| supabase/realtime | WebSockets: broadcast, presence, Postgres changes | ~7.6k | Multi-node fan-out at scale; connection supervision |
| firezone/firezone | Remote access built on WireGuard | ~9.1k | Elixir + Rust (NIF/interop) in one product |
| blockscout/blockscout | Blockchain explorer for EVM networks | ~4.7k | Heavy Ecto usage; indexers as supervised processes |
Numerical and Ecosystem Edges
| Project | What it is | Stars | What to study in the code |
| elixir-nx/nx | Tensors and defn numerical functions | ~2.9k | How defn code is compiled to multiple backends |
| elixir-nx/explorer | DataFrames on Rust's Polars | ~1.5k | Rustler NIF integration over a Rust core |
| elixir-nx/bumblebee | Pretrained Hugging Face models in Elixir | ~1.7k | Nx.Serving — batched, supervised inference |
| ash-project/ash | Declarative application framework | ~2.5k | Heavy metaprogramming done well — resources compile to code |
| nerves-project/nerves | Firmware packaging for embedded devices | ~2.5k | OTP applications booted as firmware; toolchains |
| membraneframework/membrane_core | Multimedia pipeline framework | ~1.5k | Pipeline elements as supervised processes with demand |
| absinthe-graphql/absinthe | GraphQL toolkit | ~4.4k | Macros building schemas at compile time |
| elixir-wallaby/wallaby | Browser testing (concurrent) | ~1.8k | One WebDriver session per test process |
| Project | What it is | Stars | What to study |
| rrrene/credo | Static analysis with a consistency focus | ~5.2k | Writing code-analysis checks over the AST |
| elixir-lsp/elixir-ls | Language Server for editors | ~1.8k | Bridging compiler diagnostics into LSP |
| hexpm/hex | The package manager | ~1.1k | Dependency resolution as a fun graph problem |
| h4cc/awesome-elixir | Curated catalog of libraries | ~13k | The ecosystem map — find tools by category |
How to Read Them
- Start at the behaviour. Find the
use ... or @behaviour and read the callbacks first — they are the contract.
- Read the tests before the source. Tests are executable documentation of intent.
- Trace one request. Pick the entry function and follow the data; note every
:telemetry event on the way.
- File an issue, not a rewrite. The point is to study decisions, not to judge them from scratch.