Introduction
Overview
Sutomo School Management is a multi-tenant school administration platform built on a modular monolith architecture. All code lives in a single repository but is organized by domain (Academic, Recruitment, Financial, etc.) to keep concerns separated and prepare for potential future extraction into microservices.
Technology Stack
| Layer | Technology | Purpose |
|---|---|---|
| Server | FrankenPHP (Caddy + PHP 8.4) | HTTP server + Laravel Octane |
| Backend | Laravel 13 + Octane | Application framework, API, business logic |
| Frontend (Public) | Inertia.js v3 + Svelte 5 + Tailwind v4 | Public-facing pages (school profile, admission, careers) |
| Admin Panel | Filament v5 | Admin CRUD, resources, relation managers |
| Documentation | Vitepress | Internal developer handbooks |
| Database | PostgreSQL | Primary data store |
| Cache / Queue | Redis + Laravel Horizon | Sessions, cache, job queue |
| Monitoring | Prometheus + Loki + Grafana | Metrics, logs, dashboards |
| Queue | Laravel Horizon | Job management dashboard |
Folder Structure
sutomo-school-management/
├── app/ # Laravel application code
│ ├── Enums/ # PHP enums by domain
│ ├── Filament/ # Filament panel configuration
│ ├── Http/
│ │ ├── Controllers/ # Controllers organized by domain
│ │ │ ├── Api/ # API controllers
│ │ │ ├── Landing/ # Public landing page controllers
│ │ │ └── ...
│ │ └── Middleware/ # Global + feature middleware
│ ├── Models/ # Eloquent models by domain
│ ├── Observers/ # Model observers
│ ├── Providers/ # Service providers + Filament panels
│ ├── Services/ # Business logic services
│ ├── Traits/ # Shared traits (HasLocalization, HasContact, HasLog, HasAsset)
│ └── Console/Commands/ # Artisan commands
├── bootstrap/
│ └── app.php # Middleware registration
├── config/ # Laravel configuration files
├── database/
│ ├── migrations/ # Versioned migration directories
│ │ ├── v1_0_0/
│ │ ├── v1_1_0/
│ │ └── ...
│ └── seeders/ # Database seeders by domain
├── docs/ # Vitepress documentation source
├── handbooks/ # Published handbook build output
├── lang/ # Localization files (en.json, id.json)
├── resources/
│ ├── js/ # Frontend source
│ │ ├── components/ # Atomic design components
│ │ ├── Layouts/ # Page layouts
│ │ ├── lib/ # Utilities (i18n, styles, format)
│ │ ├── modules/ # Feature modules (stores, services, api)
│ │ └── pages/ # Inertia page components
│ ├── css/ # Global styles
│ └── views/ # Blade views (auth emails, etc.)
├── routes/ # Route definitions
│ ├── api/ # API routes
│ ├── web/ # Web routes (Inertia + Blade)
│ └── filament.php # Filament admin routes
├── tests/ # Tests
│ ├── Unit/ # Unit tests
│ ├── Feature/ # Feature tests
│ └── e2e/ # Playwright E2E tests
└── docker/ # Docker configurationDomain Organization
All models are organized by domain under app/Models/ and app/Filament/Resources/:
Academic/ Recruitment/ Financial/ Geographic/
Institution/ Platform/ News/ Organization/
Support/ Assistant/ ContractManagement/Each domain model follows this pattern:
Domain/
├── ModelName.php
├── Concerns/
│ ├── HasAttributes.php
│ ├── HasRelations.php
│ └── HasScopes.php
└── Scopes/Key Files
| File | Purpose |
|---|---|
bootstrap/app.php | Middleware registration, service container config |
composer.json | PHP dependencies and autoload configuration |
docker-compose.yml | Dev environment services (PostgreSQL, Redis, MinIO) |
vite.config.ts | Vite build configuration with Inertia + Wayfinder |
tailwind.config.ts | Tailwind CSS v4 configuration |
phpunit.xml | PHPUnit configuration (SQLite for local tests) |
playwright.config.ts | E2E test configuration |