Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Cms Laravel Package

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.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

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

  • The package is converging on a genuine content platform rather than a page builder: a shared 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.
  • The model is effectively a generic document store (one 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.
  • Shipping its own Tiptap bundle and serving it through a named route (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

  • The migration is in-place and id-preserving for existing pages and elements, which is the single most important feasibility fact here: it avoids a re-keying exercise and keeps existing URLs, references, and foreign keys intact. Feasible, but it is a data-rewriting migration over live tables and must be treated as a release event, not a routine deploy.
  • The removals (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

  • High: rich text sanitization. The notes say 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.
  • Medium-high: breaking removals in a 0.x line. Versioning permits it, but consumers need an explicit migration note mapping old → new.
  • Medium: asset delivery. A Laravel route serving 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.
  • Medium: migration atomicity. A single large migration that rewrites pages and elements is not easily resumable. On a large dataset, lock time and rollback story need to be known before scheduling.
  • Low-medium: registry misconfiguration. An unregistered content type is likely to fail in a way that looks like data loss rather than a config error.

Key questions

  1. Is the migration additive-and-copy or destructive-of-old-tables? Is the old schema retained for one release as a fallback?
  2. What sanitizer is used (HTMLPurifier, mews/purifier, a Tiptap-side schema, or a custom allowlist), and is sanitization applied on render as well as save?
  3. Are the removed components aliased, or hard-removed? Is there a compatibility shim for one minor version?
  4. What are the supported Laravel/PHP versions, and does the frontend build have a documented Node/Tiptap version floor?
  5. How does cms.asset behave under php artisan optimize, route caching, and a CDN? What cache headers does it emit?
  6. Does ContentTypeRegistry support anything beyond type → class mapping — per-type field definitions, validation, renderers, permissions?
  7. Is test coverage reported for the migration and for sanitization specifically?
  8. Is document history/versioning preserved through the contents restructure?

Integration Approach

Stack fit

  • Well-matched to a Laravel app with modular content needs: publishable migrations/config, a service-provider registration point for content types, a route for assets, and Blade/Livewire-facing components. If the host app is a conventional modular monolith, this is close to a drop-in.
  • Less comfortable for headless/API-first consumers: the value added here is a server-rendered editor, and the API story for contents / content_elements is not described in the notes.

Migration path

  1. Pin the current working version and capture a restorable database snapshot before upgrade.
  2. Read the actual migration source in vendor — confirm whether it preserves IDs, whether it is chunked, and whether it is reversible.
  3. Run the full upgrade on a production-data copy (not a toy fixture): measure migration duration, lock time, and row counts pre/post.
  4. Reconcile IDs: spot-check pages, elements, and any host-table foreign keys pointing at them.
  5. Register every host content type with ContentTypeRegistry and verify each one opens in the editor.
  6. Grep the host codebase and published views for element-page-detail, element-picker-modal, EditsContentElements; port each usage to EditsContentDocument or the new document components.
  7. Verify the Tiptap bundle is present in the build artifact and that cms.asset resolves under production URL, path prefix, and cache configuration.
  8. Run a sanitization test pass: paste-from-Word, script tags, onerror attributes, javascript: links, nested lists.

Compatibility

  • Treat v0.4.0 as breaking despite the minor bump. Under 0.x semver this is legitimate, but for planning purposes assume any package below 1.0 can break on any release; pin exactly and upgrade deliberately.
  • Check for published/vendored overrides of removed views before upgrading — those will not be flagged by Composer.

Sequencing

  • Do this as a standalone release, not bundled with host feature work. The migration and the component removals are independent failure sources; you want to attribute regressions to one of them.
  • Order: pin snapshot → staging data rehearsal → backend upgrade + migration → register content types → port host UI off removed components → asset/CSP configuration → editor UX validation with real authors → production cutover.
  • If any sibling module registers content types, upgrade the package first, then the modules, so the registry exists before registrations run.

Operational Impact

Maintenance

  • Net increase. The package now ships a maintained JS bundle: Tiptap and ProseMirror dependency updates, build reproducibility, bundle size, and browser support all become ongoing concerns for whoever owns the integration. Previously the frontend surface was smaller and more static.
  • The generic content model also means schema evolution happens in data, not just in migrations — new element types, registry entries, and renderers — which is flexible but spreads the definition of "what content looks like" across code and rows.

Support

  • Expect a new class of tickets: sanitizer stripping legitimate markup, paste behavior, the // insert gesture being undiscoverable or firing when users mean a literal slash, and inline field editing quirks.
  • The // 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.
  • A single shared editor across all content types means one editor bug is reported as "the CMS is broken," regardless of which content type is affected.

Scaling

  • Row growth is the main concern: a document with fifty elements is fifty 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

  • Migration fails partway: IDs preserved in principle, but partial rewrite may leave mixed old/new rows. Highest-severity risk; needs a tested rollback and a maintenance window.
  • Missing dist/build in the deploy artifact: editor silently fails to load for every content type at once. Add a post-deploy smoke check.
  • Sanitizer misconfiguration: either XSS (under-strict) or lost author content (over-strict). Both are hard to detect after the fact; test both directions.
  • Unregistered content type: content appears missing or uneditable, easily misdiagnosed as data loss.
  • Asset route behind a CDN or path prefix: 404s that only appear in production.
  • Removed component still referenced by an un-updated host view: hard error on the pages that use it, so validate coverage rather than assuming a clean grep.

Ramp-up

  • Backend developers: low-to-moderate. The 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.
  • Frontend: moderate. Someone on the team must own the Tiptap build and understand the element-insertion extension, or the editor becomes a black box.
  • Authors: low, but non-zero — the Notion-style interaction is familiar; the // gesture and inline field editing need a short walkthrough.
  • Support/ops: needs to know the migration is a release event and know the asset-route smoke check. Small but must be written down.

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.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
skyraptor/chatter
edlugz/sasapay
abbasudo/artisan-route
mirvan/ippanel
ignibyte/aic-framework
glavweb/data-schema-bundle
glavweb/datagrid-bundle
tacticmedia/scim-server
uni-method/frame
neika-ai/sdk
adachsoft/php-code-style
pharaonic/laravel-notification-dependencies
beautinow/translug
dev-brainiac/bot-cloaked
octoberrain/html
octoberrain/extension
octoberrain/exception
octoberrain/contracts
adachsoft/api-version-bundle
cgv/localized-resource