GraphQL Router Development Mode | Cosmo by WunderGraph - WunderGraph

Development Mode for GraphQL Federation

Start building against the router in one line of config. dev_mode: true turns on human-readable logs, detailed subgraph error output, and automatic localhost fallback inside Docker.

Local federation should not fight you

Defaults that protect production often erase the signal you need on your laptop. Docker networking and half-configured YAML make it worse.

Production defaults hide what you need to see

Structured JSON logs and sanitized errors are useful in production, but harder to debug locally. Reading a 400-line JSON blob for a single request is not how debugging should start.

Inside a container, localhost is not your host

A subgraph URL like http://localhost:4001 works on your laptop because localhost is your machine. From the router running in Docker, the same URL still means “this container,” so the process never reaches services on your Mac or Windows host. That mismatch trips teams constantly during local federation.

Development settings drift over time

Teams often end up maintaining separate debug flags, error settings, and logging overrides across environments. Months later, nobody remembers why stack traces appear in one setup but not another.

One line of config enables development-friendly router defaults

Cosmo Router development mode bundles the router settings most teams enable during local development into a single preset, so developers can debug locally without hand-configuring logging, error propagation, and Docker networking behavior.

What happens when the preset is on

  1. Set dev_mode: true in the router config. At startup, the router loads a development-focused preset instead of requiring individual debugging settings to be configured manually.
  2. The preset bundles settings you would otherwise flip one by one. It disables JSON logs, enables full subgraph error propagation (HTTP status codes, GraphQL locations, and stack trace fields when the subgraph sends them), and turns on Advanced Request Tracing (ART) for local development.
  3. When a subgraph URL uses localhost and the connection fails inside Docker, the router retries against host.docker.internal automatically (unless you disable the fallback).
  4. Config changes reload automatically during development, so teams can iterate without restarting the router.
  5. You spend time building, not configuring multiple settings manually, and you remove or set dev_mode: false before production so debug output does not appear in production responses.

Before & After

Before Cosmo With Cosmo
Five separate toggles to get useful dev output dev_mode: true flips them all at once
JSON logs that are hard to read during debugging Human-readable, terminal-friendly logs
Sanitized errors, unclear why a query failed Expanded subgraph error context: status codes, locations, and stack traces when available
Docker-to-localhost networking needs manual setup Automatic fallback to host.docker.internal on failure

What dev_mode: true enables

dev_mode: true is a preset equivalent to:

Plus: Advanced Request Tracing (ART) is enabled automatically in local development environments, as well as automatic Docker-to-localhost fallback.

Using development mode

Flip the toggle

Add dev_mode: true to the router config and start the router locally.

Same development settings every time the router starts

At startup the preset applies in one go: readable logs, richer subgraph errors, local ART, and the Docker fallback.

See failures where they happen.

Run queries against the router locally. Errors become easier to debug, logs are readable in the terminal, and Docker localhost failures recover automatically.

Production configs stay explicit.

Disable development mode in production configs to keep production logging and error responses sanitized.

Where teams lean on dev mode

First-time router setup

A new developer pulls the repo, starts the router with dev_mode: true. Within a minute they have readable logs, working Docker networking, and expanded error output, none of which they had to configure.

Debugging a failing federated query

A query returns an error. Development mode surfaces the subgraph's HTTP status code, the error location in the query, and the stack trace when the subgraph provides one.

Docker Compose with local subgraphs

Router in Docker; subgraphs on the host at localhost:4001 and localhost:4002. If localhost fails in-container, retries use host.docker.internal:4001.