Configuration
This page is the canonical reference for Foundry's site config. It explains what each config group is for, what each key does, and where examples are useful it shows the expected YAML shape directly.
What this file does
content/config/site.yaml is the main runtime config for a Foundry site. It
controls site identity, serving, admin behavior, build output, content layout,
taxonomies, fields, plugin activation, deploy targets, feeds, and theme-facing values.
Foundry also supports environment overlays such as
content/config/site.preview.yaml. Those files are layered on top of the
base config when you run commands like foundry build --env preview.
If you want a full explicit config with every current default written out, start from
content/config/example.site.yaml.
Minimal example
name: "foundry"
title: "Foundry CMS"
base_url: "http://localhost:8080"
theme: "default"
server:
addr: ":8080"
live_reload: true
admin:
enabled: true
path: "/__admin"
theme: "default"
content:
pages_dir: "pages"
posts_dir: "posts"
Top-level keys
These keys define the overall site identity and root directory layout.
-
name: machine-oriented site identifier used in status output and metadata. Default:foundry. -
title: human-facing site title. Default:Foundry CMS. -
base_url: canonical site base URL used for absolute links, feeds, preview manifests, and deploy output. Default: empty. -
theme: active frontend theme name underthemes/. Default:default. -
environment: environment label such asdefault,preview, orproduction. Default:default. -
default_lang: default language code for content routing. Default:en. -
content_dir: root content directory. Default:content. -
public_dir: build output directory. Default:public. -
themes_dir: theme root directory. Default:themes. -
data_dir: runtime data directory used for state files and structured data. Default:data. -
plugins_dir: plugin installation directory. Default:plugins.
server
This group controls the preview server and live reload behavior.
-
addr: bind address for the preview server. Default::8080. -
live_reload: enables or disables live reload. Default:false. -
live_reload_mode: reload transport. Usestreamfor Server-Sent Events orpollwhen browser connection limits make SSE unreliable. Default:stream. -
auto_open_browser: automatically opens the preview URL after startup. Default:false. -
debug_routes: enables extra debug-only route output where supported. Default:false.
server:
addr: ":8080"
live_reload: true
live_reload_mode: "poll"
auto_open_browser: false
debug_routes: false
admin
This group controls the admin shell, admin auth, persistent session state, and admin-only debug features.
-
enabled: enables or disables the admin surface. Default:false. -
addr: reserved for a separate admin bind address. The current server mounts admin under the main HTTP server. Default: empty. -
path: admin mount path. Default:/__admin. -
local_only: rejects forwarded or non-local admin access when true. Default:true. -
access_token: optional API token for automation or non-browser admin access. Default: empty. -
theme: active admin theme underthemes/admin-themes/. Default:default. -
users_file: filesystem-backed user database file. Default:content/config/admin-users.yaml. -
session_store_file: persistent session store file. Default:data/admin/sessions.yaml. -
lock_file: persistent document lock file used by editor locking. Default:data/admin/locks.yaml. -
session_ttl_minutes: idle browser session timeout. Default:30. -
password_min_length: minimum password length for save and reset flows. Default:12. -
password_reset_ttl_minutes: password reset token lifetime. Default:30. -
totp_issuer: issuer string embedded in TOTP setup URIs. Default:Foundry.
admin.debug
-
pprof: enables authenticatednet/http/pprofaccess and the admin Debug page runtime summary. Default:false.
admin:
enabled: true
addr: ""
path: "/__admin"
local_only: true
access_token: ""
theme: "default"
users_file: "content/config/admin-users.yaml"
session_store_file: "data/admin/sessions.yaml"
lock_file: "data/admin/locks.yaml"
session_ttl_minutes: 30
password_min_length: 12
password_reset_ttl_minutes: 30
totp_issuer: "Foundry"
debug:
pprof: true
build
This group controls the shape of static build output.
-
clean_public_dir: removespublic/before a build. Default:false. -
include_drafts: includes draft content in build output. Default:false. -
minify_html: minifies rendered HTML. Default:false. -
copy_assets: copies content-owned static assets into output. Default:false. -
copy_images: copies image media into output. Default:false. -
copy_uploads: copies legacy uploads plus the current non-image media collections where applicable. Default:false.
content
This group defines directory names under content/ and a few core content
defaults.
-
pages_dir: page document directory. Default:pages. -
posts_dir: post document directory. Default:posts. -
images_dir: image media directory. Default:images. -
videos_dir: video media directory. Default:videos. -
audio_dir: audio media directory. Default:audio. -
documents_dir: document-like media directory. Default:documents. -
assets_dir: content-owned static asset directory. Default:assets. -
uploads_dir: legacy upload directory retained for compatibility. Default:uploads. -
max_versions_per_file: maximum retained filesystem versions per file before pruning. Default:10. -
default_layout_page: default layout for pages. Default:page. -
default_layout_post: default layout for posts. Default:post. -
default_page_slug_index: slug used for section-index pages. Default:index.
content:
pages_dir: "pages"
posts_dir: "posts"
images_dir: "images"
videos_dir: "videos"
audio_dir: "audio"
documents_dir: "documents"
assets_dir: "assets"
uploads_dir: "uploads"
max_versions_per_file: 10
default_layout_page: "page"
default_layout_post: "post"
default_page_slug_index: "index"
permalinks
This group defines the route templates used when Foundry assigns URLs to pages and posts.
-
page_default: default-language page route pattern. -
page_i18n: non-default-language page route pattern. -
post_default: default-language post route pattern. -
post_i18n: non-default-language post route pattern.
permalinks:
page_Default: "/:slug/"
page_i18n: "/:lang/:slug/"
post_Default: "/posts/:slug/"
post_i18n: "/:lang/posts/:slug/"
taxonomies
This group enables taxonomy rendering and defines which taxonomies exist.
-
enabled: enables taxonomy support. Default:false. -
default_set: taxonomy names enabled by default for content. Default:[tags, categories]. -
definitions: per-taxonomy definitions keyed by taxonomy name. Default:{}.
Each taxonomy definition supports:
-
title: human title for the taxonomy. -
labels: per-language label map. -
archive_layout: optional archive layout override. -
term_layout: layout used for individual term pages. -
order: ordering hint such asalpha.
taxonomies:
enabled: true
default_set:
- tags
- categories
definitions:
tags:
title: "Tags"
labels:
en: "Tags"
es: "Etiquetas"
archive_layout: "list"
term_layout: "list"
order: "alpha"
categories:
title: "Categories"
labels:
en: "Categories"
archive_layout: "list"
term_layout: "list"
plugins
This group controls which installed plugins are enabled for the site.
-
enabled: list of plugin names to enable. Default: empty list.
plugins:
enabled:
- toc
- relatedposts
- readingtime
fields
This group enables schema-driven fields and validation for content types.
-
enabled: enables schema-backed field support. Default:false. -
allow_anything: accepts undeclared field data even when schemas exist. Default:false. -
schemas: map of schema definitions keyed by schema name or document kind. Default:{}.
Each schema contains a fields list. Each field supports keys such as
name, label, type, required,
default, enum, fields, item,
help, and placeholder.
fields:
enabled: true
allow_anything: false
schemas:
post:
fields:
- name: hero_style
label: "Hero Style"
type: "select"
enum:
- "standard"
- "feature"
help: "Choose the post hero treatment."
- name: hero
label: "Hero"
type: "object"
fields:
- name: image
type: "text"
placeholder: "media:images/hero.jpg"
- name: eyebrow
type: "text"
- name: authors
label: "Authors"
type: "list"
item:
name: "author"
type: "object"
fields:
- name: name
type: "text"
required: true
- name: role
type: "text"
seo
This group controls SEO-oriented output defaults.
-
enabled: enables SEO-related handling where supported. Default:false. -
default_title_sep: default title separator when combining page and site titles. Default: empty.
cache
This group controls cache-related behavior where supported by the current runtime.
-
enabled: enables cache-related behavior. Default:false.
security
This group controls security-sensitive rendering behavior.
-
allow_unsafe_html: preserves raw HTML from Markdown when true. Leave thisfalseunless you intentionally trust raw HTML in content. Default:false.
feed
This group controls RSS and sitemap output.
-
rss_path: RSS route path. Default:/rss.xml. -
sitemap_path: sitemap route path. Default:/sitemap.xml. -
rss_limit: maximum number of items in the RSS feed. Default:50. -
rss_title: feed title. Default: the site title. -
rss_description: feed description. Default: the site title.
feed:
rss_path: "/rss.xml"
sitemap_path: "/sitemap.xml"
rss_limit: 50
rss_title: "Foundry CMS"
rss_description: "Foundry CMS"
deploy
This group defines named deploy targets that can override selected config values during builds.
-
default_target: target name to use by default. Default: empty. -
targets: map of named deploy targets. Default:{}.
Each deploy target supports:
-
base_url: override canonical base URL. -
public_dir: override output directory. -
theme: override frontend theme. -
include_drafts: override build draft inclusion. -
environment: override environment label. -
preview: when true, forces preview-style draft inclusion. -
live_reload_mode: override live reload transport for the target.
deploy:
default_target: "production"
targets:
production:
base_url: "https://example.com"
public_dir: "public-prod"
theme: "default"
include_drafts: false
environment: "production"
preview: false
live_reload_mode: "stream"
preview:
base_url: "https://preview.example.com"
public_dir: "public-preview"
include_drafts: true
environment: "preview"
preview: true
live_reload_mode: "poll"
params
This is a free-form map of site-level values exposed to themes, templates, and plugins.
-
params: arbitrary key-value data. Default:{}.
params:
company_name: "Sphire"
support_email: "support@example.com"
home_eyebrow: "Launch Week"
menus
This group defines named menus. Each menu contains items with name and
url.
-
menus: menu map keyed by menu name. Default:{}. -
name: item label shown in the UI. -
url: destination URL.
menus:
main:
- name: "Home"
url: "/"
- name: "Docs"
url: "/docs/"
footer:
- name: "RSS"
url: "/rss.xml"
- name: "GitHub"
url: "https://github.com/sphireinc/foundry"
Defaults and examples
-
Use
content/config/example.site.yamlwhen you want every current default spelled out explicitly. -
Keep
content/config/site.yamlfocused on the values you are actually overriding. -
Use overlays like
content/config/site.preview.yamlor named deploy targets when a setting should only change for preview or production builds. -
When a group contains nested structures like
taxonomies.definitions,fields.schemas, ordeploy.targets, prefer full YAML snippets over terse one-line docs so the expected shape stays obvious.