{"id":58,"date":"2026-10-15T15:00:00","date_gmt":"2026-10-15T15:00:00","guid":{"rendered":"https:\/\/myport.ddev.site\/blog\/building-a-typo3-v14-site-package-with-site-sets-and-pageview\/"},"modified":"2026-10-16T12:00:12","modified_gmt":"2026-10-16T12:00:12","slug":"building-a-typo3-v14-site-package-with-site-sets-and-pageview","status":"publish","type":"post","link":"https:\/\/hoja.in\/blog\/building-a-typo3-v14-site-package-with-site-sets-and-pageview\/","title":{"rendered":"Building a TYPO3 v14 site package with site sets and PAGEVIEW"},"content":{"rendered":"<p>When I rebuilt hoja.in on TYPO3 14.3, the old site package was full of flux page templates, a long <code>FLUIDTEMPLATE<\/code> block and a <code>sys_template<\/code> record with static includes. None of it came along. The new package is small, and most of the wiring is done by conventions that arrived in TYPO3 13 and are the normal way in 14.<\/p>\n<p>This post builds a minimal site package from zero with exactly those conventions. Copy it, rename the vendor, and you have a working page.<\/p>\n<h2>What was wrong with the old way<\/h2>\n<p>The classic setup had three places that needed to agree with each other: a <code>sys_template<\/code> record in the database with static includes, TypoScript that resolved the template name from the backend layout with a long <code>stdWrap<\/code> chain, and three separate root paths for templates, layouts and partials. Change one and forget the other, and you get a white page with an exception. I have debugged that more times than I want to count.<\/p>\n<p>Two features in TYPO3 13 removed most of this:<\/p>\n<ul>\n<li><strong>Site sets<\/strong> (Feature #103437, with TypoScript and TSconfig providers in #103439 and #103522). A set is a folder with a <code>config.yaml<\/code>. Files called <code>setup.typoscript<\/code>, <code>constants.typoscript<\/code> and <code>page.tsconfig<\/code> next to it are loaded automatically.<\/li>\n<li><strong>PAGEVIEW<\/strong> (Feature #103504). A content object that picks the Fluid template from the page&#8217;s backend layout and finds layouts and partials by folder convention.<\/li>\n<\/ul>\n<h2>Step 1: The package skeleton<\/h2>\n<p>This is the whole tree of the example. Nothing is hidden.<\/p>\n<pre><code class=\"language-text\">packages\/my-site\/\n\u251c\u2500\u2500 composer.json\n\u251c\u2500\u2500 Configuration\/\n\u2502   \u2514\u2500\u2500 Sets\/\n\u2502       \u2514\u2500\u2500 MySite\/\n\u2502           \u251c\u2500\u2500 config.yaml\n\u2502           \u251c\u2500\u2500 setup.typoscript\n\u2502           \u2514\u2500\u2500 page.tsconfig\n\u2514\u2500\u2500 Resources\/\n    \u2514\u2500\u2500 Private\/\n        \u2514\u2500\u2500 PageView\/\n            \u251c\u2500\u2500 Layouts\/\n            \u2502   \u2514\u2500\u2500 Page.html\n            \u251c\u2500\u2500 Pages\/\n            \u2502   \u2514\u2500\u2500 Default.html\n            \u2514\u2500\u2500 Partials\/\n                \u2514\u2500\u2500 Navigation.html<\/code><\/pre>\n<p>The <code>composer.json<\/code> needs the extension key and the core packages you depend on:<\/p>\n<pre><code class=\"language-json\">{\n    \"name\": \"myvendor\/my-site\",\n    \"type\": \"typo3-cms-extension\",\n    \"license\": \"GPL-2.0-or-later\",\n    \"require\": {\n        \"typo3\/cms-core\": \"^14.3\",\n        \"typo3\/cms-fluid-styled-content\": \"^14.3\"\n    },\n    \"extra\": {\n        \"typo3\/cms\": {\n            \"extension-key\": \"my_site\"\n        }\n    }\n}<\/code><\/pre>\n<p>In the project root, add the folder as a path repository and require the package: <code>composer config repositories.local path 'packages\/*'<\/code> and <code>composer require myvendor\/my-site:@dev<\/code>.<\/p>\n<h2>Step 2: The set definition<\/h2>\n<p>The <code>config.yaml<\/code> of the set gives it a name and lists other sets it depends on. Dependencies are loaded first and de-duplicated, which replaces the old static includes.<\/p>\n<pre><code class=\"language-yaml\">name: myvendor\/my-site\nlabel: 'My site'\ndependencies:\n  - typo3\/fluid-styled-content<\/code><\/pre>\n<p>On hoja.in the set also depends on <code>typo3\/form<\/code> and <code>typo3\/seo-sitemap<\/code>, because the contact page uses the form framework and the sitemap should be there without extra TypoScript.<\/p>\n<h2>Step 3: TypoScript with PAGEVIEW<\/h2>\n<p><code>setup.typoscript<\/code> next to <code>config.yaml<\/code> is picked up without any include. This is the full file:<\/p>\n<pre><code class=\"language-typoscript\">page = PAGE\npage {\n  meta.viewport = width=device-width, initial-scale=1\n\n  10 = PAGEVIEW\n  10 {\n    paths.10 = EXT:my_site\/Resources\/Private\/PageView\/\n\n    dataProcessing {\n      10 = menu\n      10 {\n        levels = 1\n        as = mainMenu\n      }\n    }\n  }\n}<\/code><\/pre>\n<p>Our hero here is <code>paths<\/code>. <code>PAGEVIEW<\/code> appends <code>Pages\/<\/code>, <code>Layouts\/<\/code> and <code>Partials\/<\/code> to each path itself. Several paths are possible (<code>paths.10<\/code>, <code>paths.20<\/code>) and higher numbers win, so another package can override single templates.<\/p>\n<p>In the template you get some variables for free: <code>page<\/code>, <code>site<\/code>, <code>language<\/code> and <code>settings<\/code>. Since TYPO3 14.2 there is also <code>content<\/code>, which holds the content areas of the current backend layout (Feature #104974). These default names are reserved; trying to override them throws an exception.<\/p>\n<h2>Step 4: A backend layout that maps to a template<\/h2>\n<p><code>page.tsconfig<\/code> in the set folder is loaded as page TSconfig for every page of a site that uses the set. One layout with one column is enough to start:<\/p>\n<pre><code class=\"language-typoscript\">mod.web_layout.BackendLayouts {\n  Default {\n    title = Default page\n    config {\n      backend_layout {\n        colCount = 1\n        rowCount = 1\n        rows {\n          1 {\n            columns {\n              1 {\n                name = Main content\n                colPos = 0\n                identifier = main\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n}<\/code><\/pre>\n<p>Select it in the page properties of the root page, as &#8220;Backend Layout&#8221; and &#8220;for subpages&#8221;. The stored value is <code>pagets__Default<\/code>; <code>PAGEVIEW<\/code> strips the prefix and renders <code>Pages\/Default.html<\/code>. When no layout is selected at all, the resolver falls back to the name <code>default<\/code>, and Fluid in v14 tries the given spelling first and the capitalised one after it, so <code>Pages\/Default.html<\/code> still matches. A second layout called <code>Legal<\/code> would render <code>Pages\/Legal.html<\/code>, which is exactly how the legal pages on hoja.in get their own template.<\/p>\n<p>The <code>identifier = main<\/code> is important. It becomes the key of the content area in Fluid.<\/p>\n<h2>Step 5: The Fluid files<\/h2>\n<p>The page template only picks a layout and fills a section:<\/p>\n<pre><code class=\"language-html\">&lt;html xmlns:f=\"http:\/\/typo3.org\/ns\/TYPO3\/CMS\/Fluid\/ViewHelpers\" data-namespace-typo3-fluid=\"true\"&gt;\n&lt;f:layout name=\"Page\" \/&gt;\n\n&lt;f:section name=\"Main\"&gt;\n    &lt;f:render.contentArea contentArea=\"{content.main}\" \/&gt;\n&lt;\/f:section&gt;\n&lt;\/html&gt;<\/code><\/pre>\n<p>The layout holds the frame around it:<\/p>\n<pre><code class=\"language-html\">&lt;html xmlns:f=\"http:\/\/typo3.org\/ns\/TYPO3\/CMS\/Fluid\/ViewHelpers\" data-namespace-typo3-fluid=\"true\"&gt;\n&lt;header&gt;\n    &lt;a href=\"{site.base}\"&gt;{site.configuration.websiteTitle}&lt;\/a&gt;\n    &lt;f:render partial=\"Navigation\" arguments=\"{mainMenu: mainMenu}\" \/&gt;\n&lt;\/header&gt;\n&lt;main id=\"content\"&gt;\n    &lt;f:render section=\"Main\" \/&gt;\n&lt;\/main&gt;\n&lt;\/html&gt;<\/code><\/pre>\n<p>And the partial renders the menu from the data processor:<\/p>\n<pre><code class=\"language-html\">&lt;html xmlns:f=\"http:\/\/typo3.org\/ns\/TYPO3\/CMS\/Fluid\/ViewHelpers\" data-namespace-typo3-fluid=\"true\"&gt;\n&lt;nav aria-label=\"Main\"&gt;\n    &lt;ul&gt;\n        &lt;f:for each=\"{mainMenu}\" as=\"item\"&gt;\n            &lt;li&gt;&lt;a href=\"{item.link}\" aria-current=\"{f:if(condition: item.current, then: 'page', else: 'false')}\"&gt;{item.title}&lt;\/a&gt;&lt;\/li&gt;\n        &lt;\/f:for&gt;\n    &lt;\/ul&gt;\n&lt;\/nav&gt;\n&lt;\/html&gt;<\/code><\/pre>\n<p><code>f:render.contentArea<\/code> is new in TYPO3 14.2 (Feature #108726). In 13.4 you would loop over the records yourself or use a <code>CONTENT<\/code> object; the ViewHelper is nicer because other extensions can hook into the output with the <code>ModifyRenderedContentAreaEvent<\/code>. If your package must also run on v13, keep the old way for now.<\/p>\n<p>A small note on file names: Fluid 5 in v14 also accepts <code>Default.fluid.html<\/code> (Feature #108166). It is optional. I kept plain <code>.html<\/code>.<\/p>\n<h2>Step 6: Let the site depend on the set<\/h2>\n<p>The last piece is the site configuration. Instead of a <code>sys_template<\/code> record, the site lists the set:<\/p>\n<pre><code class=\"language-yaml\">rootPageId: 1\nbase: 'https:\/\/example.ddev.site\/'\ndependencies:\n  - myvendor\/my-site\nlanguages:\n  -\n    title: English\n    enabled: true\n    languageId: 0\n    base: \/\n    locale: en_US.UTF-8<\/code><\/pre>\n<p>You can also choose the set in the backend in the Sites module. A site that uses sets acts as its own TypoScript root, so there is no &#8220;clear&#8221; and &#8220;root&#8221; flag to forget. A <code>sys_template<\/code> record still works and is applied after the site TypoScript, but for a fresh project I do not create one at all.<\/p>\n<p>Flush the caches with <code>vendor\/bin\/typo3 cache:flush<\/code>, open the frontend, and the page renders with your layout, your menu and the content of the main column.<\/p>\n<h2>What I learned<\/h2>\n<ul>\n<li>Folder names matter more than TypoScript now. <code>Pages<\/code>, <code>Layouts<\/code>, <code>Partials<\/code>, with exactly this spelling.<\/li>\n<li>The backend layout identifier is the template name. Rename one and you must rename the other.<\/li>\n<li>Put everything that belongs to the site design in the set: TypoScript, TSconfig, form configuration. Then a second site is just one more line in its <code>config.yaml<\/code>.<\/li>\n<\/ul>\n<p>If this post helped you to start your package without the old boilerplate, I will be really happy.<\/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\">TYPO3: Site sets<\/a><\/li>\n<li><a href=\"https:\/\/docs.typo3.org\/m\/typo3\/reference-typoscript\/main\/en-us\/ContentObjects\/Pageview\/Index.html\">TypoScript reference: PAGEVIEW<\/a><\/li>\n<li><a href=\"https:\/\/docs.typo3.org\/c\/typo3\/cms-core\/main\/en-us\/Changelog\/14.2\/Feature-108726-IntroduceFluidRenderContentAreaViewHelper.html\">Feature #108726: f:render.contentArea ViewHelper<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>A minimal TYPO3 v14 site package from zero: a site set with config.yaml, auto-loaded TypoScript and TSconfig, PAGEVIEW and one backend layout mapped to a page template.<\/p>\n","protected":false},"author":1,"featured_media":59,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[30,13,28,24,29],"class_list":["post-58","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-typo3","tag-extension-development","tag-fluid","tag-site-sets","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>TYPO3 v14 site package with site sets and PAGEVIEW<\/title>\n<meta name=\"description\" content=\"Build a TYPO3 v14 site package without FLUIDTEMPLATE: site set config.yaml, setup.typoscript, PAGEVIEW, backend layouts and the folder conventions.\" \/>\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\/building-a-typo3-v14-site-package-with-site-sets-and-pageview\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"TYPO3 v14 site package with site sets and PAGEVIEW\" \/>\n<meta property=\"og:description\" content=\"Build a TYPO3 v14 site package without FLUIDTEMPLATE: site set config.yaml, setup.typoscript, PAGEVIEW, backend layouts and the folder conventions.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/hoja.in\/blog\/building-a-typo3-v14-site-package-with-site-sets-and-pageview\/\" \/>\n<meta property=\"og:site_name\" content=\"Hoja Mustaffa Abdul Latheef \u2013 Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-15T15:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-16T12:00:12+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/building-a-typo3-v14-site-package-with-site-sets-and-pageview.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\\\/building-a-typo3-v14-site-package-with-site-sets-and-pageview\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/building-a-typo3-v14-site-package-with-site-sets-and-pageview\\\/\"},\"author\":{\"name\":\"Hoja Mustaffa Abdul Latheef\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#\\\/schema\\\/person\\\/e6fbd54c2061674d8ea3e7861d858c7b\"},\"headline\":\"Building a TYPO3 v14 site package with site sets and PAGEVIEW\",\"datePublished\":\"2026-10-15T15:00:00+00:00\",\"dateModified\":\"2026-10-16T12:00:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/building-a-typo3-v14-site-package-with-site-sets-and-pageview\\\/\"},\"wordCount\":819,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#\\\/schema\\\/person\\\/e6fbd54c2061674d8ea3e7861d858c7b\"},\"image\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/building-a-typo3-v14-site-package-with-site-sets-and-pageview\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/hoja.in\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/building-a-typo3-v14-site-package-with-site-sets-and-pageview.jpg\",\"keywords\":[\"Extension development\",\"fluid\",\"Site sets\",\"TYPO3 v14\",\"TypoScript\"],\"articleSection\":[\"TYPO3\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/hoja.in\\\/blog\\\/building-a-typo3-v14-site-package-with-site-sets-and-pageview\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/building-a-typo3-v14-site-package-with-site-sets-and-pageview\\\/\",\"url\":\"https:\\\/\\\/hoja.in\\\/blog\\\/building-a-typo3-v14-site-package-with-site-sets-and-pageview\\\/\",\"name\":\"TYPO3 v14 site package with site sets and PAGEVIEW\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/building-a-typo3-v14-site-package-with-site-sets-and-pageview\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/building-a-typo3-v14-site-package-with-site-sets-and-pageview\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/hoja.in\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/building-a-typo3-v14-site-package-with-site-sets-and-pageview.jpg\",\"datePublished\":\"2026-10-15T15:00:00+00:00\",\"dateModified\":\"2026-10-16T12:00:12+00:00\",\"description\":\"Build a TYPO3 v14 site package without FLUIDTEMPLATE: site set config.yaml, setup.typoscript, PAGEVIEW, backend layouts and the folder conventions.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/building-a-typo3-v14-site-package-with-site-sets-and-pageview\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/hoja.in\\\/blog\\\/building-a-typo3-v14-site-package-with-site-sets-and-pageview\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/building-a-typo3-v14-site-package-with-site-sets-and-pageview\\\/#primaryimage\",\"url\":\"https:\\\/\\\/hoja.in\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/building-a-typo3-v14-site-package-with-site-sets-and-pageview.jpg\",\"contentUrl\":\"https:\\\/\\\/hoja.in\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/building-a-typo3-v14-site-package-with-site-sets-and-pageview.jpg\",\"width\":1200,\"height\":630,\"caption\":\"Site sets meet PAGEVIEW\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/building-a-typo3-v14-site-package-with-site-sets-and-pageview\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/hoja.in\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Building a TYPO3 v14 site package with site sets and PAGEVIEW\"}]},{\"@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":"TYPO3 v14 site package with site sets and PAGEVIEW","description":"Build a TYPO3 v14 site package without FLUIDTEMPLATE: site set config.yaml, setup.typoscript, PAGEVIEW, backend layouts and the folder conventions.","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\/building-a-typo3-v14-site-package-with-site-sets-and-pageview\/","og_locale":"en_US","og_type":"article","og_title":"TYPO3 v14 site package with site sets and PAGEVIEW","og_description":"Build a TYPO3 v14 site package without FLUIDTEMPLATE: site set config.yaml, setup.typoscript, PAGEVIEW, backend layouts and the folder conventions.","og_url":"https:\/\/hoja.in\/blog\/building-a-typo3-v14-site-package-with-site-sets-and-pageview\/","og_site_name":"Hoja Mustaffa Abdul Latheef \u2013 Blog","article_published_time":"2026-10-15T15:00:00+00:00","article_modified_time":"2026-10-16T12:00:12+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/building-a-typo3-v14-site-package-with-site-sets-and-pageview.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\/building-a-typo3-v14-site-package-with-site-sets-and-pageview\/#article","isPartOf":{"@id":"https:\/\/hoja.in\/blog\/building-a-typo3-v14-site-package-with-site-sets-and-pageview\/"},"author":{"name":"Hoja Mustaffa Abdul Latheef","@id":"https:\/\/hoja.in\/blog\/#\/schema\/person\/e6fbd54c2061674d8ea3e7861d858c7b"},"headline":"Building a TYPO3 v14 site package with site sets and PAGEVIEW","datePublished":"2026-10-15T15:00:00+00:00","dateModified":"2026-10-16T12:00:12+00:00","mainEntityOfPage":{"@id":"https:\/\/hoja.in\/blog\/building-a-typo3-v14-site-package-with-site-sets-and-pageview\/"},"wordCount":819,"commentCount":0,"publisher":{"@id":"https:\/\/hoja.in\/blog\/#\/schema\/person\/e6fbd54c2061674d8ea3e7861d858c7b"},"image":{"@id":"https:\/\/hoja.in\/blog\/building-a-typo3-v14-site-package-with-site-sets-and-pageview\/#primaryimage"},"thumbnailUrl":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/building-a-typo3-v14-site-package-with-site-sets-and-pageview.jpg","keywords":["Extension development","fluid","Site sets","TYPO3 v14","TypoScript"],"articleSection":["TYPO3"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/hoja.in\/blog\/building-a-typo3-v14-site-package-with-site-sets-and-pageview\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/hoja.in\/blog\/building-a-typo3-v14-site-package-with-site-sets-and-pageview\/","url":"https:\/\/hoja.in\/blog\/building-a-typo3-v14-site-package-with-site-sets-and-pageview\/","name":"TYPO3 v14 site package with site sets and PAGEVIEW","isPartOf":{"@id":"https:\/\/hoja.in\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/hoja.in\/blog\/building-a-typo3-v14-site-package-with-site-sets-and-pageview\/#primaryimage"},"image":{"@id":"https:\/\/hoja.in\/blog\/building-a-typo3-v14-site-package-with-site-sets-and-pageview\/#primaryimage"},"thumbnailUrl":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/building-a-typo3-v14-site-package-with-site-sets-and-pageview.jpg","datePublished":"2026-10-15T15:00:00+00:00","dateModified":"2026-10-16T12:00:12+00:00","description":"Build a TYPO3 v14 site package without FLUIDTEMPLATE: site set config.yaml, setup.typoscript, PAGEVIEW, backend layouts and the folder conventions.","breadcrumb":{"@id":"https:\/\/hoja.in\/blog\/building-a-typo3-v14-site-package-with-site-sets-and-pageview\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/hoja.in\/blog\/building-a-typo3-v14-site-package-with-site-sets-and-pageview\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/hoja.in\/blog\/building-a-typo3-v14-site-package-with-site-sets-and-pageview\/#primaryimage","url":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/building-a-typo3-v14-site-package-with-site-sets-and-pageview.jpg","contentUrl":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/building-a-typo3-v14-site-package-with-site-sets-and-pageview.jpg","width":1200,"height":630,"caption":"Site sets meet PAGEVIEW"},{"@type":"BreadcrumbList","@id":"https:\/\/hoja.in\/blog\/building-a-typo3-v14-site-package-with-site-sets-and-pageview\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/hoja.in\/blog\/"},{"@type":"ListItem","position":2,"name":"Building a TYPO3 v14 site package with site sets and PAGEVIEW"}]},{"@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\/58","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=58"}],"version-history":[{"count":1,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/posts\/58\/revisions"}],"predecessor-version":[{"id":152,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/posts\/58\/revisions\/152"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/media\/59"}],"wp:attachment":[{"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/media?parent=58"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/categories?post=58"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/tags?post=58"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}