Skip to content

Remove duplicate “Drupal Site” app button and standardize on “DDEV Web” #158

@jameswilson

Description

@jameswilson

Problem

The Drupal workspace templates currently expose two Coder app buttons for the same underlying DDEV web service:

  • DDEV Web
  • Drupal Site

Both apps proxy to the same internal DDEV web port:

  • drupal-core: http://localhost:80
  • drupal-contrib: http://localhost:8080

Because both apps set subdomain = true, Coder gives each app its own generated hostname:

  • ddev-web--...
  • drupal-site--...

This makes the UI look like there are two distinct site entry points, auth contexts, environments, or service states. In practice, both hostnames route to the same DDEV web service. The different app names/subdomains caused user confusion, and the Slack discussion concluded that the duplicate Drupal Site button does not provide enough value.

Findings

Git history shows that the duplicate app was intentional, but its purpose was health/status signaling rather than routing.

PR #41 added Drupal Site as a second coder_app with the same backend URL as DDEV Web, but with a stricter healthcheck:

  • DDEV Web checks general webserver health at /, indicating DDEV/nginx is responding.
  • Drupal Site checks application heath at /user/login, indicating Drupal has installed far enough to return a non-5xx response.

That intent is reasonable, but exposing it as a second app creates a misleading UX. Users see two launchers and two subdomains for one underlying service.

PR #122 later copied the pattern into drupal-contrib, and CI now also assumes the drupal-site--... hostname as the canonical external site URL.

Coder app health display

Coder already has native health-state presentation for app buttons.

For a coder_app with a healthcheck, Coder treats the app as healthy when the healthcheck URL returns an HTTP status below 500. The original Drupal Site implementation relied on this behavior: the app icon is dimmed/unhealthy while Drupal is not ready, then appears normal/bright once /user/login returns a non-5xx response.

This means the readiness signal does not require a second launcher, a second subdomain, or modified icon artwork. The single DDEV Web app can carry the Drupal readiness check, and Coder can continue to represent readiness through its native unhealthy/healthy visual treatment.

Proposed resolution

Remove the duplicate Drupal Site app and standardize on a single DDEV Web launcher.

Move the Drupal readiness healthcheck from Drupal Site onto the existing DDEV Web app for Drupal-specific templates:

  • in drupal-core, check http://localhost:80/user/login
  • in drupal-contrib, check http://localhost:8080/user/login

Keep the DDEV logo unchanged as the app icon. Do not recolor, overlay, badge, dim manually, or otherwise modify the DDEV mark. Let Coder’s native app health UI communicate readiness.

Add a tooltip to clarify the healthcheck semantics, for example:

tooltip = "Opens the DDEV web service. Health indicates Drupal is installed and /user/login is returning a non-5xx response."

This preserves the useful readiness signal while avoiding a second launcher/subdomain.

Why not dynamically use the site favicon?

I considered whether DDEV Web could dynamically use the served site’s favicon, falling back to the DDEV logo.

That does not appear to fit Coder’s app model well. coder_app.icon is a static URL in the Terraform resource, while the served favicon is only knowable after the workspace starts and the site responds. Trying to mutate the app icon at runtime would be fragile and would fight the Terraform/Coder app model.

Keeping the canonical DDEV logo is simpler, more reliable, and avoids any possible DDEV brand-mark concerns. Readiness should be conveyed through Coder’s native app health state and tooltip text instead.

Scope

Update:

  • drupal-core/template.tf
  • drupal-contrib/template.tf
  • CI checks that currently reference drupal-site--...
  • generated welcome text or ddev describe/post-start output that references drupal-site--...
  • docs or screenshots that show both buttons

Do not change unrelated apps such as VS Code or Mailpit.

Do not apply this stricter /user/login healthcheck to generic/freeform templates, where DDEV Web should continue to mean “the DDEV web service is responding.”

Acceptance criteria

  • Drupal workspaces expose only one primary site launcher: DDEV Web.
  • Users no longer see both ddev-web--... and drupal-site--... for the same service.
  • The DDEV Web app still uses the canonical DDEV logo.
  • Drupal readiness is still reflected by the app health state.
  • The unhealthy state is represented by Coder’s native app UI, not by modified DDEV icon artwork.
  • CI and generated output use ddev-web--... as the canonical site hostname.
  • Existing VS Code, Mailpit, and non-Drupal/freeform behavior is unchanged.

Reference notes

Credit: Assisted by GPT-5.5 Thinking for repo-history review and issue framing.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions