> ## Documentation Index
> Fetch the complete documentation index at: https://docs.frankenpress.com/llms.txt
> Use this file to discover all available pages before exploring further.

# FrankenPress

> Run WordPress at scale on Kubernetes — Caddy + FrankenPHP + Souin + S3

**FrankenPress** is an opinionated, minimal way to run WordPress at scale
on Kubernetes. Four small repos, one immutable site image, and a Helm
chart that deploys on `kind` in under a minute.

<CardGroup cols={2}>
  <Card title="Quickstart" icon="rocket" href="/quickstart">
    Deploy a working WordPress site on a local `kind` cluster in 3 steps.
  </Card>

  <Card title="Architecture" icon="diagram-project" href="/architecture">
    What each `*` repo does and how they fit together.
  </Card>

  <Card title="Production topology" icon="cloud" href="/operations/production">
    DragonflyDB Operator, MariaDB Operator, AWS S3, External Secrets.
  </Card>

  <Card title="Components" icon="layer-group" href="/components/runtime">
    Deep dives into `runtime`, `mu-plugin`, `site-template`, and `charts`.
  </Card>
</CardGroup>

## What's in the box

<Steps>
  <Step title="Caddy + FrankenPHP runtime">
    A single-process container — no nginx, no PHP-FPM, no supervisord.
    [`runtime`](https://github.com/frankenpress/runtime) bakes
    [`caddyserver/cache-handler`](https://github.com/caddyserver/cache-handler)
    (Souin) for HTTP-level page caching with Redis-protocol storage.
  </Step>

  <Step title="Slim must-use plugin">
    Four components, all platform-housekeeping:
    [`S3UploadsBootstrap`](/components/mu-plugin#s3uploadsbootstrap)
    (refuses uploads when S3 isn't fully configured — no silent local-disk
    fallback),
    [`SouinInvalidator`](/components/mu-plugin#souininvalidator)
    (direct Redis `DEL` on `save_post` — bypasses cache-handler v0.16.0's
    broken HTTP invalidation APIs),
    [`SiteHealth`](/components/mu-plugin#sitehealth)
    (suppresses Site Health tests whose failure is intentional under the
    immutable-image lockdown), and opt-in
    [`SMTPMailer`](/components/mu-plugin#smtpmailer)
    (transport-agnostic SMTP for `wp_mail()` — Postmark, SendGrid, SES, etc.).
  </Step>

  <Step title="GitHub-template site">
    [`site-template`](https://github.com/frankenpress/site-template)
    is a Bedrock-layout WordPress site preconfigured for the runtime.
    Click "Use this template", run `fp init`, you have a site —
    composer install, stack up, WP installed, latest snapshot applied,
    all in one command.
  </Step>

  <Step title="Bitnami-style Helm chart">
    [`charts`](https://github.com/frankenpress/charts) ships
    `site` — a Helm chart that consumes any `site-template`-built
    image. Bundles MariaDB + Redis + MinIO subcharts for instant
    `kind` deploys. Production swaps to managed services / operators.
  </Step>

  <Step title="Auto-install on first deploy">
    A post-install Helm hook Job runs `wp core install` and
    `wp core update-db` so a fresh `helm install` produces a usable
    site — no manual `kubectl exec`. Idempotent across upgrades; opt-in
    `syncAdminCredentials` reconciles the admin password from a
    Secret on every release for ESO/Sealed-Secret rotation flows.
    See [charts → First install](/components/charts#first-install).
  </Step>
</Steps>

## Design principles

* **Immutable images, no admin-installable plugins.** The "Update WordPress / plugins / themes" buttons are absent in admin. Lockdown is hard-coded; admin-side installs would land on ephemeral pod disk and vanish on restart anyway.
* **Single must-use plugin scope: S3 safety + cache invalidation.** Anything else (URL fixers, object cache, metrics, WooCommerce log handlers) is a regular plugin sites install themselves.
* **Slim default deps.** No WooCommerce, no opinionated theme picks. The site template ships only what's strictly needed for WordPress to render.
* **No GitOps glue.** The Helm chart deploys plain Deployment + Service + HTTPRoute. End users wrap with Argo Rollouts / Kargo / Flux / etc. as they see fit.

## Why "FrankenPress"?

[FrankenPHP](https://frankenphp.dev/) — the modern PHP app server built on Caddy — does most of the heavy lifting for the runtime. We add Souin for HTTP cache, S3-Uploads for media, and just enough WordPress glue to make Bedrock-style sites work cleanly on Kubernetes.

<Note>
  FrankenPress is built and maintained by [FrankenPress](https://frankenpress.com).
  All four `*` repositories are Apache-2.0 licensed.
</Note>
