Configuration
Configure eddev projects with theme-level JSON settings.
eddev projects are configured with ed.config.json in the theme root. The file is read by the JavaScript build/server process and, for some options, by the WordPress PHP runtime.
The generated .ed.config.schema.json file gives editor autocomplete and validation. It is generated from the Zod schema in eddev, so treat that schema as the source of truth when an option changes.
{
"$schema": ".ed.config.schema.json",
"version": "2",
"legacyStitches": false,
"favicon": {
"mode": "svg"
},
"serverless": {
"enabled": true,
"uploads": "remote",
"plugins": "remote",
"admin": "hide",
"themeAssets": ["assets/**/*"],
"originProtection": {
"requireLogin": false
},
"endpoints": {
"cms.website.com": "website.com"
}
},
"cache": {
"*": {
"pageDataTTL": 300,
"appDataTTL": 300,
"queryHooksTTL": 300,
"serverless": {
"isr": true,
"dataCache": "in-memory"
},
"wordpress": {
"cacheHeaders": true,
"transients": true
}
}
},
"devUI": "enabled"
}Keep cache and serverless.endpoints explicit on production projects. The JavaScript side applies schema defaults, but the WordPress PHP side also reads parts of the raw JSON file.
Where To Go Next
Serverless
Configure the JavaScript host that renders the public frontend.
RPC Functions
Add TypeScript server routes for project-specific APIs.
Favicons
Choose how eddev prepares favicon files for the theme.
GraphQL Caching
Tune cache behavior for view, app, and runtime query data.
Top-Level Options
| Option | What It Does |
|---|---|
$schema | Points editors at .ed.config.schema.json for autocomplete and validation. |
version | Config format version. Current projects should use "2". |
favicon | Controls favicon generation. See Favicons. |
legacyMetadata | Enables older comment-based metadata parsing for projects that still need it. New projects should use exported metadata. |
legacyStitches | Marks the project as using the old Stitches styling setup. New projects should leave this as false. |
trackers | Adds standard tracking snippets such as GA4 or GTM. |
serverless | Controls serverless deployment, proxied assets, admin URL behavior, endpoint mappings, CORS, and CSP. See Serverless. |
cache | Controls WordPress and serverless data/response caching. See Serverless cache settings and GraphQL caching. |
devUI | Enables or disables the eddev development UI. Use "enabled" for normal development. |
favicon
favicon controls how eddev prepares favicon assets during the build.
| Mode | Use When |
|---|---|
auto | WordPress Site Icon should handle favicons. No .ico is generated by eddev. |
svg | The project has a single SVG favicon source, optionally with light and dark variants. |
pngs | The project has multiple PNG favicon source files. |
The favicon page should carry the asset naming and export details once it is filled out: Favicons.
serverless
Most current projects deploy the public frontend to Vercel and keep WordPress as the CMS and route authority. serverless controls that deployment shape.
| Option | What It Does |
|---|---|
enabled | Enables serverless deployment support. |
uploads | Chooses whether upload URLs are remote origin URLs or proxied through the serverless deployment. |
plugins | Chooses whether plugin asset URLs are remote origin URLs or proxied through the serverless deployment. |
admin | Controls whether WordPress admin/API URLs are proxied or hidden on the serverless deployment. |
originProtection.requireLogin | Forces eddev Access Control for the WordPress origin. |
themeAssets | Lists theme asset folders to include in the serverless deployment. |
endpoints | Maps WordPress hostnames to serverless hostnames for RPC and SPA/admin calls. |
cors.origins | Adds extra CORS origins beyond hosts inferred from endpoints. |
csp | Configures Content Security Policy for the serverless app. |
Use the serverless overview for deployment flow, SITE_URL, SITE_API_KEY, Access Control, endpoint mappings, and cache behavior: Serverless.
cache
cache is a map of WordPress origin hostnames to cache settings. Use "*" as the default, and add exact or wildcard host entries when staging and production need different behavior.
{
"cache": {
"*.staging.website.com": {
"pageDataTTL": 60,
"appDataTTL": 60,
"queryHooksTTL": 60,
"serverless": {
"isr": false,
"dataCache": "none"
},
"wordpress": {
"cacheHeaders": false,
"transients": false
}
},
"*": {
"pageDataTTL": 300,
"appDataTTL": 300,
"queryHooksTTL": 300,
"serverless": {
"isr": true,
"dataCache": "in-memory"
},
"wordpress": {
"cacheHeaders": true,
"transients": true
}
}
}
}Cache host keys are matched as hostnames. Ports are ignored, exact hostnames win over wildcard patterns, and "*" is the fallback.
| Option | What It Does |
|---|---|
pageDataTTL | Seconds to cache route data and rendered page responses. |
appDataTTL | Seconds to cache global app data from views/_app.graphql. |
queryHooksTTL | Seconds to cache named runtime GraphQL query hook responses. |
serverless.isr | Enables serverless response caching/ISR for pages and data routes. |
serverless.dataCache | in-memory uses the serverless LRU/SWR data cache. none fetches WordPress every time. |
wordpress.cacheHeaders | Allows WordPress data responses to emit cache headers. |
wordpress.transients | Allows WordPress to cache GraphQL results in transients. |
Individual GraphQL files can still override the duration with # ttl: 300 or disable caching with # nocache; see GraphQL caching.
trackers
trackers embeds standard tracking snippets collected by eddev.
{
"trackers": [
{
"provider": "ga4",
"id": "G-XXXXXXXXXX"
},
{
"provider": "gtm",
"id": "GTM-XXXXXXX"
}
]
}Supported providers are ga4 and gtm. Serverless CSP can auto-detect common tracker origins when CSP is enabled.
If you've got Slim SEO installed, you can just put them in Settings -> Slim SEO -> Code.
Legacy Flags
legacyMetadata and legacyStitches are compatibility switches for older projects. Leave them off unless the project already depends on those older conventions.
legacyMetadatakeeps support for older metadata extraction.legacyStitchesmarks the site as using the old Stitches styling path.
New projects should use exported block/view metadata and the current CSS/Tailwind setup.