Setting up a new project has always been a real hassle for me: configuring tools, setting up linting, installing packages, and—more importantly—making it collaborative.
That’s why I decided to create a reusable boilerplate that lets you scaffold a project quickly, with almost zero configuration, thanks to the power of Docker and a few Make commands.
While the boilerplate is opinionated in terms of tooling, project structure, and code conventions, I hope you’ll still find useful ideas or inspiration within it.
- 🐳 Docker-first development setup (Laravel, Hybridly, Node, Redis, Mailpit, RustFS, Traefik)
- ⚡ One-liner setup via make install
- 🧪 Preconfigured .env and .env.testing environments
- 🔏 SSL certificates with mkcert + .test TLD with local DNS resolver
- 🛠️ Built-in support for Husky Git hooks
- 📦 Modern stack (Pnpm, Tailwind CSS, Laravel, Hybridly, Nuxt UI, etc.)
- ✨ Code linting and formatting preconfigured (ESLint, Pint, etc.)
- 🔎 Robust types enforcement (Vue-TSC, PHPStan, Laravel Typescript-Transformer)
- 🥦 Taze: modern CLI tool to keep front-end dependencies up-to-date
- 📱 Fully responsive
- 🌓 Light & Dark Mode
- 🎨 Dynamic logo & favicon derived from APP_NAME and theme color
This project follows a modular monolith architecture where each module is self-contained with its own routes, controllers, models, views, migrations, and tests.
┌─────────────────────────────────────────────────────────────────┐
│ CORE │
│ Base classes, enums, middleware, UI components │
│ Can be imported by ALL modules │
└─────────────────────────────────────────────────────────────────┘
▲
┌─────────────────────────────┴───────────────────────────────────┐
│ DATATABLES │
│ Reusable table infrastructure │
│ Can be imported by ALL modules │
└─────────────────────────────────────────────────────────────────┘
▲
┌─────────────────────────────┴───────────────────────────────────┐
│ USERS │
│ Model + Data can be imported by feature modules │
│ Actions/Services stay encapsulated within module │
└─────────────────────────────────────────────────────────────────┘
▲
┌─────────────────────┼─────────────────────┐
│ │ │
┌───────┴───────┐ ┌───────┴───────┐ ┌───────┴───────┐
│AUTHENTICATION │ │ MENUS │ │ [YOUR NEW │
│ │ │ │ │ MODULE] │
│Feature Module │ │Feature Module │ │ │
└───────────────┘ └───────────────┘ └───────────────┘
✗ Feature modules should NOT import from each other
| Type | Modules | Can Import From | Can Be Imported By |
|---|---|---|---|
| Foundation | Core | Laravel/Vendor, Users\Data | All modules |
| Infrastructure | Datatables | Core | All modules |
| Domain | Users | Core, Datatables | All (Model/Data only) |
| Feature | Authentication, Menus | Core, Datatables, Users (Model/Data) | None |
Why Hybridly over Inertia?
Hybridly provides tighter Laravel integration with features like automatic TypeScript type generation from PHP, native table support, and a more Laravel-centric API. It bridges Laravel and Vue while maintaining strong typing across the stack.
Why RustFS over MinIO?
MinIO entered maintenance mode in December 2025, with no new features and Docker images removed from public registries. RustFS is a Rust-based, S3-compatible alternative that offers better performance (2.3x throughput for small objects) and active development.
Architecture tests in modules/Core/Tests/Architecture/ enforce these rules at CI time:
# Run architecture tests
./vendor/bin/pest --filter=ArchitectureThese tests will fail if:
- Core imports from any other module
- Feature modules import from each other
- Users Actions are used outside the Users module
- Controllers don't extend the base Controller
- Data objects don't extend Spatie\LaravelData\Data
To run this project, you need to have installed:
Important
You should first read the documentation here to get a good understanding on how docker powers this project.
git clone https://github.com/Jean-Da-Rocha/sassfolding.gitcd sassfolding && make install
Based on the ${COMPOSE_PROJECT_NAME} variable (sassfolding in our case), the installation process will
automatically do the following:
- Create the dedicated .env files, replacing the
${COMPOSE_PROJECT_NAME}variable in those files - Generate SSL certificates for HTTPS
- Configure husky hooks
- Build the docker images
- Install pnpm & composer dependencies
- Generate keys for both .env and .env.testing files
- Define the DNSMASQ_FORWARD_PORT to use based on your operating system
- Configure a DNS resolver based on .test Top-Level Domain (TLD)
- Create the sassfolding and sassfolding_testing databases
- Start the containers in detached mode
You can always run make help in your console to see which commands are available.
Tip
Don’t forget to run make artisan cmd="migrate" to run your migrations and make composer cmd="autocomplete"
to enable autocompletion based on your database structure.
Once the docker containers are running, you can access the following URL:
- https://app.sassfolding.test - The main application
- https://mail.sassfolding.test - The Mailpit dashboard to receive your emails locally
- https://rustfs.sassfolding.test - The RustFS dashboard to manage files, folders and buckets
- https://traefik.sassfolding.test - The Traefik dashboard to view your entrypoints, routes etc.
- Datatables — how to build server-side tables with inline actions, bulk actions, sorting, and more
You're welcome to open issues or pull requests if you find bugs or want to suggest improvements, related to the Docker setup or the Sassfolding app.
