{"id":98,"date":"2026-10-29T08:00:00","date_gmt":"2026-10-29T07:00:00","guid":{"rendered":"https:\/\/hoja.in\/blog\/site-set-settings-settings-definitions-yaml-in-practice\/"},"modified":"2026-10-16T14:00:12","modified_gmt":"2026-10-16T12:00:12","slug":"site-set-settings-settings-definitions-yaml-in-practice","status":"publish","type":"post","link":"https:\/\/hoja.in\/blog\/site-set-settings-settings-definitions-yaml-in-practice\/","title":{"rendered":"Site set settings: settings.definitions.yaml in practice"},"content":{"rendered":"<p>For years the place for &#8220;small things an integrator may change&#8221; in TYPO3 was the constant editor. A colour here, a page uid there, a logo path. In theory editors could change them. In practice nobody found them, the comment syntax for categories was a mystery, and in a multi-site installation you needed a <code>sys_template<\/code> record per site just to change one value.<\/p>\n<p>Since TYPO3 v13 the better place is the site set. A set can describe its settings in <code>settings.definitions.yaml<\/code>, with a type, a default, a label and a category. Each site stores its own values in <code>config\/sites\/&lt;identifier&gt;\/settings.yaml<\/code>. This post shows how I use it, with a small sitepackage example.<\/p>\n<h2>Problems I faced with constants<\/h2>\n<ul>\n<li>No types. A constant is a string. If somebody writes <code>#29292<\/code> instead of <code>#292929<\/code>, TypoScript does not care.<\/li>\n<li>Values live in database records, so they are not in git and not reviewable.<\/li>\n<li>Per-site values need per-site template records, which drift apart over the years.<\/li>\n<li>The comment-based category syntax of the constant editor was hard to remember even for me, after many years of TYPO3.<\/li>\n<\/ul>\n<h2>Step 1: describe the settings<\/h2>\n<p>A site set is a folder with <code>config.yaml<\/code> under <code>Configuration\/Sets\/&lt;Name&gt;\/<\/code>. Next to it you put <code>settings.definitions.yaml<\/code>. The hoja.in sitepackage still has its meta description and theme colour hard-coded in <code>setup.typoscript<\/code>, so they are perfect candidates. Here is how the definitions would look:<\/p>\n<pre><code class=\"language-yaml\"># EXT:sitepackage\/Configuration\/Sets\/Sitepackage\/settings.definitions.yaml\ncategories:\n  sitepackage:\n    label: 'Portfolio theme'\n  sitepackage.meta:\n    label: 'Meta data'\n    parent: sitepackage\n  sitepackage.layout:\n    label: 'Layout'\n    parent: sitepackage\n\nsettings:\n  sitepackage.meta.description:\n    label: 'Default meta description'\n    description: 'Used when a page has no own description.'\n    category: sitepackage.meta\n    type: text\n    default: ''\n\n  sitepackage.meta.themeColor:\n    label: 'Browser theme colour'\n    category: sitepackage.meta\n    type: color\n    default: '#292929'\n\n  sitepackage.layout.contactPage:\n    label: 'Page with the contact form'\n    category: sitepackage.layout\n    type: page\n    default: 0\n\n  sitepackage.layout.showBadges:\n    label: 'Show certification badges in the footer'\n    category: sitepackage.layout\n    type: bool\n    default: true\n\n  sitepackage.layout.heroStyle:\n    label: 'Hero style'\n    category: sitepackage.layout\n    type: string\n    default: dark\n    enum:\n      dark: 'Dark background'\n      light: 'Light background'<\/code><\/pre>\n<p>Some notes from practice:<\/p>\n<ul>\n<li>The keys are flat, dotted identifiers. Prefix them with something unique (here <code>sitepackage.<\/code>) so they do not clash with core sets like <code>styles.content.*<\/code> or <code>seo.*<\/code>.<\/li>\n<li>In TYPO3 14.3 the core registers these types: <code>bool<\/code>, <code>color<\/code>, <code>int<\/code>, <code>number<\/code>, <code>page<\/code>, <code>string<\/code>, <code>stringlist<\/code>, <code>text<\/code> and <code>url<\/code>. You can see them as classes in <code>EXT:core\/Classes\/Settings\/Type\/<\/code>. An invalid value is not accepted silently: the type validates it and falls back to the default, with a log entry.<\/li>\n<li>A setting can be <code>readonly: true<\/code>. The editor then shows it but does not let you change it; only a developer can, in the YAML file.<\/li>\n<li><code>enum<\/code> turns a string setting into a select box. Since v14.2 the enum labels can be localized as well (Feature #106640).<\/li>\n<li>Instead of writing labels into the YAML file, you can put a <code>labels.xlf<\/code> next to <code>config.yaml<\/code>, with ids like <code>settings.sitepackage.meta.themeColor<\/code> and <code>categories.sitepackage.meta<\/code>. The core sets do it this way.<\/li>\n<\/ul>\n<h2>Step 2: set values per site<\/h2>\n<p>The defaults belong to the set. The values of one site belong to the site, in <code>config\/sites\/main\/settings.yaml<\/code>. Since v13.4 the recommended format is a flat map (Important #106894), so <code>foo.bar<\/code> and <code>foo.bar.baz<\/code> can both have a value:<\/p>\n<pre><code class=\"language-yaml\"># config\/sites\/main\/settings.yaml\nsitepackage.meta.themeColor: '#1d1d1b'\nsitepackage.layout.contactPage: 12<\/code><\/pre>\n<p>The real <code>settings.yaml<\/code> of hoja.in currently holds only one value from a core set, written as a tree. TYPO3 still reads the tree form; the settings editor converts it to a map the next time it saves:<\/p>\n<pre><code class=\"language-yaml\"># Section pages (canonical = root page), content pool, quicklinks and storage folders\nseo:\n  sitemap:\n    pages:\n      excludePagesRecursive: '7,10,11,12,13,14,17,20'<\/code><\/pre>\n<p>That setting is defined by the core set <code>typo3\/seo-sitemap<\/code>. So this is the second big win of sets: you configure an extension&#8217;s behaviour per site in a YAML file that is in git, instead of in a template record.<\/p>\n<h2>Step 3: read the values<\/h2>\n<h3>In TypoScript<\/h3>\n<p>Site settings are available as TypoScript constants (that part is older than sets, it came with TYPO3 10.4). So the hard-coded lines in my setup become:<\/p>\n<pre><code class=\"language-typoscript\">page {\n  meta.description = {$sitepackage.meta.description}\n  meta.theme-color = {$sitepackage.meta.themeColor}\n}<\/code><\/pre>\n<p>If you migrate an extension from constants to settings and want both to keep working for a while, v13.1 added a null coalescing operator for constants. The core seo extension uses it exactly for the setting above:<\/p>\n<pre><code class=\"language-typoscript\">excludePagesRecursive = {$plugin.tx_seo.settings.xmlSitemap.sitemaps.pages.excludePagesRecursive ?? $seo.sitemap.pages.excludePagesRecursive}<\/code><\/pre>\n<h3>In Fluid with PAGEVIEW<\/h3>\n<p><code>PAGEVIEW<\/code> assigns the constants tree as the variable <code>settings<\/code>, so dotted keys become nested array keys in the template:<\/p>\n<pre><code class=\"language-html\">&lt;f:if condition=\"{settings.sitepackage.layout.showBadges}\"&gt;\n    &lt;f:render partial=\"Badges\" \/&gt;\n&lt;\/f:if&gt;\n&lt;f:link.page pageUid=\"{settings.sitepackage.layout.contactPage}\"&gt;Contact&lt;\/f:link.page&gt;<\/code><\/pre>\n<p>One thing to watch: through TypoScript constants every value arrives as a string. A <code>bool<\/code> setting with value false is the string <code>\"0\"<\/code>, which Fluid treats as false in a condition, so the example works. But do not compare it with <code>== false<\/code> and expect PHP semantics.<\/p>\n<h3>In PHP<\/h3>\n<p>In a middleware, controller or event listener you get the typed value from the site object of the request:<\/p>\n<pre><code class=\"language-php\">use TYPO3CMSCoreSiteEntitySite;\n\n$site = $request-&gt;getAttribute('site');\nif ($site instanceof Site) {\n    $contactPage = (int)$site-&gt;getSettings()-&gt;get('sitepackage.layout.contactPage', 0);\n}<\/code><\/pre>\n<h2>Step 4: the backend settings editor<\/h2>\n<p>TYPO3 v13.3 added a settings editor (Feature #104794). In v13 it is the module <em>Site Management &gt; Settings<\/em>. In v14 the backend modules were reorganised (Feature #107628): the separate settings module was merged into <em>Sites &gt; Setup<\/em>, the same module where you edit the site configuration. The editor lists your categories and settings with proper widgets: a colour picker for <code>color<\/code>, a page browser for <code>page<\/code>, a select box for <code>enum<\/code>.<\/p>\n<p>Two details that matter in a team:<\/p>\n<ol>\n<li>The editor only writes values that differ from the default of the active sets. Your <code>settings.yaml<\/code> stays small and the diff in git is readable.<\/li>\n<li>When the feature came in v13.3, the module was for administrators only. So plan who changes what. For hoja.in that is me, so nothing to plan.<\/li>\n<\/ol>\n<p>Because the editor writes a file, a change made on production is a change to a file that is also in git. Decide early whether settings are edited in the backend on production (then do not deploy over <code>settings.yaml<\/code>) or only in git (then do not give anybody access to the module on production). Mixing both ends with somebody&#8217;s change being overwritten on the next deploy. I have seen that with other files in one of my projects, and it is not fun to explain.<\/p>\n<h2>When to still use constants<\/h2>\n<p>Almost never for new work. For an existing extension with many users, keep the constants for one major version and read them with the <code>??<\/code> fallback shown above, then drop them. For a sitepackage you own, move everything at once; it is an afternoon of work and you get types, labels and git history for free.<\/p>\n<p>If this post helped you, I will be really happy. Cheers!<\/p>\n<h2>Further reading<\/h2>\n<ul>\n<li><a href=\"https:\/\/docs.typo3.org\/m\/typo3\/reference-coreapi\/main\/en-us\/ApiOverview\/SiteHandling\/SiteSets.html\">Site sets in the TYPO3 core API reference<\/a><\/li>\n<li><a href=\"https:\/\/docs.typo3.org\/c\/typo3\/cms-core\/main\/en-us\/Changelog\/13.3\/Feature-104794-IntroduceSiteSettingsEditor.html\">Feature #104794: Introduce site settings editor<\/a><\/li>\n<li><a href=\"https:\/\/docs.typo3.org\/c\/typo3\/cms-core\/main\/en-us\/Changelog\/13.4.x\/Important-106894-SiteSettingsyamlIsNowStoredAsAMap.html\">Important #106894: settings.yaml is stored as a map<\/a><\/li>\n<li><a href=\"https:\/\/docs.typo3.org\/c\/typo3\/cms-core\/main\/en-us\/Changelog\/13.1\/Feature-103671-ProvideNullCoalescingOperatorForTypoScriptConstants.html\">Feature #103671: Null coalescing operator for TypoScript constants<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Constants editors never found are now typed site settings: settings.definitions.yaml, settings.yaml per site, and reading values in TypoScript, Fluid and PHP.<\/p>\n","protected":false},"author":1,"featured_media":99,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[28,33,24,29],"class_list":["post-98","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-typo3","tag-site-sets","tag-typo3-v13","tag-typo3-v14","tag-typoscript"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Site set settings with settings.definitions.yaml<\/title>\n<meta name=\"description\" content=\"Typed site settings in settings.definitions.yaml, per-site values in settings.yaml, read in TypoScript, Fluid and PHP, edited in TYPO3 v13\/v14.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/hoja.in\/blog\/site-set-settings-settings-definitions-yaml-in-practice\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Site set settings with settings.definitions.yaml\" \/>\n<meta property=\"og:description\" content=\"Typed site settings in settings.definitions.yaml, per-site values in settings.yaml, read in TypoScript, Fluid and PHP, edited in TYPO3 v13\/v14.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/hoja.in\/blog\/site-set-settings-settings-definitions-yaml-in-practice\/\" \/>\n<meta property=\"og:site_name\" content=\"Hoja Mustaffa Abdul Latheef \u2013 Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-29T07:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/site-set-settings-settings-definitions-yaml-in-practice.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Hoja Mustaffa Abdul Latheef\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@hojaonline\" \/>\n<meta name=\"twitter:site\" content=\"@hojaonline\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Hoja Mustaffa Abdul Latheef\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/site-set-settings-settings-definitions-yaml-in-practice\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/site-set-settings-settings-definitions-yaml-in-practice\\\/\"},\"author\":{\"name\":\"Hoja Mustaffa Abdul Latheef\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#\\\/schema\\\/person\\\/e6fbd54c2061674d8ea3e7861d858c7b\"},\"headline\":\"Site set settings: settings.definitions.yaml in practice\",\"datePublished\":\"2026-10-29T07:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/site-set-settings-settings-definitions-yaml-in-practice\\\/\"},\"wordCount\":938,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#\\\/schema\\\/person\\\/e6fbd54c2061674d8ea3e7861d858c7b\"},\"image\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/site-set-settings-settings-definitions-yaml-in-practice\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/hoja.in\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/site-set-settings-settings-definitions-yaml-in-practice.jpg\",\"keywords\":[\"Site sets\",\"TYPO3 v13\",\"TYPO3 v14\",\"TypoScript\"],\"articleSection\":[\"TYPO3\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/hoja.in\\\/blog\\\/site-set-settings-settings-definitions-yaml-in-practice\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/site-set-settings-settings-definitions-yaml-in-practice\\\/\",\"url\":\"https:\\\/\\\/hoja.in\\\/blog\\\/site-set-settings-settings-definitions-yaml-in-practice\\\/\",\"name\":\"Site set settings with settings.definitions.yaml\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/site-set-settings-settings-definitions-yaml-in-practice\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/site-set-settings-settings-definitions-yaml-in-practice\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/hoja.in\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/site-set-settings-settings-definitions-yaml-in-practice.jpg\",\"datePublished\":\"2026-10-29T07:00:00+00:00\",\"description\":\"Typed site settings in settings.definitions.yaml, per-site values in settings.yaml, read in TypoScript, Fluid and PHP, edited in TYPO3 v13\\\/v14.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/site-set-settings-settings-definitions-yaml-in-practice\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/hoja.in\\\/blog\\\/site-set-settings-settings-definitions-yaml-in-practice\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/site-set-settings-settings-definitions-yaml-in-practice\\\/#primaryimage\",\"url\":\"https:\\\/\\\/hoja.in\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/site-set-settings-settings-definitions-yaml-in-practice.jpg\",\"contentUrl\":\"https:\\\/\\\/hoja.in\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/site-set-settings-settings-definitions-yaml-in-practice.jpg\",\"width\":1200,\"height\":630,\"caption\":\"Typed settings for every site\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/site-set-settings-settings-definitions-yaml-in-practice\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/hoja.in\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Site set settings: settings.definitions.yaml in practice\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/hoja.in\\\/blog\\\/\",\"name\":\"Hoja Mustaffa Abdul Latheef \u2013 Blog\",\"description\":\"Notes from daily work with TYPO3, PHP and AI-assisted engineering\",\"publisher\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#\\\/schema\\\/person\\\/e6fbd54c2061674d8ea3e7861d858c7b\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/hoja.in\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#\\\/schema\\\/person\\\/e6fbd54c2061674d8ea3e7861d858c7b\",\"name\":\"Hoja Mustaffa Abdul Latheef\",\"logo\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#\\\/schema\\\/person\\\/image\\\/\"},\"description\":\"Senior TYPO3 Developer at jweiland.net, TYPO3 CMS Certified Developer. I write about TYPO3 upgrades, extension development, PHP and AI-assisted engineering with Claude Code.\",\"sameAs\":[\"https:\\\/\\\/hoja.in\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Site set settings with settings.definitions.yaml","description":"Typed site settings in settings.definitions.yaml, per-site values in settings.yaml, read in TypoScript, Fluid and PHP, edited in TYPO3 v13\/v14.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/hoja.in\/blog\/site-set-settings-settings-definitions-yaml-in-practice\/","og_locale":"en_US","og_type":"article","og_title":"Site set settings with settings.definitions.yaml","og_description":"Typed site settings in settings.definitions.yaml, per-site values in settings.yaml, read in TypoScript, Fluid and PHP, edited in TYPO3 v13\/v14.","og_url":"https:\/\/hoja.in\/blog\/site-set-settings-settings-definitions-yaml-in-practice\/","og_site_name":"Hoja Mustaffa Abdul Latheef \u2013 Blog","article_published_time":"2026-10-29T07:00:00+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/site-set-settings-settings-definitions-yaml-in-practice.jpg","type":"image\/jpeg"}],"author":"Hoja Mustaffa Abdul Latheef","twitter_card":"summary_large_image","twitter_creator":"@hojaonline","twitter_site":"@hojaonline","twitter_misc":{"Written by":"Hoja Mustaffa Abdul Latheef","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/hoja.in\/blog\/site-set-settings-settings-definitions-yaml-in-practice\/#article","isPartOf":{"@id":"https:\/\/hoja.in\/blog\/site-set-settings-settings-definitions-yaml-in-practice\/"},"author":{"name":"Hoja Mustaffa Abdul Latheef","@id":"https:\/\/hoja.in\/blog\/#\/schema\/person\/e6fbd54c2061674d8ea3e7861d858c7b"},"headline":"Site set settings: settings.definitions.yaml in practice","datePublished":"2026-10-29T07:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/hoja.in\/blog\/site-set-settings-settings-definitions-yaml-in-practice\/"},"wordCount":938,"commentCount":0,"publisher":{"@id":"https:\/\/hoja.in\/blog\/#\/schema\/person\/e6fbd54c2061674d8ea3e7861d858c7b"},"image":{"@id":"https:\/\/hoja.in\/blog\/site-set-settings-settings-definitions-yaml-in-practice\/#primaryimage"},"thumbnailUrl":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/site-set-settings-settings-definitions-yaml-in-practice.jpg","keywords":["Site sets","TYPO3 v13","TYPO3 v14","TypoScript"],"articleSection":["TYPO3"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/hoja.in\/blog\/site-set-settings-settings-definitions-yaml-in-practice\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/hoja.in\/blog\/site-set-settings-settings-definitions-yaml-in-practice\/","url":"https:\/\/hoja.in\/blog\/site-set-settings-settings-definitions-yaml-in-practice\/","name":"Site set settings with settings.definitions.yaml","isPartOf":{"@id":"https:\/\/hoja.in\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/hoja.in\/blog\/site-set-settings-settings-definitions-yaml-in-practice\/#primaryimage"},"image":{"@id":"https:\/\/hoja.in\/blog\/site-set-settings-settings-definitions-yaml-in-practice\/#primaryimage"},"thumbnailUrl":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/site-set-settings-settings-definitions-yaml-in-practice.jpg","datePublished":"2026-10-29T07:00:00+00:00","description":"Typed site settings in settings.definitions.yaml, per-site values in settings.yaml, read in TypoScript, Fluid and PHP, edited in TYPO3 v13\/v14.","breadcrumb":{"@id":"https:\/\/hoja.in\/blog\/site-set-settings-settings-definitions-yaml-in-practice\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/hoja.in\/blog\/site-set-settings-settings-definitions-yaml-in-practice\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/hoja.in\/blog\/site-set-settings-settings-definitions-yaml-in-practice\/#primaryimage","url":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/site-set-settings-settings-definitions-yaml-in-practice.jpg","contentUrl":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/site-set-settings-settings-definitions-yaml-in-practice.jpg","width":1200,"height":630,"caption":"Typed settings for every site"},{"@type":"BreadcrumbList","@id":"https:\/\/hoja.in\/blog\/site-set-settings-settings-definitions-yaml-in-practice\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/hoja.in\/blog\/"},{"@type":"ListItem","position":2,"name":"Site set settings: settings.definitions.yaml in practice"}]},{"@type":"WebSite","@id":"https:\/\/hoja.in\/blog\/#website","url":"https:\/\/hoja.in\/blog\/","name":"Hoja Mustaffa Abdul Latheef \u2013 Blog","description":"Notes from daily work with TYPO3, PHP and AI-assisted engineering","publisher":{"@id":"https:\/\/hoja.in\/blog\/#\/schema\/person\/e6fbd54c2061674d8ea3e7861d858c7b"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/hoja.in\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/hoja.in\/blog\/#\/schema\/person\/e6fbd54c2061674d8ea3e7861d858c7b","name":"Hoja Mustaffa Abdul Latheef","logo":{"@id":"https:\/\/hoja.in\/blog\/#\/schema\/person\/image\/"},"description":"Senior TYPO3 Developer at jweiland.net, TYPO3 CMS Certified Developer. I write about TYPO3 upgrades, extension development, PHP and AI-assisted engineering with Claude Code.","sameAs":["https:\/\/hoja.in\/"]}]}},"_links":{"self":[{"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/posts\/98","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/comments?post=98"}],"version-history":[{"count":1,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/posts\/98\/revisions"}],"predecessor-version":[{"id":172,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/posts\/98\/revisions\/172"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/media\/99"}],"wp:attachment":[{"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/media?parent=98"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/categories?post=98"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/tags?post=98"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}