An authoring, teaching and learning environment: An AGPL-licensed open source LMS.
To build, you need Java 21, Node 22, SBT and Yarn. To run, you need PostgreSQL 17, OpenSearch and Valkey/Redis.
The follow steps assume a modern macOS and Homebrew, but other OS and environments will work too. The default configuration expects that the required services are all available on their standard ports.
% brew install openjdk@21 node@22 yarn sbt
Follow the instructions to add node
and java
to your PATH
(or use
nvm
or jenv
or suchlike). Expect that node --version
is 22
and java --version
is 21.
% brew install postgresql@17
Follow the instructions to add PostgreSQL to your PATH
and to
start the service.
% brew install opensearch
Follow the instructions to start the service.
% brew install valkey
Follow the instructions to start the service. Redis will also work.
The platform needs a database, a keystore and some secrets.
Create a database and user. You'll need to choose a password for the database user and remember it for later.
% createuser -P ug
Enter password for new role: <dbpass>
% createdb -O ug -E utf-8 underground
If these commands are not found, make sure you added postgres to your PATH
above
and source
your rc file if necessary.
Generate a keystore for the Tomcat server. You'll need to choose a password for the keystore and remember it for later.
% keytool -genkey -keystore backend/keystore -alias localhost -dname "CN=localhost" -sigalg SHA256withRSA -keyalg RSA -validity 365
Enter keystore password: <storepass>
Re-enter new password: <storepass>
Create a file backend/deploy/src/main/resources/user.conf
. You will need to choose
a password for the overlord (super-admin) and test accounts and enter the keystore and
database user passwords from above:
overlord.password = "<rootpass>"
de.strap.user.password = "<adminpass>"
keystore.password = "<storepass>"
de.databases.underground.datasource.pass = "<dbpass>"
If OpenSearch required an admin password for setup, add these lines:
opensearch.username = "admin"
opensearch.password = "<ospass>"
The frontend components are built using Vite and then packaged and published locally as JAR files for convenience to the backend.
% cd frontend/
% sbt install build publishLocal
This builds the three frontend packages in parallel, and publishes the resulting artifacts to your local Ivy repository.
If there are problems with the combined build step, you can build the projects individually using Yarn:
% cd frontend/authoring/ # or platform/ or courseware/
% yarn install
% yarn build
You still need to sbt publishLocal
if you build individually.
The backend is build with SBT and runs directly in an embedded Tomcat container.
% cd backend/
% sbt -J-Xmx4G
sbt:de> up
After a brief interlude you should see the message "CPXP ready". Log messages
are available in logs/detomcat.json
.
Navigate to:
https://127.0.01:8181/control/admin
.
You'll have to accept the HTTPS security warning.
Login using the username root
and the rootpass password you chose above.
Navigate to Domains, choose Add Domain / Basic Domain.
Under Domain Settings enter the following values:
- Identifier:
lo
- Name:
LO University
- Short Name:
LO
- Primary Host Name:
localhost
Under Profile Settings select the Test Data checkbox to create some test accounts including the local admin.
Click Submit and wait for the domain to provision. You will be launched into the administration portal for the domain.
Navigate to:
https://localhost:8181/
.
You'll have to accept the HTTPS security warning.
Login using the username admin
and the adminpass password you chose above.
Click on the Authoring tab, click New Project, enter a name such as "First Project" and click Create Project.
Create content using the authoring environment.
Preview content using the Eye of Horus menu.
LO Platform copyright © 2007–2025 LO Ventures LLC.
Released under the terms of the AGPL-3.0.
For custom licensing, contact us at info
@ lo.ventures
.
For culpability, please see the hall of blame.