Skip to content

Runtimes & site profiles

A site profile decides how your repository is built and how the result is served. managed.dev resolves a profile during the detect stage of the build pipeline, then uses it to pick the build steps, the artifact shape, and the serve model — a long-running container or a static file tree behind the edge.

The platform is deliberately built runtime-agnostic. WordPress is the launch runtime, not the foundation: the core resources — site, environment, build, deploy, domain, TLS, backup, observability — are defined without any WordPress-shaped assumption. That discipline is what lets a new runtime inherit the entire platform — auth, jobs, streaming logs, observability, billing — for free. The API surfaces this as capability discovery: a client asks a site “what can you do?” rather than hard-coding if runtime == "wordpress". See capability discovery.

The bedrock profile is the git-deploy WordPress profile. It expects a Bedrock-style layout: a composer.json at the repo root, dependencies (including WordPress itself and your plugins/themes) managed by Composer, and configuration driven by environment variables rather than committed wp-config.php.

  • Builds: composer install in the egress-restricted sandbox via the build proxy, plus any asset build your project defines.
  • Served as: a container on the FrankenPHP runtime.
  • Use it when: you want a real dependency-managed WordPress codebase in git, with plugins and themes pinned in composer.json.

During the detect stage, managed.dev inspects the pushed commit and resolves exactly one profile from the repository shape:

Signal in the repo Resolved profile
composer.json with a Bedrock-style layout bedrock
A WordPress tree without Composer-managed core vanilla
A build that emits a static output directory static

Two profiles run as containers; one is served as static files. The serve model is what the platform attaches to your environment after rollout:

Profile Build does Serve model Dynamic app layer
bedrock composer install + assets container (FrankenPHP) plugins, themes, content, cron, DB
vanilla prepare WP tree + assets container (FrankenPHP) plugins, themes, content, cron, DB
static run build → static dir static (edge) none

The dynamic application layer is the part the API exposes as capability-gated sub-resources: plugins, themes, content, cron, and the database exist for the WordPress profiles and are structurally absent for static. That is the whole trick — a static site and a WordPress site are the same resource type with different advertised capabilities.

The runtime-agnostic core is built to take on more runtimes without foundation changes — the platform model already understands additional builders beyond WordPress.

When a runtime ships, clients discover it the same way they discover everything else: GET /v1/runtimes lists the catalog, and GET /v1/sites/{id}/capabilities reports what a given site can do. Code that drives the API through capability discovery picks up new runtimes with no rewrite.