Changelog :
V 6.3.0
What's new
config/media.phpnow defines separate public and private media disks throughmedia.disks.public(MEDIA_PUBLIC_DISK) andmedia.disks.private(MEDIA_PRIVATE_DISK).MEDIA_DISKstill sets both at once. With the defaultlocalfilesystem, public media go to Laravel'spublicdisk and private media to thelocaldisk.- Generated resource collections now support
detailed(), which marks every item in the collection as detailed. - The generated Inertia/React
FilepondInputcomponent accepts anallowProcessprop. Passing an emptyacceptedFileTypesarray now turns off file-type validation.
What has been improved
- 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. - 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.
- Private media URLs are now always temporary signed URLs. Media columns store only their storage metadata, while the API representation also includes
urlandname. - Media validation and
SerializedMedia::copyTo()now delete the temporary files they download, and temporary-file failures raise clear exceptions. 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 aswhen()are filtered correctly.HasMedianow registers its model events throughbootHasMedia()instead of overriding the model'sboot()method.- The generated TypeScript
Mediamodel now includesstorage_path, and file attributes on generated interfaces acceptFile | Media | null | undefined.
Notes / breaking changes
- The
media.diskconfig key has been replaced bymedia.disks.public/media.disks.private. Re-publishconfig/media.phptogether with the media stubs. If you don't setMEDIA_DISK, existing public files stored on thelocaldisk must be moved to thepublicdisk (or setMEDIA_DISK=local), and you need to runphp artisan storage:link. - The private disk must support temporary URLs (for example, S3, or the
localdisk withserveenabled).SerializedMedia::url()now throws an exception for private media on any other disk, and the private disk can no longer be thepublicdisk. - The public static
SerializedMedia::diskName()method has been removed.
V 6.2.0
What's new
- The generated Inertia/React
TextEditorandTranslatableTextEditorcomponents now expose a configurabledebounceDelayprop, defaulting to 250 milliseconds, for controlling how quickly edited content is committed to form state.
What has been improved
- Tiptap content updates now use a true debounce that restarts after every edit, keeps the latest
onChangecallback across parent renders and lets the existing save button flush pending content immediately. - 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. StarterKitextensions are configured in one place instead of being registered twice, and the React/TypeScript installer no longer installs the redundant standalone extensions already bundled byStarterKit.- 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
- 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.
- Inertia dashboards now load locale-specific JSON modules through a reusable
useTranslationhook with placeholder replacement and English fallback support; Inertia shares only the active locale with each request. - Generating CRUD pages now adds missing model, plural-model, attribute and relation labels to every configured locale's Laravel
site.phpfile and, for React dashboards, its locale JSON file without replacing existing values. - 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
- Fixing some bugs
V 6.0.4
What's new
- Generated Inertia/React CRUD index tables now render generated
belongsTorelation values as small linked buttons that open the related record's show page. - Generated Inertia/React CRUD show pages now render generated
belongsTorelation values as linked buttons that open the related record's show page. - Generated Inertia/React CRUD pages now predict whether file columns contain images from names such as
logo,image,photo,avatar,icon,thumbnail,banner,coverandposter. Image files render as previews in index tables and galleries on show pages, while other files render as download buttons. - 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
- Fixed the generated model PHPDoc type for file attributes to use
SerializedMedia(orSerializedMedia|nullfor nullable attributes) and importApp\Serializers\SerializedMedia, matching the value returned by the generatedMediaCastinstead of describing it as an array shape.
V 6.0.2
What's new
- 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
DTOmakes the generated auth controllers accept validated DTOs and read their data withtoArray(); selectingFormRequestkeeps the existing request-based behavior. - 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
DTOorBoth. - When
Bothis 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. - The auth installer now installs the validated DTO package automatically when auth DTOs are enabled.
V 6.0.1
What's new
- The permissions installer now generates
RoleResourceandPermissionResourceclasses for API and Inertia/React projects. Both resources expose the role or permissionidandname. - Generated
UserResourceclasses now includerolesandpermissionscollections when the permissions stack is installed, usingwhenLoaded()so those relations are serialized only after they have been loaded. - Installing permissions after auth now updates the existing
UserResourcewith 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
- 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. - Running any generator command with
--helpnow 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. - New publishable
config/media.phplets you configure the storage disk, signed URL TTL for private files, and public/private path prefixes used by generated file/media columns. - File columns now generate
MediaCast::single()/MediaCast::array()casts (with an explicitprivateflag) instead of the oldMediaCast::class . ":public,single"string syntax. - File/media columns now store richer metadata (path, size, extension, MIME type) instead of a bare path string, giving you
url(),exists(),contents()anddelete()helpers on the value, and are migrated asjsoncolumns instead of nullable strings. - If you install
laravel/boostin 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
- Roles/permissions are now powered by
spatie/laravel-permissioninstead of a custom-built system; thepermissionsinstaller now installs and configures it for you automatically. - Actor/role references now use a native PHP
RoleEnuminstead of the removedRolesPermissionEnum. - 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
- 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. RolesPermissionEnumhas been removed and replaced byRoleEnum; update any code referencing the old enum.- File/media columns are now migrated as
jsoninstead of nullablestring, and the cast syntax changed fromMediaCast::class . ":..."toMediaCast::single()/MediaCast::array(). Existing installs need a new migration and a cast update when upgrading media columns.
V 5.1.0
What's new
- You can now choose how the generated code validates the incoming requests data. While installing (
php artisan cubeta:install api,weborreact-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-dtoBoth: generate both classes Your choice is stored incubeta-starter.config.jsonundervalidation_type, so every later generation follows it.
- Introducing the DTO generator, which creates a
App\DTOs\<version>\<Model>\StoreUpdate<Model>DTOclass extendingValidatedDTOwith:- 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 tonull - casts for the castable columns (
IntegerCast,FloatCast,BooleanCast,StringCast)
- Introducing the
create:dtocommand and a matching--dtooption forcreate:model, alongside the existingcreate:request/--request. wendelladriel/laravel-validated-dtois now installed for you by the api , web and react-ts installers whenever the chosen validation type includes DTOs.- New
dto_namespaceanddto_pathkeys inconfig/cubeta-starter.phpto control where the generated DTOs live. - 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 pickBoth, both classes are generated and the controllers depend on the form request.
What has been improved
- The generated unique column rule now uses
request()->isMethod('PUT')andrequest()->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
- Introducing a new
FilepondInputfile field for the React/Inertia dashboard, built on top ofFilePond, which replaces the previous plain fileInputused for file columns. It comes with:- Drag-and-drop uploads with image previews and file posters
- Single or multiple file selection via the
isMultipleprop - Accepted file-type restrictions via the
acceptedFileTypesprop (defaults to common image types) - Automatic hydration of existing
Mediavalues 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
- File columns now generate the
FilepondInputcomponent instead of a basic file input, and edit forms pre-fill the field with the current media. - 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-filepondpackages are installed automatically by the React/TS packages installer.
V 5.0.1
What's new
- 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
extraButtonsprop so you can inject your own toolbar buttons with access to the editor instance
- Introducing the
TextEditorform field that wraps the Tiptap editor with the standard field styling, label, required indicator and validation error handling used across the other form fields. - Introducing the
TranslatableTextEditorcomponent 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 theFormLocaleProviderlanguage switcher. - 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
- Adding support for
Laravel 13and dropping support for previous versions (now requiresPHP 8.3+). - 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,chartand more) published straight into your project. - A
components.jsonfile is now generated so you can pull additionalshadcncomponents into your project using theshadcnCLI. - Introducing light/dark mode out of the box through a new
theme-provider(powered bynext-themes) with a ready-made theme toggle in the dashboard header. - Toast notifications now use
sonnervia a dedicatedtoaster-provider, replacing the oldreact-toastify/sweetalert2setup. - Introducing the
SerializedMediaserializer and a newMediaValidationRuleto standardize how uploaded files are validated and represented across requests, resources and the frontend. - New form field components generated for the dashboard, including a
date-picker(backed byreact-day-picker),checkbox,radio,textareaand reworked translatable inputs. - A new
FormLocaleProviderreplaces the old translatable inputs context to manage the active locale of translatable fields inside your forms.
What has been improved
- Upgraded the frontend toolchain:
Inertia React 3,Vite 8,TypeScript 7andTailwind CSS 4.3, withlucide-reacticons replacing the hand-written icon components. - Generated Models now use the
#[Fillable]attribute instead of the$fillablearray, matching Laravel 13 conventions and keeping model classes cleaner. - 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. - The
config/cubeta-starter.phppaths now usejoin_paths()so generation works consistently across operating systems. - Command execution inside the generator now runs through
proc_openinstead ofshell_exec, capturing both stdout and stderr and streaming output in real time for more reliable installs. - Improved log handling and caching in the generation engine for more reliable and readable output.
- Added richer static-analysis annotations (
#[ExpectedValues],#[FileReference]) across the source for a better developer experience when contributing to or extending the package. - Standardized all generated frontend file and import paths to lowercase for consistency.
Fixing some bugs
- Fixed
ApiSelecttyping and its handling of multiple-selection updates. - Fixed media handling and file serialization edge cases in the generated resources and casts.
- Various fixes across the generated Inertia pages, auth screens and dashboard components.
Notes / breaking changes
- The
cubeta-starter-templatespublish tag and its template-customization workflow have been removed. - The
policy_path/policy_namespaceconfig entries were removed fromconfig/cubeta-starter.php. - Because of the
shadcn/uirewrite, 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
- Fixed bugs in blade and react components
- Add more type safety to the generated code
- Improved class doc blocks
- Add prettier to format JSX and Blade files
- Introduce the new
Httpclass in Inertia React stack to normalize the request handling - Refactor MainTestCase class and TestHelpers trait to be able to chain the calls in your testing
V 3.0.0
- Adding support for the
Laravel 12and drop support for previous versions. - Adding support for
inertia.js 2.0and drop support for previous versions. - Adding support for
tailwindcss 4.0and drop support for previous versions. - Adding support for
react 19and drop support for previous versions. - Introduce
ApiResponseclass to replace theRestTraitto handle api responses - Introduce the new
MediaCastmode cast class to replace the usage of theFileHandlertrait - Bug fixes
V 2.2.0
- Adding support for the
Laravel 11and drop support for previous versions. - Bug fixes
V 2.1.0
- Introducing The
BaseBulkActionclass to make it easy to define your model available bulk actions . - Removing The BaseService and BaseRepository classes interfaces .
V 2.0.0
- Adding support generate dashboard CRUD'S using React , Typescript , Inertia.js , Tailwindcss
- Adding the ability to generate the code structure based on a version number via the package config file check here
- Updating the structure of the repository and service patterns to be instantiated using the singleton pattern and remove their dependency injection process
- Now just the blade based generation requires a service provider to register the blade components published via the package
- 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
- fixing the generated routes names for the generated controllers .
- 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
- new attribute
exacthas been added to thegallery-itemblade component so if you'd like to provide the exact source of the image - 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) - there is now three function for sweet alert messages
triggerSwallSuccess(message),triggerSwalError(message),triggerSwallMessage(message)so you can use them in your project after includingpublic/js/CustomFunctions.js, (in the generated dashboard this file is already included). - now there is a
cubeta-starter.config.jsonin 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) . - we've added
create:examplecommand 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
- 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:exampleand generate the product before the category) .
fixing some bugs
- remove
requiredattribute from the input fields in the generated edit forms - adding
.gallerycss class to thegallery-itemblade component so the functions in thepublic/js/PluginInitializer.jsfile can handle it.
V 1.1.5
- Now every input component has a
nameattribute this attribute is nullable, when it isnullthis attribute will take the value of thelabelattribute transformed to lower and snake case
V 1.1.4
- Making the columns of type translatable being cast into
Translatable::classcustom cast instead of generating an accessor for each translated column . you can find the custom castTranslatable::classafter publishingcubeta-starter-localetag in theapp/Castsdirectory
