- Overview
- Getting Started
- Database Setup
- Development
- Commands Reference
- Project Structure
- Contributing
- Legal Notice
- About Selleo
- Course Structure: Courses built from categories, modules and various lesson types
- Lesson Types: Supports text, video, presentation and quiz lessons
- Quiz Engine: Multiple-choice, single-choice, true/false, gap-filling, short/long text answers and image-based questions
- Price Configuration: Flexible setup for free and paid course access
- Progress Tracking: Automatic progress saving and course completion logic
- Daily Streak Tracking: Motivational system for tracking learning consistency
- Statistics & Insights: Detailed data on user engagement and learning results
- Admin Panel: Tools for managing users, courses, content and statistics
- User Roles: Separate experiences for students and administrators
- api: A NestJS backend application working as API
- web: A Vite Remix SPA
- reverse-proxy: For domains and https during development
- email-templates: A package for email templates
- eslint-config: A package for eslint configuration
- typescript-config: A package for typescript configuration
Before you begin, make sure you have:
- Node.js version 20.15.0 (stated in
.tool-versions
)- We recommend using asdf for version management
- pnpm package manager
- Caddy v2.8.4
- Docker and Docker Compose
Install project dependencies:
pnpm install
Configure Caddy (first-time setup only):
cd ./apps/reverse-proxy
caddy run
# After running caddy just terminate the process with Ctrl+C
Important
First run has to be run by hand to configure caddy. Later on it will automatically start with the app start script.
Configure environment variables for both applications:
cd apps/api
cp .env.example .env
cd apps/web
cp .env.example .env
Note
In project root.
- Start the database:
docker-compose up -d
- Run migrations:
pnpm db:migrate
Populate the database with initial data:
pnpm db:seed
After running the database seeding AFTER renaming the teacher
role to content creator
, the following default accounts are available:
Role | Password | |
---|---|---|
Student | [email protected] | password |
Student | [email protected] | password |
Content Creator | [email protected] | password |
Content Creator | [email protected] | password |
Admin | [email protected] | password |
Note
These accounts are created during the seeding process and are intended for development and testing purposes only.
To start all applications in development mode:
pnpm dev
After starting the development environment, you can access:
Service | URL | Description |
---|---|---|
Web App | https://app.lms.localhost | Frontend application |
API | https://app.lms.localhost/api | Backend API url |
Swagger | https://api.lms.localhost/api | API documentation |
Mailhog | https://mailbox.lms.localhost | Email testing interface |
- Format all files with Prettier
pnpm format
- Check if all files are formatted with Prettier
pnpm format:check
- Lint all files in the web app with ESLint
pnpm lint-tsc-web
- Lint all files in the api app with ESLint
pnpm lint-tsc-api
- Fix linting errors in the web app
pnpm lint-tsc-web --fix
- Fix linting errors in the api app
pnpm lint-tsc-api --fix
- Generate new migration:
pnpm db:generate
Important
After generating a migration:
- Change its name to something descriptive that explains what it does
- Make sure to update the migration name in
apps/api/src/storage/migrations/meta/_journal.json
under thetag
key
- Run migrations:
pnpm db:migrate
- Generate TypeScript API client based on Swagger specification:
pnpm generate:client
- Build email templates:
cd packages/email-templates pnpm build
Email templates are automatically built when starting the development server. To test emails, check the Mailhog interface at mailbox.lms.localhost.
-
Frontend tests:
-
Unit
pnpm test:web
-
E2E
bash test-e2e.sh
or
chmod +x test-e2e.sh ./test-e2e.sh
-
-
Backend tests:
pnpm test:api # Unit tests pnpm test:api:e2e # E2E tests
lms-core
├── apps
│ ├── api
│ │ ├── src
│ │ └── test
│ ├── reverse-proxy
│ └── web
│ ├── app
│ │ ├── api
│ │ ├── assets
│ │ ├── components
│ │ └── modules
│ └── e2e
└── packages
├── email-templates
├── eslint-config
└── typescript-config
We welcome contributions to LMS Core! Please check our Contributing Guide (coming soon) for guidelines about how to proceed.
To ensure consistency and clarity across our development workflow, we follow the naming conventions outlined below.
Each branch name should follow this pattern:
[initials]_[type]_[module]_[ticket]_[short_description]
Components:
initials
– First letter of the author's first and last name, in lowercase (e.g.,jd
for John Doe)type
– Type of change:feat
– New featurefix
– Bug fixchore
– Maintenance or build-related tasksrefactor
– Code refactoring without functional changes
module
– Relevant module or system (e.g.lms
)ticket
– Ticket or issue number (e.g.459
)short_description
(optional) – Brief description insnake_case
Example:
jd_feat_lms_459_implement_sso
We follow the Conventional Commits specification.
Format:
<prefix>: description of the change
Examples:
feat: implement SSO authentication
fix: resolve token expiration issue
Pull Requests should:
- Use conventional title format:
feat(LMS-459): Implement SSO authentication
fix(LMS-482): Resolve token expiration issue
refactor(LMS-501): Simplify chart rendering logic
- Follow the project's PR template and fill out all required sections
- Provide a brief description of the change and link to the related ticket
- Include screenshots, test results, or instructions if applicable
This project was generated using Selleo LMS which is licensed under the MIT license.
Ready to scale your eLearning platform? Selleo will help with product-minded dev teams who are here to make it happen.