Customizing Filament For User-Facing Apps
In this series, we'll build a real, user-facing app called Booknest using Laravel and Filament. We'll begin with a fresh install and begin pushing Filament beyond the usual "internal admin only" setup that you typically see. It's capable of so much more.
Progress
Series Info
- Episodes
- 14
- Run Time
- 2h 53m
- Difficulty
- Intermediate
- Last Updated
- Mar 4, 2026
- Version
- Latest
Series Episodes
- Setup and Foundation (4)
Welcome to Booknest
In this series, we'll takeFilamentbeyond the usual internal admin dashboard and shape it into a real, user-facing app calledBooknest. We'll kick things off with a freshLaravelinstall so we have a clean foundation for the design, layout, and overall experience.Set Up Two Filament Panels
We'll install Filament and set up two panels: one foradminwork and one for app users. Then we'll lock down access, create our firstBookresource with a policy, and seed realistic data so we have something solid to build on.Make It Yours with Branding and Themes
With our panels and book resource in place, it's time to make Filament feel like our app. We'll customize branding, colors, fonts, and dark mode support, refactor shared panel config into aBasePanelProvider, and generate a theme withphp artisan make:filament-themefor clean, future-proof styling.Style the Book Listing
In the app panel, we need a clean way for readers to browse books. We'll generate a newBookresource and trim it down to a simple, read-only listing, then improve the layout withSplit,Stack, responsive grids, and a customview()when built-in columns aren't enough.
- Core Features (6)
Track Requests, Borrows, and Returns
Now we'll build the heart of the app: tracking requests and reading activity with a many-to-many relationship, a pivot table, and aBookUserpivot model. Then we'll create aFilamentresource scoped to the signed-in user, complete with tabs, badges, and a few UI touches to make it feel just right.Add Ratings and Status Badges
Let's enrich our book cards with an average rating—without running inton+1issues—and render it as stars with a custom table column. Then we'll eager load the current borrow status withwith(), derive state withstate(), and display it as a clean, colored badge.Build Helpful Table Actions
We'll add custom actions to our Filament tables withrecordActions()so users can request books, cancel requests, and start a return with a quick feedback form. Along the way, we'll polish the UI withbutton(),outline(), andvisible()so actions only appear when they make sense.Polish UX with Better Notifications
Let's upgrade our notifications so they feel tailored to the app, not generic defaults. We'll improve the success and error copy, set global positioning inAppServiceProvider, and create richer notifications withNotification::make(), actions, andpersistent().Create a Star Rating Form Field
Instead of a boringselect, we'll build a customratingform field that lets users leave a star rating. We'll scaffold it withphp artisan make:filament-form-field, hook it up with Livewire and Alpine usingstateandgetStatePath(), and style the interactions with Tailwind.Redesign the Book Detail Page
The default view page is fine to start, but we want a proper book detail screen. We'll reshape theInfolistwithSectionandGrid, add a customRatingentry, include actions and reviews withRepeatableEntry, and clean up the title and heading so everything reads nicely.
- Polishing (4)
Refine the Sidebar Navigation
With the core functionality in place, it's time to make navigation feel intentional. We'll adjust sidebar width, labels, slugs, icons, and navigation groups in our panel providers, then add small touches like badges anddispatch('refresh-sidebar')to keep everything in sync.Style Filament with CSS Hooks
Now we'll lean on Filament's CSS hooks and theFi-*classes in the markup to style the app with confidence. We'll work from our theme file, inspect elements as we go, and use Tailwind@apply(plus a bit of custom CSS) to refine the sidebar, tables, and tabs.Build a Dashboard with Widgets
Let's turn our blank dashboard into something useful with widgets powered by real reading stats. We'll start with aStatsOverviewWidget, then create custom Livewire widgets and a customDashboardpage so we can control ordering, columns, andcolumnSpan.Customize the Login Page with Render Hooks
We'll finish by giving the login screen a polished, on-brand look using Filamentrender hooks. We'll register a hook inAppServiceProvider, inject a bit of Blade, and load a dedicatedlogin.cssvia@viteto style the page properly.
