Open-source project
phoenixframework/phoenix avatar
phoenixframework/phoenix

Phoenix ships four artefacts, and the JS client version runs ahead of the tags

Peace of mind from prototype to production

23,217 stars3,215 forksElixirMIT

At a glance

What is it?
Phoenix is an Elixir web framework whose repository carries four buildable things at once: the framework, the phx.new installer packaged as a Mix archive, the Phoenix.js client built into priv/static, and the documentation. The README gives no install command for users and four command sequences for builders, and package.json sits at 1.9.0-dev while the newest tagged release is v1.8.16.
Who is it for?
Phoenix fits an Elixir team that wants the framework, its project generator and its JavaScript client to move together in one release, and that is willing to read documentation on hexdocs rather than in the repository. It does not fit a team that wants a single artefact, because producing any of the four means deciding which Mix tasks to run, and it does not suit a contributor who works only on the client without Elixir installed.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 2 days ago.
What is it written in?
Mainly Elixir, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on November 13, 2026, and from our analysis. They are not legal advice.

From daily snapshots

Star history

  • phoenixframework/phoenix23,217 ★ · +51
Star history
Repository2026-09-212026-11-13
phoenixframework/phoenix23.2k23.2k

51 Stars in the last 53 days, measured from the daily GitHub snapshot. Compare with other projects

Editorial analysis

Four build sequences, because the repository is four products

The README's Building from source section is four separate sequences, and that is the clearest statement of what this repository contains.

bash
mix deps.get
mix compile

That builds the framework. The installer needs one more step, because phx.new ships as a Mix archive.

bash
mix deps.get
mix compile
mix archive.build

Phoenix.js is built by Mix as well, not by npm.

bash
mix assets.build

And the documentation has its own environment.

bash
MIX_ENV=docs mix docs

So a repository that reads like one Elixir library is really four artefacts with four build paths: the framework, the generator, the JavaScript client and the docs site. The top level reflects that split with lib/ for the framework, installer/ for the generator, assets/ for the client sources and priv/ for what gets published.

For a contributor the cost is that the JavaScript half needs Elixir tooling, not just Node, and the two halves are built by different commands with no single entry point named anywhere.

package.json reads 1.9.0-dev while the newest tag is v1.8.15

The npm package for Phoenix.js declares version 1.9.0-dev. The most recent release of the framework is v1.8.16, dated 2026-10-20, with v1.8.15 and v1.8.14 before it.

So the client package and the framework share a version scheme, and the client on the current branch is already at the next minor version. That has a consequence for anyone pinning: the client version is not independent of the framework version, so choosing a client release is also choosing which Phoenix the client was cut alongside.

The dev suffix is the other half. A -dev version is what npm and Mix treat as pre-release, so it will not be selected by a plain range and installing it is a deliberate act.

Release management lives in its own file. RELEASE.md sits at the root next to CHANGELOG.md. The README itself does not describe the process.

Three entry points in one package, and it ships sources alongside the build

The npm package is described as the official JavaScript client for the Phoenix web framework, and its entry points are laid out for three different consumers.

module points at priv/static/phoenix.mjs, main points at priv/static/phoenix.cjs.js, and unpkg and jsdelivr both point at priv/static/phoenix.min.js. The exports map repeats the first two, import for the ESM build and require for CommonJS.

That is a script tag, a bundler and a module-aware toolchain covered by one package, and the minified file is what a CDN serves. All of those files live in priv/static, which the README's mix assets.build step produces.

The files list is worth noting too, since it publishes priv/static/* and assets/js/phoenix/* together with the metadata files. Consumers therefore receive the built artefacts and the JavaScript sources, which is convenient for reading the protocol and unusual for a compiled client.

mix archive.uninstall phx_new is step one of testing unreleased code

The section on generating a project from unreleased versions is the most operationally useful part of the README, and it starts by telling you to delete something.

Remove any previously installed phx_new archives so that Mix will pick up the local source code, using mix archive.uninstall phx_new or deleting the file, which is usually in ~/.mix/archives/. Then copy the repository, then run the Mix task from within the installer directory.

bash
cd phoenix/installer
mix phx.new dev_app --dev

What --dev does is worth reading closely. It configures the new project's :phoenix dependency as a relative path dependency, and the generated deps function ends up looking like this.

elixir
defp deps do
  [{:phoenix, path: "../..", override: true},

So the generated app depends on a directory that exists only on your machine, with override enabled. That is exactly what you want while testing a change and exactly what you must not commit, which is why the flag is opt-in rather than the default.

The silent failure mode is the archive. If an older phx_new is installed, Mix prefers it over your checkout and your changes appear to have no effect.

Phoenix.js is tested against mock-socket, not against a live Phoenix

The JavaScript test setup is Jest, with jsdom for the DOM, and mock-socket among the dev dependencies. The test script runs Node with the experimental VM modules flag before invoking the Jest binary directly.

bash
node --experimental-vm-modules ./node_modules/jest/bin/jest.js

The important consequence is what mock-socket implies. The client is verified against a simulated WebSocket, which tests the client's behaviour in isolation.

The Elixir side has its own test/ directory and a separate integration_test/ directory, plus a .formatter.exs at the root for the standard formatter. So the two halves of the framework are tested by separate suites with separate tooling, and this README documents no command that runs both.

guides/ and usage-rules/ are documentation that lives in the tree

Two directories at the root are documentation rather than code, and one of them has a name that says what it is for. guides/ and usage-rules/ sit alongside the code.

The README does not describe the contents of either, which is an honest gap rather than an oversight: the front page routes readers elsewhere. It says to see the official site at phoenixframework.org for getting started, to follow the installation instructions at phoenix.hexdocs.pm for the latest released version, and to find API documentation at phoenix.hexdocs.pm with the client docs at phoenix.hexdocs.pm/js.

So the split is consistent across the project. Guides and usage rules are versioned with the code, while the rendered documentation and the installation instructions are hosted, and the front page carries links rather than content.

For questions and proposals there is a Phoenix Forum, and the Elixir channels are IRC on Libera and the elixir-lang Slack. Commercial consulting is pointed at DockYard, which is the one commercial relationship the README names.

Copyright 2014 Chris McCord, and a MIT licence with a sponsor section

The copyright line reads Copyright (c) 2014, Chris McCord, and the source is licensed under the MIT Licence with LICENSE.md at the root. The same author is named in package.json, with the project site in the author field.

The licence is the permissive one, so embedding the framework carries the usual MIT obligations and nothing more.

The governance files are conventional and complete for the size of the project: CONTRIBUTING.md, CODE_OF_CONDUCT.md, SECURITY.md, CHANGELOG.md and RELEASE.md.

What the repository does not contain is worth noting too. There is no benchmark, no comparison against another framework, and no performance claim anywhere on the front page. The one sentence describing the project is Peace of mind from prototype to production, and everything a reader would use to evaluate that claim lives on the hosted documentation site instead.

Editorial conclusion

Phoenix fits an Elixir team that wants the framework, its project generator and its JavaScript client to move together in one release, and that is willing to read documentation on hexdocs rather than in the repository. It does not fit a team that wants a single artefact, because producing any of the four means deciding which Mix tasks to run, and it does not suit a contributor who works only on the client without Elixir installed. Verify first which Phoenix you are actually testing, because an installed phx_new archive silently shadows a local checkout until you remove it.

Frequently asked questions

How do you install Phoenix?

The README has no install command. It points to the official site at phoenixframework.org and to the installation instructions at phoenix.hexdocs.pm, which cover the latest released version. The commands in the repository are for building from source rather than for installing.

How do you build Phoenix from source?

Four separate sequences. The framework needs mix deps.get and mix compile, the installer additionally needs mix archive.build, Phoenix.js is built with mix assets.build, and the documentation is built with MIX_ENV=docs mix docs.

How do you try an unreleased Phoenix?

Remove any installed phx_new archive first, with mix archive.uninstall phx_new, because an installed archive shadows your checkout. Then clone the repository and run the Mix task from the installer directory with the --dev flag, which makes the generated project depend on your local checkout as a relative path dependency.

Where does the Phoenix JavaScript client come from?

Its sources are under assets/js/phoenix and the built files land in priv/static, which is what the npm package publishes as its ESM, CommonJS and minified entry points. The npm package version is 1.9.0-dev while the newest framework release is v1.8.16.

Official sources

  1. License: MIT
  2. phoenixframework/phoenix on GitHub
  3. Project website
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/phoenixframework-phoenix.svg)](https://hysenlabs.com/projects/phoenixframework-phoenix)

Star history chart for your README

markdown
[![Star history](https://hysenlabs.com/chart/phoenixframework-phoenix.svg)](https://hysenlabs.com/projects/phoenixframework-phoenix)

Was this useful?