marshmallow/boolean-group
A Laravel package for organizing boolean flags into named groups and evaluating them as a unit. Define reusable condition sets, combine checks with a fluent API, and keep feature-flag or eligibility logic readable and centralized.
Architecture fit. marshmallow/boolean-group is a Laravel Nova field — a presentation-layer extension for the admin panel, not application runtime code. It has zero architectural surface area in the product itself: no service provider side effects beyond Nova asset registration, no middleware, no database migrations implied by the package. That makes it architecturally low-risk and strategically narrow. It is only relevant if the team already owns a Nova license and runs Nova in production. If Nova is not in the stack, this package is a non-starter regardless of quality.
The implied use case — collapsing a set of related boolean flags (permissions, feature toggles, notification preferences, per-tenant capabilities) into one grouped control on a Nova form — is a genuine papercut in Nova. Nova's native Boolean field renders one toggle per attribute, so a resource with 8–12 flags produces a long, cognitively noisy form. The value proposition is UX consolidation for internal operators, which is real but modest.
Integration feasibility. Installation is a composer require plus field usage in a fields() method, contingent on the package's Nova major-version support. v1.2.0 materially improves this: Nova 5 support was added via a merged community PR, so the package is no longer gated to Nova 4 (Vue 2). Teams on current Nova can now evaluate adoption rather than defaulting to fork-and-port.
The remaining feasibility question is not installation but storage semantics: does the field resolve booleans from discrete columns, or from a single JSON blob? That choice determines casting, validation, indexing, and whether the values are queryable in Nova filters and metrics. This must be verified from source before any commitment.
Technical risk. Still elevated relative to the value delivered, but the profile has shifted — one High risk is retired, and a weak-positive governance signal has appeared:
| Risk | Severity | Notes |
|---|---|---|
| No community validation | High | 0 stars, 0 dependents, 0 known consumers — no signal that it works outside the author's app. v1.2.0 does not change this |
| Single-maintainer / abandonment | High | "marshmallow-packages" is a personal namespace. However, v1.2.0 is the first evidence of external contribution and maintainer responsiveness — a merged PR from a non-owner is the single best leading indicator of project health available here. Not enough to upgrade the rating, enough to note |
| Nova version coupling | Medium (was High) | Nova 5 support added in v1.2.0. Residual question: does one branch serve both Nova 4 (Vue 2) and Nova 5 (Vue 3), or did the constraint move to ^5.0 and drop Nova 4? Dual-major support in a single Nova field is non-trivial and is where regressions hide |
| Unknown test coverage | Medium | A field is mostly Vue + a resolve/fill pair; the PHP side is small but the silent-failure modes live there. Unclear whether the Nova 5 PR was validated by CI across both majors |
| Supply chain | Medium | Unvetted vendor code inside an authenticated admin surface. Unchanged |
| Documentation | Medium | README-level only; no compatibility matrix evident. The release note is one line — no migration guidance for teams moving from v1.1.0 |
Key questions for the maintainer / source audit.
composer.json now declare nova ^4.0|^5.0, or ^5.0 only? Is Nova 4 still supported, and is that a breaking change for existing v1.1.0 users?dist/ against one Vue version? This is the crux of whether Nova 5 support is real or a constraint bump.resolveUsing / fillUsing overridable, and does it respect Nova's rules() and nullable semantics?sortable() / filterable() — i.e., are the underlying values queryable, or is this display-only?dist/ asset committed, or must the host app run npm run nova:install?Stack fit. Compatible only with Laravel + Nova stacks. Requires PHP 8.1+ and a Nova license whose major version matches the package's declared constraint. As of v1.2.0, Nova 5 is in scope, which removes the previously likely fork-and-port path for teams on current Nova. The build-vs-adopt calculus should still be run explicitly: a grouped-boolean field is roughly 1–2 engineer-days of work (one PHP field class, one Vue component, tests), so adoption is only obviously correct if the audit is clean. The arrival of Nova 5 support tilts the decision toward evaluation, not automatically toward adoption.
Recommended integration posture: vendor, don't depend. The Nova 5 release does not change this. There are still zero dependents and no release cadence — you are one maintainer's attention away from a frozen repo, and Nova 6 will arrive. Instead:
app/Nova/Fields/ (or a first-party acme/nova-fields internal package) and take ownership of the code. Do not vendor both branches; take the one you run.Migration path. No data migration is needed if the field maps to existing boolean columns. If it assumes a JSON column, that is a migration and a schema decision — evaluate whether JSON storage is acceptable given the team's query and reporting needs, or whether discrete columns are required. Do not let a UI convenience drive the persistence model.
There is also an upgrade path consideration that did not exist before: teams already on v1.1.0 should confirm whether v1.2.0 is additive (Nova 4 + 5) or breaking (Nova 5 only). If breaking, pin ^1.1 until you've validated on your Nova version — do not float the constraint.
Compatibility and sequencing.
Boolean fields available behind a panel/canSee check for one release as a fallback.Scope discipline. This is an internal-tooling improvement. It should not consume a roadmap slot, should not block a release, and should be timeboxed at two days total. If it exceeds that, the in-house build wins by default. The Nova 5 release is a reason to start the spike if you previously deferred it, not a reason to expand the timebox.
Maintenance. Effectively 100% — the team becomes the maintainer the moment it is used, whether or not the code is vendored in. v1.2.0 slightly improves the upstream story (someone other than the author has touched it and the maintainer merged it), but does not change the local obligation. Budget a half-day per Nova major upgrade to verify the Vue component against the new Nova asset pipeline — that estimate stands. Note that Nova 5 was the specific upgrade that historically broke these fields; it is now handled, which retires the most imminent known maintenance event and pushes the next one out to Nova 6.
Support. No vendor, no SLA, no issue-triage expectation. Escalation path for an operator-facing bug is "the engineer who integrated it reads the source." That is acceptable for admin tooling and unacceptable for anything customer-facing — which this is not. The v1.2.0 PR does suggest the maintainer will accept patches, which is a useful escape hatch: if you find a defect, upstreaming it is plausible.
Scaling. Negligible. The field renders in the Nova admin only, so it has no effect on request latency, queue throughput, or public traffic. The only scaling consideration is query behavior: if the field hydrates a relation or a JSON column, confirm it isn't triggering N+1 queries on Nova index views with large per-page counts. Test against a resource with a few thousand rows and perPage at 100. Unchanged by the release.
Failure modes to watch.
fill() doesn't persist because the attribute name or cast doesn't match. Highest-probability failure; requires an explicit create-and-reload test, not just a visual check.dist/ serving both majors is a red flag.rules(); authorization on individual flags must still be enforced server-side in policies, not just hidden in the UI.$fillable / policy checks where relevant.Ramp-up. Low for engineers already fluent in Nova custom fields — the pattern is well-trodden and the codebase is small enough to read in an hour. Non-Nova engineers should not touch it. Operational documentation burden is one short internal note covering: which resources use it, the storage convention (columns vs. JSON), the Nova major the vendored copy targets, and the "reload after save" verification step for QA.
How can I help you explore Laravel packages today?