Skip to content

Govard and Warden ​

Both start a Magento stack in containers and route it to a local domain. Warden predates Govard: it pairs an opinionated env-init stack with a traefik router and keeps its configuration in environment files. Govard ships a single binary, a Caddy proxy and a declared profile in .govard.yml. This page states the differences; the numbers live on the benchmark page, so they cannot drift away from the method that produced them.

What starts, by default ​

GovardWarden
Web + databaseyesyes
Varnish, Redis, OpenSearch, RabbitMQpart of the default profilepart of the stack env-init writes
RouterCaddy on 80 and 443, shared by every Govard projecttraefik on 80 and 443, with no way to move it
Configuration.govard.yml.env plus .warden/warden-env.yml
Installing the CLIone binary into ~/.local/bin, no privilegesroot once: it chowns an SSH tunnel key, rewrites /etc/ssh/ssh_config and installs a CA into the system trust store

The last row is the difference a team feels first, and it is also why the benchmark arm runs Warden's CLI from a container rather than asking for sudo on the measured machine.

How the two measured ​

Same fixture, same machine, same window, three runs each after a discarded warm-up. The full table and the ranges are on the benchmark page.

MetricGovardWardenRead
Start, until the storefront answers11.0 s11.6 sclose
Stop11.2 s3.7 sWarden is about three times faster
TTFB p50, cache as it ships14.2 ms13.5 msclose
TTFB p50, cache bypassed250.6 ms495.7 msGovard is about twice as fast on the cold render
Static deploy4.3 s7.7 sGovard is faster
DI compile21.0 s25.5 sGovard is faster
Peak memory, steady state1,601 MB1,020 MBWarden uses less
CLI wrapper overhead46 ms213 mssee the caveat below

Two rows need the caveat before they are quoted:

  • Stop. Govard's env down takes 11.2 s against Warden's 3.7 s. It removes more, and this page does not dress that up.
  • CLI overhead. Warden's 213 ms includes running its CLI inside a container, which is how this arm had to work without root on the measured host. A native install would not pay that.

What was not equal: Warden's traefik pins ports 80 and 443, so the Govard proxy was stopped while that arm ran, and its containers were reached directly. Both arms served through Varnish, so the cache-bypassed row compares the same shape of request on both sides.

Moving a project from Warden to Govard ​

bash
govard init --migrate-from warden

The importer reads .env and .warden/warden-env.yml, maps the project name, framework, PHP, Node, Composer, MySQL and Varnish versions, the web root and the table prefix, and offers to clone the existing Warden database volume into a Govard one. Then govard env up. The full walkthrough, including the cache cleanup that avoids stale Redis and file cache in the new environment, is on Migrate from DDEV or Warden.

When Warden is the better choice ​

  • An existing Warden setup that a team already operates, where switching costs more than it returns.
  • You want the stack and the router to come from one opinionated environment kept in shell and env files, and the root install is not a problem for you.
  • You depend on Warden's own env templates for stacks Govard does not ship.

When Govard is the better choice ​

  • You want no privileged install and no host files rewritten to get a local environment.
  • Deploy, remotes with a write-protected prod, audit, snapshots and a desktop app in the same tool you develop with.
  • You came from DDEV as well, so one importer covers both, and it reports every key as mapped, defaulted or ignored instead of dropping it.
  • A cold page render matters more to you than steady state memory, according to the numbers above.

Released under the MIT License.