{"id":56,"date":"2026-10-15T07:00:00","date_gmt":"2026-10-15T07:00:00","guid":{"rendered":"https:\/\/myport.ddev.site\/blog\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3\/"},"modified":"2026-10-16T12:00:12","modified_gmt":"2026-10-16T12:00:12","slug":"moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3","status":"publish","type":"post","link":"https:\/\/hoja.in\/blog\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3\/","title":{"rendered":"Moving hoja.in from TYPO3 7.6 classic mode to 14.3"},"content":{"rendered":"<p>Hi folks,<\/p>\n<p>My own website hoja.in ran on TYPO3 7.6 for a very long time. Classic mode, no Composer, flux and fluidpages for the page templates, realurl for the URLs and powermail for the contact form. The blog lived on a separate subdomain with WordPress 5.6. Funny situation: I upgrade TYPO3 installations for a living, and my own site was the oldest one I touched.<\/p>\n<p>In 2026 I finally moved it to TYPO3 14.3. This post is the overview: what I decided, in which order I worked, and the commands that started it. Every bigger step has its own post, linked at the end.<\/p>\n<h2>Problems I faced<\/h2>\n<p>When I listed what was installed, the picture was clear quickly:<\/p>\n<ul>\n<li><strong>Classic mode with the core in git.<\/strong> The 7.6 source was committed into the repository. When I booted a copy for testing, the committed <code>index.php<\/code> was empty, so I had to take the file from the original <code>typo3_src-7.6.10.zip<\/code>.<\/li>\n<li><strong>Extensions without a future.<\/strong> flux, fluidpages, fluidcontent, vhs, realurl and builder. realurl has had no role since TYPO3 9.5 brought site handling and slugs into the core. powermail and pxa_cookie_bar had no v14 release.<\/li>\n<li><strong>Own extensions.<\/strong> The site package (extension key <code>templates<\/code>) depended on flux, and an old <code>smslogin<\/code> extension was still installed.<\/li>\n<li><strong>The hop chain.<\/strong> A classic in-place upgrade means 7.6 \u2192 8.7 \u2192 9.5 \u2192 10.4 \u2192 11.5 \u2192 12.4 \u2192 13.4 \u2192 14.3. Seven hops, each with its own PHP version, its own upgrade wizards and its own broken templates.<\/li>\n<\/ul>\n<h2>Why a fresh install beat seven hops<\/h2>\n<p>For a big installation with many editors, workspaces and thousands of records, I usually stay with the in-place path, because the upgrade wizards migrate data that you cannot easily create again. hoja.in is the opposite case. The final import was 19 pages, 10 content elements and 6 file references. The templates were going to be thrown away anyway, because flux does not come to v14 with me.<\/p>\n<p>So walking seven hops would mean carrying flux structures through seven sets of wizards only to delete them at the end. A fresh TYPO3 14.3 Composer project plus a small import script was simply less work and less risk. That was the main decision, and everything else followed from it.<\/p>\n<h2>The plan, step by step<\/h2>\n<h3>Step 1: Inventory before opinions<\/h3>\n<p>Before deciding anything, I checked which extension was really used on which page. Two findings saved work. The <code>smslogin<\/code> extension had no plugin instance on any page of the live database, so it was dropped (the code stays in the git history). A flux carousel in a special column (<code>colPos<\/code> 18181) never rendered on the live site at all, so it was not imported. A hidden demo page tree from the original one-page theme was also left behind.<\/p>\n<h3>Step 2: A smoke baseline from the old site<\/h3>\n<p>I booted the old 7.6 site in a separate DDEV project with PHP 7.0 and MariaDB 10.5, loaded the live dump, and captured seven URLs: HTTP status, final URL, size, page title and whether an error marker appeared. The HTML of each page was saved too. Without this baseline, &#8220;it looks fine&#8221; is only a feeling. With it, every later change can be compared against what the old site really delivered.<\/p>\n<h3>Step 3: A fresh Composer project with DDEV<\/h3>\n<p>For a brand new project, these are the commands to start from the base distribution:<\/p>\n<pre><code class=\"language-bash\"># DDEV project: TYPO3 type, web root public\/, PHP 8.4, MariaDB 10.11\nddev config --project-type=typo3 --docroot=public --php-version=8.4 --database=mariadb:10.11\nddev start\n\n# TYPO3 14.3 from the base distribution, then the CLI setup\nddev composer create-project \"typo3\/cms-base-distribution:^14.3\"\nddev exec vendor\/bin\/typo3 setup<\/code><\/pre>\n<p>In my case the git repository already existed, so I turned it into a Composer root myself: web root <code>public\/<\/code>, own extensions under <code>Source\/Extension\/<\/code> as a path repository, and the PHP platform pinned so that the lock file matches the server:<\/p>\n<pre><code class=\"language-bash\">ddev composer config repositories.local path 'Source\/Extension\/*'\nddev composer config platform.php 8.4\nddev composer require \"typo3\/cms-core:^14.3\" \"typo3\/cms-fluid-styled-content:^14.3\" \n    \"typo3\/cms-form:^14.3\" \"typo3\/cms-seo:^14.3\" \"typo3\/cms-redirects:^14.3\" \n    \"harvisoft\/sitepackage:@dev\"<\/code><\/pre>\n<p>The list above is shortened; the real <code>composer.json<\/code> also requires the backend modules I use, like filelist, info, lowlevel and tstemplate.<\/p>\n<h3>Step 4: A new site package<\/h3>\n<p>The old <code>templates<\/code> extension became <code>sitepackage<\/code>, rebuilt without flux and vhs. It ships a site set (<code>harvisoft\/sitepackage<\/code>) that depends on fluid-styled-content, form and the SEO sitemap set, and it renders the page with <code>PAGEVIEW<\/code>. The site configuration lists the set as a dependency, so no <code>sys_template<\/code> record is needed.<\/p>\n<h3>Step 5: Import the content with a script<\/h3>\n<p>A PHP script boots TYPO3 on the CLI, reads the old database (loaded into a second DDEV database called <code>legacy<\/code>) and writes pages, content and file references with their original uids. Slugs are generated with the core <code>SlugHelper<\/code>, the powermail element becomes an EXT:form element, and old image paths are rewritten to <code>fileadmin\/<\/code>. It is re-runnable: it clears what it imported before it starts.<\/p>\n<p>One v14 detail bit me here: the field <code>pages.url<\/code> does not exist any more. Breaking change #17406 renamed the &#8220;External URL&#8221; page type to &#8220;Link&#8221;, which uses the typolink field <code>pages.link<\/code>. My blog menu item was such a page, so the script writes <code>\/blog\/<\/code> into <code>link<\/code>.<\/p>\n<h3>Step 6: Replace each extension<\/h3>\n<ul>\n<li>realurl \u2192 site configuration and slugs in the core.<\/li>\n<li>powermail \u2192 the core form framework with one <code>contact.form.yaml<\/code>.<\/li>\n<li>flux and fluidpages \u2192 backend layouts in page TSconfig of the set, plus <code>PAGEVIEW<\/code> templates.<\/li>\n<li>vhs \u2192 core ViewHelpers and data processors (menu and files).<\/li>\n<li>pxa_cookie_bar \u2192 dropped, because TYPO3 sets no tracking cookies on this site.<\/li>\n<\/ul>\n<h3>Step 7: Move the blog<\/h3>\n<p>WordPress went from 5.6 to 7.1 and from <code>blog.hoja.in<\/code> into <code>public\/blog<\/code>, served at <code>hoja.in\/blog<\/code>. The old subdomain gets a 301 to the new path.<\/p>\n<h3>Step 8: The gate<\/h3>\n<p>Done means measured. The seven baseline URLs had to answer 200 without error markers, the new speaking URLs and <code>\/blog\/<\/code> as well, <code>upgrade:list<\/code> had to show no pending wizards, and a contact form submission had to arrive in Mailpit. Only then I called the migration finished.<\/p>\n<h2>What I would tell you before you try the same<\/h2>\n<p>A fresh install is a strong option when the content is small and the templates are going away anyway. It is a bad option when editors depend on history, workspaces or many translated records. Decide with numbers from your own database, not with the hope that &#8220;it is only a small site&#8221;.<\/p>\n<p>The deeper posts:<\/p>\n<ul>\n<li><a href=\"\/blog\/building-a-typo3-v14-site-package-with-site-sets-and-pageview\/\">Building a TYPO3 v14 site package with site sets and PAGEVIEW<\/a><\/li>\n<li><a href=\"\/blog\/importing-content-from-typo3-7-6-into-v14-with-a-script\/\">Importing content from TYPO3 7.6 into v14 with a script<\/a><\/li>\n<li><a href=\"\/blog\/replacing-powermail-with-ext-form-in-typo3-v14\/\">Replacing powermail with EXT:form in TYPO3 v14<\/a><\/li>\n<li><a href=\"\/blog\/a-smoke-test-baseline-before-you-touch-a-typo3-upgrade\/\">A smoke test baseline before you touch a TYPO3 upgrade<\/a><\/li>\n<li><a href=\"\/blog\/upgrading-a-wordpress-blog-from-5-6-to-7-1-on-php-8\/\">Upgrading a WordPress blog from 5.6 to 7.1 on PHP 8<\/a><\/li>\n<\/ul>\n<p>Feedbacks are the champion&#8217;s breakfast, so drop a comment if you are planning a similar jump.<\/p>\n<h2>Further reading<\/h2>\n<ul>\n<li><a href=\"https:\/\/docs.typo3.org\/m\/typo3\/tutorial-getting-started\/main\/en-us\/Installation\/Install.html\">TYPO3: Installing TYPO3 with Composer<\/a><\/li>\n<li><a href=\"https:\/\/ddev.readthedocs.io\/en\/stable\/users\/quickstart\/\">DDEV: CMS quickstarts<\/a><\/li>\n<li><a href=\"https:\/\/docs.typo3.org\/c\/typo3\/cms-core\/main\/en-us\/Changelog\/14.0\/Breaking-17406-FieldUrlInTablePagesHasBeenRemoved.html\">Breaking #17406: Field &#8220;url&#8221; in table &#8220;pages&#8221; has been removed<\/a><\/li>\n<li><a href=\"https:\/\/docs.typo3.org\/m\/typo3\/reference-coreapi\/main\/en-us\/ApiOverview\/SiteHandling\/Index.html\">TYPO3: Site handling<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Why I rebuilt my own site as a fresh TYPO3 14.3 Composer project instead of climbing seven upgrade hops from 7.6, and the plan that got it done.<\/p>\n","protected":false},"author":1,"featured_media":57,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[26,27,5,24,25],"class_list":["post-56","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-typo3","tag-composer","tag-ddev","tag-typo3","tag-typo3-v14","tag-upgrades"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Moving hoja.in from TYPO3 7.6 to 14.3<\/title>\n<meta name=\"description\" content=\"A real TYPO3 7.6 to 14.3 migration: fresh Composer project with DDEV, smoke baseline, import script and replacements for flux, realurl and powermail.\" \/>\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\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Moving hoja.in from TYPO3 7.6 to 14.3\" \/>\n<meta property=\"og:description\" content=\"A real TYPO3 7.6 to 14.3 migration: fresh Composer project with DDEV, smoke baseline, import script and replacements for flux, realurl and powermail.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/hoja.in\/blog\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3\/\" \/>\n<meta property=\"og:site_name\" content=\"Hoja Mustaffa Abdul Latheef \u2013 Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-15T07: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\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3.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\\\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3\\\/\"},\"author\":{\"name\":\"Hoja Mustaffa Abdul Latheef\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#\\\/schema\\\/person\\\/e6fbd54c2061674d8ea3e7861d858c7b\"},\"headline\":\"Moving hoja.in from TYPO3 7.6 classic mode to 14.3\",\"datePublished\":\"2026-10-15T07:00:00+00:00\",\"dateModified\":\"2026-10-16T12:00:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3\\\/\"},\"wordCount\":1028,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#\\\/schema\\\/person\\\/e6fbd54c2061674d8ea3e7861d858c7b\"},\"image\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/hoja.in\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3.jpg\",\"keywords\":[\"Composer\",\"DDEV\",\"TYPO3\",\"TYPO3 v14\",\"Upgrades\"],\"articleSection\":[\"TYPO3\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/hoja.in\\\/blog\\\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3\\\/\",\"url\":\"https:\\\/\\\/hoja.in\\\/blog\\\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3\\\/\",\"name\":\"Moving hoja.in from TYPO3 7.6 to 14.3\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/hoja.in\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3.jpg\",\"datePublished\":\"2026-10-15T07:00:00+00:00\",\"dateModified\":\"2026-10-16T12:00:12+00:00\",\"description\":\"A real TYPO3 7.6 to 14.3 migration: fresh Composer project with DDEV, smoke baseline, import script and replacements for flux, realurl and powermail.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/hoja.in\\\/blog\\\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3\\\/#primaryimage\",\"url\":\"https:\\\/\\\/hoja.in\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3.jpg\",\"contentUrl\":\"https:\\\/\\\/hoja.in\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3.jpg\",\"width\":1200,\"height\":630,\"caption\":\"From 7.6 to 14.3\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/hoja.in\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Moving hoja.in from TYPO3 7.6 classic mode to 14.3\"}]},{\"@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":"Moving hoja.in from TYPO3 7.6 to 14.3","description":"A real TYPO3 7.6 to 14.3 migration: fresh Composer project with DDEV, smoke baseline, import script and replacements for flux, realurl and powermail.","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\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3\/","og_locale":"en_US","og_type":"article","og_title":"Moving hoja.in from TYPO3 7.6 to 14.3","og_description":"A real TYPO3 7.6 to 14.3 migration: fresh Composer project with DDEV, smoke baseline, import script and replacements for flux, realurl and powermail.","og_url":"https:\/\/hoja.in\/blog\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3\/","og_site_name":"Hoja Mustaffa Abdul Latheef \u2013 Blog","article_published_time":"2026-10-15T07: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\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3.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\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3\/#article","isPartOf":{"@id":"https:\/\/hoja.in\/blog\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3\/"},"author":{"name":"Hoja Mustaffa Abdul Latheef","@id":"https:\/\/hoja.in\/blog\/#\/schema\/person\/e6fbd54c2061674d8ea3e7861d858c7b"},"headline":"Moving hoja.in from TYPO3 7.6 classic mode to 14.3","datePublished":"2026-10-15T07:00:00+00:00","dateModified":"2026-10-16T12:00:12+00:00","mainEntityOfPage":{"@id":"https:\/\/hoja.in\/blog\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3\/"},"wordCount":1028,"commentCount":0,"publisher":{"@id":"https:\/\/hoja.in\/blog\/#\/schema\/person\/e6fbd54c2061674d8ea3e7861d858c7b"},"image":{"@id":"https:\/\/hoja.in\/blog\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3\/#primaryimage"},"thumbnailUrl":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3.jpg","keywords":["Composer","DDEV","TYPO3","TYPO3 v14","Upgrades"],"articleSection":["TYPO3"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/hoja.in\/blog\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/hoja.in\/blog\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3\/","url":"https:\/\/hoja.in\/blog\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3\/","name":"Moving hoja.in from TYPO3 7.6 to 14.3","isPartOf":{"@id":"https:\/\/hoja.in\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/hoja.in\/blog\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3\/#primaryimage"},"image":{"@id":"https:\/\/hoja.in\/blog\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3\/#primaryimage"},"thumbnailUrl":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3.jpg","datePublished":"2026-10-15T07:00:00+00:00","dateModified":"2026-10-16T12:00:12+00:00","description":"A real TYPO3 7.6 to 14.3 migration: fresh Composer project with DDEV, smoke baseline, import script and replacements for flux, realurl and powermail.","breadcrumb":{"@id":"https:\/\/hoja.in\/blog\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/hoja.in\/blog\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/hoja.in\/blog\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3\/#primaryimage","url":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3.jpg","contentUrl":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3.jpg","width":1200,"height":630,"caption":"From 7.6 to 14.3"},{"@type":"BreadcrumbList","@id":"https:\/\/hoja.in\/blog\/moving-hoja-in-from-typo3-7-6-classic-mode-to-14-3\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/hoja.in\/blog\/"},{"@type":"ListItem","position":2,"name":"Moving hoja.in from TYPO3 7.6 classic mode to 14.3"}]},{"@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\/56","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=56"}],"version-history":[{"count":1,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/posts\/56\/revisions"}],"predecessor-version":[{"id":151,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/posts\/56\/revisions\/151"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/media\/57"}],"wp:attachment":[{"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/media?parent=56"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/categories?post=56"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/tags?post=56"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}