Customization
Customize the installer's appearance, branding, and behavior.
#Publishing the config
php artisan vendor:publish --provider="Olakunlevpn\Installer\InstallerServiceProvider"
This creates config/installer.php with all customization options.
#Branding
#Application name
'brandName' => env('APP_NAME', 'My Application'),
Appears in the header and page titles.
#Logo
'brandLogo' => '/images/logo.svg',
URL to your logo image. Shows in the installer header. Leave null to use text-only branding.
**Example with logo:**
'brandLogo' => asset('images/company-logo.png'),
#Colors
Customize the color scheme for dark mode.
'colors' => [ 'primary' => '#272531', // Primary brand color 'secondary' => '#4a5568', // Secondary elements 'success' => '#10b981', // Success messages 'error' => '#ef4444', // Error messages 'warning' => '#f59e0b', // Warning messages 'info' => '#3b82f6', // Info messages],
All installer components use these colors automatically.
#Dark mode
'darkMode' => true,
Set to false to use light mode instead. The installer is optimized for dark mode.
#Steps configuration
#Registering steps
'steps' => [ \Olakunlevpn\Installer\Steps\WelcomeStep::class, \Olakunlevpn\Installer\Steps\RequirementsStep::class, \Olakunlevpn\Installer\Steps\PermissionsStep::class, \Olakunlevpn\Installer\Steps\EnvironmentStep::class, \YourVendor\YourPlugin\Steps\LicenseStep::class, // Your plugin step \Olakunlevpn\Installer\Steps\AccountStep::class, \Olakunlevpn\Installer\Steps\InstallingStep::class, \Olakunlevpn\Installer\Steps\CompletedStep::class,],
Steps appear in the order listed. Plugin steps are usually added via service providers, not here.
#Step order
Plugin steps use step_position from their own config:
config/installer-license.php:
'step_position' => env('LICENSE_STEP_POSITION', 5),
Common positions:
- 1-3: Early steps (requirements, permissions)
- 4-6: Configuration (database, environment)
- 7-9: Features (license, integrations)
- 10+: Finalization (admin account, completion)
#Requirements
#PHP version
'requirements' => [ 'php' => '8.2.0',],
#PHP extensions
'requirements' => [ 'extensions' => [ 'php' => [ 'openssl', 'pdo', 'mbstring', 'tokenizer', 'xml', 'ctype', 'json', 'bcmath', ], ],],
Add extensions your application requires.
#Permissions
File and directory permission requirements.
'permissions' => [ storage_path() => '775', storage_path('app') => '775', storage_path('framework') => '775', storage_path('logs') => '775', base_path('.env') => '644', base_path('bootstrap/cache') => '775',],
Format: 'path' => 'required_permissions'
#Middleware
'middleware' => ['web'],
Middleware applied to installer routes. Keep web for session support.
Add custom middleware:
'middleware' => ['web', 'throttle:10,1'],
#Completion settings
#Redirect after installation
'completed' => [ 'redirectTo' => '/admin/dashboard',],
Where to redirect after installation completes.
#Next steps
Show post-installation instructions.
'completed' => [ 'nextSteps' => [ [ 'title' => 'installer::installer.set_up_cron', 'description' => 'installer::installer.set_up_cron_description', 'icon' => 'clock', ], [ 'title' => 'installer::installer.configure_email', 'description' => 'installer::installer.configure_email_description', 'icon' => 'mail', ], ],],
These appear on the completion page as checklist items.
#Development mode
'development' => env('INSTALLER_DEV', false),
When true:
- Shows detailed error messages
- Skips some validations
- Allows re-running installer
Set in .env:
INSTALLER_DEV=true
Never enable in production.
#Custom views
Override any installer view.
**Publish views:**
php artisan vendor:publish --tag=laravel-installer-views
Views are copied to resources/views/vendor/installer/.
**Override a specific view:**
Create resources/views/vendor/installer/livewire/welcome.blade.php:
<div> <h1>Welcome to {{ config('app.name') }} Installation</h1> <p>Your custom welcome message here.</p> <!-- Keep the original form structure --> <form wire:submit.prevent="submit"> <x-installer::button type="submit"> Get Started </x-installer::button> </form></div>
The installer uses your view instead of the default.
#Custom components
Create your own components using installer styles.
**Your component:**
resources/views/components/custom-card.blade.php:
<div class="rounded-lg bg-gray-800 border border-gray-700 p-6"> <h3 class="text-lg font-semibold text-white mb-4"> {{ $title }} </h3> <div class="text-gray-300"> {{ $slot }} </div></div>
**Use in your step view:**
<x-custom-card title="License Information"> <p>Enter your license details below.</p></x-custom-card>
#Custom translations
Publish and modify translation files.
**Publish translations:**
php artisan vendor:publish --tag=laravel-installer-translations
**Edit translations:**
lang/en/installer.php:
return [ 'welcome_title' => 'Welcome to Installation', 'welcome_description' => 'We will guide you through the setup process.', // ... your custom messages];
**Add new language:**
Create lang/es/installer.php for Spanish:
return [ 'welcome_title' => 'Bienvenido a la instalación', 'welcome_description' => 'Te guiaremos a través del proceso de configuración.',];
Set locale in config:
'locale' => 'es',
#Custom CSS
Add your own styles.
**Create stylesheet:**
public/css/installer-custom.css:
.installer-header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);} .installer-card { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.3);}
**Include in layout:**
Override resources/views/vendor/installer/layouts/app.blade.php:
<head> <!-- ... existing head content --> <link rel="stylesheet" href="{{ asset('css/installer-custom.css') }}"></head>
#Complete customization example
config/installer.php:
return [ // Branding 'brandName' => env('APP_NAME', 'Acme CRM'), 'brandLogo' => asset('images/acme-logo.svg'), // Colors 'colors' => [ 'primary' => '#6366f1', // Indigo 'secondary' => '#8b5cf6', // Purple 'success' => '#10b981', // Green 'error' => '#ef4444', // Red 'warning' => '#f59e0b', // Amber 'info' => '#3b82f6', // Blue ], // Dark mode only 'darkMode' => true, // Steps 'steps' => [ \Olakunlevpn\Installer\Steps\WelcomeStep::class, \Olakunlevpn\Installer\Steps\RequirementsStep::class, \Olakunlevpn\Installer\Steps\PermissionsStep::class, \Olakunlevpn\Installer\Steps\EnvironmentStep::class, \Acme\License\Steps\LicenseVerificationStep::class, \Olakunlevpn\Installer\Steps\AccountStep::class, \Olakunlevpn\Installer\Steps\InstallingStep::class, \Olakunlevpn\Installer\Steps\CompletedStep::class, ], // Requirements 'requirements' => [ 'php' => '8.2.0', 'extensions' => [ 'php' => [ 'openssl', 'pdo', 'pdo_mysql', 'mbstring', 'tokenizer', 'xml', 'ctype', 'json', 'bcmath', 'gd', ], ], ], // Permissions 'permissions' => [ storage_path() => '775', storage_path('app') => '775', storage_path('framework') => '775', storage_path('framework/cache') => '775', storage_path('framework/sessions') => '775', storage_path('framework/views') => '775', storage_path('logs') => '775', base_path('.env') => '644', base_path('bootstrap/cache') => '775', ], // Completion 'completed' => [ 'redirectTo' => '/admin/dashboard', 'nextSteps' => [ [ 'title' => 'installer::installer.configure_cron', 'description' => 'installer::installer.configure_cron_desc', 'icon' => 'clock', ], [ 'title' => 'installer::installer.setup_email', 'description' => 'installer::installer.setup_email_desc', 'icon' => 'mail', ], [ 'title' => 'installer::installer.review_settings', 'description' => 'installer::installer.review_settings_desc', 'icon' => 'cog', ], ], ], // Development 'development' => env('INSTALLER_DEV', false), // Middleware 'middleware' => ['web', 'throttle:10,1'],];
#Environment variables
Control settings via .env:
APP_NAME="Acme CRM"INSTALLER_DEV=falseLICENSE_STEP_POSITION=5
Reference in config:
'brandName' => env('APP_NAME', 'Default Name'),'development' => env('INSTALLER_DEV', false),
#Plugin customization
Plugins can provide their own customization options.
config/installer-license.php:
return [ 'step_position' => env('LICENSE_STEP_POSITION', 5), 'api_url' => env('LICENSE_API_URL', 'https://api.example.com'), 'timeout' => env('LICENSE_API_TIMEOUT', 10), 'form_fields' => [ [ 'name' => 'license_key', 'type' => 'text', 'label' => 'license::license.key_label', 'required' => true, 'validation' => 'required|string|min:20', ], ],];
Users customize by editing the config or setting environment variables.
#Next steps
- See complete plugin example: Complete Plugin Example
- Review component documentation: Components
- Understand the event system: Events System