PHPackages                             harvirsidhu/filament-cards - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Admin Panels](/categories/admin)
4. /
5. harvirsidhu/filament-cards

ActiveLibrary[Admin Panels](/categories/admin)

harvirsidhu/filament-cards
==========================

A Filament-native cards plugin for organizing pages and resources into a card-based navigation hub.

v1.0.8(2mo ago)117.1k↑384.6%2MITPHPPHP ^8.2CI passing

Since Feb 18Pushed 2mo agoCompare

[ Source](https://github.com/harvirsidhu/filament-cards)[ Packagist](https://packagist.org/packages/harvirsidhu/filament-cards)[ Docs](https://github.com/harvirsidhu/filament-cards)[ GitHub Sponsors](https://github.com/:vendor_name)[ RSS](/packages/harvirsidhu-filament-cards/feed)WikiDiscussions 1.x Synced 3d ago

READMEChangelog (9)Dependencies (24)Versions (10)Used By (0)

Filament Cards
==============

[](#filament-cards)

Turn any Filament page into a card-based navigation hub — perfect for **Settings hubs**, **Cluster front pages**, **Resource dashboards**, or any place you want a clean grid of links instead of a sidebar tree.

It feels like part of Filament: same API patterns (`label`, `schema`, `columnSpan`, `visible`/`hidden`), respects your existing navigation config, and auto-discovers Cluster/Resource pages with full authorization checks.

[![Filament Cards screenshot](images/screenshot.png)](images/screenshot.png)

---

Table of Contents
-----------------

[](#table-of-contents)

1. [Why use this?](#why-use-this)
2. [Which approach fits your case?](#which-approach-fits-your-case)
3. [Requirements](#requirements)
4. [Installation](#installation)
5. [60-Second Quick Start](#60-second-quick-start)
6. [Use Case A — Cluster Front Page (most common)](#use-case-a--cluster-front-page-most-common)
7. [Use Case B — Resource Hub](#use-case-b--resource-hub)
8. [Use Case C — Standalone Settings Page](#use-case-c--standalone-settings-page)
9. [API Reference — `CardItem`](#api-reference--carditem)
10. [API Reference — `CardGroup`](#api-reference--cardgroup)
11. [API Reference — `CardsPage` Configuration](#api-reference--cardspage-configuration)
12. [API Reference — Page/Resource Hooks (for auto-discovery)](#api-reference--pageresource-hooks-for-auto-discovery)
13. [Advanced — Dynamic Registration](#advanced--dynamic-registration)
14. [Advanced — Custom Discovery Filtering](#advanced--custom-discovery-filtering)
15. [Full Example](#full-example)
16. [Optional — Plugin Registration](#optional--plugin-registration)
17. [License](#license)

---

Why use this?
-------------

[](#why-use-this)

FeatureWhat it gives you**Auto-discovery**Reads pages/resources in a Cluster (or Resource) and creates cards automatically — no manual list to maintain.**Filament-native API**`label`, `description`, `schema`, `visible`, `hidden`, `columnSpan` — same patterns you already use.**Authorization-aware**Calls `canAccess()` on each component before rendering.**Grouping &amp; layout**`CardGroup`, columns, spans, compact mode, collapsible sections.**Flexible visibility**Per-card or per-page hooks; central exclude lists; closure-based conditions.**Manual + discovered**Mix auto-discovered cards with hand-crafted ones (e.g., external links).**Dynamic registration**Add cards from service providers — useful for modular apps and packages.**Client-side search**Optional live search that filters by label, description, badge, and custom keywords.Which approach fits your case?
------------------------------

[](#which-approach-fits-your-case)

Your situationUse thisYou have a **Cluster** with several pages and want a landing page[Cluster Front Page](#use-case-a--cluster-front-page-most-common)You have a **Resource** with many custom pages[Resource Hub](#use-case-b--resource-hub)You just want a generic **settings/control panel** with manual cards[Standalone Page](#use-case-c--standalone-settings-page)You want to **add cards from a package or module**[Dynamic Registration](#advanced--dynamic-registration)---

Requirements
------------

[](#requirements)

- PHP **8.2+**
- Laravel **11+**
- Filament **v4 or v5**

Installation
------------

[](#installation)

Install the package via Composer:

```
composer require harvirsidhu/filament-cards
```

### Theme setup (required for styling)

[](#theme-setup-required-for-styling)

The plugin uses Tailwind classes, so add its views to your Filament theme so Tailwind picks them up.

In your `theme.css`, add:

```
@source '../../../../vendor/harvirsidhu/filament-cards/resources/views';
```

Then rebuild assets:

```
npm run build
```

---

60-Second Quick Start
---------------------

[](#60-second-quick-start)

The smallest possible cards page:

```
namespace App\Filament\Pages;

use Harvirsidhu\FilamentCards\CardItem;
use Harvirsidhu\FilamentCards\Filament\Pages\CardsPage;

class ControlPanel extends CardsPage
{
    protected static ?string $navigationIcon = 'heroicon-o-squares-2x2';

    protected static function getCards(): array
    {
        return [
            CardItem::make(CompanySettings::class),
            CardItem::make(BillingSettings::class),
        ];
    }
}
```

That's it — Filament will pick up your new page, and clicking each card navigates to the linked page.

---

Use Case A — Cluster Front Page (most common)
---------------------------------------------

[](#use-case-a--cluster-front-page-most-common)

The most powerful pattern: a CardsPage that **automatically lists every page and resource in its Cluster**.

### Step 1 — Define the Cluster

[](#step-1--define-the-cluster)

```
namespace App\Filament\Clusters;

use Filament\Clusters\Cluster;

class Settings extends Cluster
{
    protected static ?string $navigationIcon = 'heroicon-o-cog-8-tooth';
}
```

### Step 2 — Create the front-page CardsPage

[](#step-2--create-the-front-page-cardspage)

```
namespace App\Filament\Clusters\Settings\Pages;

use App\Filament\Clusters\Settings;
use Harvirsidhu\FilamentCards\Filament\Pages\CardsPage;

class SettingsHub extends CardsPage
{
    protected static ?string $cluster = Settings::class;
    protected static ?int $navigationSort = -1; // Show first in the cluster

    protected static function getCards(): array
    {
        return static::discoverClusterCards();
    }
}
```

### Step 3 — Your other Cluster pages need no changes

[](#step-3--your-other-cluster-pages-need-no-changes)

Your existing pages just work. To add a description on the card, add a single property:

```
class CompanySettings extends Page
{
    protected static ?string $cluster = Settings::class;
    protected static ?string $navigationIcon = 'heroicon-o-building-office';

    public static ?string $navigationDescription = 'Manage company name, address, and branding.';
}
```

Breadcrumbs (`Dashboard > Settings > Company Settings`) work automatically.

### What `discoverClusterCards()` does

[](#what-discoverclustercards-does)

In order, for every component registered to the Cluster:

1. Skips the CardsPage itself.
2. Calls `canAccess()` (respects authorization).
3. Checks `showInFilamentCards()` / `$showInFilamentCards` — falls back to `shouldRegisterNavigation()`.
4. Reads `$navigationLabel`, `$navigationIcon`, and the resolved URL.
5. Reads `getNavigationBadge()` / `getNavigationBadgeColor()` if defined.
6. Reads `$navigationDescription` (or `getNavigationDescription()`) if defined.
7. Groups by `getFilamentCardsGroup()` / `$filamentCardsGroup` — falls back to `$navigationGroup`.
8. Sorts each group by `$navigationSort`.

### Hiding a card from auto-discovery

[](#hiding-a-card-from-auto-discovery)

**Option 1 — on the Page/Resource (recommended):**

```
class InternalToolsPage extends Page
{
    public static function showInFilamentCards(): bool
    {
        return false;
    }
}

// or as a property
class AuditLogsResource extends Resource
{
    public static bool $showInFilamentCards = false;
}
```

**To force-show a page that's hidden from the sidebar:**

```
class HiddenFromSidebarPage extends Page
{
    public static function shouldRegisterNavigation(): bool
    {
        return false;
    }

    public static function showInFilamentCards(): bool
    {
        return true;
    }
}
```

**Option 2 — central exclude list on the CardsPage:**

```
class SettingsHub extends CardsPage
{
    protected static array $excludedClusterComponents = [
        AuditLogsResource::class,
        InternalToolsPage::class,
    ];
}
```

### Custom group name (different from the sidebar)

[](#custom-group-name-different-from-the-sidebar)

```
class CompanySettings extends Page
{
    public static function getFilamentCardsGroup(): ?string
    {
        return 'Business Settings';
    }
}

// or property form
class BillingResource extends Resource
{
    public static ?string $filamentCardsGroup = 'Finance';
}
```

### Mixing discovered cards with manual ones

[](#mixing-discovered-cards-with-manual-ones)

```
protected static function getCards(): array
{
    return [
        ...static::discoverClusterCards(),

        CardGroup::make('External Links')
            ->schema([
                CardItem::make('https://docs.example.com')
                    ->label('Documentation')
                    ->icon('heroicon-o-book-open')
                    ->openUrlInNewTab(),
            ]),
    ];
}
```

---

Use Case B — Resource Hub
-------------------------

[](#use-case-b--resource-hub)

When a Resource has many custom pages, use `discoverResourceCards()` to auto-create a card for each:

```
namespace App\Filament\Resources\UserResource\Pages;

use App\Filament\Resources\UserResource;
use Harvirsidhu\FilamentCards\Filament\Pages\CardsPage;

class UserSettingsHub extends CardsPage
{
    protected static string $resource = UserResource::class;

    protected static function getCards(): array
    {
        return static::discoverResourceCards();
    }
}
```

Same hooks (`showInFilamentCards`, `$navigationDescription`, etc.) work here. To exclude specific pages:

```
protected static array $excludedResourcePages = [
    UserResource\Pages\DangerZone::class,
];
```

---

Use Case C — Standalone Settings Page
-------------------------------------

[](#use-case-c--standalone-settings-page)

No Cluster, no Resource — just a manually-curated cards page:

```
use Harvirsidhu\FilamentCards\CardGroup;
use Harvirsidhu\FilamentCards\CardItem;
use Harvirsidhu\FilamentCards\Filament\Pages\CardsPage;

class ControlPanel extends CardsPage
{
    protected static ?string $navigationIcon = 'heroicon-o-squares-2x2';

    protected static function getCards(): array
    {
        return [
            CardGroup::make('General')
                ->icon('heroicon-o-cog')
                ->description('Core settings')
                ->schema([
                    CardItem::make(CompanySettings::class)->color('primary'),
                    CardItem::make(BillingSettings::class)->color('success'),
                ]),

            CardItem::make('/external/docs')
                ->label('Documentation')
                ->icon('heroicon-o-document-text')
                ->openUrlInNewTab(),
        ];
    }
}
```

---

API Reference — `CardItem`
--------------------------

[](#api-reference--carditem)

`CardItem` represents a single clickable card. Pass a Filament Page class, Resource class, or a URL string:

```
CardItem::make(CompanySettings::class)  // Filament Page
CardItem::make(UserResource::class)     // Filament Resource
CardItem::make('/custom/path')          // Internal URL
CardItem::make('https://example.com')   // External URL
```

When given a Page/Resource class, the card auto-resolves `label`, `icon`, `badge`, `badgeColor`, and `url` from the class's navigation properties.

### Method overview

[](#method-overview)

MethodPurpose[`label()`](#label)Override the card title[`description()`](#description)Subtitle below the title[`badge()`](#badge--badgecolor)Right-aligned badge[`badgeColor()`](#badge--badgecolor)Badge color[`icon()`](#icon)Override the card icon[`url()` / `openUrlInNewTab()`](#url--openurlinnewtab)Override target URL[`alignment()`](#alignment)Text alignment inside the card[`color()`](#color)Color accent on the card[`visible()` / `hidden()`](#visible--hidden)Conditional rendering[`disabled()`](#disabled)Render but make non-clickable[`sort()`](#sort)Order within a group[`columnSpan()` / `columnSpanFull()`](#columnspan--columnspanfull)Grid span[`searchKeywords()`](#searchkeywords)Extra terms for the search bar[`extraAttributes()`](#extraattributes)Custom HTML attributes### `label()`

[](#label)

Override the card title. Accepts a string or Closure:

```
CardItem::make(CompanySettings::class)
    ->label('Company')

CardItem::make(CompanySettings::class)
    ->label(fn () => __('settings.company'))
```

### `description()`

[](#description)

Add a subtitle below the title:

```
CardItem::make(CompanySettings::class)
    ->description('Manage company name, address, and branding')
```

> **Auto-discovery shortcut:** add `public static ?string $navigationDescription` to the page/resource and `discoverClusterCards()` / `discoverResourceCards()` will pick it up automatically.

### `badge()` / `badgeColor()`

[](#badge--badgecolor)

```
CardItem::make(CompanySettings::class)
    ->badge('Beta')
    ->badgeColor('primary')
```

> **Auto-discovery:** read from `getNavigationBadge()` / `getNavigationBadgeColor()` when present on the discovered Page/Resource.

### `icon()`

[](#icon)

```
CardItem::make('/path')
    ->icon('heroicon-o-building-office')
```

### `url()` / `openUrlInNewTab()`

[](#url--openurlinnewtab)

```
CardItem::make(CompanySettings::class)
    ->url('https://custom-url.com')
    ->openUrlInNewTab()
```

### `alignment()`

[](#alignment)

Text alignment inside the card. Options: `Start`, `Center`, `End`, `Justify`.

```
use Filament\Support\Enums\Alignment;

CardItem::make(CompanySettings::class)
    ->alignment(Alignment::Center)
```

### `color()`

[](#color)

Color accent on the card. Available: `primary`, `success`, `danger`, `warning`, `info`, `gray`.

```
CardItem::make(BillingSettings::class)->color('success')
CardItem::make(DangerZone::class)->color('danger')
```

### `visible()` / `hidden()`

[](#visible--hidden)

Boolean or Closure:

```
CardItem::make(BillingSettings::class)
    ->visible(fn () => auth()->user()->can('manage-billing'))

CardItem::make(DangerZone::class)
    ->hidden(fn () => ! auth()->user()->isAdmin())
```

### `disabled()`

[](#disabled)

Render the card but make it non-clickable with reduced opacity:

```
CardItem::make(DangerZone::class)
    ->disabled(fn () => ! auth()->user()->isAdmin())
```

### `sort()`

[](#sort)

Order cards within a group:

```
CardItem::make(CompanySettings::class)->sort(1)
CardItem::make(BillingSettings::class)->sort(2)
```

### `columnSpan()` / `columnSpanFull()`

[](#columnspan--columnspanfull)

```
CardItem::make(CompanySettings::class)->columnSpan(2)
CardItem::make(NotificationPrefs::class)->columnSpanFull()

// Responsive
CardItem::make(CompanySettings::class)->columnSpan([
    'default' => 1,
    'md' => 2,
    'lg' => 3,
])
```

### `searchKeywords()`

[](#searchkeywords)

Extra terms used by the page's search bar (when [`$searchable = true`](#searchable) on the CardsPage). Useful for aliases and jargon — the keywords are not displayed.

```
CardItem::make(BillingSettings::class)
    ->searchKeywords(['invoices', 'payments', 'subscriptions', 'finance'])

CardItem::make(CompanySettings::class)
    ->searchKeywords('organisation') // single string ok

CardItem::make(LegacyTools::class)
    ->searchKeywords(fn () => $this->resolveLegacyAliases())
```

> **Auto-discovery:** declare on the page/resource directly:
>
> ```
> public static array $filamentCardsSearchKeywords = ['organisation', 'org'];
>
> // …or as a method
> public static function getFilamentCardsSearchKeywords(): array
> {
>     return ['organisation', 'org'];
> }
> ```

### `extraAttributes()`

[](#extraattributes)

Custom HTML attributes on the card element:

```
CardItem::make(CompanySettings::class)
    ->extraAttributes([
        'data-analytics' => 'company-settings',
        'id' => 'company-card',
    ])
```

---

API Reference — `CardGroup`
---------------------------

[](#api-reference--cardgroup)

Groups organize cards under a (collapsible) header — like Filament's `Section`.

### Method overview

[](#method-overview-1)

MethodPurpose[`schema()`](#schema)Cards inside the group[`label()` / `description()` / `icon()`](#label--description--icon-group)Header customization[`columns()`](#columns)Override grid columns for this group[`collapsible()` / `collapsed()`](#collapsible--collapsed)Collapse behavior[`compact()`](#compact)Tighter padding/gaps[`visible()` / `hidden()`](#group-level-visible--hidden)Hide the whole group### `schema()`

[](#schema)

```
CardGroup::make('General')
    ->schema([
        CardItem::make(CompanySettings::class),
        CardItem::make(BillingSettings::class),
    ])
```

### `label()` / `description()` / `icon()` (group)

[](#label--description--icon-group)

```
CardGroup::make('General')
    ->label('General Settings')
    ->description('Core application configuration')
    ->icon('heroicon-o-cog')
    ->schema([...])
```

### `columns()`

[](#columns)

Integer or responsive array (Filament widget style):

```
CardGroup::make('Wide Cards')
    ->columns(2)
    ->schema([...])

CardGroup::make('Wide Cards')
    ->columns([
        'md' => 2,
        'xl' => 4,
    ])
    ->schema([...])
```

### `collapsible()` / `collapsed()`

[](#collapsible--collapsed)

```
CardGroup::make('Advanced')->collapsible()->schema([...])

// Starts collapsed (implicitly collapsible)
CardGroup::make('Advanced')->collapsed()->schema([...])

CardGroup::make('Advanced')
    ->collapsed(fn () => ! auth()->user()->isAdmin())
    ->schema([...])
```

### `compact()`

[](#compact)

```
CardGroup::make('Quick Links')
    ->compact()
    ->schema([...])
```

### Group-level `visible()` / `hidden()`

[](#group-level-visible--hidden)

```
CardGroup::make('Admin Only')
    ->hidden(fn () => ! auth()->user()->isAdmin())
    ->schema([...])
```

---

API Reference — `CardsPage` Configuration
-----------------------------------------

[](#api-reference--cardspage-configuration)

Configure the whole page with static properties.

PropertyTypeDefaultPurpose[`$columns`](#columns-1)`int|string|array``3`Grid columns (responsive supported)[`$itemsAlignment`](#itemsalignment)`Alignment``Center`Alignment of card content[`$iconSize`](#iconsize)`IconSize``Medium`Card icon size[`$iconInlined`](#iconinlined)`bool``false`Inline icon with title (vs stacked)[`$iconPosition`](#iconposition)`IconPosition``Before`Icon before or after the label[`$searchable`](#searchable)`bool``false`Show a client-side search bar[`$searchPlaceholder`](#searchplaceholder)`?string``null` (`'Search…'`)Placeholder text for the search input[`$excludedClusterComponents`](#excludedclustercomponents)`array``[]`Skip these classes in `discoverClusterCards()`[`$excludedResourcePages`](#excludedresourcepages)`array``[]`Skip these classes in `discoverResourceCards()`### `$columns`

[](#columns-1)

```
protected static string|int|array $columns = 4;

// Responsive
protected static string|int|array $columns = [
    'md' => 2,
    'xl' => 4,
];
```

### `$itemsAlignment`

[](#itemsalignment)

```
use Filament\Support\Enums\Alignment;

protected static Alignment $itemsAlignment = Alignment::Center;
```

### `$iconSize`

[](#iconsize)

```
use Filament\Support\Enums\IconSize;

protected static IconSize $iconSize = IconSize::Small;
```

### `$iconInlined`

[](#iconinlined)

```
protected static bool $iconInlined = true;
```

### `$iconPosition`

[](#iconposition)

```
use Filament\Support\Enums\IconPosition;

protected static IconPosition $iconPosition = IconPosition::After;
```

### `$searchable`

[](#searchable)

Renders a search bar at the top right. Filters cards live by label, description, badge, and any [`searchKeywords()`](#searchkeywords). Empty groups are auto-hidden. Filtering happens client-side via Alpine.js — no server round-trips.

```
protected static bool $searchable = true;
```

### `$searchPlaceholder`

[](#searchplaceholder)

```
protected static bool $searchable = true;
protected static ?string $searchPlaceholder = 'Find a tool...';
```

### `$excludedClusterComponents`

[](#excludedclustercomponents)

```
protected static array $excludedClusterComponents = [
    AuditLogsResource::class,
    InternalToolsPage::class,
];
```

### `$excludedResourcePages`

[](#excludedresourcepages)

```
protected static array $excludedResourcePages = [
    UserResource\Pages\DangerZone::class,
];
```

---

API Reference — Page/Resource Hooks (for auto-discovery)
--------------------------------------------------------

[](#api-reference--pageresource-hooks-for-auto-discovery)

These are read off your existing Pages and Resources by `discoverClusterCards()` / `discoverResourceCards()`. **You add them only to pages you want discovered.**

HookFormPurpose`$navigationDescription``public static ?string`Subtitle text on the card`getNavigationDescription()``public static function (): ?string`Same as above (method form)`$showInFilamentCards``public static bool`Whether to include in cards`showInFilamentCards()``public static function (): bool`Same (method form)`$filamentCardsGroup``public static ?string`Override group name (otherwise `$navigationGroup`)`getFilamentCardsGroup()``public static function (): ?string`Same (method form)`$filamentCardsSearchKeywords``public static array`Extra search terms`getFilamentCardsSearchKeywords()``public static function (): array`Same (method form)`getNavigationBadge()`Filament built-inRead by discovery for the card badge`getNavigationBadgeColor()`Filament built-inRead by discovery for the badge color`$navigationLabel` / `$navigationIcon` / `$navigationSort` / `$navigationGroup`Filament built-inUsed as defaults for label/icon/order/group---

Advanced — Dynamic Registration
-------------------------------

[](#advanced--dynamic-registration)

Add cards from outside the class — useful for modular apps and packages. Call from a service provider's `boot()`:

```
use App\Filament\Pages\ControlPanel;
use Harvirsidhu\FilamentCards\CardItem;

ControlPanel::addCards([
    CardItem::make(UserManagement::class)
        ->label('User Accounts')
        ->icon('heroicon-o-users')
        ->description('Manage roles, permissions, and user accounts'),
]);
```

---

Advanced — Custom Discovery Filtering
-------------------------------------

[](#advanced--custom-discovery-filtering)

Override `shouldIncludeDiscoveredCard()` for centralized inclusion logic that goes beyond exclude lists:

```
protected static function shouldIncludeDiscoveredCard(string $component): bool
{
    if (! parent::shouldIncludeDiscoveredCard($component)) {
        return false;
    }

    return $component !== BetaFeaturePage::class;
}
```

---

Full Example
------------

[](#full-example)

Everything together — auto-discovery, manual cards, groups, conditional visibility, and an external link:

```
use Filament\Support\Enums\Alignment;
use Filament\Support\Enums\IconPosition;
use Filament\Support\Enums\IconSize;
use Harvirsidhu\FilamentCards\CardGroup;
use Harvirsidhu\FilamentCards\CardItem;
use Harvirsidhu\FilamentCards\Filament\Pages\CardsPage;

class SettingsHub extends CardsPage
{
    protected static ?string $navigationIcon = 'heroicon-o-cog-8-tooth';
    protected static int $columns = 3;
    protected static Alignment $itemsAlignment = Alignment::Center;
    protected static IconSize $iconSize = IconSize::Medium;
    protected static IconPosition $iconPosition = IconPosition::Before;

    protected static function getCards(): array
    {
        return [
            CardGroup::make('General')
                ->icon('heroicon-o-cog')
                ->description('Core application settings')
                ->collapsible()
                ->schema([
                    CardItem::make(CompanySettings::class)
                        ->color('primary'),

                    CardItem::make(BillingSettings::class)
                        ->visible(fn () => auth()->user()->can('manage-billing'))
                        ->color('success')
                        ->sort(2),

                    CardItem::make(NotificationPrefs::class)
                        ->description('Email, SMS & push notification preferences')
                        ->columnSpanFull(),
                ]),

            CardGroup::make('Danger Zone')
                ->icon('heroicon-o-exclamation-triangle')
                ->collapsed()
                ->columns(2)
                ->schema([
                    CardItem::make(DangerZone::class)
                        ->color('danger')
                        ->disabled(fn () => ! auth()->user()->isAdmin()),
                ]),

            CardItem::make('https://docs.example.com')
                ->label('Documentation')
                ->icon('heroicon-o-book-open')
                ->openUrlInNewTab()
                ->extraAttributes(['data-track' => 'docs']),
        ];
    }
}
```

---

Optional — Plugin Registration
------------------------------

[](#optional--plugin-registration)

Not required, but you can register the plugin in your panel provider for clarity:

```
use Harvirsidhu\FilamentCards\FilamentCardsPlugin;

public function panel(Panel $panel): Panel
{
    return $panel
        ->plugins([
            FilamentCardsPlugin::make(),
        ]);
}
```

---

License
-------

[](#license)

MIT — see [License File](LICENSE.md).

###  Health Score

49

—

FairBetter than 94% of packages

Maintenance88

Actively maintained with recent releases

Popularity33

Limited adoption so far

Community10

Small or concentrated contributor base

Maturity53

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 86.7% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~8 days

Recently: every ~18 days

Total

10

Last Release

62d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/7453102?v=4)[harvirsidhu](/maintainers/harvirsidhu)[@harvirsidhu](https://github.com/harvirsidhu)

---

Top Contributors

[![harvirsidhu](https://avatars.githubusercontent.com/u/7453102?v=4)](https://github.com/harvirsidhu "harvirsidhu (13 commits)")[![webard](https://avatars.githubusercontent.com/u/855788?v=4)](https://github.com/webard "webard (2 commits)")

---

Tags

laravelSettingsfilamentfilament-pluginfilamentphpharvirsidhuclustercardscontrol panelfilament-cards

###  Code Quality

TestsPest

Static AnalysisPHPStan, Rector

Code StyleLaravel Pint

### Embed Badge

![Health badge](/badges/harvirsidhu-filament-cards/health.svg)

```
[![Health](https://phpackages.com/badges/harvirsidhu-filament-cards/health.svg)](https://phpackages.com/packages/harvirsidhu-filament-cards)
```

###  Alternatives

[rawilk/profile-filament-plugin

Profile &amp; MFA starter kit for filament.

3914.6k](/packages/rawilk-profile-filament-plugin)[croustibat/filament-jobs-monitor

Background Jobs monitoring like Horizon for all drivers for FilamentPHP

274327.2k9](/packages/croustibat-filament-jobs-monitor)[marcelweidum/filament-passkeys

Use passkeys in your filamentphp app

6649.5k1](/packages/marcelweidum-filament-passkeys)[mradder/filament-logger

Audit logging, activity tracking, exports, alerts, and dashboards for Filament admin panels.

2317.4k](/packages/mradder-filament-logger)[stephenjude/filament-jetstream

A Laravel starter kit built with Filament inspired by Jetstream.

17760.2k3](/packages/stephenjude-filament-jetstream)[stephenjude/filament-two-factor-authentication

Filament Two Factor Authentication: Google 2FA + Passkey Authentication

84215.9k9](/packages/stephenjude-filament-two-factor-authentication)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
