NewClaude over MCP — it proposes, you approve.

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.

app.example.com/admin/customers

Customers

New customer
ALAda Lovelaceada@example.comAdmin
GHGrace Hoppergrace@example.comEditor
ATAlan Turingalan@example.comEditor
KJKatherine Johnsonkatherine@example.comViewer

Built on

LaravelInertiaReactTailwind CSSshadcn/uiPuckMCP

Core

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
app/Resources/CustomerResource.php
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

example.com/admin/customers

New customer

Name *

Ada Lovelace

Email *

ada@example.com

Plan

Pro

CancelCreate

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
app.example.com/admin/site/pages/3/edit
Summer campDraft · savedPreviewPublish
Hero

Summer camp 2027

Five days by the lake, 4–8 August

Sign up

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
example.com/forms/membership
Your detailsMembership3Sign

Sign here

With your finger or mouse.

Send
membership-0142.pdfSigned · stored with the submission

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.

~/code
$ composer create-project bezalel/starter my-app
Installing bezalel/starter — a Laravel app with Core set up
$ cd my-app
$ php artisan bezalel-core:build
Built every Resource and Page the panels register
$ php artisan serve
Server 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 now

Start an app

  1. 1

    Get Composer access

    Your account gives you a token for packages.bezalel.rocks.

  2. 2

    Create the app

    Start from bezalel/starter — a Laravel app with Core already set up.

  3. 3

    Describe your entities

    Write a Resource class per entity and build it.

  4. 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.

Build your first app

Ask for an account and get Composer access.

Get started