Marwa Framework is intentionally small. The architecture is built around a few core responsibilities:
Application: boots the container, environment, and core shared servicesHttpKernel: coordinates HTTP boot flow and request handlingConsoleKernel: builds the Symfony Console application and registers commandsProviderBootstrapper: registers configured service providersModuleBootstrapper: loads marwa-module services, boots module providers, and integrates module routes, views, and console discoveryMenuRegistry: collects application and module menu items and exposes the built main navigation treeMiddlewareBootstrapper: resolves and pushes middleware into the pipelineCommandRegistry: stores commands from config, code, and package integrationsCommandDiscovery: resolves command classes from configured namespaces or PSR-4-mapped directoriesApplication is created with the host app base path..env is loaded and core singletons are bound.HttpKernel loads app config and delegates provider, module, and middleware setup to dedicated bootstrappers.RelayPipelineAdapter.RouterMiddleware dispatches to marwa-router.HttpKernel::terminate() emits the final response.Application loads the environment and binds shared services.ConsoleKernel loads config/app.php and config/console.php.ProviderBootstrapper registers application service providers and ModuleBootstrapper binds the module registry/runtime.CommandRegistry collects built-in commands, configured commands, discovered commands, module commands, and optional package commands such as marwa-db.ConsoleApplication boots the Symfony Console runtime and runs the selected command.config/app.php under providersconfig/app.php under middlewaresroutes/web.php or routes/api.phpconfig/module.php and module manifests under your configured module pathsconfig/console.php or Application::registerCommand()Application::modules(), Application::hasModule(), and Application::module()Marwa\Framework\Navigation\MenuRegistry or the menu() helperHttpKernel::setNotFound()Config, Application, and contracts over facade access where practicalsrc/Config/ so defaults and expected keys are centralized