grafite/formmaker
Grafite FormMaker is a Laravel package for rapidly building model-driven forms with reusable field types, validation, and relationship-aware inputs. It simplifies form generation and editing for admin panels and CRUD workflows, reducing repetitive Blade markup.
Architecture fit. Unchanged. FormMaker implements a form-as-a-class pattern: each form is a PHP class extending the package's base form, declaring a fields() array (type, name, options, attributes) and optionally a buildForm() override; the class renders itself to HTML via formHtml() / string casting in Blade. Architecturally this is a domain-object layer over presentation, which is a genuine improvement over ad-hoc Blade partials when the same form must appear in multiple controllers, be unit-tested for field composition, or be generated programmatically. It is not a UI framework — there is no reactivity, no client-side state, no component model. Fit remains strongest in server-rendered Laravel monoliths with conventional controller → view flows, and weak in Inertia/Vue/Svelte SPAs, Livewire-heavy codebases, or API-first services where form structure is a front-end concern. The v6.0.0 headline — Bootstrap 5 compatibility — is a presentation-layer change and does not alter this positioning in either direction.
Integration feasibility. Mechanically still simple (Composer install, service-provider auto-discovery, publish config and field partials to override markup), but the feasibility picture is now less certain, not more. The prior assessment assumed a frozen 2022-era package; v6.0.0 is a major version bump delivered with a single-line release note ("Bootstrap 5 compatibility and more"). A major bump is by definition a breaking-change signal, and we have no changelog, no diff review, and no stated compatibility matrix. Two specific unknowns now sit on the critical path:
illuminate/* constraint has moved past Laravel 8/9. The PHP 8.1+ deprecation surface (dynamic properties, implicit nullable parameters, ${var} interpolation in field partials) may be untouched. The "does it install and render cleanly on our current Laravel/PHP" spike remains mandatory.Technical risk.
NOASSERTION was the prior state and the release note makes no reference to licensing. Absent written confirmation, this remains a legal stop-sign for commercial or enterprise use. A new release does not clear it — and a maintainer actively shipping versions is the right moment to ask, but also a reminder that the terms could change under us.{!! !!}); correct escaping depends on field-level discipline. A markup rewrite is exactly when escaping regressions slip in, so v6 output deserves a fresh review rather than inheriting the prior sign-off.Key questions. (revised; 1–3 are new and blocking)
fields() array schema changed.aria-*, error association) and CSP posture (inline JS/handlers)?Verdict. Still a conditional no, but the balance has shifted slightly in the package's favor and the gates have changed. Renewed upstream activity is genuinely good news and reduces (does not eliminate) abandonment risk. It does not touch the license question, and it introduces new upgrade risk for anyone with published partial overrides. Viable as a tactical, time-boxed tool behind an internal abstraction; still not viable as a strategic dependency. The core observation stands: the value it delivers — DRY, testable form definitions — is largely reproducible with native Blade components plus a thin form-object layer, at zero abandonment and zero license risk. The prior 0.905 composite score reflected a well-formed solution to a real problem; that remains true, and the 37 stars, zero dependents, and unasserted license remain why it should not become load-bearing.
Stack fit. Unchanged. Adopt only if the target application is a Blade-rendered Laravel monolith on a version the package actually supports. If the roadmap includes Livewire, Inertia, or a headless API with a separate front end, this package is a dead end and the evaluation should stop here. Note that Bootstrap 5 compatibility is only relevant if we are on Bootstrap 5 — if our design system is Tailwind, custom, or Bootstrap 4, the headline feature is worth nothing to us and the partials must be overridden anyway.
Migration path. Do not migrate existing forms. Run a single greenfield or low-traffic internal CRUD form (text, select, checkbox, file, and one custom field) through the package in parallel with an equivalent hand-written Blade component version. Compare on: lines of code, test coverage achievable, accessibility output, and override friction. Decide on that evidence. If positive, expand only within a bounded domain (e.g., internal admin tooling) — never into customer-facing flows where markup churn has revenue impact. New for v6: do not begin this prototype until the release diff has been read; prototyping against an unread major release wastes the spike.
Compatibility. Pin the exact version in composer.json — now specifically pin 6.0.x rather than allowing a float that could land on an unvetted patch. Verify PHP and Laravel constraints before install rather than after a failed CI run. Check for published config/view collisions with existing overrides in the host app; if we have any pre-existing FormMaker partial overrides from a prior evaluation or pilot, assume they are broken by v6 and budget for rewriting them. Run the spike on a throwaway branch with a full test pass, including snapshot/markup assertions.
Sequencing.
App\Forms\BaseForm extending the vendor class so the package is exactly one class deep in our codebase. Every form extends ours, never the vendor's. This remains the single highest-leverage decision in the whole integration: it converts a fork-or-rip-out decision from a quarter of work into a week, and it is what makes absorbing a surprise major version tractable.Rejected alternatives to state explicitly. Rolling the abstraction ourselves is roughly 200–400 lines (field registry, renderer, model binding, error surfacing). Given the license and the still-unproven maintenance profile, that comparison should be made openly rather than assumed away by convenience — and the v6 release, while welcome, does not change the arithmetic much.
Maintenance. Still treat this as fork-maintained software from day one, but the fork is now more likely to be a merge than a rewrite, which is the better position. Budget approximately 1–3 engineer-days per Laravel major release to validate and patch, plus a one-off cost now for anyone holding v5-era partial overrides, since v6 moved the shipped markup. The surface remains small (a base form class plus a set of field partials), which is what makes a fork tractable — that is the package's main operational virtue and v6 did not change it.
Support. Still no vendor, no SLA, community-only GitHub issues on a low-activity repo — though a maintainer who shipped a major version this week is more likely to respond than one who hadn't shipped in three years. Internal documentation remains mandatory: field type inventory, override locations, and the upgrade runbook must live in our repo, not in a README we don't control. Add a note recording exactly which upstream version our overrides were cut against, so the next major upgrade has a diffing baseline.
Scaling. Runtime cost is negligible — rendering is Blade-compiled string output with no query or memory overhead beyond the form itself. The scaling risk is organizational, not technical: how many teams adopt it versus how many engineers can maintain or replace it. Cap adoption until the internal abstraction and runbook are in place. A major-version event is a useful forcing function — if adoption has spread faster than maintainability, this is the moment to slow it down.
Failure modes.
Ramp-up. Low for an experienced Laravel developer: the API is a fields array plus a small set of overrides, roughly half a day to productivity. The hidden cost is discoverability — there is little public material beyond the repo, and the v6 changes are undocumented in the release note, so onboarding depends entirely on internal docs and the base class. New hires will not have seen this package before; plan for it in the abstraction's inline documentation.
Recommendation. Conditional no, unchanged in direction and slightly softened in tone. Gate on (1) written license confirmation, (2) a tag diff review plus a verified install on our current Laravel/PHP, and (3) commitment to the internal base class. If any gate fails, build the thin form-object layer natively — the delta in effort is small and both the abandonment and license risks drop to zero. The v6.0.0 release is a positive signal that deserves follow-up with the maintainer, not a change in verdict.
How can I help you explore Laravel packages today?