{"id":21680942,"url":"https://github.com/mooxphp/core","last_synced_at":"2025-09-04T05:36:43.685Z","repository":{"id":222397548,"uuid":"729146327","full_name":"mooxphp/core","owner":"mooxphp","description":"[READ-ONLY] Moox Core is required by all of our packages","archived":false,"fork":false,"pushed_at":"2025-03-21T08:26:26.000Z","size":247,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-03-21T09:28:04.457Z","etag":null,"topics":["filament","filament-plugin","filamentphp","filamentphp-plugin","laravel"],"latest_commit_sha":null,"homepage":"https://moox.org","language":"PHP","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mooxphp.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["mooxphp"],"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"lfx_crowdfunding":null,"custom":null}},"created_at":"2023-12-08T14:23:29.000Z","updated_at":"2025-03-21T08:26:30.000Z","dependencies_parsed_at":"2024-06-24T11:05:19.847Z","dependency_job_id":"6975e1f0-f2ad-4bd2-8896-3cb579f9b8d7","html_url":"https://github.com/mooxphp/core","commit_stats":null,"previous_names":["mooxphp/core"],"tags_count":26,"template":false,"template_full_name":"mooxphp/builder","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mooxphp%2Fcore","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mooxphp%2Fcore/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mooxphp%2Fcore/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mooxphp%2Fcore/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mooxphp","download_url":"https://codeload.github.com/mooxphp/core/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248530196,"owners_count":21119586,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["filament","filament-plugin","filamentphp","filamentphp-plugin","laravel"],"created_at":"2024-11-25T15:22:44.625Z","updated_at":"2025-09-04T05:36:43.666Z","avatar_url":"https://github.com/mooxphp.png","language":"PHP","readme":"\u003cdiv class=\"filament-hidden\"\u003e\n\n![Moox Core](banner.jpg)\n\n\u003c/div\u003e\n\n# Moox Core\n\nThe Moox Core package provides common features, used by all Moox packages. If you use Moox Builder to create your own Moox package, these features are already included and pre-configured.\n\n## Features\n\n-   Dynamic Tabs - create your own tabs just by a few lines of configuration\n-   Dynamic Taxonomies - attach hierarchical or flat taxonomies to your items\n-   Simple Items - provides simple form actions and features\n-   Soft Delete Items - provides soft delete actions, features and tabs\n-   Publishable Items - provides publis and soft delete features, actions and tabs\n\nThe last three features provide traits for model, resource and resource pages. They are named Single... as they can not be used together with other Single... traits. You need to also include the Base traits. Example:\n\n```php\nuse Moox\\Core\\Traits\\Base\\BaseInResource;\nuse Moox\\Core\\Traits\\SoftDelete\\SingleSoftDeleteInResource;\n\nclass YourResource extends Resource\n{\n    use BaseInResource;\n    use SingleSoftDeleteInResource;\n}\n```\n\nThis part is currently not well documented. We will cover that soon.\n\n## Installation\n\nMoox is installed by the Moox Installer, that includes Moox Core and all other Moox packages, that you previously required.\n\n```bash\ncomposer require moox/core\nphp artisan moox:install\n```\n\n## Requires\n\nMoox Core requires these packages:\n\n-   https://filamentphp.com/ and https://laravel.com/ usually in the latest stable version, see composer.json\n-   https://github.com/Pharaonic/laravel-readable - for formatting numbers and dates to be human readable\n-   https://github.com/ryangjchandler/filament-progress-column - to use progress bars in Filament tables\n-   https://github.com/codeat3/blade-google-material-design-icons - we use Google Material Design Icons\n\n## Traits\n\n### HasListPageTabs\n\nThis trait provides functionality for creating dynamic tabs in Filament resources.\n\n#### Key Methods\n\n-   `getDynamicTabs(string $configPath, string $modelClass)`: Returns an array of dynamic tabs based on configuration.\n\n#### Usage\n\nThe DynamicTabs trait is already implemented in all Moox packages including Moox Builder. If you want to implement this feature in your existing package:\n\n```php\nuse Moox\\Core\\Traits\\Tabs\\HasListPageTabs;\n\nclass ListItems extends ListRecords\n{\n    use HasListPageTabs;\n\n    public function getTabs(): array\n    {\n        return $this-\u003egetDynamicTabs('package.resources.item.tabs', YourModel::class);\n    }\n}\n```\n\n#### Configuration\n\nProvide a configuration like:\n\n```php\n    'resources' =\u003e [\n        'item' =\u003e [\n\n            /*\n            |--------------------------------------------------------------------------\n            | Tabs\n            |--------------------------------------------------------------------------\n            |\n            | Define the tabs for the Resource table. They are optional, but\n            | pretty awesome to filter the table by certain values.\n            | You may simply do a 'tabs' =\u003e [], to disable them.\n            |\n            */\n\n            'tabs' =\u003e [\n                'all' =\u003e [\n                    'label' =\u003e 'trans//core::core.all',\n                    'icon' =\u003e 'gmdi-filter-list',\n                    'query' =\u003e [],\n                ],\n                'documents' =\u003e [\n                    'label' =\u003e 'trans//core::core.documents',\n                    'icon' =\u003e 'gmdi-text-snippet',\n                    'query' =\u003e [\n                        [\n                            'field' =\u003e 'expiry_job',\n                            'operator' =\u003e '=',\n                            'value' =\u003e 'Documents',\n                        ],\n                    ],\n                ],\n            ],\n        ],\n    ],\n```\n\n#### Disable Tabs\n\nIf you want to disable tabs for this resource, just do a\n\n```php\n            'tabs' =\u003e [],\n```\n\n#### Basic Tabs\n\nA pretty basic example:\n\n```php\n            'tabs' =\u003e [\n                'all' =\u003e [\n                    'label' =\u003e 'trans//core::core.all',\n                    'icon' =\u003e 'gmdi-filter-list',\n                    'query' =\u003e [],\n                ],\n                'user' =\u003e [\n                    'label' =\u003e 'trans//core::core.user_session',\n                    'icon' =\u003e 'gmdi-account-circle',\n                    'query' =\u003e [\n                        [\n                            'field' =\u003e 'user_id',\n                            'operator' =\u003e '!=',\n                            'value' =\u003e null,\n                        ],\n                    ],\n                  \t'visible' =\u003e true,\n                ],\n            ],\n```\n\n#### Visibility\n\nThe `visible`-option is not necessary, as it defaults to true. But if you want to toggle the visibility of a Tab, you can use a Closure like this:\n\n```php\n                    'visible' =\u003e in_array(rtrim(env('APP_URL'), '/'), [\n                    'https://visible.test',\n                    'http://localhost',\n                ]),\n```\n\n#### Queries\n\nSee [Queries in Config](#queriesinconfig) on how to use the query feature.\n\n#### Translation\n\nSee [Translatable Config](#translatableconfig) on how to use the trans feature.\n\n### HasQueriesInConfig\n\nThis trait allows building complex queries from configuration arrays.\n\n#### Key Methods\n\n-   `buildQueryFromConfig(array $queryConfig)`: Builds a query based on the provided configuration.\n\n#### Usage\n\n```php\nuse Moox\\Core\\Traits\\HasQueriesInConfig;\n\nclass YourClass\n{\n    use HasQueriesInConfig;\n\n    public function someMethod()\n    {\n        $queryConfig = [\n            ['field' =\u003e 'status', 'operator' =\u003e '=', 'value' =\u003e 'open'],\n        ];\n        $query = $this-\u003ebuildQueryFromConfig($queryConfig);\n    }\n}\n```\n\n#### Configuration\n\nDynamic Tabs uses the HasQueriesInConfig Trait, that means you can build queries like this:\n\nThe simplest query is for the All tab, of course:\n\n```php\n\t\t\t\t\t'query' =\u003e [],\n```\n\nAll other queries require three parameters:\n\n```php\n                    'query' =\u003e [\n                        [\n                            'field' =\u003e 'status',\n                            'operator' =\u003e '=',\n                            'value' =\u003e 'open',\n                        ],\n                    ],\n```\n\nAdd more, if you need:\n\n```php\n                    'query' =\u003e [\n                        [\n                            'field' =\u003e 'post_type',\n                            'operator' =\u003e '=',\n                            'value' =\u003e 'Post',\n                        ],\n                        [\n                            'field' =\u003e 'deleted',\n                            'operator' =\u003e '!=',\n                            'value' =\u003e 'false',\n                        ],\n                    ],\n```\n\nWe DON'T YET support relations nor the like operator. If you're in the need, we would be happy to merge a PR :-)\n\n```php\n                    // TODO: not implemented yet\n\t\t\t\t\t\t\t\t\t\t'query' =\u003e [\n                        [\n                            'field' =\u003e 'user_name',\n                            'relation' =\u003e 'user',\n                            'operator' =\u003e 'like',\n                            'value' =\u003e 'Alf',\n                        ],\n                    ],\n```\n\nThe value of a query accepts a closure. Following example is perfect for a \"My Tab\" as it filters for the current user:\n\n```php\n                    'query' =\u003e [\n                        [\n                            'field' =\u003e 'user_id',\n                            'operator' =\u003e '=',\n                            'value' =\u003e function () {\n                                return auth()-\u003euser()-\u003eid;\n                            },\n                        ],\n                    ],\n```\n\nFinally, a special idea and therefor NOT YET implemented: if the value contains a class and a forth parameter `hide-if-not-exists`set to true, Moox will check, if the class exists and otherwise hide the tab. That allows us to register buttons for packages, that are not necessarily required.\n\n```php\n                    // TODO: not implemented yet\n\t\t\t\t\t\t\t\t\t\t'query' =\u003e [\n                        [\n                            'field' =\u003e 'status',\n                            'operator' =\u003e '=',\n                            'value' =\u003e 'Moox\\Press\\Models\\WpUser',\n                            'hide-if-not-exists' =\u003e true,\n                        ],\n                    ],\n```\n\nAn practical example (works for Sessions, Devices and other user-related entities):\n\n```php\n            'tabs' =\u003e [\n\t            'mine' =\u003e [\n                    'label' =\u003e 'My Sessions',\n                    'icon' =\u003e 'gmdi-account-circle',\n                    'query' =\u003e [\n                        [\n                            'field' =\u003e 'user_id',\n                            'operator' =\u003e '=',\n                            'value' =\u003e function () {\n                                return auth()-\u003euser()-\u003eid;\n                            },\n                        ],\n                    ],\n                ],\n                'all' =\u003e [\n                    'label' =\u003e 'trans//core::core.all',\n                    'icon' =\u003e 'gmdi-filter-list',\n                    'query' =\u003e [],\n                ],\n                'user' =\u003e [\n                    'label' =\u003e 'User Sessions',\n                    'icon' =\u003e 'gmdi-account-circle',\n                    'query' =\u003e [\n                        [\n                            'field' =\u003e 'user_type',\n                            'operator' =\u003e '=',\n                            'value' =\u003e 'Moox\\User\\Models\\User',\n                        ],\n                    ],\n                ],\n                'wpuser' =\u003e [\n                    'label' =\u003e 'WordPress Sessions',\n                    'icon' =\u003e 'gmdi-account-circle',\n                    'query' =\u003e [\n                        [\n                            'field' =\u003e 'user_type',\n                            'operator' =\u003e '=',\n                            'value' =\u003e 'Moox\\Press\\Models\\WpUser',\n                        ],\n                    ],\n                ],\n                'anonymous' =\u003e [\n                    'label' =\u003e 'Anonymous Sessions',\n                    'icon' =\u003e 'gmdi-no-accounts',\n                    'query' =\u003e [\n                        [\n                            'field' =\u003e 'user_id',\n                            'operator' =\u003e '=',\n                            'value' =\u003e null,\n                        ],\n                    ],\n                ],\n            ],\n```\n\nAnd finally the most-known mistake, throws \"Cannot access offset of type string on string\":\n\n```php\n        'query' =\u003e [\n\t\t\t\t\t\t'field' =\u003e 'user_id',\n\t\t\t\t\t\t'operator' =\u003e '=',\n\t\t\t\t\t\t'value' =\u003e null,\n        ],\n```\n\nSo don't forget to put the query in an extra array, even if it is a single query.\n\nAs mentioned, the HasQueriesInConfig trait is used in HasListPageTabs, another Trait in Moox Core. Please code dive there, to see how to implement the Feature from outside Moox.\n\n### HasTranslatableConfig\n\nThis trait provides functionality for translating configuration values.\n\nThis trait is already loaded in Moox Core. If your package requires Moox Core, you should not use this trait.\n\n#### Key Methods\n\n-   `translateConfigurations()`: Translates configuration values based on defined translation keys.\n\n#### Usage\n\nDo not use this trait, if your package requires Moox Core!\n\n```php\nuse Moox\\Core\\Traits\\HasTranslatableConfig;\n\nclass YourServiceProvider extends ServiceProvider\n{\n    use HasTranslatableConfig;\n\n    public function boot()\n    {\n        $this-\u003etranslateConfigurations();\n    }\n}\n```\n\n#### Configuration\n\nA simple but useful feature is the TranslationsInConfig Trait that is used a lot in our config files, as seen with Tabs:\n\n```php\n                    'label' =\u003e 'trans//core::core.all',\n```\n\nTranslations of our packages are generally organized in Moox Core. Only few of our packages ship with own translation files. These packages are registered in the core.php configuration file. If you develop a custom package (preferably using Moox Builder) you need to add your custom package to the [Package Registration](#Package-registration).\n\n### RequestInModel\n\nThis trait allows access to request data within models.\n\n#### Key Methods\n\n-   `getRequestData(string $key)`: Retrieves request data for the given key.\n\n#### Usage\n\n```php\nuse Moox\\Core\\Traits\\RequestInModel;\n\nclass YourModel extends Model\n{\n    use RequestInModel;\n\n    public function someMethod()\n    {\n        $data = $this-\u003egetRequestData('some_key');\n    }\n}\n```\n\nThe RequestInModel Trait is currently used by all Moox Press packages. It allows us to use the request data in some of our models. You can code dive into Moox\\Press\\Models\\WpTerm.php, to find more code examples. The basic implementation looks like this:\n\n```php\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Moox\\Core\\Traits\\RequestInModel;\n\nclass WpTerm extends Model\n{\n\tuse RequestInModel;\n\n  $description = $wpTerm-\u003egetRequestData('description');\n}\n```\n\n### HasGoogleIcons\n\nThis trait provides methods for using Google Material Design Icons in your application.\n\n#### Key Methods\n\n-   `useGoogleIcons()`: Configures the application to use Google Material Design Icons.\n\n#### Usage\n\n```php\nuse Moox\\Core\\Traits\\HasGoogleIcons;\n\nclass YourServiceProvider extends ServiceProvider\n{\n    use HasGoogleIcons;\n\n    public function boot()\n    {\n        $this-\u003euseHasGoogleIcons();\n    }\n}\n```\n\nAs [Google Material Design Icons](https://blade-ui-kit.com/blade-icons?set=20) provides one of the largest sets of high quality icons, we decided to use them as default for Moox. The HasGoogleIcons Trait changes the default Filament Icons, too. It is used in the CoreServiceProvider like this:\n\nYou can disable Google Icons and use the Filament default icons instead, see [config](#Config).\n\n### HasModelTaxonomy\n\nThis trait provides functionality for models to work with dynamic taxonomies.\n\n#### Key Methods\n\n-   `taxonomy(string $taxonomy)`: Returns a MorphToMany relationship for the given taxonomy.\n-   `syncTaxonomy(string $taxonomy, array $ids)`: Syncs the given taxonomy with the provided IDs.\n\n#### Usage\n\n```php\nuse Moox\\Core\\Traits\\Taxonomy\\HasModelTaxonomy;\n\nclass YourItem extends Model\n{\n    use HasModelTaxonomy;\n\n    protected function getResourceName(): string\n    {\n        return 'youritem'; // name your item\n    }\n\n    // ... other model code ...\n\n    // Add a polymorphic relation\n    public function youritemables(string $type): MorphToMany\n    {\n        return $this-\u003emorphedByMany($type, 'youritemable');\n    }\n\n    // Delete relations on (soft)-delete\n    public function detachAllYouritemables(): void\n    {\n        DB::table('youritemables')-\u003ewhere('youritem_id', $this-\u003eid)-\u003edelete();\n    }\n\n  \t// Needed for deletion\n    protected static function booted(): void\n    {\n        static::deleting(function (YourItem $youritem) {\n            $youritem-\u003edetachAllYouritemables();\n        });\n    }\n}\n```\n\n```\n\u003e [!WARNING]\n\u003e We do not soft-delete the polymorphics, so if you restore a Taxonomy, these are lost.\n```\n\n### HasResourceTaxonomy\n\nThis trait provides methods for generating Filament form fields, table columns, and filters for dynamic taxonomies.\n\n#### Key Methods\n\n-   `getTaxonomyFields()`: Returns an array of Filament form fields for taxonomies.\n-   `getTaxonomyFilters()`: Returns an array of Filament table filters for taxonomies.\n-   `getTaxonomyColumns()`: Returns an array of Filament table columns for taxonomies.\n-   `handleTaxonomies(Model $record, array $data)`: Handles saving taxonomy relationships.\n\n#### Usage\n\n```php\nuse Moox\\Core\\Traits\\Taxonomy\\HasResourceTaxonomy;\n\nclass YourResource extends Resource\n{\n    use HasResourceTaxonomy;\n\n    public static function form(Form $form): Form\n    {\n        return $form-\u003eschema([\n            // ... other fields ...\n            ...static::getTaxonomyFields(),\n        ]);\n    }\n\n    public static function table(Table $table): Table\n    {\n        return $table\n            -\u003ecolumns([\n                // ... other columns ...\n                ...static::getTaxonomyColumns(),\n            ])\n            -\u003efilters([\n                // ... other filters ...\n                ...static::getTaxonomyFilters(),\n            ]);\n    }\n}\n```\n\n### HasPagesTaxonomy\n\nThis trait provides methods for handling dynamic taxonomies in Filament resource pages.\n\n#### Key Methods\n\n-   `handleTaxonomies()`: Handles saving taxonomy relationships.\n-   `mutateFormDataBeforeFill(array $data)`: Prepares taxonomy data for form filling.\n-   `refreshTaxonomyFormData()`: Refreshes taxonomy form data after save.\n\n#### Usage\n\n```php\nuse Moox\\Core\\Traits\\Taxonomy\\HasPagesTaxonomy;\n\nclass EditYourModel extends EditRecord\n{\n    use HasPagesTaxonomy;\n\n    // ... other page code ...\n}\n```\n\n### Log Level\n\nLog Level is a useful feature to debug things in Moox, even when you're in production, or get your logs silent while developing.\n\n```php\n\n    $this-\u003elogDebug('This is a debug message');\n    $this-\u003elogInfo('This is an info message');\n\n```\n\nYou can adjust the log level and whether to log in production in Moox Core's [Config](#Logging).\n\n## Services\n\n### TaxonomyService\n\nThis service manages taxonomy configurations and provides utility methods for working with taxonomies.\n\n#### Key Methods\n\n-   `setCurrentResource(string $resource)`: Sets the current resource context.\n-   `getTaxonomies()`: Returns all configured taxonomies for the current resource.\n-   `getTaxonomyModel(string $taxonomy)`: Returns the model class for a given taxonomy.\n-   `validateTaxonomy(string $taxonomy)`: Validates a taxonomy configuration.\n\n#### Usage\n\n```php\nuse Moox\\Core\\Services\\TaxonomyService;\n\nclass YourClass\n{\n    protected TaxonomyService $taxonomyService;\n\n    public function __construct(TaxonomyService $taxonomyService)\n    {\n        $this-\u003etaxonomyService = $taxonomyService;\n        $this-\u003etaxonomyService-\u003esetCurrentResource('your_resource');\n    }\n\n    public function someMethod()\n    {\n        $taxonomies = $this-\u003etaxonomyService-\u003egetTaxonomies();\n        // ... use taxonomies ...\n    }\n}\n```\n\n### DnsLookupService\n\nThis service provides DNS lookup functionality.\n\n#### Key Methods\n\n-   `getIpAddress(string $domain)`: Retrieves the IP address for a given domain.\n\n#### Usage\n\n```php\nuse Moox\\Core\\Services\\DnsLookupService;\n\nclass YourClass\n{\n    public function someMethod(string $domain)\n    {\n        $ipAddress = DnsLookupService::getIpAddress($domain);\n    }\n}\n```\n\nThat Service is currently used in Moox Sync's PlatformResource like so:\n\n```php\nuse Moox\\Core\\Services\\DnsLookupService;\n\nclass PlatformResource extends Resource\n{\n\t\tpublic static function form(Form $form): Form\n    {\n        return $form-\u003eschema([\n            Section::make()-\u003eschema([\n                Grid::make(['default' =\u003e 0])-\u003eschema([\n                  TextInput::make('domain')\n                        -\u003elabel(__('core::core.domain'))\n                        -\u003erules(['max:255', 'string'])\n                        -\u003erequired()\n                        -\u003eunique(ignoreRecord: true)\n                        -\u003elive(debounce: 500)\n                        -\u003eafterStateUpdated(function ($state, callable $set) {\n                            if (empty($state)) {\n                                $set('ip_address', 'The host is not resolvable');\n                            } else {\n                                $ipAddress = DnsLookupService::getIpAddress($state);\n                                $set('ip_address', $ipAddress ?: 'The host is not resolvable');\n                            }\n                        })\n                  ]),\n            ]),\n        ]);\n\n```\n\n### TaxonomyCreateForm\n\nThis class provides a schema for creating taxonomy entries.\n\n#### Usage\n\n```php\nuse Moox\\Tag\\Forms\\TaxonomyCreateForm;\n\nclass YourResource extends Resource\n{\n    public static function form(Form $form): Form\n    {\n        return $form-\u003eschema([\n            // ... other fields ...\n            ...TaxonomyCreateForm::getSchema(),\n        ]);\n    }\n}\n```\n\nThis form includes fields for title and slug, as these are needed for creating Taxonomies. As your taxonomy might need further fields, you can use your own form to create your custom taxonomies.\n\n## APIs\n\n### Core API\n\nThe Core API `api/core` provides all available packages (and their configuration).\n\nIt is currently not used, and may be changed or removed.\n\n### Models API\n\nThe Models API `api/models` provides all available and loaded models. It is used by Moox Sync, for example.\n\nThe Models API is work in progress. It probably will be secured.\n\n### Shared Hosting API\n\nThe Shared Hosting API `schedule/run` is used to run scheduled tasks in shared hosting environments.\n\nhttps://yourdomain.com/schedule/run?token=secure\n\nIf you want to use the Shared Hosting API, you need to set the `SHARED_HOSTING_ENABLED` [config](#Shared-Hosting) to `true` and the `SHARED_HOSTING_TOKEN` config to a secure token.\n\n## Configuration\n\n### Package Registration\n\nRegister Moox packages and custom packages in the `config/core.php` file:\n\nMoox has a simple package registration. To ensure that some features of Moox Core are only available for known packages, all Moox packages and all custom packages, created with Moox Builder, need to register here:\n\n```php\n    /*\n    |--------------------------------------------------------------------------\n    | Moox Packages\n    |--------------------------------------------------------------------------\n    |\n    | This config array registers all known Moox packages. You may add own\n    | packages to this array. If you use Moox Builder, these packages\n    | work out of the box. Adding a non-compatible package fails.\n    |\n    */\n\n    'packages' =\u003e [\n        'audit' =\u003e 'Moox Audit',\n        'builder' =\u003e 'Moox Builder',\n        'core' =\u003e 'Moox Core',\n        'expiry' =\u003e 'Moox Expiry',\n        'jobs' =\u003e 'Moox Jobs',\n        'login-link' =\u003e 'Moox Login Link',\n        'notifications' =\u003e 'Moox Notifications',\n        'page' =\u003e 'Moox Page',\n        'passkey' =\u003e 'Moox Passkey',\n        'permission' =\u003e 'Moox Permission',\n        'press' =\u003e 'Moox Press',\n        'press-wiki' =\u003e 'Moox Press Wiki',\n        'security' =\u003e 'Moox Security',\n        'sync' =\u003e 'Moox Sync',\n        'training' =\u003e 'Moox Trainings',\n        'user' =\u003e 'Moox User',\n        'user-device' =\u003e 'Moox User Device',\n        'user-session' =\u003e 'Moox User Session',\n    ],\n];\n```\n\nYou can publish the Moox Core configuration file and add own packages:\n\n```bash\nphp artisan vendor:publish --tag=\"core-config\"\n```\n\nbut remember to update the Array regularly then, to allow newer Moox packages to work flawlessly.\n\n### Google Icons\n\nYou can disable Google Icons, and use the Filament default iconset (Heroicons) instead.\n\nThis disables the replacement of the Filament core icons, done in Core, as well as the individual icons of most of our packages. Some packages will remain with Google Icons, because there is no corresponding icon in the Heroicon set.\n\n```php\n    /*\n    |--------------------------------------------------------------------------\n    | Google Icons\n    |--------------------------------------------------------------------------\n    |\n    | We use Google Material Design Icons, but if you want to use the\n    | Heroicons, used by Filament as default, you can disable the\n    | Google Icons here. This will affect the whole application.\n    |\n    */\n\n    'google_icons' =\u003e true,\n```\n\n### Logging\n\nYou can adjust the log level and whether to log in production. Currently used by Moox Sync and soon by other Moox packages, too.\n\n```php\n    /*\n    |--------------------------------------------------------------------------\n    | Logging\n    |--------------------------------------------------------------------------\n    |\n    | This config array sets the logging level and whether to log in\n    | production. It is used by some Moox packages where verbose\n    | logging is a good thing while implementing complex stuff.\n    |\n    */\n\n    'logging' =\u003e [\n        'verbose_level' =\u003e env('VERBOSE_LEVEL', 0), // 0: Off, 1: Debug, 2: Info, 3: All\n        'log_in_production' =\u003e env('LOG_IN_PRODUCTION', false),\n    ],\n```\n\n### Shared Hosting\n\nYou can enable shared hosting features. This is useful if you want to run scheduled tasks in shared hosting environments. It allows you to run the `queue:work` and 'schedule:run' command from an URL\n\n```php\n    /*\n    |--------------------------------------------------------------------------\n    | Shared Hosting\n    |--------------------------------------------------------------------------\n    |\n    | This config array sets the shared hosting token. This token is used to\n    | authenticate requests from shared hosting environments.\n    |\n    */\n\n    'shared_hosting' =\u003e [\n        'enabled' =\u003e env('SHARED_HOSTING_ENABLED', false),\n        'token' =\u003e env('SHARED_HOSTING_TOKEN', 'secret'),\n    ],\n```\n\n## Assets\n\nMoox Core provides a couple of (non-publishable) assets, loaded by a dynamic route. All images and assets in /public can be used like `url('/moox/core/assets/noimage.svg'`.\n\n## Changelog\n\nPlease see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently.\n\n## Security Vulnerabilities\n\nPlease review [our security policy](https://github.com/mooxphp/moox/security/policy) on how to report security vulnerabilities.\n\n## Credits\n\n-   [All Contributors](../../contributors)\n\n## License\n\nThe MIT License (MIT). Please see [License File](LICENSE.md) for more information.\n","funding_links":["https://github.com/sponsors/mooxphp"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmooxphp%2Fcore","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmooxphp%2Fcore","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmooxphp%2Fcore/lists"}