A Laravel package
Bezalel Core
Describe your data. Get a real admin.
Core is a Laravel package: one PHP class per entity compiles to a real controller and React pages you can open and change — with a website builder, forms, approvals, notifications and tools your AI can use, already built.
Customers
New customerBuilt on
LaravelInertiaReactTailwind CSSshadcn/uiPuckMCPCore
One class per entity, real code out
Fields that describe themselves
A field knows its form input, its table column and its filter — no second file listing the same names, no array config.
TextField::make('name')
->required()
->searchable(),
SelectField::make('status')
->options($statuses),
Generated, then yours
bezalel-core:build writes the controller and the pages: plain code to read and edit.
A website builder
Pages and menus in the browser, blocks in TSX, drafts, scheduled publishing and server rendering.
Forms and approvals
Forms visitors fill in, with steps, signatures and signed PDFs — and approval rules over saves and AI calls.
Teams and roles
Teams, roles and permissions, impersonation and two-factor sign-in.
Tools for your AI
Resources and pages become MCP tools under the signed-in person’s own permissions.
Nothing is final
Subclass any field, filter, column or action, and override just the step you need.
How it works
A class in, a working admin out
Describe an entity once — its fields, rules and which are searchable — and bezalel-core:build writes the controller, the table, the form and their types.
- Real files in your app, not a runtime that interprets config
- Edit any generated page by hand; it’s plain React
- Subclass a field, column or action to change one step
class CustomerResource extends Resource { public static function fields(): array { return [ TextField::make('name') ->rules(['required']) ->searchable(), TextField::make('email') ->rules(['required', 'email']) ->sortable(), SelectField::make('plan') ->options([ 'free' => 'Free', 'pro' => 'Pro', ]), ]; } }
$ php artisan bezalel-core:build CustomerResource
+ Http/Controllers/CustomerController.php
+ Pages/Customers/Index.tsx
+ Pages/Customers/Form.tsx
+ Pages/Customers/types.ts
New customer
Name *
Ada Lovelace
Email *
ada@example.com
Plan
Pro
The admin
An admin that's complete on day one
- Tables that do the work
- Sort, search, filters as tabs or menus, bulk and row actions, a card view and columns each person can choose.
- Forms beyond fields
- Tabs, grids and cards, repeaters, fields that show or require themselves from other answers, and forms in a dialog or drawer.
- Dashboards and charts
- Widgets and charts over any Resource, from counts and totals to time series.
- A history of every change
- An activity log on every record, soft deletes with restore, and who did what.
- Media and documents
- A media library with folders, images in rich text, and documents edited in the browser.
- People and access
- Teams, roles and permissions per action, impersonation for support, passkeys and two-factor.
The website
A website your team edits
Pages built from your blocks in the browser, with drafts, scheduled publishing, menus and several languages — rendered on the server, quick for visitors and search engines.
- Blocks are TSX your developers write
- Components authors build on a canvas, exportable as TSX
- Datasets and charts over your own records
Blocks
HeroFeature gridGalleryFormTextSummer camp 2027
Five days by the lake, 4–8 August
Sign upHero
Heading
Summer camp 2027
Button
Sign up
Goes to
Camp sign-up form
Forms
Forms that end in a signed PDF
Authors build forms with steps and signatures; Core derives every rule in PHP and keeps each submission — with a signed PDF and a confirmation link when you want them.
- Field types and what happens next are PHP classes
- Approval rules before anything is acted on
- Stored submissions to review in the admin
Sign here
With your finger or mouse.
Start in minutes
From empty folder to working admin
With packages.bezalel.rocks in your Composer config, the starter is a fresh Laravel app with Core already wired in: users, roles, a media library and a website, ready to sign in to.
$ composer create-project bezalel/starter my-appInstalling bezalel/starter — a Laravel app with Core set up$ cd my-app$ php artisan bezalel-core:buildBuilt every Resource and Page the panels register$ php artisan serveServer running on http://127.0.0.1:8000 — sign in at /admin$
Built in
Reaches people where they are
- Notifications
- An inbox in the header, push to phones and computers, and email for anyone who hasn’t turned push on.
- An installable app
- Your admin installs on phones and desktops like a native app, with your own name and icon.
- Reminders
- Scheduled reminders written as classes — what is due, when and to whom — that people can retime and reword.
- Campaigns
- Messages to your users or to your records’ addresses, by email and push, now or later, with a delivery report.
- Every language
- A language switch for people and for the website, with translations in plain JSON files.
- Approvals
- Multi-step approval rules over saves, actions, form submissions and AI calls — approvers can answer by email.
Tools for your AI
Your app, as tools for Claude
Turn on mcp() for a Resource and its table, record and actions become MCP tools — called as the person who connected Claude, with their permissions and nothing more.
- orders_list, orders_get, orders_update and your actions
- Approval rules hold Claude’s calls for a person
- An assistant in the page editor that proposes changes
- Every call on the AI activity page
Which orders are still unpaid after two weeks?
orders_listas Ada · Manager
{"status": "unpaid", "created": "before 2 weeks ago"}
#1041Globex18 days
#1037Initech21 days
#1029Acme Corp26 days
Three orders. Mark #1041 as paid? It needs a manager’s approval, so I’ll send it for one.
Send for approvalNot nowStart an app
- 1
Get Composer access
Your account gives you a token for packages.bezalel.rocks.
- 2
Create the app
Start from bezalel/starter — a Laravel app with Core already set up.
- 3
Describe your entities
Write a Resource class per entity and build it.
- 4
Run it
Deploy it to a server running Forge.
Questions
Do I need to know React?
No. You describe Resources in PHP and Core writes the pages; when you want to change one, it’s plain React to edit.
Is the generated code mine?
Yes — the controllers and pages are plain files in your app, yours to edit and commit.
Which Laravel version?
Laravel 13, with Inertia and React.
Can my AI use the app?
Yes. Core exposes your Resources and pages as MCP tools, with each person’s own permissions, and connected apps can be disconnected any time.