Translation
If you know Laravel, you know most of this
Nearly every concept has a counterpart. The interesting rows are the last group, where there is no clean translation in either direction.
Data
LaravelFrontierJS
Eloquent→litestone
Migrations (PHP schema builder)→diffed from schema.liteYou edit the schema; the migration is generated from the difference, not written.
Model casts, $fillable, mutators→field attributes@trim @lower @length(1,200) — declared on the field, applied on the way in.
Policies · Gates→@@allow · @@gateDeclared on the Model and compiled into the query, rather than checked in the controller.
Global scopes→row policies
Database drivers (MySQL, Postgres, SQLite…)→SQLite onlyA deliberate narrowing, and the reason the same engine can run in the browser. Also a real limit — see below.
API
Resource controllers→createService({ model })CRUD is derived from the Model rather than scaffolded into a class you own.
Form Requests · $request->validate()→derived from the fields
Middleware→hooksaround · before · after · error, per method or all.
Eloquent API Resources→the result envelopeOne shape for every service instead of a transformer per resource.
Service providers→plugins{ name, register, boot, ready, shutdown, requires }
Queues · Horizon→app.jobsCaravan — a queue on SQLite, in the same process. No Redis, and no Horizon either.
Scheduler (schedule:run + cron)→app.jobs.schedule()In-process, no crontab entry to install.
Mail · Mailables→mailer battery
Notifications (multi-channel)→app.notifyThe closest thing on the page: a class with via() and a method per channel. FrontierJS took the design.
Broadcasting · Echo · Reverb→app.channelDeclared as channel: on the service, announced once from the call, not from each handler.
Sanctum · Passport · Fortify→@frontierjs/authFar thinner. No OAuth, no first-party social login.
Telescope · Pulse→/health · /metrics · /manifestEndpoints, not a UI.
UI
Blade · Livewire→.mesaA compiler with signals, closer to Svelte than to a template engine.
Inertia→sierraFile-tree routing plus createResource binding to the API.
Vite integration · Sail→fli dev
Markdown mailables→email-kitReal components rendered to table-based HTML, from the same language as the app.
Tailwind (via Breeze/Jetstream)→@frontierjs/cssSemantic classes and themes rather than utilities. A different philosophy, not a better one.
Tooling
Artisan→fli
artisan make:*→fli make:*Generators exist in both. The difference is how much they need to generate.
Tinker→litestone studio
Pest · PHPUnit→bring your ownSuite is a named realm with no package behind it yet. Tests here are bun test / vitest.
Factories · Seeders→no equivalentA real gap. You write seed scripts by hand.
Forge · Vapor · Cloud→no equivalentSelf-hosting is the only path. For some readers that is the feature; for others it is the dealbreaker.
No clean translation
Nothing here maps back — the validation rules, live in the browser→resource.fieldsLaravel's answer is Precognition: run the real server rules over the wire. Same goal, different mechanism — a round trip and a running server versus a local check from the same schema.
Nothing here maps back — the model's permissions, in the browser→resource.can()Blade's @can already does this for server-rendered pages. The gap opens in an SPA, where you hand-pass can booleans as Inertia props and keep them in sync yourself.
Eloquent, Blade, queues, notifications as separate ecosystems→one schema under all of them