Nevela, the fullstack framework for Laravel and Next.js
The fullstack frameworkfor Laravel and Next.js
Describe a resource once. Nevela writes the table, the API, the validation and the policy in Laravel, and the dashboard screens in Next.js. Laravel stays the only place your rules live.
pnpm create nevela my-appnpm create nevela@latest my-appphp nevela resource Product --fields="name:string, sku:string!, price:money"php nevela seed Product --count=1000nevela upgradephp artisan nevela:resource Contact \
--fields="name:string,
email:email!,
phone:tel?,
status:enum(lead|customer)"
php artisan migrate- nevela/resources/contact.jsonDescriptor
- app/Models/Contact.phpEloquent model
- database/migrations/…_create_contacts_table.phpMigration
- app/Http/Requests/Nevela/ContactRequest.phpValidation
- app/Http/Controllers/Api/ContactController.phpREST API
- app/Policies/ContactPolicy.phpAuthorization
- routes/nevela.phpRoutes
- web: resources/contact.resource.tsDashboard descriptor
- web: app/dashboard/contacts/page.tsxTable, forms, detail
Edit the descriptor and run nevela:generate: every file follows, and your own code outside the generated blocks is kept.
- Laravel
- Eloquent
- Sanctum
- Next.js 16
- React 19
- Flare dashboard
- Tailwind CSS
[ 01 / 03 ] Describe
Everything a resource needs,
from one description
nevela:resource turns a list of fields into a working feature on both sides: the Laravel code that owns the data, and the screens people use to work with it.
- REST APIList, read, create, update, replace and delete for every resource, with paging, sorting, search and filters.
- ValidationA Laravel form request per resource. Its messages show next to the right field in the dashboard.
- DashboardTables, stats, forms, detail pages, import and export for every resource, from its descriptor.
- AuthorizationA Laravel policy per resource. Laravel decides; the dashboard only shows the answer.
- Sign-inSanctum tokens kept in an httpOnly cookie. The browser never sees the token.
- DatabaseEloquent models with UUID ids and a migration you can read, on any database Laravel supports.
- SeedingFill a resource with plausible records in one command, and see how long it took.
- Your code is keptRegeneration rewrites only its marked blocks, and tells you when you edited inside one.
[ 02 / 03 ] Generate
One command to start,
one for each thing you add
Each one writes plain, readable files into your project. Change them, or regenerate: Nevela keeps your edits and tells you when it skipped a file.
A new app in one command: a Laravel API and a Next.js dashboard, installed and connected.
Read the referencepnpm create nevela my-app- ✔ Creating the Laravel app
- ✔ Installing Nevela and token sign-in
- ✔ Setting up the database
- ✔ Installing dashboard packages (pnpm)
- ✔ Created my-app
- Sign in with admin@example.com / password
Describe a resource once. Nevela writes the Laravel side and the dashboard side from it.
Read the referencephp artisan nevela:resource Product --fields="name:string, sku:string!, price:money, kind:enum(stock|digital)"- created app/Models/Product.php
- created database/migrations/…_create_products_table.php
- created app/Http/Requests/Nevela/ProductRequest.php
- created app/Http/Controllers/Api/ProductController.php
- created app/Policies/ProductPolicy.php
- created ../web/resources/product.resource.ts
- created ../web/app/dashboard/products/page.tsx
Change the descriptor and run it again. Generated blocks follow; your own code stays where it is.
Read the referencephp artisan nevela:generate- updated app/Models/Product.php
- updated app/Http/Requests/Nevela/ProductRequest.php
- exists (yours) app/Policies/ProductPolicy.php
- updated ../web/resources/product.resource.ts
- exists (yours) ../web/app/dashboard/products/page.tsx
Fill a resource with records that follow its descriptor, timed.
Read the referencephp artisan nevela:seed Product --count=1000- info Seeded 1,000 Products in 114 ms (8,809 rows/s).
- Products in the database .......... 1,000
And what you write stays small
{ "name": "Product", "icon": "package", "group": "Catalogue", "fields": { "name": { "kind": "string" }, "sku": { "kind": "string", "unique": true }, "price": { "kind": "float", "format": "money" }, "kind": { "kind": "enum", "options": ["stock", "digital"] }, "notes": { "kind": "text", "required": false } }}class ProductPolicy{ // Laravel enforces this on every request. The dashboard shows the answer. public function delete(User $user, Product $product): bool { return $user->role === 'admin'; }}class Product extends Model{ // nevela:generated:start hash=4f1c2a9b7e31 protected $fillable = ['name', 'sku', 'price', 'kind', 'notes']; // nevela:generated:end
// Yours. Regeneration never touches what is outside the markers. public function scopeDigital($query) { return $query->where('kind', 'digital'); }}curl -g "http://127.0.0.1:8000/api/products?sort=-price&q=lamp&filter[kind]=stock" \ -H "Accept: application/json" -H "Authorization: Bearer $TOKEN"[ 03 / 03 ] Run
Laravel decides,
the dashboard shows
The Next.js server holds the sign-in token and calls Laravel for everything. The browser never talks to Laravel, and no rule is written twice.
curl -X POST /api/products -d '{"name": "", "sku": "L-1"}'- 422 Validation failed.
- name: The name field is required.
- sku: The sku has already been taken.
- price: The price field is required.
- The same messages appear next to each field in the dashboard form.
The dashboard uses the same REST API you can call from a mobile app, a script or another service.
REST API referenceSeed a thousand records that follow the descriptor, and see the time it took.
php artisan nevela:seed ProductSeedingQuestions
Is it production-ready?
Not yet. Nevela is at 0.x: the generator, the API and the dashboard work end to end and are tested on every change, but relations, file uploads and account pages are still to come, and things can change between minor versions.
Where do the rules live?
In Laravel only. Validation is a form request, authorization is a policy, and the dashboard shows what Laravel answers. No rule is written twice.
Can I edit the generated code?
Yes. Generated code lives inside marked blocks; everything outside them is yours and is never touched. If you edit inside a block, Nevela skips that file and tells you instead of overwriting it.
How does it relate to Flare?
The dashboard is Flare's Next.js frontend by Muke Johnbaptist, used under the MIT license. Nevela replaces its database and sign-in layer with calls to Laravel, and generates Flare's resource descriptors from Laravel.
Which databases work?
Any that Laravel supports: SQLite, MySQL, MariaDB, PostgreSQL and SQL Server. The Laravel app ships set up for SQLite, which needs no installation.