bolt/core
Bolt is a lightweight, Symfony-based content management system with flexible content types, Twig templating, taxonomies, menus, and a powerful admin UI. This core package provides the foundation for building and extending Bolt-powered sites.
Architecture fit — the headline risk. bolt/core is not a Laravel package. It is a Symfony-based CMS application that happens to be distributed via Composer. There is no service provider, no facade, no Eloquent, no Blade, no Laravel-style config publishing. Any evaluation that starts from "how do we composer require this into our Laravel app" has already gone wrong. The realistic fit is as a peer service to Laravel, in one of three modes:
Integration feasibility. Moderate at best. The blockers are not technical impossibility but surface area: two frameworks, two dependency trees, two auth systems, two asset pipelines, two upgrade cadences, and two templating languages. The single biggest unknown to resolve before any commitment is the content read API. Bolt's value proposition here is content modelling plus an admin UI; it is not marketed as a mature headless API product in the way dedicated headless CMSes are. Confirm empirically that you can read content types, fields, taxonomies, and relations over HTTP with a stable, documented contract. If that requires an extension you write and maintain, price that in — it is a permanent cost, not a one-off.
Technical risk.
Key questions to answer before committing.
Stack fit. Good at the infrastructure layer, poor at the code layer. Bolt runs PHP 8.x on MySQL/Postgres/SQLite via Doctrine, which is the same runtime our Laravel app already targets — so deployment, containerisation, logging, and secrets management are shared concerns we already solve. Code-level reuse is zero. Plan for separate repositories, separate composer.json, separate deploy pipelines, and communicate over HTTP only.
Migration path. Treat this as a phased adoption, not a lift-and-shift:
articles type with 3–4 fields, publish it, read it over HTTP, render it in Laravel. This is the go/no-go gate. If the round-trip is awkward, change integration mode now — not after 15 content types exist.BoltContentRepository) wrapping all Bolt access, with DTOs/casts mirroring the YAML field names. Nothing else in the app talks to Bolt.Cache::remember keyed by content type + locale + record id, short TTL, explicit purge on publish where the CMS supports it.Compatibility and sequencing notes.
^6.1 and let patches flow; review between minors, since patches are almost entirely dependency churn.vendor/ and compiled public assets as immutable build output; if we rebuild admin assets in our pipeline, the rebuild becomes a mandatory post-upgrade step.Maintenance. The recurring cost is not upgrade effort — patch releases like 6.1.9 are pure Dependabot bumps with no features or breaking changes — it is two dependency trees to patch, two CVE feeds to watch, two asset builds to verify. Automate Bolt upgrades in CI with a smoke test that performs a real content read, and keep a rollback tag. Note that the churn in this release lands in Bolt's admin JavaScript; if we vendor or rebuild compiled assets, skipping the rebuild means shipping stale bundles while believing the changelog.
Support. Community-driven, small core team, no vendor SLA. The practical implication for a TPM is that staffing is the support plan. Budget for one named owner who is comfortable in Symfony, Doctrine, and Twig, and accept that a Laravel-only team will be measurably slower in Bolt. Extension points (custom console commands, Twig extensions) should be preferred over patching core — patching core is a permanent tax against a frequent release cadence.
Scaling. Asymmetric, and that's fine. Bolt is an editorial system: low write volume, modest read volume, Doctrine queries that cache well. Scale the Laravel consumer independently and put an HTTP cache in front of Bolt. The DB is the shared bottleneck if co-located — keep it separate if content volume or traffic is non-trivial.
Failure modes to instrument for.
| Symptom | Likely cause | Mitigation |
|---|---|---|
| Content not appearing | Content-type YAML syntax, or uncleared Symfony cache | Lint YAML in CI; document cache-clear as step one in the runbook |
| Field silently null in Laravel | YAML field renamed, DTO not updated | Contract tests against a real content read |
| Admin UI broken after upgrade | Compiled assets not rebuilt | Rebuild assets as a pipeline gate |
| Template change not live | Twig cache in production | Explicit cache-clear in deploy, not ad hoc |
| Editors locked out | Two auth systems drifted | Separate user tables by default; monitor the proxy header path |
| Partial deploy | Migrations run per node | Single migration phase in the pipeline |
Ramp-up. Editors: days — the admin UI is the product's strongest asset and is not the risk. Developers: realistically 1–2 weeks for a Laravel-fluent engineer to be productive in Bolt's Symfony/Twig idioms, longer to be confident debugging cache and content-type resolution issues. Plan for that ramp explicitly rather than assuming PHP fluency transfers; the docs themselves warn against translating Laravel patterns by analogy, and that warning is accurate.
TPM read. Bolt is a competent, well-maintained CMS that is a poor library and a reasonable service. It is worth pursuing only if the team accepts a permanent two-stack operating model and has — or will hire — Symfony depth. The low opportunity score reflects exactly this: it solves the CMS problem well, but it does not reduce work in an existing Laravel codebase, it adds a second one to run.
How can I help you explore Laravel packages today?