{"id":"211d9856-0934-4b9b-ba85-9f9746f6a455","shortId":"zvmx4p","kind":"skill","title":"olakunlevpn-filament-skills","tagline":"Use when writing, reviewing, or refactoring Filament PHP v5 code -- resources, forms, tables, infolists, actions, widgets, panels, relation managers, multi-tenancy, testing, or plugin development. Always apply these standards to all Filament work.","description":"# Filament PHP v5 Coding Standards\n\nComprehensive standards for building production-grade Filament v5 admin panels. Filament v5 requires PHP 8.3+, Laravel 13+, Livewire 4+, Tailwind CSS 4.1+. Follow these rules exactly. For detailed code examples, see REFERENCE.md.\n\n## When to Apply\n\nApply to ALL Filament work: resources, forms, tables, infolists, actions, widgets, dashboards, panels, relation managers, imports/exports, custom pages, multi-tenancy, testing, and deployment.\n\n---\n\n## 1. Project Structure\n\n### Directory Layout\n- Domain-grouped, plural-named: `Resources/Shop/`, `Resources/Blog/`, `Resources/HR/`\n- Resources in plural directories: `Resources/Shop/Products/ProductResource.php`\n- Schemas extracted: `Resources/Shop/Products/Schemas/ProductSchema.php`\n- Tables extracted: `Resources/Shop/Products/Tables/ProductsTable.php`\n- Multiple panels: `Providers/Filament/AdminPanelProvider.php`, `AppPanelProvider.php`\n\n### Resource Complexity Tiers\n- **Simple** (ManageRecords) -- modal CRUD, single page, no relation managers\n- **Standard** (List+Create+Edit) -- separate pages, basic CRUD\n- **Full** (List+Create+Edit+View) -- sub-navigation, relation managers, widgets\n\n### Naming Rules\n- Plural resource directories: `Products/`, not `Product/`\n- File names match class names: `ProductResource.php`\n- Slugs kebab-case: `order-items`\n- Namespace matches directory path exactly\n\n---\n\n## 2. Resource Architecture\n\n### Delegation Pattern\nResources delegate to dedicated Schema and Table classes. Keep resource classes slim.\n\n```php\nclass ProductResource extends Resource\n{\n    protected static ?string $model = Product::class;\n    protected static ?string $slug = 'products';\n    protected static ?string $recordTitleAttribute = 'name';\n    protected static string|BackedEnum|null $navigationIcon = Heroicon::OutlinedShoppingBag;\n    protected static ?string $navigationGroup = 'Shop';\n    protected static ?int $navigationSort = 1;\n\n    public static function form(Schema $schema): Schema\n    {\n        return ProductSchema::configure($schema);\n    }\n\n    public static function table(Table $table): Table\n    {\n        return ProductsTable::configure($table);\n    }\n}\n```\n\n### Key Rules\n- Always set `$recordTitleAttribute` for global search\n- Navigation icons: always `Heroicon::Outlined*` (not Solid for nav)\n- Use `Heroicon` enum, never string icon names\n- All actions import from `Filament\\Actions\\*` namespace only\n- Table methods: `recordActions()` not `actions()`, `groupedBulkActions()` not `bulkActions()`\n\n---\n\n## 3. Form Design\n\n- Top-level: `$schema->components([...])` with `Section` wrapping\n- Section from `Filament\\Schemas\\Components\\Section`\n- Layout components (Section, Grid, Tabs, Flex) from `Filament\\Schemas\\Components\\*`\n- Slug fields: `->live(onBlur: true)`, create-only via `Operation::Create`, `->disabled()->dehydrated()`\n- Selects with relationships: always `->searchable()` and `->preload()`\n- File uploads: set `->disk()`, `->directory()`, `->visibility()`\n- Use `Operation` enum for conditional logic: `Operation::Create`, `Operation::Edit`\n- Repeaters for line items with calculated fields\n- Tabs for complex multi-section forms\n- All text labels via language files, never hardcoded\n\n---\n\n## 4. Table Design\n\n- Columns: TextColumn, IconColumn (booleans), BadgeColumn (enums), ImageColumn\n- Toggleable columns: `->toggleable(isToggledHiddenByDefault: true)` for less important columns\n- Filters: SelectFilter, TernaryFilter (boolean), date range via custom filter\n- Actions wrapped in `ActionGroup`: View, Edit, Delete grouped\n- Bulk actions via `groupedBulkActions()`: delete, export, status change\n- Toolbar actions via `toolbarActions()`: create, import, export\n- Default sort: `->defaultSort('created_at', 'desc')`\n- Searchable columns: `->searchable()` on key text columns\n- Money: `->money('USD')` or `->formatStateUsing()` for custom formatting\n\n---\n\n## 5. Infolist (View) Patterns\n\n- Entry types: TextEntry, IconEntry (boolean), ImageEntry, BadgeEntry (enum)\n- Inline labels for compact display: `->inlineLabel()`\n- Rich content: `->prose()->markdown()` for formatted text\n- Tabs for complex view pages\n- Contextual actions on view pages with visibility conditions\n- Key-value entries for metadata\n\n---\n\n## 6. Enum Design System\n\nEvery status/type/category uses a PHP 8.1 backed string enum implementing Filament contracts:\n- `HasLabel` -- display name\n- `HasColor` -- semantic color\n- `HasIcon` -- Heroicon\n\n**Semantic colors:** success (positive), danger (negative), warning (caution), info (new), primary (special), gray (neutral)\n\n**Naming:** PascalCase case names, snake_case backed values. Cast in model: `'status' => OrderStatus::class`\n\n---\n\n## 7. Actions & Notifications\n\n- All actions: `Filament\\Actions\\Action`, `Filament\\Actions\\CreateAction`, etc.\n- Never import from `Filament\\Tables\\Actions\\*` (removed in v5)\n- Action modals use `->schema()` not `->form()`\n- ActionGroup ordering: View, Edit, Delete (most common first)\n- Notifications: `Notification::make()->title()->success()->send()`\n- Refresh after action: `$this->dispatch('$refresh')` or return redirect\n- Bulk actions: `->authorizeIndividualRecords()` for policy-gated bulk operations\n\n---\n\n## 8. Relation Managers\n\n- Standard: extend `RelationManager`, define `form()` and `table()`\n- Alternative: `ManageRelatedRecords` page for complex relations\n- Action placement: `headerActions` (create), `recordActions` (per row), `groupedBulkActions` (selected)\n- Reuse across resources when the same relation appears in multiple places\n- Default sort on related records\n\n---\n\n## 9. Widgets & Dashboards\n\n- **StatsOverview**: multiple stat cards, optional inline charts, descriptions, icons\n- **Chart widgets**: line, bar, doughnut, pie -- extend `ChartWidget`\n- **Lazy loading**: on by default (`$isLazy = true`)\n- **Polling**: default 5s, customize via `$pollingInterval` or `null` to disable\n- **Dashboard filters**: implement `HasFiltersForm` for filterable dashboards\n- **Resource page widgets**: use `ExposesTableToWidgets` trait\n- Widget sort order via `$sort` property\n\n---\n\n## 10. Multi-Tenancy\n\n- Panel: `->tenant(Team::class)` in PanelProvider\n- User model: implement `HasTenants` with `getTenants()` and `canAccessTenant()`\n- Automatic query scoping on all resources (opt-out with `$isScopedToTenant = false`)\n- **CRITICAL**: Form selects are NOT auto-scoped -- add `modifyQueryUsing` with `Filament::getTenant()`\n- Validation: use `->scopedUnique()` and `->scopedExists()` for tenant-aware rules\n- Domain-based: `->tenantDomain('{tenant:slug}.example.com')`\n- Path-based with slug: `->tenant(Team::class, slugAttribute: 'slug')`\n- Registration page: extend `RegisterTenant`\n- Profile page: extend `EditTenantProfile`\n\n---\n\n## 11. Multi-Panel Architecture\n\n- Separate PanelProvider per panel (admin, app, vendor)\n- Each panel: own auth, resources, pages, widgets, middleware, theme\n- `FilamentUser::canAccessPanel()` controls per-panel access\n- Shared config via Plugin class or static helper\n- `Filament::setCurrentPanel('app')` for testing non-default panels\n\n---\n\n## 12. Custom Pages & Clusters\n\n- Custom pages: `php artisan make:filament-page Settings`\n- Access control: `canAccess()` method\n- Header actions, header/footer widgets, widget data passing\n- Clusters: group related pages under sub-navigation\n- `SubNavigationPosition::Top` for horizontal tabs\n- Resource sub-navigation: `getRecordSubNavigation()` for View/Edit/Related pages\n\n---\n\n## 13. Testing (Pest + Livewire)\n\n- Test via `livewire(PageClass::class)` -- pages are Livewire components\n- Auth: `actingAs(User::factory()->create())` in `beforeEach`\n- Multi-tenant: `Filament::setTenant($team)` + `Filament::bootCurrentPanel()`\n- Multi-panel: `Filament::setCurrentPanel('admin')`\n\n**Key test patterns:**\n- List: `->assertCanSeeTableRecords()`, `->searchTable()`, `->sortTable()`, `->filterTable()`\n- Create: `->fillForm([...])->call('create')->assertHasNoFormErrors()->assertNotified()`\n- Edit: `->assertSchemaStateSet([...])->fillForm([...])->call('save')`\n- Actions: `->callAction(TestAction::make('send')->table($record))`\n- Bulk: `->selectTableRecords($ids)->callAction(TestAction::make('delete')->table()->bulk())`\n- Relations: `livewire(RelationManager::class, ['ownerRecord' => $record, 'pageClass' => EditPage::class])`\n\n---\n\n## 14. Import & Export\n\n- Exporter: `ExportColumn` definitions, placed in `app/Filament/Exports/`\n- Importer: `ImportColumn` with rules, examples, casting, relationship resolution\n- Actions: `ExportAction::make()`, `ImportAction::make()` in toolbar\n- Record resolution: `firstOrNew`, `new Model`, or `null` to skip\n\n---\n\n## 15. Authorization\n\n- `FilamentUser` interface required in production (APP_ENV != local)\n- Model policies auto-discovered: `viewAny`, `create`, `update`, `delete`, `restore`, `forceDelete`, `reorder`\n- Skip authorization: `$shouldSkipAuthorization = true`\n- Bulk action authorization: `->authorizeIndividualRecords()`\n- Per-panel access: `canAccessPanel(Panel $panel)` with panel ID check\n\n---\n\n## 16. Performance & Deployment\n\n**Production:**\n```\nphp artisan optimize\nphp artisan filament:optimize\n```\n\n**Panel config:**\n- `->spa()` for SPA mode\n- `->unsavedChangesAlerts()` for data protection\n- `->databaseTransactions()` for action safety\n\n**Widgets:** Lazy by default. Set polling interval or `null` to disable. Use `wire:init` for deferred API loads.\n\n**Never run `filament:optimize` in local dev** -- new components won't be discovered.\n\n**Tailwind v4:** CSS-based config via Vite plugin. No `tailwind.config.js`. Use `@source` directives.\n\n---\n\n## 17. Livewire 4 Features (via Filament v5)\n\n- **Islands**: isolated re-render regions with `@island` directive\n- **Async actions**: `#[Async]` attribute for fire-and-forget (analytics, logging)\n- **wire:model.deep**: required when relying on child element event bubbling\n- **wire:sort**: built-in drag-and-drop without external packages\n- **Parallel requests**: `wire:model.live` no longer blocks\n- **Self-closing tags required**: `<livewire:component />`\n\n---\n\n## 18. Strict Rules\n\n- Never publish Blade views. Use CSS hooks with `fi-` prefix.\n- Never hardcode brand names, logos, currency. Use dynamic settings.\n- All user-facing text through language files and translation keys.\n- `$recordTitleAttribute` set on every resource.\n- Action modals: `->schema()` not `->form()`\n- Table: `recordActions()` not `actions()`, `groupedBulkActions()` not `bulkActions()`\n- Schema: `$schema->components([...])` at top level\n- Icons: `Heroicon::` enum only, never string names\n- Operation: `Operation::Create`, `Operation::Edit`, never string comparisons\n\n## Summary Checklist\n\n- [ ] Resource delegates to Schema and Table classes\n- [ ] `$recordTitleAttribute` set on every resource\n- [ ] `Heroicon::` enum for all icons, `Outlined` for navigation\n- [ ] All actions from `Filament\\Actions\\*` namespace\n- [ ] Table uses `recordActions()`, `groupedBulkActions()`, `toolbarActions()`\n- [ ] Enums implement HasLabel, HasColor, HasIcon with semantic colors\n- [ ] Form selects are searchable and preloaded\n- [ ] Multi-tenant form selects manually scoped to tenant\n- [ ] `FilamentUser` interface implemented with `canAccessPanel()`\n- [ ] Model policies for authorization on every resource\n- [ ] `filament:optimize` in production deploy script\n- [ ] Tests use `livewire()` with `Filament::setTenant()` for multi-tenant\n- [ ] No hardcoded text -- all through language files\n- [ ] No published Blade views -- CSS hooks only","tags":["olakunlevpn","filament","skills","admin-panel","agent-skills","laravel","livewire"],"capabilities":["skill","source-olakunlevpn","skill-olakunlevpn-filament-skills","topic-admin-panel","topic-agent-skills","topic-filament","topic-laravel","topic-livewire"],"categories":["olakunlevpn-filament-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/olakunlevpn/olakunlevpn-filament-skills","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add olakunlevpn/olakunlevpn-filament-skills","source_repo":"https://github.com/olakunlevpn/olakunlevpn-filament-skills","install_from":"skills.sh"}},"qualityScore":"0.454","qualityRationale":"deterministic score 0.45 from registry signals: · indexed on github topic:agent-skills · 8 github stars · SKILL.md body (11,512 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T13:14:46.821Z","embedding":null,"createdAt":"2026-05-18T13:14:46.821Z","updatedAt":"2026-05-18T13:14:46.821Z","lastSeenAt":"2026-05-18T13:14:46.821Z","tsv":"'1':104,245 '10':717 '11':795 '12':840 '13':61,885 '14':963 '15':996 '16':1037 '17':1107 '18':1168 '2':190 '3':308 '4':63,393,1109 '4.1':66 '5':465 '5s':690 '6':509 '7':561 '8':620 '8.1':518 '8.3':59 '9':661 'access':822,853,1029 'across':646 'actinga':899 'action':19,89,293,297,304,421,430,438,496,562,565,567,568,570,578,582,604,612,636,858,938,980,1023,1060,1124,1206,1214,1262,1265 'actiongroup':424,588 'add':755 'admin':53,804,918 'altern':630 'alway':31,270,278,351 'analyt':1132 'api':1078 'app':805,833,1003 'app/filament/exports':971 'appear':652 'appli':32,79,80 'apppanelprovider.php':132 'architectur':192,799 'artisan':847,1042,1045 'assertcanseetablerecord':923 'asserthasnoformerror':931 'assertnotifi':932 'assertschemastateset':934 'async':1123,1125 'attribut':1126 'auth':810,898 'author':997,1019,1024,1303 'authorizeindividualrecord':613,1025 'auto':753,1009 'auto-discov':1008 'auto-scop':752 'automat':735 'awar':768 'back':519,553 'backedenum':231 'badgecolumn':400 'badgeentri':475 'bar':676 'base':772,779,1097 'basic':151 'beforeeach':904 'blade':1173,1332 'block':1162 'boolean':399,415,473 'bootcurrentpanel':912 'brand':1183 'bubbl':1143 'build':47 'built':1147 'built-in':1146 'bulk':429,611,618,945,953,1022 'bulkact':307,1217 'calcul':376 'call':929,936 'callact':939,948 'canaccess':855 'canaccesspanel':817,1030,1299 'canaccessten':734 'card':667 'case':181,549,552 'cast':555,977 'caution':540 'chang':436 'chart':670,673 'chartwidget':680 'check':1036 'checklist':1240 'child':1140 'class':175,202,205,208,217,560,724,784,827,893,957,962,1247 'close':1165 'cluster':843,864 'code':14,42,73 'color':530,534,1279 'column':396,404,411,451,456 'common':594 'compact':480 'comparison':1238 'complex':134,380,492,634 'compon':315,323,326,334,897,1088,1220 'comprehens':44 'condit':365,502 'config':824,1049,1098 'configur':255,266 'content':484 'contextu':495 'contract':524 'control':818,854 'creat':147,155,341,345,368,441,447,639,902,927,930,1012,1233 'create-on':340 'createact':571 'critic':747 'crud':139,152 'css':65,1096,1176,1334 'css-base':1095 'currenc':1186 'custom':96,419,463,691,841,844 'danger':537 'dashboard':91,663,698,704 'data':862,1056 'databasetransact':1058 'date':416 'dedic':198 'default':444,656,685,689,838,1065 'defaultsort':446 'defer':1077 'defin':626 'definit':968 'dehydr':347 'deleg':193,196,1242 'delet':427,433,592,951,1014 'deploy':103,1039,1311 'desc':449 'descript':671 'design':310,395,511 'detail':72 'dev':1086 'develop':30 'direct':1106,1122 'directori':107,121,168,187,359 'disabl':346,697,1072 'discov':1010,1092 'disk':358 'dispatch':606 'display':481,526 'domain':110,771 'domain-bas':770 'domain-group':109 'doughnut':677 'drag':1150 'drag-and-drop':1149 'drop':1152 'dynam':1188 'edit':148,156,370,426,591,933,1235 'editpag':961 'edittenantprofil':794 'element':1141 'entri':469,506 'enum':287,363,401,476,510,521,1226,1254,1272 'env':1004 'etc':572 'event':1142 'everi':513,1204,1251,1305 'exact':70,189 'exampl':74,976 'example.com':776 'export':434,443,965,966 'exportact':981 'exportcolumn':967 'exposestabletowidget':709 'extend':210,624,679,789,793 'extern':1154 'extract':124,127 'face':1193 'factori':901 'fals':746 'featur':1110 'fi':1179 'field':336,377 'filament':3,11,37,39,51,55,83,296,321,332,523,566,569,576,758,831,850,908,911,916,1046,1082,1112,1264,1307,1317 'filament-pag':849 'filamentus':816,998,1295 'file':172,355,390,1197,1329 'fillform':928,935 'filter':412,420,699,703 'filtert':926 'fire':1129 'fire-and-forget':1128 'first':595 'firstornew':989 'flex':330 'follow':67 'forcedelet':1016 'forget':1131 'form':16,86,249,309,384,587,627,748,1210,1280,1289 'format':464,488 'formatstateus':461 'full':153 'function':248,259 'gate':617 'getrecordsubnavig':881 'getten':732,759 'global':274 'grade':50 'gray':545 'grid':328 'group':111,428,865 'groupedbulkact':305,432,643,1215,1270 'hardcod':392,1182,1324 'hascolor':528,1275 'hasfiltersform':701 'hasicon':531,1276 'haslabel':525,1274 'hasten':730 'header':857 'header/footer':859 'headeract':638 'helper':830 'heroicon':234,279,286,532,1225,1253 'hook':1177,1335 'horizont':875 'icon':277,290,672,1224,1257 'iconcolumn':398 'iconentri':472 'id':947,1035 'imagecolumn':402 'imageentri':474 'implement':522,700,729,1273,1297 'import':294,410,442,574,964,972 'importact':983 'importcolumn':973 'imports/exports':95 'info':541 'infolist':18,88,466 'init':1075 'inlin':477,669 'inlinelabel':482 'int':243 'interfac':999,1296 'interv':1068 'island':1114,1121 'islazi':686 'isol':1115 'isscopedtoten':745 'istoggledhiddenbydefault':406 'item':184,374 'kebab':180 'kebab-cas':179 'keep':203 'key':268,454,504,919,1200 'key-valu':503 'label':387,478 'languag':389,1196,1328 'laravel':60 'layout':108,325 'lazi':681,1063 'less':409 'level':313,1223 'line':373,675 'list':146,154,922 'live':337 'livewir':62,888,891,896,955,1108,1315 'load':682,1079 'local':1005,1085 'log':1133 'logic':366 'logo':1185 'longer':1161 'make':598,848,941,950,982,984 'manag':23,94,144,162,622 'managerecord':137 'managerelatedrecord':631 'manual':1291 'markdown':486 'match':174,186 'metadata':508 'method':301,856 'middlewar':814 'modal':138,583,1207 'mode':1053 'model':215,557,728,991,1006,1300 'model.deep':1135 'model.live':1159 'modifyqueryus':756 'money':457,458 'multi':25,99,382,719,797,906,914,1287,1321 'multi-panel':796,913 'multi-sect':381 'multi-ten':24,98,718,905,1286,1320 'multipl':129,654,665 'name':114,164,173,176,227,291,527,547,550,1184,1230 'namespac':185,298,1266 'nav':284 'navig':160,276,871,880,1260 'navigationgroup':239 'navigationicon':233 'navigationsort':244 'negat':538 'neutral':546 'never':288,391,573,1080,1171,1181,1228,1236 'new':542,990,1087 'non':837 'non-default':836 'notif':563,596,597 'null':232,695,993,1070 'olakunlevpn':2 'olakunlevpn-filament-skil':1 'onblur':338 'oper':344,362,367,369,619,1231,1232,1234 'opt':742 'opt-out':741 'optim':1043,1047,1083,1308 'option':668 'order':183,589,713 'order-item':182 'orderstatus':559 'outlin':280,1258 'outlinedshoppingbag':235 'ownerrecord':958 'packag':1155 'page':97,141,150,494,499,632,706,788,792,812,842,845,851,867,884,894 'pageclass':892,960 'panel':21,54,92,130,721,798,803,808,821,839,915,1028,1031,1032,1034,1048 'panelprovid':726,801 'parallel':1156 'pascalcas':548 'pass':863 'path':188,778 'path-bas':777 'pattern':194,468,921 'per':641,802,820,1027 'per-panel':819,1026 'perform':1038 'pest':887 'php':12,40,58,207,517,846,1041,1044 'pie':678 'place':655,969 'placement':637 'plugin':29,826,1101 'plural':113,120,166 'plural-nam':112 'polici':616,1007,1301 'policy-g':615 'poll':688,1067 'pollinginterv':693 'posit':536 'prefix':1180 'preload':354,1285 'primari':543 'product':49,169,171,216,222,1002,1040,1310 'production-grad':48 'productresourc':209 'productresource.php':177 'productschema':254 'productst':265 'profil':791 'project':105 'properti':716 'prose':485 'protect':212,218,223,228,236,241,1057 'providers/filament/adminpanelprovider.php':131 'public':246,257 'publish':1172,1331 'queri':736 'rang':417 're':1117 're-rend':1116 'record':660,944,959,987 'recordact':302,640,1212,1269 'recordtitleattribut':226,272,1201,1248 'redirect':610 'refactor':10 'reference.md':76 'refresh':602,607 'region':1119 'registerten':790 'registr':787 'relat':22,93,143,161,621,635,651,659,866,954 'relationmanag':625,956 'relationship':350,978 'reli':1138 'remov':579 'render':1118 'reorder':1017 'repeat':371 'request':1157 'requir':57,1000,1136,1167 'resolut':979,988 'resourc':15,85,118,133,167,191,195,204,211,647,705,740,811,877,1205,1241,1252,1306 'resources/blog':116 'resources/hr':117 'resources/shop':115 'resources/shop/products/productresource.php':122 'resources/shop/products/schemas/productschema.php':125 'resources/shop/products/tables/productstable.php':128 'restor':1015 'return':253,264,609 'reus':645 'review':8 'rich':483 'row':642 'rule':69,165,269,769,975,1170 'run':1081 'safeti':1061 'save':937 'schema':123,199,250,251,252,256,314,322,333,585,1208,1218,1219,1244 'scope':737,754,1292 'scopedexist':764 'scopeduniqu':762 'script':1312 'search':275 'searchabl':352,450,452,1283 'searchtabl':924 'section':317,319,324,327,383 'see':75 'select':348,644,749,1281,1290 'selectfilt':413 'selecttablerecord':946 'self':1164 'self-clos':1163 'semant':529,533,1278 'send':601,942 'separ':149,800 'set':271,357,852,1066,1189,1202,1249 'setcurrentpanel':832,917 'setten':909,1318 'share':823 'shop':240 'shouldskipauthor':1020 'simpl':136 'singl':140 'skill':4 'skill-olakunlevpn-filament-skills' 'skip':995,1018 'slim':206 'slug':178,221,335,775,781,786 'slugattribut':785 'snake':551 'solid':282 'sort':445,657,712,715,1145 'sorttabl':925 'sourc':1105 'source-olakunlevpn' 'spa':1050,1052 'special':544 'standard':34,43,45,145,623 'stat':666 'static':213,219,224,229,237,242,247,258,829 'statsoverview':664 'status':435,558 'status/type/category':514 'strict':1169 'string':214,220,225,230,238,289,520,1229,1237 'structur':106 'sub':159,870,879 'sub-navig':158,869,878 'subnavigationposit':872 'success':535,600 'summari':1239 'system':512 'tab':329,378,490,876 'tabl':17,87,126,201,260,261,262,263,267,300,394,577,629,943,952,1211,1246,1267 'tag':1166 'tailwind':64,1093 'tailwind.config.js':1103 'team':723,783,910 'tenanc':26,100,720 'tenant':722,767,774,782,907,1288,1294,1322 'tenant-awar':766 'tenantdomain':773 'ternaryfilt':414 'test':27,101,835,886,889,920,1313 'testact':940,949 'text':386,455,489,1194,1325 'textcolumn':397 'textentri':471 'theme':815 'tier':135 'titl':599 'toggleabl':403,405 'toolbar':437,986 'toolbaract':440,1271 'top':312,873,1222 'top-level':311 'topic-admin-panel' 'topic-agent-skills' 'topic-filament' 'topic-laravel' 'topic-livewire' 'trait':710 'translat':1199 'true':339,407,687,1021 'type':470 'unsavedchangesalert':1054 'updat':1013 'upload':356 'usd':459 'use':5,285,361,515,584,708,761,1073,1104,1175,1187,1268,1314 'user':727,900,1192 'user-fac':1191 'v4':1094 'v5':13,41,52,56,581,1113 'valid':760 'valu':505,554 'vendor':806 'via':343,388,418,431,439,692,714,825,890,1099,1111 'view':157,425,467,493,498,590,1174,1333 'view/edit/related':883 'viewani':1011 'visibl':360,501 'vite':1100 'warn':539 'widget':20,90,163,662,674,707,711,813,860,861,1062 'wire':1074,1134,1144,1158 'without':1153 'won':1089 'work':38,84 'wrap':318,422 'write':7","prices":[{"id":"8c1c6193-1d8f-421f-8dda-42673834de54","listingId":"211d9856-0934-4b9b-ba85-9f9746f6a455","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"olakunlevpn","category":"olakunlevpn-filament-skills","install_from":"skills.sh"},"createdAt":"2026-05-18T13:14:46.821Z"}],"sources":[{"listingId":"211d9856-0934-4b9b-ba85-9f9746f6a455","source":"github","sourceId":"olakunlevpn/olakunlevpn-filament-skills","sourceUrl":"https://github.com/olakunlevpn/olakunlevpn-filament-skills","isPrimary":false,"firstSeenAt":"2026-05-18T13:14:46.821Z","lastSeenAt":"2026-05-18T13:14:46.821Z"}],"details":{"listingId":"211d9856-0934-4b9b-ba85-9f9746f6a455","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"olakunlevpn","slug":"olakunlevpn-filament-skills","github":{"repo":"olakunlevpn/olakunlevpn-filament-skills","stars":8,"topics":["admin-panel","agent-skills","filament","laravel","livewire"],"license":"mit","html_url":"https://github.com/olakunlevpn/olakunlevpn-filament-skills","pushed_at":"2026-03-30T09:59:20Z","description":"Filament PHP v5 coding standards agent skill. Resources, forms, tables, multi-tenancy, testing, and 18 areas covered. Works with Claude Code, Cursor, Cline,   Gemini CLI and 40+ AI agents.","skill_md_sha":"93f76e9eebe42915d2f99eaa3e60df8087d0f1d6","skill_md_path":"SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/olakunlevpn/olakunlevpn-filament-skills"},"layout":"root","source":"github","category":"olakunlevpn-filament-skills","frontmatter":{"name":"olakunlevpn-filament-skills","description":"Use when writing, reviewing, or refactoring Filament PHP v5 code -- resources, forms, tables, infolists, actions, widgets, panels, relation managers, multi-tenancy, testing, or plugin development. Always apply these standards to all Filament work."},"skills_sh_url":"https://skills.sh/olakunlevpn/olakunlevpn-filament-skills"},"updatedAt":"2026-05-18T13:14:46.821Z"}}