A Laravel-based learning management system for admins, teachers, and students.
Manage classrooms, courses, question banks, exams, assignments, results, reports, internal discussions, and live sessions.
- Overview
- Core Features
- Demo Screens
- Module Architecture
- Tech Stack
- Local Setup
- Production Deployment
- Demo Accounts
- Development Commands
- Development Guidelines
- License
Mindigo LMS is a modular learning management system built with Laravel. The application is organized around three main user experiences:
- Admin operates the platform, users, permissions, system health, support, audit logs, and aggregate operational analytics. Admin does not approve exams or alter academic results.
- Teachers and tutors own classrooms, courses, question banks, official exams, assignments, grading, reports, announcements, discussions, and live sessions.
- Students join classrooms, take assigned exams, create separate practice sets, submit assignments, track schedules and progress, view released results, write notes, and join discussions or live sessions.
The goal of the project is to provide a clear, extensible LMS foundation with consistent UI patterns and practical workflows for online learning.
- Authentication, password recovery, OTP, and Mindigo ID flows.
- User management, roles, permissions, and account status control.
- Subject, topic, classroom, and classroom member management.
- Operational monitoring for exam traffic, migration/cutover health, queues, storage, and aggregate reporting.
- No academic approval workflow and no access to learner answers or grade editing.
- System settings, profile management, support tickets, and audit logs.
- Teacher dashboard focused on active classes, students, grading, reminders, schedules, and performance.
- Classroom management with schedules, attendance, and student rosters.
- Course management with chapters and lessons.
- Teacher-owned exam templates, sessions, assignments, candidates, monitoring, grading, result release, analytics, import, and scanning workflows.
- Assignment creation, submission review, grading, and feedback.
- Result review by exam, by student, and by attempt.
- Reports for classes, students, exams, and learning progress.
- Class announcements.
- Internal class discussions with a chat-style interface, images, files, and group information.
- Live session creation and management.
- Student dashboard with assigned work, schedule, progress, and recent activity.
- Classroom overview and related learning content.
- Exam taking with autosave, realtime monitoring, configurable proctoring signals, released-result review, and attempt history.
- Assignment receiving and submission through files or text.
- Student-owned practice sets separated from official exams and gradebooks.
- Schedule, learning progress, and leaderboard pages.
- Personal notebook.
- Class discussions and live session participation.
Teacher Dashboard |
Exam Management |
Assignments & Submissions |
Class Discussions |
Teacher Reports |
Student Live Sessions |
Mindigo workflow demo video.
Mindigo is organized as internal Composer path packages inside the packages/ directory.
| Module | Purpose |
|---|---|
Auth |
Login, OTP, Mindigo ID, role middleware |
Core |
Public homepage and public layout |
Dashboard |
Shared dashboard shell, sidebar, search, and layout |
UserManagement |
User account management |
RolePermission |
Roles and permissions |
SystemSetting |
System configuration |
AuditLog |
Activity and operation logs |
SubjectManagement |
Subjects and topics |
ClassroomManagement |
Platform-level classroom management |
QuestionBank |
Question bank management |
ExamManagement |
Exam templates, sessions, candidates, attempts, proctoring, monitoring, grading, analytics, migration, and cutover |
Report |
Role-scoped learning reports and aggregate operational reports |
SupportManagement |
Support tickets |
Profile |
Profile, security, and notification preferences |
BlogManagement |
News and blog content |
| Module | Purpose |
|---|---|
TeacherDashboard |
Teacher dashboard |
TeacherClassroom |
Classrooms, schedules, and attendance |
TeacherCourse |
Courses, chapters, and lessons |
TeacherQuestion |
Teacher question management |
TeacherExam |
Teacher exam management |
TeacherAssignment |
Assignments and submissions |
TeacherResult |
Results, grading, and attempt review |
TeacherAnnouncement |
Class announcements |
TeacherDiscussion |
Internal class discussions |
TeacherLiveSession |
Live sessions |
| Module | Purpose |
|---|---|
StudentDashboard |
Student dashboard |
StudentClassroom |
Student classrooms |
StudentExam |
Exam taking |
StudentAssignment |
Assigned work and submissions |
StudentPractice |
Practice sessions |
StudentSchedule |
Learning schedule |
StudentProgress |
Learning progress |
StudentHistory |
Attempt and activity history |
StudentLeaderboard |
Leaderboard |
StudentNotebook |
Personal notes |
StudentDiscussion |
Class discussions |
StudentLiveSession |
Live session participation |
| Layer | Technology |
|---|---|
| Backend | Laravel 12, PHP 8.3 |
| Frontend | Blade, Tailwind CSS 4, Vite |
| UI Icons | Blade Heroicons |
| Database | MySQL 8.4 |
| Realtime | Laravel Reverb |
| Cache, sessions, queues | Redis 7.4, Laravel queue workers |
| Local runtime | Docker Compose, Nginx, PHP-FPM, immutable built assets |
| PDF/Export | barryvdh/laravel-dompdf |
| Internal packages | Composer path repositories |
Docker Compose is the standard local runtime. Only Docker Desktop (or Docker Engine with the Compose plugin) is required. PHP, Composer, Node.js, MySQL and Redis do not need to be installed or started on the host.
git clone https://github.com/scoppy9201/Mindigo.git
cd Mindigodocker compose -f docker-compose.dev.yml build
docker compose -f docker-compose.dev.yml up -d
docker compose -f docker-compose.dev.yml psThe stack starts:
- Nginx and PHP-FPM;
- MySQL and Redis on private Docker networks;
- queue worker and scheduler;
- Laravel Reverb;
- frontend assets built into the application image.
Open the application at http://127.0.0.1:8080. Reverb is available at
127.0.0.1:8082.
docker compose -f docker-compose.dev.yml exec app php artisan db:seedPHP, Blade, CSS and JavaScript are built into one consistent application image.
After source changes, rebuild the stack so Laravel and Nginx use the same asset
manifest. Do not run php artisan serve, npm run dev, Redis,
queue workers, the scheduler, or Reverb separately on the host.
Useful checks:
docker compose -f docker-compose.dev.yml logs -f app nginx queue reverb vite
docker compose -f docker-compose.dev.yml exec app php artisan migrate:status
curl.exe -I http://127.0.0.1:8080/upSee docs/11-docker-local-development.md for volumes, ports, rebuilding, testing, troubleshooting, and reset commands.
Mindigo can be deployed on an Ubuntu virtual machine with Docker Compose. This setup is suitable for demo, internal testing, and production-like deployment when the server is behind NAT and does not have a public IP.
For the full CI/CD webhook guide, see:
docs/6-ci-cd-github-actions.md
- Ubuntu Server running in VMware, VirtualBox, VPS, or a physical server.
- Docker and Docker Compose plugin.
- Git access to the repository.
- A configured
.envfile or Docker environment variables. - Optional: ngrok static domain when the VM does not have a public IP.
cd /home/hung/mindigo
git clone https://github.com/scoppy9201/Mindigo.git
cd Mindigo
docker compose up -d --build
docker compose ps
curl -I http://localhost:8080The default Docker Compose stack exposes:
| Service | URL |
|---|---|
| Application | http://<IP_UBUNTU>:8080 |
| phpMyAdmin | http://<IP_UBUNTU>:8081 |
| MySQL from host | 127.0.0.1:3307 |
Run migrations, clear caches, and seed demo accounts:
docker compose exec app php artisan migrate --force
docker compose exec app php artisan optimize:clear
docker compose exec app php artisan db:seedThe production Docker image installs Composer dependencies with --no-dev. The database factories are therefore written without depending on fakerphp/faker, so seeding still works in a production image.
The deployment workflow is:
push main -> GitHub Actions -> build/test -> POST webhook -> ngrok -> Ubuntu VM -> deploy.sh
Create these GitHub repository secrets:
| Secret | Example |
|---|---|
WEBHOOK_URL |
https://your-ngrok-domain.ngrok-free.dev/deploy |
WEBHOOK_SECRET |
mindigo-secret |
On the Ubuntu VM, copy the webhook files:
mkdir -p ~/webhook
cp /home/hung/mindigo/Mindigo/deploy/webhook/server.py ~/webhook/server.py
cp /home/hung/mindigo/Mindigo/deploy/webhook/deploy.sh ~/webhook/deploy.sh
chmod +x ~/webhook/server.py ~/webhook/deploy.shRun the webhook manually for a quick test:
cd ~/webhook
WEBHOOK_SECRET=mindigo-secret python3 server.pyExpose it with ngrok:
ngrok http 9000For a static ngrok domain:
ngrok http --domain=your-ngrok-domain.ngrok-free.dev 9000When GitHub calls the webhook successfully, the server runs:
git fetch origin main
git checkout main
git pull --ff-only origin main
DOCKER_BUILDKIT=1 docker compose build app
docker compose up -d --remove-orphans
docker compose exec -T app php artisan migrate --force
docker compose exec -T app php artisan optimize:clearFor long-running deployment, create systemd services for:
mindigo-webhook.servicemindigo-ngrok.service
Example webhook service:
[Unit]
Description=Mindigo deploy webhook
After=network.target
[Service]
Type=simple
User=hung
WorkingDirectory=/home/hung/webhook
Environment=WEBHOOK_SECRET=mindigo-secret
Environment=WEBHOOK_PORT=9000
Environment=APP_DIR=/home/hung/mindigo/Mindigo
ExecStart=/usr/bin/python3 /home/hung/webhook/server.py
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.targetEnable it:
sudo systemctl daemon-reload
sudo systemctl enable mindigo-webhook
sudo systemctl start mindigo-webhook
sudo systemctl status mindigo-webhookThe same Docker deployment can be moved to a real VPS or physical server. Replace the VM/ngrok parts with normal public networking:
- Point the domain DNS record to the server public IP.
- Put Nginx, Apache reverse proxy, Caddy, Cloudflare Tunnel, or a load balancer in front of
http://127.0.0.1:8080. - Enable HTTPS with Let's Encrypt or the platform certificate manager.
- Set
APP_ENV=production,APP_DEBUG=false, andAPP_URL=https://your-domain.com. - Use strong database passwords and application secrets.
- Do not expose phpMyAdmin publicly; remove it or bind it to localhost/VPN only.
- Keep
storage_dataanddb_dataDocker volumes backed up. - Run
php artisan migrate --forceduring deploy, but rundb:seedonly when demo data is needed.
Useful production checks:
docker compose ps
docker compose logs --tail=100 app
docker compose exec app php artisan about
curl -I http://localhost:8080CI/CD verification: update this section when testing the GitHub Actions deployment workflow.
The database seeder creates fixed accounts for quick testing:
| Role | Password | |
|---|---|---|
| Admin | admin@mindigo.com |
123456 |
| Teacher | teacher@mindigo.com |
123456 |
| Student | student@mindigo.com |
123456 |
The seeder also creates additional users with factories for list, permission, and classroom testing.
Run project tooling inside the application container:
# Full test suite
docker compose -f docker-compose.dev.yml exec app composer test
# Laravel Pint
docker compose -f docker-compose.dev.yml exec app ./vendor/bin/pint --test
# Clear application caches
docker compose -f docker-compose.dev.yml exec app php artisan optimize:clear
# Refresh Composer autoloading
docker compose -f docker-compose.dev.yml exec app composer dump-autoload
# Inspect all services
docker compose -f docker-compose.dev.yml psRebuild the PHP image only after changing its Dockerfile, entrypoint, or PHP extensions:
docker compose -f docker-compose.dev.yml build app
docker compose -f docker-compose.dev.yml up -d --force-recreate app queue scheduler reverb- Keep module boundaries clear across
Mindigo,Teacher, andStudents. - Use Blade, Tailwind, and existing shared components/icons.
- Put user-facing text in
resources/lang/vi/app.phpandresources/lang/en/app.php. - Define module web routes in
src/routes/web.php. - Keep controllers thin and place core business logic in services.
- Follow the existing color system: system green, slate, amber, violet, and rose as accents.
- When adding a new package module, update Composer path repositories, PSR-4 autoloading, and service provider registration if auto-discovery is not available.
Mindigo LMS is released under the MIT License.
Developed by Auronsoft
Mindigo LMS







