PHPackages                             alessandro-nuunes/filament-kanban - 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. alessandro-nuunes/filament-kanban

ActiveLibrary

alessandro-nuunes/filament-kanban
=================================

Kanban board pages for Filament v5 panels.

v1.0.0(1mo ago)08↑2900%MITPHPPHP ^8.2|^8.3|^8.4

Since Mar 28Pushed 1mo agoCompare

[ Source](https://github.com/alessandronuunes/filament-kanban)[ Packagist](https://packagist.org/packages/alessandro-nuunes/filament-kanban)[ Docs](https://github.com/alessandro-nuunes/filament-kanban)[ GitHub Sponsors](https://github.com/alessandro-nuunes)[ RSS](/packages/alessandro-nuunes-filament-kanban/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependencies (8)Versions (2)Used By (0)

Filament Kanban
===============

[](#filament-kanban)

Kanban board pages for **Filament v5** panels (PHP 8.2+ / Laravel 11–12).

> First Kanban plugin built natively for Filament v5.
> Drag-and-drop, status transitions, edit modal, Enum integration, dark mode.

---

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

[](#requirements)

- PHP 8.2+
- Laravel 11.x or 12.x
- Filament 5.x

---

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

[](#installation)

```
composer require alessandro-nuunes/filament-kanban
```

Publish config and translations:

```
php artisan filament-kanban:install
```

Add the `@source` to your Filament theme CSS so Tailwind picks up the plugin classes:

```
/* resources/css/filament/admin/theme.css */

/* via Composer (production) */
@source '../../../../vendor/alessandro-nuunes/filament-kanban/resources/views/**/*';

/* via local packages/ (development) */
@source '../../../../packages/filament-kanban/resources/views/**/*';
```

Then rebuild assets:

```
npm run build
```

---

Quick Start
-----------

[](#quick-start)

### 1. Generate a Kanban page

[](#1-generate-a-kanban-page)

```
php artisan make:filament-kanban TicketsKanban --resource=TaskResource --model=Task --panel=admin
```

This creates `app/Filament/Admin/Resources/Tasks/Pages/TicketsKanban.php`.

### 2. Register it in your Resource

[](#2-register-it-in-your-resource)

```
// TaskResource.php
public static function getPages(): array
{
    return [
        'index'  => Pages\ListTasks::route('/'),
        'kanban' => Pages\TicketsKanban::route('/kanban'),
        'view'   => Pages\ViewTask::route('/{record}'),
    ];
}
```

### 3. Add your Enum (optional but recommended)

[](#3-add-your-enum-optional-but-recommended)

```
use AlessandroNuunes\FilamentKanban\Contracts\HasKanbanStatuses;
use AlessandroNuunes\FilamentKanban\Concerns\InteractsWithKanbanStatuses;
use Filament\Support\Contracts\HasColor;
use Filament\Support\Contracts\HasLabel;

enum TaskStatus: string implements HasKanbanStatuses, HasColor, HasLabel
{
    use InteractsWithKanbanStatuses;

    case Pending    = 'pending';
    case InProgress = 'in_progress';
    case Completed  = 'completed';
    case Cancelled  = 'cancelled';

    // Only show these 3 on the board
    public static function kanbanCases(): array
    {
        return [self::Pending, self::InProgress, self::Completed];
    }

    public function getLabel(): ?string
    {
        return match ($this) {
            self::Pending    => 'Pending',
            self::InProgress => 'In Progress',
            self::Completed  => 'Completed',
            self::Cancelled  => 'Cancelled',
        };
    }

    public function getColor(): string|array|null
    {
        return match ($this) {
            self::Pending    => 'warning',
            self::InProgress => 'info',
            self::Completed  => 'success',
            self::Cancelled  => 'gray',
        };
    }
}
```

### 4. Point the board to your Enum

[](#4-point-the-board-to-your-enum)

```
class TicketsKanban extends KanbanBoard
{
    protected static string $resource             = TaskResource::class;
    protected static string $model                = Task::class;
    protected static ?string $statusEnum          = TaskStatus::class;
    protected static string $recordStatusAttribute = 'status';
    protected static string $recordTitleAttribute  = 'protocol';

    protected function onStatusChanged(
        int|string $recordId,
        string $newStatus,
        array $fromOrderedIds,
        array $toOrderedIds,
    ): void {
        Task::find($recordId)?->update(['status' => $newStatus]);
    }
}
```

---

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

[](#configuration)

### `config/filament-kanban.php`

[](#configfilament-kanbanphp)

```
return [
    // 'record' = calls canMoveRecord() on the page
    // 'policy' = calls $policy->update($user, $record)
    'authorization_mode' => 'record',

    'default_status_attribute' => 'status',
    'default_title_attribute'  => 'title',

    // Max height of each column's scroll area
    'board_max_height' => '75vh',

    // Enable the inline edit modal (click on card)
    'enable_edit_modal' => true,
];
```

---

All overridable methods
-----------------------

[](#all-overridable-methods)

MethodDescription`statuses(): Collection`Manual statuses when not using an Enum`records(): Collection`Filter/scope which records appear`onStatusChanged(...)`Persist status change + side-effects`onSortChanged(...)`Persist reordering within a column`canMoveRecord(Model, from, to): bool`Block specific moves`allowedTransitions(): ?array`Restrict status-to-status transitions`mutateRecordDataForCard(array, Model)`Customize data passed to card view`getEditModalFormSchema(?id): array`Define edit modal form fields`editRecord(id, data, state): void`Handle edit modal save`getSortColumn(): ?string`Column name for persistent ordering`shouldPersistSorting(): bool`Whether to persist column sort order---

Status transitions
------------------

[](#status-transitions)

```
protected function allowedTransitions(): ?array
{
    return [
        'pending'     => ['in_progress', 'cancelled'],
        'in_progress' => ['completed', 'pending'],
        // null or missing key = no restriction from that status
    ];
}
```

---

Manual statuses (no Enum)
-------------------------

[](#manual-statuses-no-enum)

```
protected function statuses(): Collection
{
    return collect([
        ['id' => 'todo',        'title' => 'To Do',       'color' => 'gray'],
        ['id' => 'in_progress', 'title' => 'In Progress',  'color' => 'info'],
        ['id' => 'done',        'title' => 'Done',         'color' => 'success'],
    ]);
}
```

---

Events
------

[](#events)

Listen to these events in your application:

```
use AlessandroNuunes\FilamentKanban\Events\KanbanRecordStatusChanging;
use AlessandroNuunes\FilamentKanban\Events\KanbanRecordStatusChanged;
use AlessandroNuunes\FilamentKanban\Events\KanbanRecordSortingChanged;

Event::listen(KanbanRecordStatusChanged::class, function ($event) {
    // $event->userId, recordId, fromStatus, toStatus, fromOrderedIds, toOrderedIds
});
```

---

Customizing views
-----------------

[](#customizing-views)

Publish all views:

```
php artisan vendor:publish --tag="filament-kanban-views"
```

Or override per board:

```
protected static string $boardView   = 'my-package::kanban-board';
protected static string $columnView  = 'my-package::kanban-column';
protected static string $cardView    = 'my-package::kanban-card';
protected static string $emptyView   = 'my-package::kanban-empty';
protected static string $scriptsView = 'my-package::kanban-scripts';
```

---

Theme (required)
----------------

[](#theme-required)

```
/* production */
@source '../../../../vendor/alessandro-nuunes/filament-kanban/resources/views/**/*';

/* local development */
@source '../../../../packages/filament-kanban/resources/views/**/*';
```

---

License
-------

[](#license)

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

Author
------

[](#author)

**Alessandro Nuunes** — [GitHub](https://github.com/alessandronuunes)

###  Health Score

41

—

FairBetter than 89% of packages

Maintenance90

Actively maintained with recent releases

Popularity7

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity51

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% 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

Unknown

Total

1

Last Release

46d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/4d53fc7e3f13c6a03262261f5f6e670d8ae140b90878dd51eca3d18d27ab7423?d=identicon)[alessandronuunes](/maintainers/alessandronuunes)

---

Top Contributors

[![alessandronuunes](https://avatars.githubusercontent.com/u/13227884?v=4)](https://github.com/alessandronuunes "alessandronuunes (1 commits)")

---

Tags

laravellivewirefilamentfilament-pluginfilament-kanbankanban

###  Code Quality

TestsPest

Code StyleLaravel Pint

### Embed Badge

![Health badge](/badges/alessandro-nuunes-filament-kanban/health.svg)

```
[![Health](https://phpackages.com/badges/alessandro-nuunes-filament-kanban/health.svg)](https://phpackages.com/packages/alessandro-nuunes-filament-kanban)
```

###  Alternatives

[bezhansalleh/filament-shield

Filament support for `spatie/laravel-permission`.

2.8k2.9M88](/packages/bezhansalleh-filament-shield)[croustibat/filament-jobs-monitor

Background Jobs monitoring like Horizon for all drivers for FilamentPHP

254255.2k6](/packages/croustibat-filament-jobs-monitor)[bezhansalleh/filament-google-analytics

Google Analytics integration for FilamentPHP

205144.8k5](/packages/bezhansalleh-filament-google-analytics)[guava/filament-modal-relation-managers

Allows you to embed relation managers inside filament modals.

7565.0k4](/packages/guava-filament-modal-relation-managers)[caresome/filament-neobrutalism-theme

A neobrutalism theme for FilamentPHP admin panels

303.2k](/packages/caresome-filament-neobrutalism-theme)[tapp/filament-google-autocomplete-field

Filament plugin that provides a Google Autocomplete field

3098.1k](/packages/tapp-filament-google-autocomplete-field)

PHPackages © 2026

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