System Health
Overall Status: Healthy
Last checked: 2026-09-13T14:59:20+00:00
Database
Database connection is healthy
Cache
Cache is healthy
Database Connection
- Status
- Connected
- Database
- mintfit_development
- Host
- mariadb:3306
- Version
- 11.8.8-MariaDB-ubu2404
- Database Size
- 5.72 MB
- Active Connections
- 1
Queue Metrics
Development Tools
Project README
MintfitV2
A modern Learning Management System (LMS) built as a modular monolith with Laravel 12. Designed to replace Moodle with a flexible, API-driven architecture that maintains microservice-style boundaries while keeping deployment simple.
Key Features
- API-Only Backend - Stateless JWT authentication, JSON responses
- Modular Monolith - Self-contained modules with strict boundaries enforced by Deptrac
- Docker-Based - Complete development environment with one command
- Anonymous Sessions - Guest users can interact before registration
- Multi-Tenancy - Built-in tenant isolation
- RBAC - Role-based access control with flexible permission system
Architecture
Each module is a self-contained domain with clean separation:
modules/{ModuleName}/
├── Domain/ # Entities, DTOs, value objects
├── Application/ # Services (public API), use cases
└── Infrastructure/ # Repositories, controllers, models
Module Communication: Modules interact only via Service injection. Services return DTOs, never models.
Current Modules: Health, Tenant, Identity, User, Block, Notification, Dashboard
Quick Start
# Complete setup (first time)
make setup
# Start development environment
make start
Services:
- Dashboard: http://localhost:8000 (System monitoring & health)
- API Docs: http://localhost:8000/docs
- phpMyAdmin: http://localhost:8080 (Database management)
- Mailpit: http://localhost:8025 (Email testing)
The default local runtime uses FrankenPHP with two Laravel workers, matching the
Kubernetes worker setting without scaling to the host CPU count. MariaDB 11.8,
Valkey 9.1, Garage 2.3.0, Mailpit 1.30.4 and the Chromium image match the Fleet
setup. Default, PDF and import queues run in separate containers with their
production timeout and recycling policies. Use make start OCTANE=0 only when
testing the PHP-FPM fallback. If a default host port is occupied, set APP_PORT
or PHPMYADMIN_PORT in .env; container-to-container ports do not change.
Common Commands
# Development
make start # Start all services
make logs # View application logs
make shell # Open shell in container
# Database
make db-migrate # Run migrations
make db-seed # Seed database
make db-reset # Fresh database with seeds
# Testing & Quality
make test # Run all tests
make analyze # Run all checks (tests, pint, deptrac, phpstan)
make pint # Format code
make deptrac # Check module boundaries
# Modules
make module NAME=Product TYPE=stateful # Generate new module
make module-test MODULE=Tenant # Test specific module
make module-migrate MODULE=Tenant # Migrate specific module
# View all commands
make help
Creating a New Module
# Interactive mode (recommended)
make module NAME=Product
# With options
make module NAME=Order TYPE=stateful WITH_EVENTS=1 WITH_TESTS=1
The generator creates:
- Complete module structure (Domain, Application, Infrastructure)
- DTOs with validation rules
- Service with CRUD operations
- Repository and Model
- Controller and routes
- Migration and seeder
- Tests (Feature and Unit)
- Permission provider (stateful modules)
After generation:
- Customize DTOs and validation rules
- Update migration schema
- Configure permissions in
config/module_rbac.php - Run
make module-migrate MODULE=YourModule - Run
make module-test MODULE=YourModule
Git Hooks
Pre-commit hooks enforce code quality automatically before each commit:
- Laravel Pint - Enforces PSR-12 code style
- Deptrac - Validates module boundaries
- PHPStan - Static analysis (level 5)
Installation:
make install-hooks
The hooks are stored in .githooks/ and symlinked to .git/hooks/. If any check fails, the commit is blocked.
Bypass (not recommended):
git commit --no-verify
See .githooks/README.md for more details.
Documentation
- CLAUDE.md - Complete project documentation (architecture, patterns, commands)
- CONTRIBUTING.md - Module system rules and conventions
- API Documentation - Auto-generated, view at
/docsendpoint
Technology Stack
- Framework: Laravel 12 (PHP 8.2+)
- Database: MariaDB 11.8
- Cache/Queues: Valkey 9.1 using the Redis protocol
- Authentication: JWT (stateless)
- Frontend: Tailwind CSS 4, Vite
- Testing: PHPUnit with SQLite
- API Docs: Scribe
- Architecture Enforcement: Deptrac, PHPStan
Development Workflow
- Understand the architecture - Read
CONTRIBUTING.md - Explore existing modules - Look at
Health,Tenant, orBlockfor patterns - Create or modify modules - Use
make moduleor follow existing patterns - Test your changes - Write tests, run
make test - Verify quality - Run
make analyzebefore committing
Architecture Enforcement
Deptrac enforces module boundaries:
- Modules can ONLY access other modules via Services
- No direct access to Repositories, Models, or Infrastructure
- Layered architecture: Domain → Application → Infrastructure
PHPStan ensures type safety and catches bugs before runtime.
Run make analyze to verify both.
Important Notes
- This is NOT standard Laravel - Strict module boundaries enforced
- All authentication is stateless JWT (no sessions)
- Services are the public API for modules
- Always return DTOs from Services, never models
- Use ULIDs for primary keys (via
HasUlidstrait) - API-only - No Blade views or traditional forms (except Dashboard module for internal monitoring)
License
Proprietary - All rights reserved
System Overview
- Modules
- 25
- Database Tables
- 58
- Routes
- 351
- Tests
- 169
- Pending Jobs
- 0
- Failed Jobs
- 0
- Custom Commands
- 18
Detailed Statistics
Table Row Counts
| Table | Rows |
|---|---|
| quiz_slot_options | 102 |
| migrations | 78 |
| permissions | 77 |
| role_permissions | 65 |
| quiz_slots | 62 |
| questions | 42 |
| questions_history | 42 |
| quiz_sections | 22 |
| quiz_versions | 21 |
| quizzes | 18 |
| media | 17 |
| identities | 9 |
| notifications | 9 |
| role_user | 9 |
| placements | 8 |
| roles | 4 |
| tags | 4 |
| tag_contexts | 3 |
| ad_clicks | 0 |
| ad_impressions | 0 |
| ad_placements | 0 |
| ad_statistics | 0 |
| ads | 0 |
| ads_history | 0 |
| anonymous_sessions | 0 |
| attempt_responses | 0 |
| attempt_scheduled_slots | 0 |
| attempt_slot_history | 0 |
| attempts | 0 |
| cache | 0 |
| cache_locks | 0 |
| certificate_definitions | 0 |
| certificates | 0 |
| content_history | 0 |
| content_progress | 0 |
| contents | 0 |
| course_activities | 0 |
| course_activity_progress | 0 |
| course_enrollments | 0 |
| courses | 0 |
| failed_jobs | 0 |
| manual_grading_assignments | 0 |
| media_aliases | 0 |
| media_conversions | 0 |
| moodle_import_mappings | 0 |
| moodle_import_runs | 0 |
| notification_preferences | 0 |
| quiz_feedback_bands | 0 |
| tag_assignments | 0 |
| telescope_entries | 0 |