PHPackages                             webid/druid - 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. webid/druid

ActiveLibrary[Admin Panels](/categories/admin)

webid/druid
===========

Laravel Filament based CMS

0.5.0(2mo ago)192.1k3[4 issues](https://github.com/web-id-fr/druid/issues)[3 PRs](https://github.com/web-id-fr/druid/pulls)MITPHPPHP ^8.4CI passing

Since Feb 12Pushed 2mo ago5 watchersCompare

[ Source](https://github.com/web-id-fr/druid)[ Packagist](https://packagist.org/packages/webid/druid)[ Docs](https://github.com/webid/druid)[ GitHub Sponsors](https://github.com/web-id-fr)[ RSS](/packages/webid-druid/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (6)Dependencies (16)Versions (23)Used By (0)

[![img.png](img.png)](img.png)

[![Latest Version on Packagist](https://camo.githubusercontent.com/5ec1709d094f3378617b4d74d2b27446d3d4ead33198fb21a63178d586404d36/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f77656269642f64727569642e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/webid/druid)[![GitHub Tests Action Status](https://camo.githubusercontent.com/174ece0b5a71512ab02fdc53ff828829cc8ba93211a8dcef65074cf3e00d063c/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f7765622d69642d66722f64727569642f72756e2d74657374732e796d6c3f6272616e63683d6d61696e266c6162656c3d7465737473267374796c653d666c61742d737175617265)](https://github.com/webid/druid/actions?query=workflow%3Arun-tests+branch%3Amain)[![GitHub Code Style Action Status](https://camo.githubusercontent.com/513d3b17b9bbd68cef6199a697bfe28dd087a7efed71db4608de328c6bf52974/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f7765622d69642d66722f64727569642f6669782d7068702d636f64652d7374796c652d6973737565732e796d6c3f6272616e63683d6d61696e266c6162656c3d636f64652532307374796c65267374796c653d666c61742d737175617265)](https://github.com/webid/druid/actions?query=workflow%3A%22Fix+PHP+code+style+issues%22+branch%3Amain)[![Total Downloads](https://camo.githubusercontent.com/bda983b8f11aad9653602f29ac7614c19bab3aec80833f8304e47f0171e68e5b/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f77656269642f64727569642e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/webid/druid)

What is Dru^ID CMS?
-------------------

[](#what-is-druid-cms)

Dru^ID is meant to be a light Content Management System build on top of a Laravel application. You can install it in an existing Laravel project without breaking everything or start with a fresh installation. This is more a toolbox for developers rather than a one click install CMS with a billion themes and plugins.

Essentially out of the box you'll get a Filament based admin panel where you can edit.

- Pages
- Posts
- Navigation menus
- Reusable blocks

You'll also find helpers and services to manage multilingual and navigation menu features in your codebase.

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

[](#requirements)

- PHP &gt;= 8.4
- Laravel &gt;= 11
- Composer 2
- MariaDB / MySQL
- [Laravel Filament 3.x](https://filamentphp.com/docs/3.x/panels/installation)
- [Filament Curator](https://v2.filamentphp.com/plugins/curator)

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

[](#installation)

⚠️ In order to install Dru^ID CMS, you first need to have a Laravel Filament running installation with the Filament Curator admin.

Please follow the installation process

- For Filament here:
- For Curator here:

```
composer require webid/druid

```

```
php artisan vendor:publish --provider="Webid\Druid\DruidServiceProvider"

```

```
php artisan migrate

```

Create a first admin

```
php artisan filament:install --panels
php artisan make:filament-user

```

Open the `app/Providers/Filament/AdminPanelProvider.php` file and register Druid in plugins like that :`

```
return $panel
        ->plugins([
                DruidPlugin::make(),
            ]);
```

Customize the `config/cms.php` file specially if you need to enable the multilingual feature. It's better to choose the default language before writing content.

Load the demo dataset
---------------------

[](#load-the-demo-dataset)

If you want to seed a demo dataset, simply run the following command in a fresh installation

`php artisan druid:demo`

The admin panel
---------------

[](#the-admin-panel)

Dru^ID has been built on top of the Filament package which means than by default, you'll find the administration panel to the `/admin` route.

The [Filament documentation](https://filamentphp.com/docs/3.x/panels/installation) will help you create your first admin if you're not already using it inside your project.

Once you're logged-in, you can create navigation menus, pages, posts, categories and reusable components.

### Pages and posts

[](#pages-and-posts)

Pages and posts contents are based on a bunch of components such as Text, Text + Image, Separator, Quote etc. Some of them are included in the Dru^ID package itself, but you can easily create your own components using the Filament fields system.

### Reusable components

[](#reusable-components)

When you need to display the exact same component in several contents for example a Call to action component, you can configure it one time and use it multiple times wherever you like afterward. This is what we call a reusable component.

### Navigation menus

[](#navigation-menus)

You can manually group and nest your contents inside navigation menus in the admin panel. You can choose between internal content (page and posts) and external URLs. You can nest your menu items up to 3 levels for advanced menus usage.

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

[](#configuration)

The `config/cms.php` file contains all the configuration options for the Dru^ID package. Is it recommended to publish the configuration file and customize it to fit your needs. It is possible to disable some modules or features if you don't need them.

Druid Facade
------------

[](#druid-facade)

### Multilingual helpers

[](#multilingual-helpers)

FunctionDescription`Druid::isMultilingualEnabled(): bool`Returns `true` if `enable_multilingual_feature` is set to true in `config/cms.php``Druid::getDefaultLocale() : Langs`Return the default `Lang` Enum set in `config/cms.php``Druid::getDefaultLocale() : string`Same as previous but returns the local key`Druid::getLocales() : array`Returns an array of locale data defined in `config/cms.php``Druid::getCurrentLocaleKey() : Lang`Returns the current Lang chosen by the visitor`Druid::getLanaguageSwitcher() : Collection`Returns a Collection of links in different languages to switch to### Navigation menus helpers

[](#navigation-menus-helpers)

FunctionDescription`Druid::getNavigationMenuBySlug(string $slug): Menu`Returns a `Menu` DTO with all the nested links details`Druid::getNavigationMenuBySlugAndLang(string $slug, Langs $lang) : Menu`Same as preview but with a given languageServices
--------

[](#services)

### NavigationMenuManager

[](#navigationmenumanager)

When you have configured your navigation menus in the admin panel, you can have access to it using the `Webid\Druid\Services\NavigationMenuManager\NavigationMenuManager` class as a dependency or using the navigation menu helpers described in the `Helpers` section.

Once you have your menu manager instance, you can request a menu by slug and lang using the following method.

`$mainMenu = $menuManager->getBySlug('main');`

If you use the multilingual feature, you can have the same menu `slug` for several language so you can use the `getCurrentLocaleKey()` helper function to dynamize the method call.

`$mainMenuInCurrentLanguage = $menuManager->getBySlugAndLang('main', getCurrentLocaleKey());`

Customizing menu items
----------------------

[](#customizing-menu-items)

You can customize the menu items to add more attributes. Here's how to do it

1. Override the `'menu_items_relation_manager' => \Webid\Druid\Filament\Resources\MenuResource\RelationManagers\ItemsRelationManager::class,` in the `config/cms.php` file.
2. Add the new fields in the `menu_items` table.

### Language switcher

[](#language-switcher)

When using the multilingual feature, you certainly need to display a language switcher component that helps redirecting users to the equivalent content in another language (only if this equivalent exists).

For that you can use the `Webid\Druid\Services\LanguageSwitcher` class as a dependency or use the `getLanaguageSwitcher()`helper described in the helpers section.

You'll get a collection of langs details with the current URL equivalent in other languages and a key to indicate the current language.

Rendering &amp; Templating
--------------------------

[](#rendering--templating)

Dru^ID enable by default a bunch of front-end routes to help you save some time

- The pages (`Models/Page`) detail view is accessible via the URL `homepage/{the-page-slug}` or `homepage/{lang}/{the-page-slug}`if the multilingual feature is enabled.
- The posts (`Models/Post`) detail view is accessible via the URL `homepage/{blog-prefix}/{the-post-slug}`or `homepage/{blog-prefix}/{lang}/{the-post-slug}` if the multilingual feature is enabled.

By default, these view are rendered with a basic Blade template that you can override in your project `resources/views/vendor/druid` directory You can also choose to render a `JsonResource` instead by changing the `views.type` param in the `config/cms.php` file.

Creating new component types
----------------------------

[](#creating-new-component-types)

1. Create a class that implements the `Webid\Druid\Components\ComponentInterface` interface.
2. Add all methods required by the interface.
3. Register your component in the `config/cms.php` config file.

You can of course create a custom package that adds one or several components and give it to the community.

Extending default settings and Page/Post fields
-----------------------------------------------

[](#extending-default-settings-and-pagepost-fields)

Anywhere in your app (in a Service Provider, Middleware for example), you can override the default admin behaviour in terms of form fields

The following example will show you how to add an extra settings field

```
/** @var FilamentSettingsFieldsBuilder $fieldsBuilder */
$fieldsBuilder = $this->app->make(FilamentSettingsFieldsBuilder::class);

$fieldsBuilder->addField(
    TextInput::make('a_first_field') // A Filament field as explained in Filament documentation
        ->label(__('A first field'))
        ->required(),
    'a_first_field' // A key to help fields targeting
);

$fieldsBuilder->addField(
    TextInput::make('a_second_field')
        ->label(__('A second field'))
        ->required(),
    'a_second_field',
    'tabs.application', // Here we provide the target path structure where we want our field to show up
    // In the settings form, we have a tabs group named `tabs`. One of the tabs is named `application`
    before: 'another_field' // We can specify a `before` or `after` param to put the new field in a specific spot
);
```

Extending models
----------------

[](#extending-models)

If you are extending the differents models, you will need to specify your new models in this `config/cms.php` file.

If you need to EXTEND the existing models note that:

- Your Category model needs to extend the Webid\\Druid\\Models\\Category model
- Your Menu model needs to extend the Webid\\Druid\\Models\\Menu model
- Your MenuItem model needs to extend the Webid\\Druid\\Models\\MenuItem model
- Your Page model needs to extend the Webid\\Druid\\Models\\Page model
- Your Post model needs to extend the Webid\\Druid\\Models\\Post model
- Your ReusableComponent model needs to extend the Webid\\Druid\\Models\\ReusableComponent model

For Curator Media model, we need to follow the curator instruction :  and change the `config/cms.php` file with your model.

Tips to define a default homepage
---------------------------------

[](#tips-to-define-a-default-homepage)

We decide to not provide a default homepage route in the package because we think that it's better to let the developer choose the way to define it. Here is a simple way to define a default homepage route in your `routes/web.php` file.

You can use a custom env based config to store the homepage id and retrieve it in your controller.

```
    HomepageController.php

    public function index(): View
    {
        /** @var int|null $page */
        $page = config('app.homepage_id');

        if (is_null($page)) {
            abort(404);
        }

        $homepage = $this->pageRepository->findOrFail($page->value);

        if (Druid::isMultilingualEnabled()) {
            $homepage->loadMissing('translations');
        }

        return view('druid::page.page', [
            'page' => PageResource::make($homepage)->toObject(),
        ]);
    }

    routes/web.php

    Route::get('/', [HomepageController::class, 'index'])->name('homepage');
```

Scheduled Commands
------------------

[](#scheduled-commands)

Dru^ID comes with a scheduled command that check if articles have status scheduled\_published and publish them if the publication date is reached.

To enable this feature, you need to add a schedule for this command :

```
druid:publish-scheduled-posts
```

Laravel 11 doc to add command to scheduler :

Credits
-------

[](#credits)

- [Web^ID Team](https://web-id.fr/fr/agence-web-lyon)
- [All Contributors](https://github.com/web-id-fr/druid/graphs/contributors)

License
-------

[](#license)

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

###  Health Score

48

—

FairBetter than 94% of packages

Maintenance82

Actively maintained with recent releases

Popularity28

Limited adoption so far

Community14

Small or concentrated contributor base

Maturity58

Maturing project, gaining track record

 Bus Factor2

2 contributors hold 50%+ of commits

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

Recently: every ~71 days

Total

13

Last Release

67d ago

PHP version history (2 changes)0.1.0PHP ^8.2

0.5.0PHP ^8.4

### Community

Maintainers

![](https://www.gravatar.com/avatar/cefb02231110e801ec332d70b4bb7f1df97a12f095e0c1ea887d3273d74cde78?d=identicon)[web-id](/maintainers/web-id)

---

Top Contributors

[![clemrep](https://avatars.githubusercontent.com/u/62845501?v=4)](https://github.com/clemrep "clemrep (53 commits)")[![E-Liegeois](https://avatars.githubusercontent.com/u/75976679?v=4)](https://github.com/E-Liegeois "E-Liegeois (37 commits)")[![benjaminniess](https://avatars.githubusercontent.com/u/1109647?v=4)](https://github.com/benjaminniess "benjaminniess (30 commits)")

---

Tags

laraveldruidWebid

###  Code Quality

TestsPest

Static AnalysisPHPStan

Code StyleLaravel Pint

### Embed Badge

![Health badge](/badges/webid-druid/health.svg)

```
[![Health](https://phpackages.com/badges/webid-druid/health.svg)](https://phpackages.com/packages/webid-druid)
```

###  Alternatives

[codewithdennis/filament-select-tree

The multi-level select field enables you to make single selections from a predefined list of options that are organized into multiple levels or depths.

320392.1k17](/packages/codewithdennis-filament-select-tree)[guava/filament-knowledge-base

A filament plugin that adds a knowledge base and help to your filament panel(s).

206120.5k1](/packages/guava-filament-knowledge-base)[ralphjsmit/laravel-filament-seo

A package to combine the power of Laravel SEO and Filament Admin.

15398.7k10](/packages/ralphjsmit-laravel-filament-seo)[vormkracht10/laravel-mails

Laravel Mails can collect everything you might want to track about the mails that has been sent by your Laravel app.

24149.7k](/packages/vormkracht10-laravel-mails)[ralphjsmit/laravel-filament-components

A collection of reusable components for Filament.

10972.2k2](/packages/ralphjsmit-laravel-filament-components)[geo-sot/filament-env-editor

Access .env file though Filament admin panel

2432.3k1](/packages/geo-sot-filament-env-editor)

PHPackages © 2026

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