The Open Source Learning Management System for Companies
<a href="https://classroomio.com">Website</a> | <a href="https://dub.sh/ciodiscord">Join Discord community</a>

Streamline training for everyone with ClassroomIO.com. Our all-in-one platform empowers bootcamps, educators, and businesses to manage training programs easily. With our platform, anyone can run multiple classes and cohorts all from one UI. The application is mobile-first, which means that students can access your lesson materials from any device.
At ClassroomIO, our mission is to provide students with the best possible learning experience. We believe in empowering educators with the tools they need to deliver high-quality education that is accessible, engaging, and effective.
Please reach out to me on twitter if you have any feature request.
You can book a quick 15 min demo to see if ClassroomIO is a good fit for you
To get a local copy up and running, please follow these simple steps.
Here is what you need to be able to run ClassroomIO.com
This repo is a monorepo that consists of these primary apps:
website: The landing page of ClassroomIO hosted hereapi: The api service that handles PDF, video processing, Emailing and Notifications.dashboard: The web application that runs the learning management system hosted here.docs: Official documentation of ClassroomIO hosted hereThe repository also contains shared packages under packages/ (for example packages/db, packages/utils, and packages/ui).
bash
git clone https://github.com/classroomio/classroomio.git
bash
cd classroomio
nvm):bash
nvm use
You first might need to install the specific version and then use it:
bash
nvm install && nvm use
You can install nvm from here.
bash
pnpm i
Set up your .env files:
Go to apps/dashboard and apps/api.
.env.example file and rename it to .envapps/api/.env: DATABASE_URL, REDIS_URL, AUTH_BEARER_TOKEN, BETTER_AUTH_SECRETapps/dashboard/.env: PUBLIC_SERVER_URL, PRIVATE_SERVER_KEY, PUBLIC_IS_SELFHOSTEDOptional for self-hosted Enterprise-only features (SSO, token-auth, no-tracking): set LICENSE_KEY in apps/api/.env
Start local infrastructure for API (Postgres + Redis) and seed the DB:
bash
docker compose -f docker/docker-compose.yaml up -d postgres redis db-init
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/classroomioREDIS_URL=redis://localhost:6379The db-init container runs migrations/seed once Postgres is healthy.
(Optional) Start MinIO locally for object storage (media/documents):
bash
docker compose -f docker/docker-compose.yaml --profile minio up -d minio minio-init
minioadmin / minioadmin)minio-init: videos, documents, mediaAdd to apps/api/.env when using MinIO locally:
OBJECT_STORAGE_ENDPOINT=http://localhost:9000OBJECT_STORAGE_PUBLIC_ENDPOINT=http://localhost:9000OBJECT_STORAGE_ACCESS_KEY_ID=minioadminOBJECT_STORAGE_SECRET_ACCESS_KEY=minioadminOBJECT_STORAGE_FORCE_PATH_STYLE=trueOBJECT_STORAGE_MEDIA_PUBLIC_BASE_URL=http://localhost:9000/mediaRun the local app services in separate terminals:
bash
pnpm api:dev
bash
pnpm dashboard:dev
Default local URLs:
dashboard: http://localhost:5173
Optional: run other apps:
website: pnpm website:dev
docs: pnpm dev --filter=@cio/docs
Login into dashboard:
admin@test.com123456To learn more about how to login with a dummy account, go here.
cp .env.example .env # copy env template, edit for your domain
./run-docker-full-stack.sh
The script reads root .env via docker compose --env-file .env and auto-generates secure values for AUTH_BEARER_TOKEN and PRIVATE_SERVER_KEY when missing.
See .env.example for the full list of environment variables with required/optional grouping, and docker/docs/SELF_HOST.md for the complete Docker self-hosting guide.
$ claude mcp add classroomio \
-- python -m otcore.mcp_server <graph>