Skip to content

Instantly share code, notes, and snippets.

@larsbo
Last active September 12, 2025 07:53
Show Gist options
  • Save larsbo/5bba54b3ce8c7903b3ac96316cbbbf80 to your computer and use it in GitHub Desktop.
Save larsbo/5bba54b3ce8c7903b3ac96316cbbbf80 to your computer and use it in GitHub Desktop.
Laravel 12 + Filament v4 example repo creater
#!/usr/bin/env bash
set -euo pipefail
APP_NAME="${1:-filament-v4-repro}"
rm -rf "${APP_NAME}"
echo "==> Creating Laravel app: ${APP_NAME}"
composer create-project laravel/laravel "${APP_NAME}"
cd "${APP_NAME}"
echo "==> Configure .env for SQLite + APP_URL"
mkdir -p database && touch database/database.sqlite
cp .env .env.backup
php -r '
$env=file_get_contents(".env");
$env=preg_replace("/^DB_CONNECTION=.*/m","DB_CONNECTION=sqlite",$env);
$env=preg_replace("/^DB_HOST=.*/m","DB_HOST=",$env);
$env=preg_replace("/^DB_PORT=.*/m","DB_PORT=",$env);
$env=preg_replace("/^DB_DATABASE=.*/m","DB_DATABASE=" . getcwd() . "/database/database.sqlite",$env);
$env=preg_replace("/^DB_USERNAME=.*/m","DB_USERNAME=",$env);
$env=preg_replace("/^DB_PASSWORD=.*/m","DB_PASSWORD=",$env);
if (!preg_match("/^APP_URL=/m",$env)) { $env .= PHP_EOL."APP_URL=http://127.0.0.1:8000".PHP_EOL; }
file_put_contents(".env",$env);
'
echo "==> Require Filament v4"
composer require filament/filament:"^4.0" -W
echo "==> Run Filament installer (panels)"
php artisan filament:install --panels -n
echo "==> Ensure provider is default() & registered"
P="app/Providers/Filament/AdminPanelProvider.php"
if [ -f "$P" ]; then
php -r '
$p="'$P'";
$s=file_get_contents($p);
if (strpos($s,"->default()")===false) {
$s=preg_replace("/return\\s*\\$panel\\s*\\n\\s*/","return \$panel\n ->default()\n ",$s,1);
file_put_contents($p,$s);
}'
fi
# Laravel 11: Provider wird in bootstrap/providers.php registriert.
if [ -f bootstrap/providers.php ] && ! grep -Fq "AdminPanelProvider::class" bootstrap/providers.php; then
awk 'BEGIN{a=0} /\]\s*;\s*$/ && !a{print " App\\Providers\\Filament\\AdminPanelProvider::class,"; a=1} {print}' bootstrap/providers.php > bp.tmp && mv bp.tmp bootstrap/providers.php
fi
echo "==> Key + migrate"
php artisan key:generate
php artisan migrate -n
echo "==> Create Filament admin user"
php artisan make:filament-user --name="Admin User" --email="[email protected]" --password="password" -n
echo "==> Demo model + resource"
php artisan make:model Post -m -n >/dev/null || true
php artisan make:filament-resource Post --generate --panel=admin -n >/dev/null || true
# simple posts migration if missing
if ! ls database/migrations/*create_posts_table*.php >/dev/null 2>&1; then
NOW=$(date +"%Y_%m_%d_%H%M%S")
cat > "database/migrations/${NOW}_create_posts_table.php" <<'PHP'
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up(): void {
Schema::create('posts', function (Blueprint $table) {
$table->id(); $table->string('title'); $table->text('body')->nullable(); $table->timestamps();
});
}
public function down(): void { Schema::dropIfExists('posts'); }
};
PHP
fi
php artisan migrate -n
echo "==> Clear caches"
php artisan optimize:clear
echo "==> README"
cat > README.md <<'MD'
# Filament v4 Minimal Reproduction
Run:
composer install
php artisan key:generate
touch database/database.sqlite
php artisan migrate
php artisan serve
Open http://127.0.0.1:8000/admin
Login: [email protected] / password
MD
echo "==> Git init (optional)"
git init >/dev/null || true
git add .
git commit -m "Filament v4 installation" >/dev/null || true
cat <<'DONE'
All set.
Start: php artisan serve
Panel: http://127.0.0.1:8000/admin
Login: [email protected] / password
DONE
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment