An attempt to port/rebuild Spree, an open source e-commerce solution, with Elixir and Phoenix.
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.


Build Status Coverage Status Stories in Ready

An attempt to port/rebuild Spree, an open source e-commerce solution, with Phoenix.


Spree is an excellent product however, for several reasons, it started to show some limits:

  • being written in Ruby and Rails requires a lot of hosting resources
  • it became a big, monolithic piece of software, really hard to customize
  • it slowed down the development pace (perhaps because of the point above)

So here's the deal: why not to port/rebuild Spree with Elixir and Phoenix? The main idea is to take inspiration from the many Spree's good parts and build a new generation ecommerce for the next years.

Roadmap, a sort of

See TODO for more details, meanwhile, here there are some intentions:

Short term

The first short term goal is to quickly build a bare-bones MVP with the core models (eg: Product, Variant, Order, LineItem, ...) and the necessary code to glue them through isolated, well defined commands. Then, at a very high level:

  • get a monolithic app, for now
  • as a Customer (say a guest user for the first iteration), I want to purchase products (add to cart -> do checkout)
  • as an Admin, I want to manage products and orders through an HTTP-JSON API

Mid term

Once we get an initial, working, very basic product, we can start to split the whole app into components. Very similar to Spree:

  • core: contains the core models and their basic integrations (queries, commands, ...);
  • api: all actions should be done from an HTTP-JSON API, so anyone can build its custom frontend (eg: a Single Page App, command line, mobile app, ...), especially for admins;
  • frontend: uses plain old server-rendered HTML pages;
  • admin: not a top priority. it's like frontend, for admins;
  • extensions: everything that doesn't strictly fit into the above components, should be done in a dedicated package. After all, some features are very specific to certain needs, we don't want another monolithic piece of software.

Long term

Don't know right now, world domination™? :-)


  1. Be nice with others
  2. Check issues or, if your prefer kanban boards, we have waffle too
  3. Fork this repo
  4. Write code (and tests)
  5. Open a PR


  1. Copy .env-example.exs to .env.exs, then edit it to set secret configs
  2. Install dependencies with mix deps.get
  3. Create and migrate your database with mix ecto.create && mix ecto.migrate
  4. Run tests with mix test
  5. Install npm dependencies with npm install
  6. Start Phoenix endpoint with mix phoenix.server
  7. Visit localhost:4000 from your browser