area17/twill
Twill is an open-source Laravel package for building a custom CMS fast. It provides a polished admin UI with prebuilt features and Vue components, stays flexible and extensible, works headless or integrated, and lets you use your own models with no lock-in.
composer require area17/twill, then run php artisan twill:install to scaffold the admin UI, publish config/migrations, and create a basic Admin user.Page) and its migration, then generate a Twill A17\Twill\Http\Controllers\Admin\SingletonModuleController (for singletons) or CrudController (for collections) via php artisan twill:make:admin Page.setUpManager() method—specify which fields to show in listing, form, and relationships via listProperties, formFields, and editFormPanels.twill.disabled in .env to disable the admin UI during development, or run php artisan twill:clear-cache after config changes.Project, ProjectGalleryImage, ProjectTeamMember) into cohesive modules using Twill’s built-in relationships (many-to-many, morphMany, belongsTo) declared in the controller via hasMany, belongsToMany, etc. Use twill-img, twill-repeater, and twill-modal for rich UI components.SingletonModuleController (e.g., for SiteSettings, Homepage) with A17\Twill\Models\Singleton to manage site-wide data that appears in only one instance.twill-repeater and twill-blocks—create custom Vue components for specialized blocks (e.g., a HeroBlock with image, video, and CTA) and register them in config/twill.php under blocks.AuthServiceProvider. Use canViewAny, canEdit, etc., on models and in controller logic.A17\Twill\Api\Controllers\ApiController for headless frontends, or use Twill’s view() method to render Blade views directly. For hybrid apps, use A17\Twill\Traits\Exportable to generate JSON feeds.php artisan twill:install publishes twill_users and related migrations—but if you’re adding custom fields to Twill’s core models (e.g., twill_users), do not modify vendor files; extend via user model traits (e.g., A17\Twill\Models\User) or use A17\Twill\Models\Singleton extensions.@twillLayout (not @extends) in admin views, and wrap custom admin views in twill::layouts.app. Avoid direct Blade @push in controller views—use Twill’s @twillScripts and @twillStyles slots instead.php artisan twill:clear-cache and php artisan config:clear. Rehydration (e.g., $model->rehydrate()) is needed after bulk updates to relationship collections.listProperties or formFields, always call parent::setUpManager() first if extending built-in Twill controllers. Missed calls cause missing fields or broken relations.listProperties ('perPage' => 25) and avoid eager-loading unnecessary relations in getIndexQuery()—only include with() relations actually used in listing columns.How can I help you explore Laravel packages today?