Skip to content

Changelog : ​

V 6.3.0 ​

What's new ​

  1. config/media.php now defines separate public and private media disks through media.disks.public (MEDIA_PUBLIC_DISK) and media.disks.private (MEDIA_PRIVATE_DISK). MEDIA_DISK still sets both at once. With the default local filesystem, public media go to Laravel's public disk and private media to the local disk.
  2. Generated resource collections now support detailed(), which marks every item in the collection as detailed.
  3. The generated Inertia/React FilepondInput component accepts an allowProcess prop. Passing an empty acceptedFileTypes array now turns off file-type validation.

What has been improved ​

  1. Files uploaded through a media column are now deleted when the model is never saved, the transaction rolls back, or the attribute is assigned again before saving, so failed writes no longer leave orphaned files behind. Files that the stored row references are always kept, including after saves that skip model events (saveQuietly(), Model::withoutEvents(), Event::fake()). Cloned and unserialized models never delete the original's uploads, and appending to a column that still holds unsaved uploads keeps them.
  2. Submitting stored media that doesn't belong to the record being written now fails with a validation error on that column. Previously the media was silently dropped.
  3. Private media URLs are now always temporary signed URLs. Media columns store only their storage metadata, while the API representation also includes url and name.
  4. Media validation and SerializedMedia::copyTo() now delete the temporary files they download, and temporary-file failures raise clear exceptions.
  5. BaseResource::extra() data is now included in direct resource responses as well as nested ones. Collection items are resolved through Laravel's resource pipeline, so conditional attributes such as when() are filtered correctly.
  6. HasMedia now registers its model events through bootHasMedia() instead of overriding the model's boot() method.
  7. The generated TypeScript Media model now includes storage_path, and file attributes on generated interfaces accept File | Media | null | undefined.

Notes / breaking changes ​

  1. The media.disk config key has been replaced by media.disks.public / media.disks.private. Re-publish config/media.php together with the media stubs. If you don't set MEDIA_DISK, existing public files stored on the local disk must be moved to the public disk (or set MEDIA_DISK=local), and you need to run php artisan storage:link.
  2. The private disk must support temporary URLs (for example, S3, or the local disk with serve enabled). SerializedMedia::url() now throws an exception for private media on any other disk, and the private disk can no longer be the public disk.
  3. The public static SerializedMedia::diskName() method has been removed.

V 6.2.0 ​

What's new ​

  1. The generated Inertia/React TextEditor and TranslatableTextEditor components now expose a configurable debounceDelay prop, defaulting to 250 milliseconds, for controlling how quickly edited content is committed to form state.

What has been improved ​

  1. Tiptap content updates now use a true debounce that restarts after every edit, keeps the latest onChange callback across parent renders and lets the existing save button flush pending content immediately.
  2. Editor transactions no longer rerender the entire editor integration. Toolbar formatting state and footer character/word counts now subscribe only to the editor state they need through useEditorState.
  3. StarterKit extensions are configured in one place instead of being registered twice, and the React/TypeScript installer no longer installs the redundant standalone extensions already bundled by StarterKit.
  4. Translatable rich-text values are accumulated through a stable reference, preventing rapid updates in different locales from overwriting one another and avoiding an unnecessary local-state render.

V 6.1.0 ​

What's new ​

  1. Generated Blade and Inertia/React dashboards now resolve their navigation, CRUD, authentication, table, form, modal, editor, notification and accessibility text from locale files instead of embedding user-facing English strings in generated pages and published components.
  2. Inertia dashboards now load locale-specific JSON modules through a reusable useTranslation hook with placeholder replacement and English fallback support; Inertia shares only the active locale with each request.
  3. Generating CRUD pages now adds missing model, plural-model, attribute and relation labels to every configured locale's Laravel site.php file and, for React dashboards, its locale JSON file without replacing existing values.
  4. Generated Blade DataTables and shared dashboard controls now consume the same locale selected by the existing language switcher, and generated documents expose the active locale through their HTML language attribute.

V 6.0.5 ​

  1. Fixing some bugs

V 6.0.4 ​

What's new ​

  1. Generated Inertia/React CRUD index tables now render generated belongsTo relation values as small linked buttons that open the related record's show page.
  2. Generated Inertia/React CRUD show pages now render generated belongsTo relation values as linked buttons that open the related record's show page.
  3. Generated Inertia/React CRUD pages now predict whether file columns contain images from names such as logo, image, photo, avatar, icon, thumbnail, banner, cover and poster. Image files render as previews in index tables and galleries on show pages, while other files render as download buttons.
  4. Generating a model with a relation to an existing model now reliably adds the reverse relation PHPDoc property to the existing model and the reverse property to its TypeScript interface, including model names whose interface filenames use lowercase or kebab case.

V 6.0.3 ​

Fixing some bugs ​

  1. Fixed the generated model PHPDoc type for file attributes to use SerializedMedia (or SerializedMedia|null for nullable attributes) and import App\Serializers\SerializedMedia, matching the value returned by the generated MediaCast instead of describing it as an array shape.

V 6.0.2 ​

What's new ​

  1. The auth installer now follows the project's configured validation type for every generated auth action across the API, Blade and Inertia/React stacks. Selecting DTO makes the generated auth controllers accept validated DTOs and read their data with toArray(); selecting FormRequest keeps the existing request-based behavior.
  2. Added validated DTOs for login, registration, password-reset requests, password resets, reset-code checks and user-profile updates. They are generated under the configured DTO namespace when the validation type is DTO or Both.
  3. When Both is selected, the auth installer now generates both form requests and DTOs while keeping the generated controllers dependent on form requests, consistent with the CRUD generators.
  4. The auth installer now installs the validated DTO package automatically when auth DTOs are enabled.

V 6.0.1 ​

What's new ​

  1. The permissions installer now generates RoleResource and PermissionResource classes for API and Inertia/React projects. Both resources expose the role or permission id and name.
  2. Generated UserResource classes now include roles and permissions collections when the permissions stack is installed, using whenLoaded() so those relations are serialized only after they have been loaded.
  3. Installing permissions after auth now updates the existing UserResource with the role and permission fields; installing auth after permissions includes the same fields while generating the resource.

V 6.0.0 ​

This release moves roles/permissions onto spatie/laravel-permission and reworks how file/media columns are stored and configured. Because both changes affect previously generated code and database schema, it is a breaking change, so we made it a major version.

What's new ​

  1. Generator commands (create:actor , create:dto , create:factory , create:migration , create:model , and others) can now be run non-interactively, accepting attributes/relations/uniques/nullables/container as arguments instead of interactive prompts, with sane defaults used where possible and a clear error raised when a required input is missing — handy for scripts, CI, or AI coding agents.
  2. Running any generator command with --help now prints detailed usage examples and an explanation of the attributes/relations/nullables/uniques/container argument formats, so you no longer need to check the docs to use them non-interactively.
  3. New publishable config/media.php lets you configure the storage disk, signed URL TTL for private files, and public/private path prefixes used by generated file/media columns.
  4. File columns now generate MediaCast::single() / MediaCast::array() casts (with an explicit private flag) instead of the old MediaCast::class . ":public,single" string syntax.
  5. File/media columns now store richer metadata (path, size, extension, MIME type) instead of a bare path string, giving you url() , exists() , contents() and delete() helpers on the value, and are migrated as json columns instead of nullable strings.
  6. If you install laravel/boost in your project, this package now ships Boost-compatible guidelines and a skill so AI coding agents get built-in guidance on how to use it correctly.

What has been improved ​

  1. Roles/permissions are now powered by spatie/laravel-permission instead of a custom-built system; the permissions installer now installs and configures it for you automatically.
  2. Actor/role references now use a native PHP RoleEnum instead of the removed RolesPermissionEnum .
  3. Generated file handling now cleans up replaced files on update, and removes files only on force-delete for soft-deletable models instead of on a regular soft delete.

Notes / breaking changes ​

  1. The previously generated custom roles/permissions system (models, migrations, middlewares and traits) has been removed in favor of spatie/laravel-permission . Existing projects that installed the old permissions stack need to migrate to Spatie's tables and APIs when upgrading.
  2. RolesPermissionEnum has been removed and replaced by RoleEnum ; update any code referencing the old enum.
  3. File/media columns are now migrated as json instead of nullable string , and the cast syntax changed from MediaCast::class . ":..." to MediaCast::single() / MediaCast::array() . Existing installs need a new migration and a cast update when upgrading media columns.

V 5.1.0 ​

What's new ​

  1. You can now choose how the generated code validates the incoming requests data. While installing (php artisan cubeta:install api , web or react-ts) or from the GUI settings page you pick one of:
    • FormRequest : the classic Laravel form requests (the default, and what previous versions always generated)
    • DTO : validated DTOs built on top of wendelladriel/laravel-validated-dto
    • Both : generate both classes Your choice is stored in cubeta-starter.config.json under validation_type , so every later generation follows it.
  2. Introducing the DTO generator, which creates a App\DTOs\<version>\<Model>\StoreUpdate<Model>DTO class extending ValidatedDTO with:
    • the same validation rules the form request gets
    • typed properties inferred from the column types (int , float , bool , string , UploadedFile), nullable columns being nullable and defaulting to null
    • casts for the castable columns (IntegerCast , FloatCast , BooleanCast , StringCast)
  3. Introducing the create:dto command and a matching --dto option for create:model , alongside the existing create:request / --request .
  4. wendelladriel/laravel-validated-dto is now installed for you by the api , web and react-ts installers whenever the chosen validation type includes DTOs.
  5. New dto_namespace and dto_path keys in config/cubeta-starter.php to control where the generated DTOs live.
  6. The generated controllers now inject the validation class you chose : a DTO is injected and read with $dto->toArray() , while a form request is still injected and read with $request->validated() . When you pick Both , both classes are generated and the controllers depend on the form request.

What has been improved ​

  1. The generated unique column rule now uses request()->isMethod('PUT') and request()->route(...) instead of $this->isMethod(...) and $this->route(...) , so the same rule works inside form requests and DTOs alike.

V 5.0.2 ​

What's new ​

  1. Introducing a new FilepondInput file field for the React/Inertia dashboard, built on top of FilePond, which replaces the previous plain file Input used for file columns. It comes with:
    • Drag-and-drop uploads with image previews and file posters
    • Single or multiple file selection via the isMultiple prop
    • Accepted file-type restrictions via the acceptedFileTypes prop (defaults to common image types)
    • Automatic hydration of existing Media values on edit forms, so already-uploaded files show up in the field
    • Standard field styling, label and validation error handling consistent with the other form fields
  2. File columns now generate the FilepondInput component instead of a basic file input, and edit forms pre-fill the field with the current media.
  3. The required FilePond plugins (image preview, file poster, file-type validation and EXIF orientation) are registered automatically in the dashboard layout, and all filepond / react-filepond packages are installed automatically by the React/TS packages installer.

V 5.0.1 ​

What's new ​

  1. Introducing a brand-new rich-text editor for the React/Inertia dashboard built on top of Tiptap, replacing the previous editor setup. The editor ships with a full toolbar out of the box:
    • Text formatting: bold, italic, text color and font family
    • Block elements: headings (H1–H6), blockquotes, bullet and ordered lists, horizontal rules
    • Rich content: links, images (by URL), tables, YouTube embeds and multi-column layouts
    • A live footer showing character and word counts
    • Debounced auto-save so content is committed to the form without an explicit save on every keystroke
    • An extraButtons prop so you can inject your own toolbar buttons with access to the editor instance
  2. Introducing the TextEditor form field that wraps the Tiptap editor with the standard field styling, label, required indicator and validation error handling used across the other form fields.
  3. Introducing the TranslatableTextEditor component for rich-text content that needs to be translated across multiple languages, following the same pattern as the other translatable form fields and integrating with the FormLocaleProvider language switcher.
  4. All required @tiptap/* packages are now installed automatically by the React/TS packages installer, so the editor works with no extra setup.

V 5.0.0 ​

This is a major release that upgrades the whole stack to Laravel 13 and rebuilds the generated React

dashboard on top of shadcn/ui. Because of the framework bump and the frontend rewrite it is a breaking

change, so we made it a major version.

What's new ​

  1. Adding support for Laravel 13 and dropping support for previous versions (now requires PHP 8.3+).
  2. The generated React/Inertia dashboard is now built on top of shadcn/ui , so you get a full set of accessible, themeable UI primitives (dialog , drawer , sidebar , select , calendar , popover , dropdown-menu , tabs , card , chart and more) published straight into your project.
  3. A components.json file is now generated so you can pull additional shadcn components into your project using the shadcn CLI.
  4. Introducing light/dark mode out of the box through a new theme-provider (powered by next-themes) with a ready-made theme toggle in the dashboard header.
  5. Toast notifications now use sonner via a dedicated toaster-provider , replacing the old react-toastify / sweetalert2 setup.
  6. Introducing the SerializedMedia serializer and a new MediaValidationRule to standardize how uploaded files are validated and represented across requests, resources and the frontend.
  7. New form field components generated for the dashboard, including a date-picker (backed by react-day-picker), checkbox , radio , textarea and reworked translatable inputs.
  8. A new FormLocaleProvider replaces the old translatable inputs context to manage the active locale of translatable fields inside your forms.

What has been improved ​

  1. Upgraded the frontend toolchain: Inertia React 3 , Vite 8 , TypeScript 7 and Tailwind CSS 4.3 , with lucide-react icons replacing the hand-written icon components.
  2. Generated Models now use the #[Fillable] attribute instead of the $fillable array, matching Laravel 13 conventions and keeping model classes cleaner.
  3. Auth flashes and redirects now use Inertia flash data instead of session flashes for a smoother SPA experience, and the auth screens ship with a dedicated AuthLayout .
  4. The config/cubeta-starter.php paths now use join_paths() so generation works consistently across operating systems.
  5. Command execution inside the generator now runs through proc_open instead of shell_exec , capturing both stdout and stderr and streaming output in real time for more reliable installs.
  6. Improved log handling and caching in the generation engine for more reliable and readable output.
  7. Added richer static-analysis annotations (#[ExpectedValues] , #[FileReference]) across the source for a better developer experience when contributing to or extending the package.
  8. Standardized all generated frontend file and import paths to lowercase for consistency.

Fixing some bugs ​

  1. Fixed ApiSelect typing and its handling of multiple-selection updates.
  2. Fixed media handling and file serialization edge cases in the generated resources and casts.
  3. Various fixes across the generated Inertia pages, auth screens and dashboard components.

Notes / breaking changes ​

  1. The cubeta-starter-templates publish tag and its template-customization workflow have been removed.
  2. The policy_path / policy_namespace config entries were removed from config/cubeta-starter.php .
  3. Because of the shadcn/ui rewrite, previously published dashboard components live under new lowercase paths , so re-publish the frontend assets when upgrading an existing project.

V 4.0.0 ​

This version basically is a rewrite for the package and it was a massive rewrite so for that we make it a major

version update

  1. Fixed bugs in blade and react components
  2. Add more type safety to the generated code
  3. Improved class doc blocks
  4. Add prettier to format JSX and Blade files
  5. Introduce the new Http class in Inertia React stack to normalize the request handling
  6. Refactor MainTestCase class and TestHelpers trait to be able to chain the calls in your testing

V 3.0.0 ​

  1. Adding support for the Laravel 12 and drop support for previous versions.
  2. Adding support for inertia.js 2.0 and drop support for previous versions.
  3. Adding support for tailwindcss 4.0 and drop support for previous versions.
  4. Adding support for react 19 and drop support for previous versions.
  5. Introduce ApiResponse class to replace the RestTrait to handle api responses
  6. Introduce the new MediaCast mode cast class to replace the usage of the FileHandler trait
  7. Bug fixes

V 2.2.0 ​

  1. Adding support for the Laravel 11 and drop support for previous versions.
  2. Bug fixes

V 2.1.0 ​

  1. Introducing The BaseBulkAction class to make it easy to define your model available bulk actions .
  2. Removing The BaseService and BaseRepository classes interfaces .

V 2.0.0 ​

  1. Adding support generate dashboard CRUD'S using React , Typescript , Inertia.js , Tailwindcss
  2. Adding the ability to generate the code structure based on a version number via the package config file check here
  3. Updating the structure of the repository and service patterns to be instantiated using the singleton pattern and remove their dependency injection process
  4. Now just the blade based generation requires a service provider to register the blade components published via the package
  5. All required middlewares , exceptions handlers and service providers for a specific stack is being registered via its install command

V 1.1.7 ​

fixing some bugs ​

  1. fixing the generated routes names for the generated controllers .
  2. now when publishing for api or for web 2 route files will be generated ( public , protected ) to give more customizable routing instead of the generated route files based on the actor name .

V 1.1.6 ​

  1. new attribute exact has been added to the gallery-item blade component so if you'd like to provide the exact source of the image
  2. add 2 new components <x-translatable-text-editor /> and <x-translatable-long-text-field /> to handle the localized long text field (the ones those need text editors)
  3. there is now three function for sweet alert messages triggerSwallSuccess(message) , triggerSwalError(message) , triggerSwallMessage(message) so you can use them in your project after including public/js/CustomFunctions.js , (in the generated dashboard this file is already included).
  4. now there is a cubeta-starter.config.json in the root directory of your project this will guid the package for some tables data, and it is a first step on the next feature which is (presets handling) .
  5. we've added create:example command for those who are trying to se what the package capable of , this command will give you three option :
    • the first one is to create the Category model which has many products
    • the second one is to create the Product model which related to brands by many to many relation
    • finally the brands model
  6. we've tried to not generate a code that use a relation to a table not defined yet and then when it is defined we add the proper code (you can check that by running the command : php artisan create:example and generate the product before the category) .

fixing some bugs ​

  1. remove required attribute from the input fields in the generated edit forms
  2. adding .gallery css class to the gallery-item blade component so the functions in the public/js/PluginInitializer.js file can handle it.

V 1.1.5 ​

  1. Now every input component has a name attribute this attribute is nullable, when it is null this attribute will take the value of the label attribute transformed to lower and snake case

V 1.1.4 ​

  1. Making the columns of type translatable being cast into Translatable::class custom cast instead of generating an accessor for each translated column . you can find the custom cast Translatable::class after publishing cubeta-starter-locale tag in the app/Casts directory

Released under the MIT License.