About

It's a standard Laravel 12 application running in a single Docker container (nginx + php-fpm via supervisord). No microservices, no external queue, no cache layer — just Laravel talking to a MySQL database.

Pages are stored as JSON blocks in a pages table. Each page has an ordered array of blocks (hero, text, blog_types, blog_posts), and a Blade view loops through them calling @include("blocks.{type}") for each one. Adding a new block type is just adding a Blade file.

Blog is a posts table with title, slug, content, excerpt, cover_image_url, published_at, and a foreign key to blog_types. Published posts are those where published_at is not null. BlogType is just a category — name, slug, description, image_url. The blog controller handles /blog, /blog/{slug} (single post), and /blog/type/{slug} (filtered by category).

Admin is Filament 4 — it gives you the forms, tables, and CRUD for Pages, Posts, Blog Types, and Media out of the box. No custom admin code beyond defining the resource classes.

Media library is a simple media table storing name, URL, disk, and type. When you pick a background image in the hero block form, it's just a Select pulling from that table. Images are stored in storage/app/public/ and served via a symlink at public/storage.

Seeding handles both demo mode (static posts hardcoded in the seeder) and generated mode (JSON blob passed in via a base64 environment variable, which the seeder decodes and inserts on first boot).