Text based MMORPG engine written in Elixir
Switch branches/tags
Nothing to show
Clone or download
oestrich Merge pull request #95 from lorecrafting/webpack
Enable babel webpack treeshaking interop & update npm scripts
Latest commit 91072dc Nov 13, 2018
Failed to load latest commit information.
assets Merge pull request #95 from lorecrafting/webpack Nov 13, 2018
config Merge branch 'master' into webpack Nov 9, 2018
contrib Update bundled Grafana dashboard to match provided sample Aug 13, 2018
docs Add applicationid to the discord info gmcp Oct 4, 2018
lib Merge branch 'webpack' of https://github.com/lorecrafting/ex_venture Nov 13, 2018
priv Handle sign in and registration from grapevine Nov 3, 2018
rel Upgrade distillery and release tasks Aug 20, 2018
test Handle sign in and registration from grapevine Nov 3, 2018
.credo.exs Bump credo and fix new warnings May 1, 2018
.dockerignore Add sample Docker Compose environment Aug 13, 2018
.formatter.exs Format the project again Feb 19, 2018
.gitignore Updating gitignore. Sep 27, 2018
.projections.json NPCs will respawn after a spawn interval Aug 24, 2017
.tool-versions Commit tool verions Oct 1, 2018
.travis.yml Bump to pg 10.5 Aug 27, 2018
CONTRIBUTING.md Rename to CONTRIBUTING.md May 16, 2018
Dockerfile Update to alpine 3.8 in the dockerfile Aug 20, 2018
LICENSE Update copyright to 2018 Feb 26, 2018
README.md Add grapevine to the readme Nov 12, 2018
docker-compose.yml Prevent port collisions with host Postgres port Aug 13, 2018
local.tin Start supporting the GMCP protocol Oct 1, 2017
mix.exs Update sentry to latest Nov 9, 2018
mix.lock Bump distillery and libcluster Nov 9, 2018
mkdocs.yml Add a hidden `/play` page Sep 10, 2018
release.sh Generate a production build of javascript Jun 2, 2018



Trello Discord Patreon

ExVenture Logo

A text based MMO server written in Elixir.


Powerful web admin

  • Everything is editable by the web admin panel and live in the game on save
  • There are no text files to edit, everything is stored in PostgreSQL

Web client

  • Using Phoenix Channels, ExVenture ships with a built in web client
  • Hosted by the app itself, accessible by browsing to /play

Cross Game Chat

  • ExVenture fully supports the Gossip network
  • Supports Grapevine
  • Cross game channels
  • Cross game tells

Front Page

  • News announcements
  • Help is web accessible
  • Classes, skills, and races are all available on the home page
  • Send and receive in game mail from your account page
  • Chat with players in the game from the web chat


  • The telnet connection does not allow passwords to be entered over plaintext
  • Add TOTP to your account


  • Crashes are contained in the room that they occur and those processes restart cleanly
  • Player connections are not dropped during session recovery

Multi-node support

  • Use the power of elixir to start a cluster for your game
  • The world is spread across the entire cluster
  • Building on local resiliency, the app will stay alive if a node goes down


  • PostgreSQL 10
  • Elixir 1.7.2
  • Erlang 21.0.5
  • node.js 8.6


mix deps.get
mix compile
cd assets && npm install && node node_modules/brunch/bin/brunch build && cd ..
mix ecto.reset
mix run --no-halt

This will start a server on port 5555 that you can connect with using the local.tin tintin++ config. Ecto reset will include a sample area, classes, skills, and a login. You can also load http://localhost:4000/ in your browser for the admin panel and web client.

Running Tests

MIX_ENV=test mix ecto.create
MIX_ENV=test mix ecto.migrate
mix test

Web Client

A web client is hosted by the game. Once it is running locally, you can access it via http://localhost:4000/play.

Web Client

Admin Panel

There is an admin panel located at http://locahost:4000/admin that you can build out the game in. Create zones, rooms, npcs, items, etc. in the panel. They will become live instantly on creating or updating.

You can see more on exventure.org.

Admin Dashboard


See exventure.org for deployment setup.


Prometheus metrics are set up and will be reported on /metrics. You may want to have nginx deny requests to this endpoint or whitelist it for IPs, etc.