roots/bedrock
Bedrock is a WordPress boilerplate with a modern folder structure, Composer-based dependency management, and environment-specific configuration. It makes WordPress sites easier to build, deploy, and maintain, with wp-cli support, dotenv configs, and a cleaner, more secure web root.
Framing correction first. Bedrock is not a Laravel package. It is a WordPress project skeleton — a Composer-managed boilerplate that reorganizes a WordPress install into a twelve-factor-style layout (web/wp for core, web/app for plugins/themes/mu-plugins, config/environments/*.php for per-environment config, vendor/ for Composer-installed dependencies, .env for secrets). Evaluating it as a Laravel dependency will produce the wrong answer. The correct framing is: do we have a WordPress content surface in our portfolio, and if so, should it be built the Bedrock way?
Architecture fit. High if the roadmap includes marketing sites, content hubs, documentation portals, or a headless CMS feeding a Laravel or JS frontend — anything where editorial teams need WordPress but engineering wants immutable, reproducible deploys. Low-to-none if the roadmap is a pure Laravel SaaS with no content-authoring surface; in that case the correct decision is "no action," and the 1.77 opportunity score corroborates that this is infrastructure hygiene rather than a strategic bet. The fit is strongest precisely because Bedrock converges on conventions Laravel teams already hold: Composer as the single source of dependency truth, .env-driven configuration with no secrets in version control, and a build artifact that is deployed rather than mutated in place.
Integration feasibility. Greenfield is trivial — a single composer create-project. Brownfield is a migration project, not an install, and that distinction drives most of the cost. Existing sites carry plugins installed via the WP admin and files committed directly or, worse, edited on the server. Bedrock requires every plugin and theme to be a Composer dependency with a pinned version, which means sourcing each one from WPackagist or a private repository, and accepting that plugins which self-update or write into their own directory are structurally incompatible with the immutable-build model. Budget real discovery time to inventory plugins and classify them as Composer-available, private-repo-required, or blocking.
Technical risk. Four items dominate. (1) Update-model conflict: WordPress core and plugins ship frequent security releases; when they are Composer dependencies, patching becomes a build-and-deploy cycle rather than a one-click admin action. That is better for reproducibility and worse for mean-time-to-patch unless CI is genuinely fast. (2) Ecosystem gravity: a meaningful share of the commercial plugin market is not Composer-first, and premium licenses often require manual credential handling in CI. (3) Provenance gap: the repository field is unresolved and the listed last-release date is forward-dated, both of which are data-quality flags that must be verified against the actual upstream before anything is built on it — treat metadata as unconfirmed until checked. (4) Document-root exposure: the web/ root split is a security improvement only if the web server is reconfigured correctly; a misconfigured vhost can serve vendor/ or .env.
Key questions.
Stack fit. Bedrock sits comfortably beside a Laravel estate rather than inside it. Shared surface area: PHP 8.x runtime, Composer 2, .env/Dotenv conventions, WP-CLI as the analogue of Artisan, and the same CI primitives (build artifact, deploy, cache warm). The pragmatic composition is to keep one deploy pipeline and one secrets store for both applications, and to keep the runtimes separate — do not attempt to boot WordPress inside a Laravel process or vice versa. Where content is the product, run Bedrock headless and let WordPress serve content over REST or GraphQL to a Laravel, Inertia, or Next.js frontend; where content is a brochure, run Bedrock conventionally behind a CDN and skip the API layer.
Migration path. Four phases, each with a stop/go gate.
Compatibility. Verify PHP minor-version parity with the Laravel applications so a single runtime image can serve both; a split PHP version doubles the patch burden. Confirm Composer 2 only. Validate that the chosen host supports a custom document root and does not inject its own WordPress auto-updates. If the frontend is JS-based, confirm the REST/GraphQL layer can be cached independently of the WordPress origin.
Sequencing. Environment and hosting preconditions first (document root, PHP version, CI runner), then the plugin inventory and Composer sourcing, then the skeleton, then CI/CD, then the first deploy, and only then any migration. Do not let a migration be the pilot — migrations carry legacy unknowns that will be mistaken for Bedrock defects. Keep Trellis and Sage as separate, optional adoption decisions; each adds provisioning or frontend surface area that can be deferred without blocking the value Bedrock itself delivers.
Maintenance. The ongoing cost is a Composer update cadence — realistically a scheduled monthly pass plus out-of-band emergency updates for core and plugin security releases. Every update is a code change that must pass review and CI, which is the point, but it converts what used to be a dashboard click into an engineering task. Budget roughly a fraction of one engineer's time per site per month for dependency hygiene, rising with plugin count. Maintain an explicit allowlist of approved packages and a documented process for the private-repo and licensed-plugin cases, or the Composer manifest will decay into ad-hoc exceptions.
Support. Bedrock is MIT-licensed and community-maintained, with the Roots ecosystem (Trellis, Sage) providing adjacent tooling and an active community forum and Slack. There is no commercial SLA and no vendor escalation path — this is the single biggest operational difference from a paid platform. Internal ownership must be explicit: one named team accountable for the plugin allowlist, the update cadence, and the deploy pipeline. Third-party plugin vendors will not support Composer-installed deployments, so first-line triage stays in-house.
Scaling. Bedrock is a deployment-topology choice, not a runtime-scaling one; it neither helps nor hinders throughput. WordPress scaling remains the familiar ladder — full-page cache at the edge, persistent object cache (Redis), read replicas for the database, offloaded media, and static asset CDN. Bedrock does make horizontal scaling cleaner, because the codebase is identical across instances and configuration is injected via environment rather than baked into files. Headless deployments offload rendering to the frontend tier and reduce WordPress to a content API, which is usually the largest available scaling win.
Failure modes. Watch for: (1) composer install failing in CI on a drifted or unreachable private repository, blocking all deploys; (2) a plugin released without Composer metadata, forcing a fork or a manual vendor drop; (3) environment-variable drift between staging and production causing subtle config divergence; (4) document-root misconfiguration exposing vendor/, .env, or the config directory; (5) security-patch lag during periods of low deploy activity, which is the most dangerous failure because it is silent; (6) a developer installing a plugin through the admin on a Bedrock site, creating state that the next deploy silently erases. Mitigate (1) with lockfile discipline and repository mirrors, (3) with a config-parity check in CI, (4) with an automated probe in the smoke-test suite, and (5) and (6) with policy plus the plugin allowlist enforced at review.
Ramp-up. For a team already fluent in Composer and Laravel conventions, expect a few days to productivity: the mental model transfers almost entirely, and the genuinely new material is the WordPress plugin ecosystem and its Composer gaps. For a team coming from traditional WordPress, expect two to three weeks — the learning is concentrated in Composer, environment-based configuration, and the discipline of never touching production by hand. The hidden ramp-up cost is ecosystem knowledge, not tooling: knowing which plugins are safe to Composer-manage is a skill that only accumulates through migrations. Pair every migration with someone who has already done one.
How can I help you explore Laravel packages today?