anomaly/installer-module
Anomaly Installer Module supplies the installation workflow for Anomaly CMS, guiding Laravel-based setup of the application and database so new sites can be configured quickly and consistently.
This package is almost never the thing you composer require directly. It arrives transitively when you install the Streams Platform skeleton (anomaly/streams-platform and the streams-platform application template). Confirm it's there with composer show anomaly/installer-module, then check composer.json for "type": "streams-addon" — the platform's addon loader registers it automatically, so you generally won't find a providers entry in config/app.php that you need to touch.
Look first at three places:
src/InstallerModuleServiceProvider.php (or InstallerModuleServiceProvider under a namespaced module folder). This tells you which routes, config, and commands the module registers.config/installer.php (or resources/config/installer.php depending on the publish layout). This usually controls the step list, whether the installer is enabled, and where the "installed" flag is written.storage/app/ or a .env/config value. Knowing this file is the single most useful thing: it's what the middleware checks to decide whether to redirect you back into the wizard.Your first real use case: stand up a fresh Streams Platform app and walk the browser wizard at the installer route (commonly /installer or /admin/installer). If you're containerizing, the more relevant first use case is the opposite — disabling the wizard entirely and reproducing its steps from an Artisan/CI script.
Interactive bootstrap (normal path). Run the app, get redirected to the installer, step through environment checks → database credentials → admin user → completion. Let the module write .env and the install flag. Then run php artisan migrate --seed if the wizard doesn't already do it.
Scripted/CI install (the pattern worth investing in). The wizard is a UI over the same operations you can drive yourself. For Docker entrypoints and test fixtures, bypass it:
.env and create the install flag file before the app boots, so the middleware never engages.Keep this in a committed install.sh / deploy script rather than clicking through the wizard per environment — it's the only way to get reproducible builds, and it's why most teams never touch this module after initial setup.
Guard middleware. The installer registers middleware that redirects uninstalled apps into the wizard. If you're writing your own app-level middleware, register it after this one, and never let it run in production behind a flag — the check is typically cheap and file-based, but it will short-circuit every request until the flag exists.
Custom install steps. If Streams' step-based installer is in play, the extension point is to add your own step class and register it in the installer config's step array, then drop its view into the module's resources/views. Useful for collecting app-specific settings (mailer, default site name, feature flags) during onboarding instead of a "now edit .env" README. Treat this as a light abstraction: a step is basically a form + a run()/handle() method, so keep DB writes in a separate service you can also call from your scripted installer.
Post-install hooks. Fire your seeders/domain bootstrap from an event or a command invoked at the end of the wizard, and call the same command from install.sh. That keeps the interactive and automated paths honest with each other.
.env, storage/, and possibly bootstrap/cache/. PHP-FPM users need write access; classic failure is a half-written .env and a "not installed" loop.php artisan config:cache before install will bake stale values — including the install state if it's config-backed. Always config:clear/route:clear when debugging installer behavior.APP_KEY. The wizard generates it, but if it writes .env without a key or with an empty key, encrypted sessions/cookies break silently later. Check .env immediately after install./installer are computed from the request; behind nginx or a subdirectory mount, configure trusted proxies or the wizard will bounce you to the wrong host.How can I help you explore Laravel packages today?