Hack it, Build it,
Ship it, Sell it

(with Tutor)

Régis Behmo

Open edX end-of-year celebration, Dec. 14th 2021 (video)


I'm Régis Behmo :-)

Freelance software engineer @ Overhang.IO

160+ pull requests on Open edX

Principal Tutor maintainer

Let's talk about Tutor

$ pip install tutor
$ tutor local quickstart
    Interactive platform configuration
Are you configuring a production platform? [y/N] y
Your website domain name for students (LMS) [local.overhang.io] mydomain.com
Your website domain name for teachers (CMS) [studio.mydomain.com]
Your platform name/title [My Open edX] Merry 🎅 Open edX!
Your public contact email address [contact@mydomain.com]
The default language code for the platform [en] zh-cn
Activate SSL/TLS certificates for HTTPS access? [y/N] y
Your Open edX platform is ready and can be accessed at the following urls:




Intuitive CLI

Transparent Docker commands

All data in ~/.local/share/tutor


Stateless containers

Idempotent commands


Docker layer cache

Minimal "core"






Dec. 20th 2021, Maple release: Tutor replaces the native installation as the default community installation.

Future plans: replace the Devstack.

Special thanks to...

Community maintainers (see handbook)

edX for financial support

  1. Configuration management
  2. Template rendering
  3. Command line interface

all extendable with plugins!

  1. Configuration management
  2. Template rendering
  3. Command line interface

all extendable with plugins!

Configuration management

$ tutor config save --set LMS_HOST="mydomain.com"
$ grep LMS_HOST ~/.local/share/tutor/config.yml
LMS_HOST: mydomain.com

Template rendering

$ git grep LMS_BASE -- tutor/templates/apps/openedx/config/lms.env.json
"LMS_BASE": "{{ LMS_HOST }}",
$ grep LMS_BASE ~/.local/share/tutor/env/apps/openedx/config/lms.env.json
"LMS_BASE": "mydomain.com",

Command line interface

$ tutor local quickstart
$ tutor local createuser --superuser --staff admin admin@overhang.io
$ tutor local importdemocourse
$ tutor k8s scale lms 11

Creating a plugin

$ pip install cookiecutter
$ cookiecutter https://github.com/overhangio/cookiecutter-tutor-plugin.git
$ pip install -e ./tutor-contrib-myplugin
$ tutor plugins enable myplugin
$ tutor local quickstart
  1. Configuration management: config = {"add": {"MYSETTING": "value"}}
  2. Template rendering: {{ patch(...) }}
  3. Command line interface: tutor myplugin ...

Tutor plugins

Extensibility → Diversity

Making Open edX easier to use...

“Why would you want to do that?”

“Does that mean more community support?”

“Open edX administration should be left to experts”

Less complexity → more experts

Less complexity → cheaper software

What do we want
to achieve?

What do we want to achieve?

“1. Increase access to high-quality education for everyone, everywhere.
2. Enhance teaching and learning on campus and online.
3. Advance teaching and learning through research.”

Our mission, https://www.edx.org/about-us

“I want to teach a billion learners.”

Anant Agarwal, 2013

What works

  • edX.org
  • Growing Open edX ecosystem
  • 3rd-party contributions
  • Working groups & community-led decisions
  • Tutor as a package manager

What doesn't work (yet)

  • Disconnect between edX and the rest of the Open edX community
  • 3rd-party commitment to extension maintenance
  • Ownership: “if you break it, you fix it.”

What doesn't work at all



is not a business

Education is not a business

Education must be free, open and decentralized

Technology must not be adversarial

Startups are not healthy examples to replicate

Proposed action items

  • Publicly discuss the Open edX roadmap (github.com/openedx/platform-roadmap)
  • Bring non-profit organizations to the table
  • Publish course content under a creative commons license
  • Implement content and access federation across Open edX instances
  • Build a global community of learners
  • Reach sustainability and foster innovation through an Open edX Foundation

Let's continue the conversation

@regis on discuss.openedx.org

Huge thanks to the Maple release contributors!

(press z to dance)

Gabriel D'Amours, Xavier Antoviaque, Jhony Avella, Ned Batchelder, Dennis Bates, Sofiane Bébert, Sarina Canelake, Suman Chapai, Shimul Chowdhury, Zia Fazal, Matjaz Gregoric, Asad Iqbal, Nizar Mahmoud, Ghassan Maslamani, Peter Pinch, Phillip Shiu, Max Sokolski, Kevin Valencia, Michael Wheeler