Filament offers something hard to refuse: an admin panel that exists without being built from scratch. The writer has used it across the seven projects in this portfolio, from an ERP with more than twenty resources to a cash book for a small organization. This article summarizes the framework the writer keeps reusing, plus a list of tools worth installing from day one.

The Framework That Stays the Same

Filament sits on top of Livewire and Alpine.js, so almost every admin panel need already exists as a component. What makes projects move fast is not the number of plugins but the structural decisions taken from the start. The writer keeps returning to the same four.

First, one resource is one place of definition: form for input, table for listing, detail for reading. Tams ERP has more than twenty resources and all of them follow the same shape, so the writer can move between screens without re-reading code. Filament generates most of that skeleton itself; what the writer keeps consistent is naming, field order, and validation.

public static function form(Form $form): Form
{
    return $form->schema([
        TextInput::make('code')->required(),
        Select::make('pool_id')->relationship('pool', 'name')->required(),
    ]);
}

Second, permissions are never planted inside the resource. One policy per model, with Filament Shield as the permission generator so the permission list is never typed by hand. In projects with layered approval flows, such as the internal helpdesk and the production ticket ordering system, the question of "allowed or not" is always answered by a policy:

public function approve(User $user, Ticket $ticket): bool
{
    return $user->can('ticket.approve')
        && $ticket->waitingFor($user->division);
}

Third, business logic lives in the service layer, not in form actions. The example the writer uses most in Tams ERP: editing a transaction must also revalidate stock. If that rule sits in the action, it only applies when editing through the panel; once moved to a service, the same flow can be called from data imports, jobs, or migration scripts.

StockRevalidationService::revalidate($transaction);

Fourth, relation managers handle linked transactions: supplier installments per pool in Tams ERP, or ticket modules sharing state with asset modules in the helpdesk. The writer shows a relation on the same resource page only when the relation is actually edited from the parent context. Otherwise the relation's own resource page is enough.

The snippets above use the Filament v4 and v5 API. The code is illustrative, shaped from patterns the writer uses in those projects, not a copy of production code.

Relevant Tools

The list the writer always considers on every new project:

  • Filament Shield (bezhansalleh/filament-shield): permission generator built on spatie/laravel-permission. Policies and permissions fill themselves instead of being typed by hand. This is the RBAC foundation in the helpdesk and the ticket approval system.
  • Auth UI Enhancer (diogogpinto/filament-auth-ui-enhancer): Filament's default login pages look the same everywhere. This plugin reshapes them without writing the auth views by hand.
  • ApexCharts (leandrocfe/filament-apex-charts): chart widgets for the dashboard. The writer uses them for the numbers managers keep asking for: open tickets, weekly trends, summaries that need quick context.
  • Filament Bug Reports (cerealkiller97/filament-bug-reports): non-developer users can report bugs from inside the panel, and validated reports land in GitHub Issues. It replaces the usual "explain it over WhatsApp".
  • Spatie Media Library (filament/spatie-laravel-media-library-plugin): uploads, collections, and image manipulation. Installed as soon as files or galleries are needed.
  • FilaCheck (laraveldaily/filacheck): static analysis for Filament projects. It checks dependencies and deprecated patterns quickly, so old code is caught before it becomes a problem at the next upgrade.
  • Laravel Debugbar (barryvdh/laravel-debugbar): not a Filament plugin, but mandatory when writing a new resource. Its query panel points straight at N+1 queries from missed eager loads, before that code reaches production.

Where the Boundary Is

When should Filament not be used? The lesson came from Saksi Virtual. Its public side is a landing page whose goal is turning visitors into WhatsApp orders, and for that the writer chose React with Inertia on the frontend. Filament only runs the CMS, so the client can change text and images themselves. Filament is an excellent admin tool; forcing it to be a public page only makes that public page look like an admin panel.

Closing

The boilerplate the writer means here is not a starter repo but a habit: uniform resources, policies that hold access, services that hold rules, and tools that come in because there is a need, not because they can be installed. Seven projects run on the same framework and differ only in their data models. That part cannot be boilerplated: the writer still has to sit down and understand the problem first.