noerd/cms
A lightweight Laravel CMS package for adding editable pages, reusable content blocks, navigation, and basic SEO to custom apps. noerd/cms integrates with Blade and Eloquent, giving developers a simple admin-friendly way to manage site content without a heavy CMS.
Basis of this assessment: only the v0.4.0 release notes were available — no repository, test suite, migration files, bundle size metrics, or prior assessment. Conclusions below are directional and should be re-validated against the codebase and a staging upgrade before any commitment.
Architecture fit
contents / content_elements base, an ExtendsContent concern, and a ContentTypeRegistry for third-party content types. That is the right shape for a Laravel modular monolith and is a significant step up in reuse — other modules can register types instead of forking the page model.contents row → many content_elements rows, with a rich_text element for prose). This buys uniform editing and rendering, but it moves structure out of columns and into rows. Anything that needs filtering, sorting, or reporting on element data will be harder and slower than the previous page-centric schema.cms.asset) is pragmatic for a package that must be drop-in, but it means the package now owns a frontend build pipeline it did not own before. That is an architectural commitment, not a packaging detail.Integration feasibility
element-page-detail, element-picker-modal, EditsContentElements → EditsContentDocument) are the real integration hazard. Any host app, theme, or sibling module that references those names — published views, class imports, Livewire/Blade includes, event listeners — breaks at upgrade time with no deprecation window.Technical risk
rich_text is "sanitized on save" but not with what, on which allowlist, or whether sanitization is also applied on render. This is the primary XSS surface of the whole package and now applies to every content type, so one gap is a fleet-wide gap.dist/build puts static assets on the PHP request path unless caching headers, far-future expiry, and CDN bypass are configured. Also a deployment risk: dist/build must exist in the release artifact, which is easy to lose in CI.Key questions
mews/purifier, a Tiptap-side schema, or a custom allowlist), and is sanitization applied on render as well as save?cms.asset behave under php artisan optimize, route caching, and a CDN? What cache headers does it emit?ContentTypeRegistry support anything beyond type → class mapping — per-type field definitions, validation, renderers, permissions?contents restructure?Stack fit
contents / content_elements is not described in the notes.Migration path
ContentTypeRegistry and verify each one opens in the editor.element-page-detail, element-picker-modal, EditsContentElements; port each usage to EditsContentDocument or the new document components.cms.asset resolves under production URL, path prefix, and cache configuration.onerror attributes, javascript: links, nested lists.Compatibility
Sequencing
Maintenance
Support
// insert gesture being undiscoverable or firing when users mean a literal slash, and inline field editing quirks.// shortcut is a training item, not just a feature. Budget a short author guide and expect an initial spike in "how do I add an element" questions.Scaling
content_elements rows. Rendering a page means joining them; rendering a listing means avoiding an N+1 across contents. Index on content_id (and content_id, position) is non-negotiable, and eager loading must be enforced in the package, not left to callers.rich_text as an element is flexible but means prose-heavy documents produce many small rows. Acceptable at moderate scale; worth benchmarking at the top end of expected content volume before committing to the model.cms.asset served through Laravel will scale poorly if hit per request with no caching. Verify far-future cache headers and CDN/edge offload, or publish the bundle to the public path instead.Failure modes
dist/build in the deploy artifact: editor silently fails to load for every content type at once. Add a post-deploy smoke check.Ramp-up
ExtendsContent concern plus registry is a small, learnable pattern; the real learning is the content/element data model and its query implications. Estimate a day for a Laravel-fluent developer to register a first content type.// gesture and inline field editing need a short walkthrough.Recommendation: adopt v0.4.0 — the shared content base and registry are a real architectural improvement and the id-preserving migration is the right call — but gate it behind a staged-data migration rehearsal, an explicit port off the three removed components, a sanitization test pass, and a documented asset-build check. Do not bundle it with unrelated host changes, and pin the version exactly until 1.0.
How can I help you explore Laravel packages today?