Northwestern Laravel UI
- Custom User Experiences
- Public-facing Content & Landing Pages
- Official Branded Pages
- Complex Custom Workflows
Trade-offs
- More Development Time
- Manual building of forms/tables
The starter is architected with two separate and distinct UI stacks. This dual-stack approach is optimized to deliver the best experience for different audiences and use cases: a custom, branded stack for users, and a rapid administration panel for staff/developers.
This stack is dedicated to creating a cohesive, branded experience for end-users and the public.
Repository: Northwestern Laravel UI
Example: The application’s default home page (
/) is built entirely with this stack.
Filament is a rapid application development framework built on Livewire and Tailwind. The starter ships with a single Administration panel for back-end staff tooling, but Filament is not limited to admin use — it is equally suited for authenticated, data-driven user experiences like portals, dashboards, and self-service tools.
Framework: Filament
/administration (requires authentication and specific permissions). Additional panels can be created on separate routes.The choice between stacks depends entirely on the audience and the required level of customization.
Northwestern Laravel UI
Filament
Filament’s power lies in its structure based on Panels and Resources.
A Panel is a discrete, isolated area of the site with its own navigation, set of resources, and pages.
Example: Everything under
/administrationis driven by theAdministrationPanelProvider.
When adding a new Panel, the ID is critical for authorization:
class AdministrationPanelProvider extends PanelProvider{ public const string ID = 'administration';
public function panel(Panel $panel): Panel { return $panel ->default() ->id(self::ID) // . . . }}The initial access check for the entire panel is determined by the User::canAccessPanel() method, which uses this ID constant to execute the appropriate permission check.
Filament adapts Eloquent Models to its system using Resources. This is where the configuration for the tables, filters, and CRUD screens resides.
To ensure correct mapping to the application’s domain structure, you must specify the model namespace when generating a resource:
php artisan make:filament-resource User --generate --model-namespace=App\\Domains\\User\\ModelsThe --generate flag is highly recommended as it uses model introspection to create reasonable defaults for forms and columns.
To facilitate relationships between resources (e.g., users belonging to a role), you use Relation Managers. You must specify the related model’s full path:
# Example: Generating a manager for the Role::users() relationshipphp artisan make:filament-relation-manager --related-model=App\\Domains\\User\\Models\\User --attach Role users username