A production-ready, modular API hub system for centralizing multiple APIs with secure API key authentication, CORS per-client control, comprehensive logging, and a Filament v5 admin panel on shared hosting.
π¦ GitHub Repository: fay019/api-manager
π Clone & Deploy: git clone https://github.com/fay019/api-manager.git
β Version: 1.0.0 | β¨ Installation: 1 command (php artisan install)
The application operates in two mutually exclusive modes based on the presence of storage/app/installed.lock.
- Trigger:
installed.lockis missing. - Behavior:
- Only
routes/setup.phpis loaded. - Standard app routes are not registered, preventing conflicts with Livewire v3.
- Stateless architecture: No standard Laravel sessions or encrypted cookies are used to avoid
DECRYPT_FAILEDerrors whenAPP_KEYchanges. - Progress is stored in
storage/app/setup/progress_[token].json.
- Only
- Trigger:
installed.lockexists. - Behavior: Normal Laravel lifecycle with Filament and Livewire fully enabled. The setup wizard is physically inaccessible.
If you need to restart the installation process, use the dedicated CLI command (forbidden in production):
php artisan app:danger-resetYou can also reset the application from the Admin Panel > Settings > Danger Zone.
| Feature | Description |
|---|---|
| π Modular API Architecture | /api/v1/ versioning with independent module structure |
| π Secure API Keys | Bcrypt-hashed keys with per-client rate limiting (60/min default) |
| π CORS Control | Per-client allowed origins list with strict validation |
| π Request Logging | Complete audit trail with filtering and analytics |
| π¨ Filament v5 Admin | Comprehensive dashboard for managing clients, keys, and logs |
| π₯ User Management | Public login/profile pages + Filament admin resource for user CRUD |
| π― Promo API Module | Multilingual banners (FR, EN, DE, AR), smart selection, tracking, version history |
| π¦ Shared Hosting Ready | No Node.js, minimal dependencies, SQLite/MySQL support |
| π Dynamic Documentation | Markdown to HTML conversion with beautiful styling |
| π Multilingual Support | Full i18n with FR, EN, DE translations for UI, admin, errors, and public pages |
| π Dark Mode | Full CSS dark mode support across all pages (login, profile, error pages) |
| π₯ Health Check API | Comprehensive system health monitoring with configurable checks and full multilingual support |
The application is fully internationalized with support for French, English, and German.
- π«π· FranΓ§ais (FR) - Default
- π¬π§ English (EN)
- π©πͺ Deutsch (DE)
- β
Automatic Detection - Browser language preference automatically detected via
Accept-Languageheader - β User Selection - Language selector buttons (FR/EN/DE) in navbar
- β Session Persistence - Selected language persists across pages
- β
No URL Prefixes - Clean URLs
/admininstead of/en/admin - β
Complete Coverage:
- π Setup Wizard (multilingual installation)
- π Public pages (home, docs, footer)
- βοΈ Admin panel (all resources, pages, forms)
- β Error pages (401, 403, 404, 419, 500, 503)
- π§ Contact form and notifications
- π¨ All UI labels and buttons
- β Dark Mode Aware - Translations respect light/dark theme
- β V4 Styles - Modernized CSS for setup and public pages
lang/
βββ fr/
β βββ app.php # Public pages, navbar, footer, theme
β βββ errors.php # Error pages
β βββ filament.php # Admin panel, resources
β βββ contact.php # Contact form
β βββ setup.php # Installation wizard
βββ en/
β βββ app.php
β βββ errors.php
β βββ filament.php
β βββ contact.php
β βββ setup.php
βββ de/
βββ app.php
βββ errors.php
βββ filament.php
βββ contact.php
βββ setup.php
- Setup Wizard: Choose language on welcome page (Step 1)
- Admin Panel: Click language button (FR/EN/DE) in top navbar
- Public Pages: Click locale switcher in navbar
- Programmatically:
POST /locale/{locale}where locale isfr,en, orde
- Use
__('app.key.nested')for translations in Blade templates - Locale middleware (
SetLocale) auto-loads based on session > browser preference > config - New strings automatically fallback to English if translation missing
- All forms and validation messages translated
The application features a complete public authentication system separate from the Filament admin panel, with user profile management and admin user management capabilities.
- π Public Users - Can login and manage their own profiles at
/profile - π¨βπΌ Admin Users - Have access to Filament admin panel at
/admin+ all public features
Login Page: GET /login (or POST /login to authenticate)
- Responsive design with gradient header
- Form validation with helpful error messages
- Dark mode compatible
- Multilingual (FR, EN, DE)
- Redirects admins to
/admin, regular users to/profile
Profile Page: GET /profile (protected, requires login)
- Edit profile name and email
- Change password securely
- Form validation and success messages
- Dark mode compatible
- Multilingual (FR, EN, DE)
Filament Resource: /admin/resources/users
Admins can:
- β Create new users (auto-generated temporary password)
- β Edit user details (name, email)
- β Change user passwords securely
- β Delete users
- β Assign admin roles
- β View user creation/update timestamps
Password Security:
- Passwords always hashed with bcrypt (never stored in plain text)
- Passwords required on user creation
- Passwords optional on user edit (only update if changed)
- Separate password field with secure hashing on save
Public User β GET /login β Form β POST /login β Redirect to /profile
β
Admin User β GET /login β Form β POST /login β Redirect to /admin
Profile Edit β POST /profile β Validate β Save β Redirect with success message
Password Change β Hash with bcrypt β Save β Validate β Success
The application includes complete dark mode support across all pages with CSS-based theme switching:
β
Automatic Detection - Respects browser's prefers-color-scheme preference
β
User Toggle - Theme switcher button in navbar (βοΈ/π)
β
Persistent - Theme preference stored in localStorage
β
No Flash - Applies theme before page renders (no white flash)
β
Complete Coverage - All pages support dark mode:
- Login page with dark gradient header
- Profile page with dark form styling
- Home page with dark background and text
- Error pages (404, 403, 401, 419, 500, 503)
- Admin panel (Filament v5)
Uses CSS with html.dark selector:
/* Light mode (default) */
.header {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
}
/* Dark mode */
html.dark .header {
background: rgb(30, 41, 59);
color: #f3f4f6;
}- Click the theme toggle (βοΈ/π) in navbar
- Verify all text is readable in both light and dark modes
- Verify backgrounds contrast is sufficient
- Verify form inputs are visible
- Verify buttons have proper styling
- PHP 8.2+ with required extensions (bcmath, ctype, json, mbstring, openssl, pdo, tokenizer, xml)
- MySQL 5.7+ or SQLite (for local development)
- Composer installed globally
- Node.js 18+ (optional, for frontend assets)
# 1. Clone from GitHub
git clone https://github.com/fay019/api-manager.git
cd api-manager
# 2. Install dependencies
composer install
# 3. Automated installation (handles everything in 9 steps!)
php artisan installThat's it! Your application is ready. β¨
php artisan serve
# Or use composer dev (includes queue + logs)
composer devAccess the application:
- π Frontend: http://localhost:8000
- π§ Admin Panel: http://localhost:8000/admin
- π Documentation: http://localhost:8000/docs
Default Admin Credentials:
Email: admin@moussouni.dev
Password: password
β οΈ IMPORTANT: Change this password immediately in production!
Access:
- π Public Pages:
/(no login required) - π User Login:
/login(public users) - π€ User Profile:
/profile(requires login) - π§ Admin Panel:
/admin(admin users only)
If you see a 500 error on first access, visit one of these completely independent pages:
Plain Text Diagnostic (ultra-simple, works if HTML fails):
https://your-domain.com/diagnostic.php
Full HTML Installation Page (interactive with UI):
https://your-domain.com/install.php
Both pages will:
- β Show diagnostic information (PHP version, extensions, permissions)
- β Create missing directories automatically
- β Create .env file from .env.example
- β Test filesystem permissions and report issues
- β Detect Composer status and run install if needed
- β Create SQLite database and sessions table
- β
Write detailed logs to
storage/logs/install-diagnostic.log - β Work even if Laravel is completely broken!
Why these exist:
- These files have zero Laravel dependencies
- They run before Laravel bootstraps
- They execute even if .env is missing or directories don't exist
- They capture all PHP errors and log them for debugging
Automatic detection: Visit any page β Setup Wizard appears if not installed
The wizard asks for:
- Site Information + Database Type (SQLite/MySQL/PostgreSQL)
- Database Details (if MySQL/PostgreSQL - skipped for SQLite)
- Confirmation β Installation completes automatically
Automated tasks:
- β Installs Composer dependencies
- β Generates APP_KEY encryption key
- β Creates all required directories
- β Creates SQLite database file (if chosen)
- β Updates .env with all settings
- β Runs all database migrations
- β Initializes modules
- β Seeds initial data
- β Creates admin user account
php artisan installFor servers without web access or CI/CD pipelines.
# Validate installation
php artisan validate:install
# Discover modules
php artisan discover:modules
# Step-by-step installation (for CI/CD)
php artisan install --step=requirements
php artisan install --step=database
php artisan install --step=modules
# Development
php artisan serve
composer dev # Concurrent: server + queue + logs + Vite
# Testing
composer testThe architecture is fully modular. Add features by creating modules:
mkdir -p app/Modules/YourModule/Models
mkdir -p app/Modules/YourModule/Migrations
mkdir -p app/Modules/YourModule/Http/Controllers
# Create YourModuleModule.php (extends BaseModule)
# Add migrations - auto-discovered!
# Add routes - auto-registered!
# Reinstall
php artisan installSee MODULE_CREATION.md for complete guide.
GET /api/v1/healthReturns comprehensive system health status including:
- Cache - Write/read functionality
- Logs - Directory writability
- Disk Space - Usage and warnings
- Storage - All directories writability
- Mail - SMTP configuration
- Database - Connection status
- PHP Extensions - Required extensions loaded
- API Response Time - Response latency measurement
- Configuration - Critical environment variables
Response: {"success": true, "data": {"status": "ok", "timestamp": "...", "checks": {...}}}
Full multilingual support (FR, EN, DE) - All messages display in the user's language.
GET /api/v1/promo/banner.json
X-API-KEY: apk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxPOST /api/v1/promo/event
X-API-KEY: apk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Body: {
"promo_id": 1,
"event_type": "impression|click|dismiss",
"session_id": "abc123",
"url": "https://example.com"
}For complete API documentation, see API.md
Located at /admin/health-check-settings, the Health Check administration page allows you to:
1. Configure Health Checks
- Toggle individual checks on/off (9 available checks)
- Each check has its own toggle button with description
- Settings persist to the database
2. Run Tests
- Click "Test Health Check" button to run all enabled checks
- Results display without page refresh (AJAX)
- Shows individual check status (β ok, β warning, β error)
- View raw JSON response for detailed analysis
3. Supported Health Checks
| Check | Purpose | Languages |
|---|---|---|
| Cache | Verify cache write/read functionality | FR, EN, DE |
| Logs | Check logs directory writability | FR, EN, DE |
| Disk Space | Monitor disk usage (warns if > 90%) | FR, EN, DE |
| Storage | Verify all storage directories writable | FR, EN, DE |
| Validate SMTP configuration | FR, EN, DE | |
| Database | Test database connectivity | FR, EN, DE |
| PHP Extensions | Check required extensions loaded | FR, EN, DE |
| API Response Time | Measure API latency | FR, EN, DE |
| Configuration | Validate critical environment variables | FR, EN, DE |
Public endpoint (no authentication required):
curl https://api.moussouni.dev/api/v1/healthAdmin test endpoint (requires login):
POST /admin/health-check/test
X-CSRF-Token: [token]Both endpoints return identical multilingual health data.
- Login to
/admin - Go to API Management β API Clients
- Create new client with:
- Name (e.g., "Mobile App", "Web Dashboard")
- Type (MOBILE, WEB, PARTNER, INTERNAL)
- Contact info
- Rate limit (default: 60 req/min)
- Allowed origins (CORS)
- Save client
- Go to API Keys tab
- Create API key - Copy it immediately (won't be shown again)
See CLIENTS.md for detailed client management documentation.
api-manager/
βββ app/
β βββ Enums/ # Application enums
β βββ Filament/ # Filament admin resources
β β βββ Pages/ # Custom pages
β β βββ Resources/ # CRUD resources
β βββ Http/
β β βββ Controllers/
β β β βββ Api/ # API controllers
β β β βββ DocsController.php # Documentation
β β βββ Middleware/ # Authentication, CORS, rate limiting
β β βββ Responses/ # Standard API responses
β βββ Models/ # Eloquent models
β βββ Modules/
β β βββ Promo/ # Promo module
β βββ Services/ # Business logic
β βββ Observers/ # Model observers
β βββ Providers/ # Service providers
β
βββ config/
β βββ api.php # API configuration
β
βββ database/
β βββ migrations/ # Database tables
β βββ seeders/ # Database seeders
β
βββ routes/
β βββ api.php # API route definitions
β βββ api/
β β βββ v1.php # API v1 routes
β βββ web.php # Web routes
β
βββ resources/
β βββ views/
β β βββ docs/ # Documentation views
β β βββ home.blade.php # Homepage
β βββ css/ # Stylesheets
β
βββ docs/ # Markdown documentation
β βββ API.md # API reference
β βββ DATABASE.md # Database schema
β βββ DEPLOYMENT.md # Deployment guide
β βββ CLIENTS.md # Client management
β βββ PROMOS.md # Promotions system
β
βββ public/ # Web server root
βββ storage/ # Logs, cache, uploads
βββ .env.example # Environment template
βββ artisan # Laravel CLI
βββ composer.json # PHP dependencies
To create a new API module:
-
Create module structure:
mkdir -p app/Modules/YourModule/Http/Controllers
-
Create controller:
// app/Modules/YourModule/Http/Controllers/YourController.php namespace App\Modules\YourModule\Http\Controllers; use App\Http\Responses\ApiResponse; class YourController { public function index() { return ApiResponse::success([ 'message' => 'Hello from YourModule' ]); } }
-
Create routes file:
// routes/api/modules/yourmodule.php Route::get('/your-endpoint', [\App\Modules\YourModule\Http\Controllers\YourController::class, 'index']);
-
Include in v1 routes:
// routes/api/v1.php require __DIR__ . '/modules/yourmodule.php';
Automatic Benefits:
- β API key authentication
- β CORS validation
- β Rate limiting
- β Request logging
- β Standard error handling
The system uses 8 interconnected tables:
βββββββββββββββββββββββββββββββββββββββββββββββ
β users β
βββββββββββββββββββββββββββββββββββββββββββββββ€
β - Admin user management β
β - Password stored as bcrypt hash β
ββββββββββββ¬βββββββββββββββββββββββββββββββββββ
β
ββββ api_clients βββββββββββββββββββββββ
β β
ββββ promos βββββββββββββββ β
β β β
ββββ promo_versions ββ promo_events
ββ api_keys βββββ¬βββ api_request_logs
β
ββ documentation_settings
For detailed schema information, see DATABASE.md
# 1. Clone from GitHub
git clone https://github.com/fay019/api-manager.git
cd api-manager
# 2. Install dependencies (production mode)
composer install --no-dev --optimize-autoloader
# 3. Configure environment
cp .env.example .env
nano .env # Set DB_CONNECTION=mysql, DB_HOST, etc.
# 4. Run installation
php artisan install --force --skip-seeds=dev
# 5. Optimize for production
php artisan optimize
php artisan config:cache
php artisan route:cache
php artisan view:cache
# 6. Set permissions
chmod -R 755 storage bootstrap/cache
chown -R www-data:www-data .For complete deployment guide to shared hosting:
See DEPLOYMENT.md for:
- β PHP requirements verification
- β Database setup & configuration
- β Environment configuration
- β File permissions
- β HTTPS & security hardening
- β Cron jobs setup
- β Monitoring & logging
- β Troubleshooting
# Before pushing to production:
- [ ] PHP 8.2+ with all extensions
- [ ] Database created and accessible
- [ ] .env configured for production
- [ ] php artisan install --force completed
- [ ] Storage permissions: chmod -R 755 storage bootstrap/cache
- [ ] Cron job configured (runs every minute)
- [ ] HTTPS enabled
- [ ] Admin password changed
- [ ] APP_DEBUG = false
- [ ] APP_ENV = productionFROM php:8.2-fpm
RUN docker-php-ext-install bcmath json pdo pdo_mysql
COPY . /var/www/html
WORKDIR /var/www/html
RUN composer install --no-dev --optimize-autoloader
RUN php artisan install --force
RUN chown -R www-data:www-data /var/www/html/storage
EXPOSE 9000If Laravel encounters an error during installation or operation, a static maintenance page is available:
URL: https://your-domain.com/maintenance.html
This page works independently of Laravel and provides:
- β Confirmation that the domain is accessible
- βΉοΈ Current server time and status
- π Link to installation wizard (
/setup) - π Troubleshooting steps
- πΎ Common solutions (cache clear, permissions, etc.)
- π Auto-refreshes every 10 seconds to detect recovery
The application prepares itself automatically on first request:
1. In public/index.php (BEFORE Laravel loads):
- β
Creates required directories (
storage/,bootstrap/cache/, etc.) - β
Creates
.envfile from.env.exampleif missing - Eliminates "No environment file" and "Permission denied" errors
2. In middleware EnsureDatabaseExists (BEFORE session loading):
- β Creates SQLite file if chosen database type
- β Creates sessions table automatically
- Prevents "Sessions table not found" errors
These protections run before Laravel's configuration loads, ensuring the application is ready for anything.
Result: Zero 500 errors on first deployment! β
- First deployment: Domain works but Laravel not yet configured
- 500 errors: Shows that web server is fine, Laravel has issues
- Installation failures: Guides user through troubleshooting
- Maintenance mode: Can be manually activated if needed
See TROUBLESHOOTING.md for detailed error recovery procedures.
| Document | Purpose |
|---|---|
| AUTH.md | π Public authentication, user management, profiles |
| MULTILINGUAL.md | Internationalization (i18n) with FR, EN, DE |
| TROUBLESHOOTING.md | Common issues, debugging, error solutions |
| INSTALLATION.md | Complete installation guide, deployment, troubleshooting |
| MODULE_CREATION.md | Create custom modules (tutorial + examples) |
| API.md | Complete API reference with endpoints, authentication, examples |
| DATABASE.md | Database schema, relationships, migrations, queries |
| DEPLOYMENT.md | Production deployment guide for shared hosting |
| CLIENTS.md | API client management and configuration |
| PROMOS.md | Promotional banners system |
| ANALYTICS.md | API analytics, monitoring, request logs |
- In Application: Visit
/docsin your browser - In Admin Panel: Settings β Documentation Settings (manage visibility)
- View Raw: Check
/docs/directory for markdown files
| Security Feature | Implementation |
|---|---|
| API Key Hashing | Bcrypt hashing - raw keys shown only once |
| Data Privacy | Session ID, IP, User-Agent hashed with SHA256 |
| CORS Protection | Per-client origin whitelist validation |
| Rate Limiting | Per-client rate limits (configurable, default 60 req/min) |
| Request Logging | Complete audit trail for security monitoring |
| Input Validation | All endpoints validate input before processing |
| HTTPS | SSL/TLS enforcement for all API calls |
| Admin Access | Protected admin panel with login required |
Track everything from the admin panel:
- Request Logs: Filter by client, method, status, date range
- API Clients: Monitor active clients and their usage
- API Keys: Track key lifecycle (active, expired, revoked, scheduled)
- Promo Analytics: Monitor banner impressions, clicks, dismissals
- Error Tracking: Identify and troubleshoot failed requests
# Prune old request logs (default: 90 days)
php artisan api:prune-logs --days=90
# Prune old promo events (default: 180 days)
php artisan promo:prune-events --days=180
# View application logs
tail -f storage/logs/laravel.logEdit config/api.php:
return [
// Default rate limit (requests per minute)
'default_rate_limit' => env('API_DEFAULT_RATE_LIMIT', 60),
// Public request rate limit (per IP)
'unauth_rate_limit' => env('API_UNAUTH_RATE_LIMIT', 10),
// Promo cache duration (seconds)
'promo_cache_ttl' => env('PROMO_CACHE_TTL', 3600),
// Request log retention (days)
'log_retention_days' => env('API_LOG_RETENTION_DAYS', 90),
];Key .env variables:
# Application
APP_NAME="API Manager"
APP_ENV=production
APP_DEBUG=false
APP_URL=https://api.example.com
# Database
DB_CONNECTION=mysql
DB_HOST=localhost
DB_DATABASE=api_manager
DB_USERNAME=user
DB_PASSWORD=password
# API Configuration
API_DEFAULT_RATE_LIMIT=60
API_UNAUTH_RATE_LIMIT=10
PROMO_CACHE_TTL=3600
API_LOG_RETENTION_DAYS=90
PROMO_EVENT_RETENTION_DAYS=180For detailed troubleshooting guides, see: TROUBLESHOOTING.md
That document covers:
- β 500 errors and Laravel crashes
- β Database connection issues
- β Permission problems
- β Installation failures
- β API issues (401, 429, etc.)
- β Server configuration (Nginx, Apache)
- β Debugging with logs and commands
500 Error on Admin Panel
# Clear cache
php artisan config:clear
php artisan cache:clear
# Verify permissions
chmod -R 755 storage bootstrap/cacheAPI Endpoints Return 404
# Clear and recache routes
php artisan route:clear
php artisan route:cacheDatabase Connection Error
# Verify .env configuration
grep DB_ .env
# Test connection
php artisan tinker
>>> DB::connection()->getPdo();Domain works but getting 500 error?
β Visit https://your-domain.com/maintenance.html for guided troubleshooting
Private - Internal use only
The application includes custom error pages that provide clear, multilingual information when something goes wrong:
| Error Code | Page | What It Shows |
|---|---|---|
| 500 | Server Error | Recent logs when APP_DEBUG=true |
| 404 | Not Found | Page doesn't exist |
| 403 | Forbidden | Permission denied |
| 401 | Unauthorized | Authentication required |
| 419 | Session Expired | CSRF token expired |
| 503 | Service Unavailable | Application in maintenance |
Features:
- β Gradient header background (dark mode compatible)
- β
Two navigation buttons:
- "β Back to Home" - Returns to homepage (
/) - "β Previous Page" - Returns to previous page
- "β Back to Home" - Returns to homepage (
- β Fully translated in FR, EN, DE
- β Responsive design (mobile & desktop)
- β Dark mode support with proper contrast
To see detailed error information and logs in the browser:
# In .env file
APP_DEBUG=trueWhen enabled:
- β Error pages display the last 20 log entries
- β Shows exception class, message, file, and line number
- β Displays request URL, method, and user information
- β Links to the complete log file
Important: Disable in production:
# In .env file
APP_DEBUG=falseReal-time logs:
tail -f storage/logs/laravel.logLast 50 lines:
tail -50 storage/logs/laravel.logSearch for errors:
grep -i "error" storage/logs/laravel.log
grep -i "exception" storage/logs/laravel.log| Issue | Solution |
|---|---|
| 500 error on first visit | Enable APP_DEBUG=true to see details in error page |
| Logs not showing | Check file permissions: chmod 666 storage/logs/laravel.log |
| Page keeps redirecting | Check if already installed: storage/app/installed.lock exists |
| Database connection error | Verify DB_* values in .env or check /admin/manage-app-settings |
- Enable Debug Mode - Set
APP_DEBUG=truein .env to see detailed errors - Check Error Pages - Visit the page that errors to see logs in browser
- Review Application Logs -
tail -f storage/logs/laravel.log - Check Documentation - See relevant documentation files above
- Check Admin Panel - Review detailed error messages in
/admin - Contact Administrator - Reach out for production support
- GitHub Repository: fay019/api-manager
- Clone:
git clone https://github.com/fay019/api-manager.git - Issues & Bugs: GitHub Issues
- Start Installation:
php artisan install
| Metric | Value |
|---|---|
| Version | 1.0.0 |
| Framework | Laravel 12 |
| Admin Panel | Filament v5 |
| PHP Minimum | 8.2 |
| Database | MySQL 5.7+ / SQLite |
| Installation Steps | 9 (automated) |
| Installation Time | < 2 minutes |
| Modules | Promo (built-in) + Custom |
| Commands | 50+ Artisan commands |
Last Updated: 2026-04-12 Installation System: v1.1.0 (Modular, Idempotent, Auto-Discovery) Authentication System: v2.0.0 (Public + Admin, Full i18n, Dark Mode) Health Check System: v2.1.0 (9 Checks, Full i18n, AJAX Testing) Status: β Production Ready
-
Complete Health Check Translations (v2.1.0)
- β All 9 health check messages now translated (FR, EN, DE)
- β Cache, logs, disk space, storage, mail, database, PHP extensions, API response time
- β Configuration validation with dynamic environment variables
- β AJAX test button (no page refresh) with real-time results display
- β Full multilingual support in admin panel and public API
-
Health Check API Improvements (v2.1.0)
- β
Refactored
checkEnvironmentVariables()to useconfig()instead ofenv() - β
Better compatibility with
php artisan optimizecaching - β Database column migrations for 5 new health checks
- β Configurable per-check toggles in admin panel
- β
Refactored
-
Public Authentication System (v1.0)
- Public login page at
/login(separate from Filament admin) - User profile management at
/profile(name, email, password change) - Automatic role-based redirects (admins β
/admin, users β/profile)
- Public login page at
-
Filament User Management Resource (v1.0)
- Create, read, update, delete users from admin panel
- Password hashing with bcrypt (secure, never stored plain)
- Admin role assignment
- User creation/update timestamps
-
Complete Dark Mode Support (v1.0)
- All pages now support dark mode (login, profile, home, errors)
- Automatic detection of browser preference
- Manual toggle via theme switcher button
- Persistent theme preference in
localStorage - No white flash on page load
-
i18n Translations for Auth (v1.0)
- Complete
auth.phptranslation files (FR, EN, DE) - Login page fully translated
- Profile page fully translated
- Password change validation messages
- Complete
-
Error Page Button Improvements (v1.0)
- Separated "Back to Home" vs "Previous Page" buttons
- Both buttons with separate translation keys
- Proper routing:
url('/')vsurl()->previous() - All error pages (401, 403, 404, 419, 500, 503) updated
- Dark mode CSS visibility issues
- Login/profile header backgrounds in dark mode
- Button styling contrast in dark mode
- Error page button messages (no longer identical)
- Unicode quote issues in footer translations
- Footer CSS isolation (prevented cross-page styling issues)
- README.md: Added User Management and Dark Mode sections
- MULTILINGUAL.md: Added auth.php section with key examples
- Updated translation keys documentation