PHPackages                             anselmocossa/filament-launchpad - 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. anselmocossa/filament-launchpad

ActiveLibrary[Admin Panels](/categories/admin)

anselmocossa/filament-launchpad
===============================

Transform your Filament v5 panel homepage into a SAP Fiori-style launchpad: Spaces, Pages, Sections and drag-and-drop KPI/shortcut/widget cards with role-based visibility.

v1.4.0(yesterday)020↓12.5%MITPHP ^8.2

Since Jul 7Compare

[ Source](https://github.com/anselmocossa/filament-launchpad)[ Packagist](https://packagist.org/packages/anselmocossa/filament-launchpad)[ Docs](https://github.com/anselmocossa/filament-launchpad)[ RSS](/packages/anselmocossa-filament-launchpad/feed)WikiDiscussions Synced today

READMEChangelog (1)Dependencies (11)Versions (20)Used By (0)

Filament Launchpad
==================

[](#filament-launchpad)

[![Latest Version on Packagist](https://camo.githubusercontent.com/3d2c68cfb8efb76979b43a437d1df0d9f600242bb7c663c058e4732088cce570/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f616e73656c6d6f636f7373612f66696c616d656e742d6c61756e63687061642e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/anselmocossa/filament-launchpad)[![Total Downloads](https://camo.githubusercontent.com/7a5dd15176b7d86bc365fef97e6c984ca902bdca8e5b7740431bacf559868cd1/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f616e73656c6d6f636f7373612f66696c616d656e742d6c61756e63687061642e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/anselmocossa/filament-launchpad)[![License](https://camo.githubusercontent.com/059d6dce8156ce8780f1c2fa3e257e6a0123222753df2c55fedec60ea06ddf55/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f616e73656c6d6f636f7373612f66696c616d656e742d6c61756e63687061642e7376673f7374796c653d666c61742d737175617265)](LICENSE.md)

[![Filament Launchpad](art/cover.png)](art/cover.png)

Turn your Filament panel's homepage into a SAP Fiori-style launchpad: Spaces, Pages, Sections and drag-and-drop KPI/shortcut/widget cards, with role-based visibility and a full builder UI — all rendered inside the native Filament shell.

Screenshots
-----------

[](#screenshots)

[![Launchpad — light mode](art/launchpad-light.png)](art/launchpad-light.png)*The launchpad home page in light mode: sub-nav tabs, sections and tile cards.*

[![Launchpad — dark mode](art/launchpad-dark.png)](art/launchpad-dark.png)*The same home page in dark mode — panel chrome (topbar, sidebar) stays native.*

[![Drag-and-drop builder](art/builder.png)](art/builder.png)*The layout builder: drag cards from the library or existing sections to rearrange the page.*

[![Edit Home menu entry](art/user-menu.png)](art/user-menu.png)*"Edit Home" in the account/user menu — a one-click shortcut into the builder for the home page.*

[![Role-based permissions](art/permissions.png)](art/permissions.png)*The "Permission" field on a Space/Page/Section/Card, restricting visibility to selected roles.*

[![Spaces management](art/spaces.png)](art/spaces.png)*Managing Spaces, Pages and Sections through the plugin's Resources.*

[![Cards index and search](art/cards.png)](art/cards.png)*The flat Cards index, also reachable from Filament's global search.*

[![Native widgets as cards](art/widgets.png)](art/widgets.png)*A native Filament widget (StatsOverviewWidget/ChartWidget) rendered in place of a card.*

Features
--------

[](#features)

- **Fiori-style launchpad home page** — sub-nav tabs, grouped sections, and a grid of clickable cards, rendered inside the native Filament page shell (topbar, sidebar, breadcrumbs and dark mode stay untouched).
- **Space → Page → Section → Card hierarchy** — manage everything through dedicated Filament Resources and nested relation managers.
- **Sub-nav navigation** — "☰ All Spaces" menu, a per-space Pages dropdown, and an automatic "More ▾" overflow (priority-nav) so the tab bar never scrolls.
- **Three card types** — KPI (live value from a `KpiSource` class), Shortcut (link to a Resource, Page or URL), and Widget (renders a native `StatsOverviewWidget`/`ChartWidget` in place of the card).
- **Class-based KPI engine** — a `KpiSource` returns a rich `KpiResult` (value + unit + trend + badge) from one query; auto-discovered under `app/Filament/Launchpad`, resolved lazily with per-request memoization and an optional (tenant-safe) cached TTL, and scopeable per panel. Legacy closure sources still supported; a throwing source degrades the tile to `—`. Never `eval`'d, never user-controlled.
- **Artisan generators** — `make:launchpad-kpi`, `make:launchpad-widget` and `make:launchpad-card` scaffold KPI/widget/card-preset classes (auto `Kpi`/`Widget`/`Card` suffix, optional `--model=` subfolder).
- **Reusable card library** — draggable presets for the builder, defined once and dropped into as many sections as needed.
- **Auto-discovered widget library** — widgets already registered on the panel are available in the builder out of the box; override label/icon/column span or add extra ones only when needed.
- **Drag-and-drop layout builder** — native HTML5 Drag and Drop (Alpine-driven, no external JS library), with a searchable Card Library and Widgets panel.
- **"Edit Home" shortcut** — a one-click entry in the account/user menu straight into the builder for the home page, without navigating the Spaces/Pages tree.
- **Global search** — Cards are searchable from Filament's built-in global search, with the Section/Page/Space they live in shown as result details.
- **Role-based visibility (Fiori-style permissions)** — a "Permission" field on every Space/Page/Section/Card, softly integrated with `bezhansalleh/filament-shield` and `spatie/laravel-permission`.
- **Localization** — English, European Portuguese, Brazilian Portuguese and generic Portuguese translations included, fully overridable.

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

[](#requirements)

- PHP 8.2+
- Filament 5.0+ (4.0+ also supported)
- Laravel (Illuminate contracts/support) 11.0+, 12.0+, or 13.0+

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

[](#installation)

Install the package via Composer:

```
composer require anselmocossa/filament-launchpad
```

Run the installer — it publishes the config, then optionally runs the package migrations:

```
php artisan launchpad:install          # publish config
php artisan launchpad:install --migrate # ...and run the migrations (asks first)
```

Prefer to do it by hand? The package auto-loads its migrations, so run them normally:

```
php artisan migrate
```

Optionally publish the config file, views or translations:

```
php artisan vendor:publish --tag="launchpad-config"
php artisan vendor:publish --tag="launchpad-views"
php artisan vendor:publish --tag="launchpad-lang"
```

Register the plugin in your panel provider:

```
use Filament\Launchpad\LaunchpadPlugin;

public function panel(Panel $panel): Panel
{
    return $panel
        // ...
        ->plugin(LaunchpadPlugin::make());
}
```

The plugin registers a `Launchpad` page at the panel root (`/`), so it becomes the panel home. If your panel also registers the default `Dashboard` page, remove it (or give it another slug) so the launchpad can own `/`.

After installing, build the launchpad from the UI: create a Space, a Page inside it, a Section inside that, and Cards inside the Section — or use the drag-and-drop builder (see below) instead of the plain forms.

Usage
-----

[](#usage)

### Spaces, Pages, Sections and Cards

[](#spaces-pages-sections-and-cards)

The launchpad is database-driven by default. The hierarchy is:

- **Space** — a top-level entry in the sub-nav. A Space with a single Page renders as a plain button; with several Pages it shows a dropdown.
- **Page** — lives inside a Space and holds Sections. Selecting a Page swaps which Sections render.
- **Section** — a titled group of Cards on a Page.
- **Card** — a single tile: KPI, Shortcut, or Widget.

Manage all four through the plugin's Filament Resources (**Spaces**, reachable from the sidebar; **Pages**, **Sections** and **Cards** reachable through relation managers and the "Pages"/"Cards" header buttons), or build a Page visually with the drag-and-drop builder.

### KPI sources

[](#kpi-sources)

A KPI card's live value comes from a **`KpiSource` class** that returns a rich `KpiResult` (value + unit + trend + badge) from a single query. Scaffold one with artisan:

```
php artisan make:launchpad-kpi SalesToday
# → app/Filament/Launchpad/SalesTodayKpi.php   ("Kpi" suffix added automatically)

php artisan make:launchpad-kpi SalesToday --model=Order
# → app/Filament/Launchpad/Order/SalesTodayKpi.php
```

```
namespace App\Filament\Launchpad;

use App\Models\Order;
use Filament\Launchpad\Launchpad\BaseKpiSource;
use Filament\Launchpad\Launchpad\KpiResult;

class SalesTodayKpi extends BaseKpiSource
{
    public function cacheFor(): ?int
    {
        return 120; // seconds; null = no TTL cache (still memoized once per request)
    }

    public function resolve(): KpiResult
    {
        return KpiResult::make(Order::whereDate('created_at', today())->count())
            ->unit('orders')
            ->trend('+3 today', 'success') // success | danger | gray
            ->badge('new');                // pass null to hide the badge
    }
}
```

`BaseKpiSource` derives `key()` (`sales_today`) and `label()` (`Sales Today`) from the class name (the `Kpi` suffix is stripped). A KPI Card references the source by its `key()` from the **"Source (Live)"** select in the Card form; a source that throws degrades the tile to `—` instead of breaking the page. A Card without a source can still use a "Fixed Value" typed into the form.

**Registration.** Drop the class under `app/Filament/Launchpad` and it is **auto-discovered** — no wiring needed. Register explicitly (which turns auto-discovery off) or scan a custom folder instead:

```
use Filament\Launchpad\LaunchpadPlugin;

LaunchpadPlugin::make()
    ->kpis([\App\Filament\Launchpad\SalesTodayKpi::class])          // explicit
    ->discoverKpis(in: app_path('Metrics'), for: 'App\\Metrics')    // custom folder
    ->autoDiscoverKpis(false);                                      // opt out entirely
```

The **legacy closure form** still works for quick one-offs and is fully backward-compatible:

```
LaunchpadPlugin::make()->kpiSources([
    'open_tickets' => fn () => Ticket::whereNull('resolved_at')->count(),
]);
```

**Per-panel scoping.** Override `panels()` to limit a source to specific panels (empty = all):

```
public function panels(): array
{
    return ['store'];
}
```

**Multi-tenant caching.** When `cacheFor()` is set, values are cached under the source's `cacheKey()` (defaults to `key()`). In a multi-tenant app, override it so a cached value never leaks across tenants:

```
public function cacheKey(): string
{
    return static::key().':'.tenancy()->tenant()?->id;
}
```

### Card library

[](#card-library)

Card Library presets show up in the builder's "Card Library" panel, ready to be dragged into any Section. Define each as a **`CardPreset` class** (auto-discovered under `app/Filament/Launchpad`) — scaffold one with artisan:

```
php artisan make:launchpad-card SalesToday
# → app/Filament/Launchpad/SalesTodayCard.php   ("Card" suffix added automatically)
```

```
namespace App\Filament\Launchpad;

use Filament\Launchpad\Launchpad\BaseCardPreset;

class SalesTodayCard extends BaseCardPreset
{
    protected string $title = 'Sales Today';

    protected ?string $subtitle = 'Point of Sale';

    protected ?string $icon = 'heroicon-o-banknotes';

    protected string $type = 'kpi';                  // kpi | shortcut | widget

    protected string $targetType = 'url';            // none | url | resource | page

    protected ?string $targetValue = '/admin/sales';

    // protected ?string $kpiSource = 'sales_today'; // optionally pre-wire a live KPI source
}
```

`BaseCardPreset` derives the `key()` from the class name (`SalesTodayCard` → `sales_today`). Registration mirrors KPI sources: auto-discovered by default, or register explicitly / scan a custom folder / opt out with `->cards([...])`, `->discoverCards(in:, for:)`, `->autoDiscoverCards(false)`.

The **legacy array form** still works and is merged with the class-based presets (class presets win on key collision):

```
LaunchpadPlugin::make()->cardLibrary([
    ['key' => 'sales-today', 'title' => 'Sales Today', 'type' => 'kpi', 'target_type' => 'url', 'target_value' => '/admin/sales'],
]);
```

Presets are reusable — dropping the same preset into several Sections is expected; wire a `kpi_source` (or edit the value) on the created Card afterwards.

### Widgets

[](#widgets)

Any widget already registered on the panel through `widgets()` or `discoverWidgets()` is automatically available in the builder's "Widgets" library. Use `widgets()` on the plugin only to override the generated label/icon/column span, or to expose a widget that is not registered on the panel:

```
use App\Filament\Widgets\RevenueChart;
use Filament\Launchpad\LaunchpadPlugin;

LaunchpadPlugin::make()->widgets([
    [
        'key' => 'revenue-chart',
        'class' => RevenueChart::class,
        'label' => 'Revenue',
        'icon' => 'heroicon-o-chart-bar',
        'columnSpan' => 'full',
    ],
]);
```

Dropping a widget from the library creates a Card of type `widget` that stores only its registered `key` — the class is resolved from the developer's registration at render time, never read from the database directly.

Scaffold a launchpad-ready widget (a `StatsOverviewWidget`, no custom view required) with artisan:

```
php artisan make:launchpad-widget Revenue            # → app/Filament/Launchpad/RevenueWidget.php
php artisan make:launchpad-widget Revenue --model=Order  # → app/Filament/Launchpad/Order/RevenueWidget.php
```

### Drag-and-drop builder

[](#drag-and-drop-builder)

Open the builder from a Page's **Build** action (Spaces → a Space → Pages → a Page), or jump straight to the home page's builder via **Edit Home** in the account/user menu. From there you can:

- Add, rename, reorder and delete Sections.
- Drag a preset from the Card Library, or a widget from the Widgets panel, into any Section.
- Drag existing Cards between Sections, or reorder them within a Section.
- Click a Card to edit it in place (same form used by the Cards relation manager).

### Global search

[](#global-search)

Cards are registered as globally searchable (by title and subtitle) through Filament's built-in global search. A result shows which Section/Page/Space the Card lives in, and navigates to whatever the Card's target resolves to.

Configuration
-------------

[](#configuration)

The published config file (`config/launchpad.php`) exposes `branding`, `accent_color`, `dark_header`, and `tile_sizing`:

```
return [
    'branding' => [
        'name' => 'Launchpad',
        'logo' => null,
    ],
    'accent_color' => '#16a34a',
    'dark_header' => false,
    'tile_sizing' => 'fluid', // 'fixed' (6 equal columns, 1/6 row width each) or 'fluid' (auto-fit, minmax 176px)
];
```

- **`fixed`**: `repeat(6, 1fr)` — always 6 equal columns, each card exactly 1/6 of row width, no empty space, no stretching.
- **`fluid`**: `auto-fit minmax(176px, 1fr)` — tiles stretch equally to fill the row, more tiles per row on wider screens.

Both modes use `auto-fit` so empty grid tracks collapse when fewer tiles than columns.

Prefer the fluent plugin API for anything beyond these — `LaunchpadPlugin::make()->accentColor('#16a34a')->tileSizing('fixed')` — since the config file cannot express closures (live KPIs, widget mappings).

Permissions &amp; Shield
------------------------

[](#permissions--shield)

Every Space, Page, Section and Card has a **Permission** field: the roles allowed to see it. Leave it empty and everyone can see the item — this is the default, unrestricted behaviour, with no dependency required.

Install [`bezhansalleh/filament-shield`](https://filamentphp.com/plugins/bezhansalleh-shield) (which pulls in `spatie/laravel-permission`) to turn the field into an active gate:

```
composer require bezhansalleh/filament-shield spatie/laravel-permission
php artisan shield:install
```

Once installed:

- A Space/Page/Section/Card restricted to one or more roles is hidden from any user who does not hold at least one of them — cascading down the hierarchy (an empty Space, Page or Section, once everything inside it is filtered out, is hidden too).
- The Shield `super_admin` role always sees everything, regardless of restrictions.
- The `Launchpad` (home) and `EditHome` pages are themselves gated (`View:Launchpad`, `View:EditHome`), and the Spaces/Pages/Sections/Cards Resources ship their own policies — Shield's convention-based policy discovery does not reach models under `Filament\Launchpad\Models\*`, so the plugin registers these policies itself.
- A restricted Card is also excluded from Filament's global search results for users without the role.

Without `spatie/laravel-permission` installed, none of the above applies: the "Permission" field is simply not rendered, and every ability is granted.

Localization
------------

[](#localization)

Translation catalogs are included for:

- English (`en`) — base language
- Portuguese (`pt`)
- European Portuguese (`pt_PT`)
- Brazilian Portuguese (`pt_BR`)

Publish and override the translation files with:

```
php artisan vendor:publish --tag="launchpad-lang"
```

Then edit `resources/lang/vendor/launchpad/{locale}/launchpad.php` — every string in the plugin (labels, buttons, builder copy, model names) is wrapped in `__('launchpad::launchpad.*')`, so any published locale immediately overrides the package default.

Testing
-------

[](#testing)

```
composer test
```

Changelog
---------

[](#changelog)

Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently.

Contributing
------------

[](#contributing)

Issues and pull requests are welcome. Please run `composer lint` and `composer test` before submitting a PR, and keep new strings translatable via `launchpad::launchpad.*`.

Security Vulnerabilities
------------------------

[](#security-vulnerabilities)

If you discover any security-related issues, please email  instead of using the issue tracker.

Credits
-------

[](#credits)

- [Anselmo Cossa](https://github.com/anselmocossa)

License
-------

[](#license)

The MIT License (MIT). Please see [License File](LICENSE.md) for more information.

###  Health Score

44

—

FairBetter than 90% of packages

Maintenance100

Actively maintained with recent releases

Popularity9

Limited adoption so far

Community2

Small or concentrated contributor base

Maturity54

Maturing project, gaining track record

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 ~0 days

Total

19

Last Release

1d ago

### Community

Maintainers

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

---

Tags

laraveldashboardfilamentfilament-pluginsapfiorilaunchpad

###  Code Quality

TestsPest

Code StyleLaravel Pint

### Embed Badge

![Health badge](/badges/anselmocossa-filament-launchpad/health.svg)

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

###  Alternatives

[laravel/ai

The official AI SDK for Laravel.

1.0k3.2M216](/packages/laravel-ai)[rawilk/profile-filament-plugin

Profile &amp; MFA starter kit for filament.

3914.8k](/packages/rawilk-profile-filament-plugin)[nativephp/mobile

NativePHP for Mobile

1.1k75.1k100](/packages/nativephp-mobile)[croustibat/filament-jobs-monitor

Background Jobs monitoring like Horizon for all drivers for FilamentPHP

274333.4k9](/packages/croustibat-filament-jobs-monitor)[stephenjude/filament-jetstream

A Laravel starter kit built with Filament inspired by Jetstream.

17760.2k3](/packages/stephenjude-filament-jetstream)[harris21/laravel-fuse

Circuit breaker for Laravel queue jobs. Protect your workers from cascading failures.

44855.7k](/packages/harris21-laravel-fuse)

PHPackages © 2026

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