{"id":100,"date":"2026-10-29T16:00:00","date_gmt":"2026-10-29T15:00:00","guid":{"rendered":"https:\/\/hoja.in\/blog\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli\/"},"modified":"2026-10-16T14:00:12","modified_gmt":"2026-10-16T12:00:12","slug":"running-typo3-upgrade-wizards-and-schema-updates-from-the-cli","status":"publish","type":"post","link":"https:\/\/hoja.in\/blog\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli\/","title":{"rendered":"Running TYPO3 upgrade wizards and schema updates from the CLI"},"content":{"rendered":"<p>Clicking through the install tool works when you have one installation and one environment. With DDEV locally, a staging server and production, you click the same buttons three times and hope you clicked the same ones. On a multi-site upgrade at work that is simply not an option. Everything that touches the database during an upgrade should be a command you can put in a runbook.<\/p>\n<p>This post covers the core commands in TYPO3 v14 for that job, what each of them really writes, and the part that bit me most: wizards that say &#8220;done&#8221; although they migrated nothing.<\/p>\n<h2>The commands<\/h2>\n<p>All of them come with the core when <code>typo3\/cms-install<\/code> is installed (the upgrade wizard interfaces and the <code>#[UpgradeWizard]<\/code> attribute moved to EXT:core in v14, see Deprecation #106947). In DDEV you run them with <code>ddev exec<\/code>:<\/p>\n<pre><code class=\"language-bash\"># what is pending, and what was already done\nddev exec vendor\/bin\/typo3 upgrade:list\nddev exec vendor\/bin\/typo3 upgrade:list --all\n\n# run all pending wizards, or exactly one\nddev exec vendor\/bin\/typo3 upgrade:run\nddev exec vendor\/bin\/typo3 upgrade:run pageDoktypeLinkMigration\n\n# flip a wizard back to \"not done\"\nddev exec vendor\/bin\/typo3 upgrade:mark:undone pageDoktypeLinkMigration\n\n# set up extensions: schema, static data, extension configuration\nddev exec vendor\/bin\/typo3 extension:setup\nddev exec vendor\/bin\/typo3 extension:setup -e sitepackage<\/code><\/pre>\n<p>On hoja.in after the move to v14.3, <code>upgrade:list<\/code> says <code>No wizards available.<\/code>, and <code>upgrade:list --all<\/code> shows a table with every wizard and its status, for example <code>pageDoktypeLinkMigration<\/code> as <code>DONE<\/code>. Keep that in mind, I come back to it.<\/p>\n<h2>What extension:setup does to your schema<\/h2>\n<p>There is no separate &#8220;update schema&#8221; command in the core. Schema changes happen in <code>extension:setup<\/code>. I read <code>PackageSetup::updateDatabaseSchemaForAllPackages()<\/code> to be sure what it does: it compares all <code>ext_tables.sql<\/code> definitions with the database and applies only four kinds of changes: <code>add<\/code>, <code>change<\/code>, <code>create_table<\/code> and <code>change_table<\/code>. It never drops or renames a field or table.<\/p>\n<p>That is a good default for a deploy. Removing old columns is the install tool&#8217;s job: <em>Analyze Database Structure<\/em> in the Maintenance module (in v14 the top-level module formerly called &#8220;Admin Tools&#8221; is named &#8220;System&#8221;). The core renames removed fields to <code>zzz_deleted_*<\/code> first and only drops them in a second step. If you use helhum\/typo3-console, it has a <code>database:updateschema<\/code> command with safe and destructive selectors; check that the release you install supports your core version.<\/p>\n<p>Also good to know: <code>upgrade:run<\/code> checks the prerequisites of each wizard. Many wizards require an up-to-date database, and that prerequisite adds missing tables and fields before the wizard runs. So the order is not as fragile as it looks. But it still only adds, it does not remove.<\/p>\n<h2>Problems I faced: &#8220;done&#8221; does not mean &#8220;migrated&#8221;<\/h2>\n<p>The status in <code>upgrade:list --all<\/code> is just a flag in the <code>sys_registry<\/code> table (namespace <code>installUpdate<\/code>, one row per wizard class). Nothing checks your data. I found three ways that flag gets set without a migration.<\/p>\n<h3>1. A fresh installation marks every wizard as done<\/h3>\n<p>When you set up a new TYPO3, <code>SetupDatabaseService::markWizardsDone()<\/code> sets the flag for all non-repeatable wizards. That makes sense for an empty database. But hoja.in was exactly the other case: a fresh v14.3 installation, then old 7.6 content imported by a script. The wizards were &#8220;done&#8221; before the old data even arrived.<\/p>\n<p>One of the breaking changes on that way is Breaking #17406: the field <code>pages.url<\/code> was removed, external link pages use the typolink field <code>pages.link<\/code> now. The wizard <code>pageDoktypeLinkMigration<\/code> would move the values, but it was never going to run. So the import script did that mapping itself, and the smoke test confirmed that the &#8220;Blog&#8221; menu entry still pointed to <code>\/blog\/<\/code>. If you import data into a fresh installation, read the wizards of every version you skip and do their work in the import.<\/p>\n<h3>2. Running a wizard when the data is not there yet<\/h3>\n<p>If a wizard says <code>updateNecessary()<\/code> is false, <code>upgrade:run<\/code> marks it done and tells you: &#8220;does not need to make changes. Marking wizard as done.&#8221; That is fine if the data really does not exist. It is not fine if the data is just not there <em>yet<\/em>, or not there <em>any more<\/em>.<\/p>\n<p>The link wizard is a nice example: it only reports work when <code>pages<\/code> still has the columns <code>url<\/code>, <code>target<\/code> and <code>link<\/code>. Remove <code>url<\/code> in the install tool before running wizards and the wizard sees nothing to do, gets marked done, and your external links are empty. Order: wizards first, destructive cleanup last.<\/p>\n<h3>3. Confirmable wizards with &#8211;no-interaction<\/h3>\n<p>Some wizards ask a question (they implement <code>ConfirmableInterface<\/code>). In a deploy script you add <code>-n<\/code>, so Symfony takes the default answer. If the default is &#8220;no&#8221; and the confirmation is not required, the command prints &#8220;No changes applied, marking wizard as done.&#8221; and exits successfully. Green pipeline, nothing migrated.<\/p>\n<h2>Solution: check the data, not the flag<\/h2>\n<p>Step 1: before any of this, take a database dump. In DDEV that is one command:<\/p>\n<pre><code class=\"language-bash\">ddev snapshot --name before-wizards<\/code><\/pre>\n<p>On hoja.in the AI agent that did the legwork ran with a guard hook that refused <code>extension:setup<\/code> and <code>upgrade:run<\/code> unless a dump younger than 24 hours existed. That rule is worth keeping even without an agent.<\/p>\n<p>Step 2: list what is flagged as done, straight from the registry:<\/p>\n<pre><code class=\"language-bash\">ddev mysql -e \"SELECT entry_key FROM sys_registry WHERE entry_namespace = 'installUpdate'\"<\/code><\/pre>\n<p>Step 3: for each wizard that matters for your data, write one query that shows whether the old shape is still present. For the link wizard:<\/p>\n<pre><code class=\"language-sql\">-- external link pages without a link: either migrated wrong, or not at all\nSELECT uid, title FROM pages WHERE doktype = 3 AND deleted = 0 AND link = '';<\/code><\/pre>\n<p>Step 4: if a wizard was flagged too early and the source columns still exist, run <code>upgrade:mark:undone &lt;identifier&gt;<\/code> and then <code>upgrade:run &lt;identifier&gt;<\/code>. If the columns are already gone, restore the dump. That is why step 1 exists.<\/p>\n<h2>A deploy script snippet<\/h2>\n<p>On production I do not want to run wizards blindly. They are rehearsed on a copy of the production database, one by one, with the checks above. The deploy only applies the safe schema part and then refuses to continue if anything is still pending:<\/p>\n<pre><code class=\"language-bash\">#!\/usr\/bin\/env bash\nset -euo pipefail\n\ncomposer install --no-dev --optimize-autoloader --no-interaction\nvendor\/bin\/typo3 extension:setup --no-interaction\n\npending=\"$(vendor\/bin\/typo3 upgrade:list --no-ansi)\"\nif ! grep -q 'No wizards available' &lt;&lt;&lt;\"$pending\"; then\n    echo \"Pending upgrade wizards, run them on staging first:\" &gt;&amp;2\n    echo \"$pending\" &gt;&amp;2\n    exit 1\nfi\n\nvendor\/bin\/typo3 cache:flush<\/code><\/pre>\n<p>This is close to step 3 of the hoja.in runbook (<code>composer install --no-dev<\/code>, <code>extension:setup<\/code>, <code>upgrade:list<\/code> expecting &#8220;No wizards available&#8221;, <code>cache:flush<\/code>), just with the expectation turned into an exit code.<\/p>\n<p>Feedbacks are the champion&#8217;s breakfast. If you know another way a wizard gets marked done too early, drop a comment.<\/p>\n<h2>Further reading<\/h2>\n<ul>\n<li><a href=\"https:\/\/docs.typo3.org\/m\/typo3\/reference-coreapi\/main\/en-us\/ApiOverview\/UpdateWizards\/Index.html\">Upgrade wizards in the TYPO3 core API reference<\/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 url in table pages has been removed<\/a><\/li>\n<li><a href=\"https:\/\/docs.typo3.org\/c\/typo3\/cms-core\/main\/en-us\/Changelog\/14.0\/Deprecation-106947-MoveUpgradeWizardRelatedInterfacesAndAttributeToEXTcore.html\">Deprecation #106947: upgrade wizard interfaces moved to EXT:core<\/a><\/li>\n<li><a href=\"https:\/\/ddev.readthedocs.io\/en\/stable\/users\/usage\/commands\/\">DDEV commands (snapshot, mysql, exec)<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>upgrade:list, upgrade:run and extension:setup in TYPO3 v14, what each one writes to the database, and three ways a wizard ends up marked done without migrating anything.<\/p>\n","protected":false},"author":1,"featured_media":101,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[27,45,5,25],"class_list":["post-100","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-typo3","tag-ddev","tag-devops","tag-typo3","tag-upgrades"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>TYPO3 upgrade wizards and schema updates on the CLI<\/title>\n<meta name=\"description\" content=\"Run TYPO3 v14 upgrade wizards and schema updates from the CLI in DDEV and on deploy, and find wizards that were marked done without migrating your data.\" \/>\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\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"TYPO3 upgrade wizards and schema updates on the CLI\" \/>\n<meta property=\"og:description\" content=\"Run TYPO3 v14 upgrade wizards and schema updates from the CLI in DDEV and on deploy, and find wizards that were marked done without migrating your data.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/hoja.in\/blog\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli\/\" \/>\n<meta property=\"og:site_name\" content=\"Hoja Mustaffa Abdul Latheef \u2013 Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-29T15:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli.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\\\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli\\\/\"},\"author\":{\"name\":\"Hoja Mustaffa Abdul Latheef\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#\\\/schema\\\/person\\\/e6fbd54c2061674d8ea3e7861d858c7b\"},\"headline\":\"Running TYPO3 upgrade wizards and schema updates from the CLI\",\"datePublished\":\"2026-10-29T15:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli\\\/\"},\"wordCount\":930,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#\\\/schema\\\/person\\\/e6fbd54c2061674d8ea3e7861d858c7b\"},\"image\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/hoja.in\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli.jpg\",\"keywords\":[\"DDEV\",\"DevOps\",\"TYPO3\",\"Upgrades\"],\"articleSection\":[\"TYPO3\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/hoja.in\\\/blog\\\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli\\\/\",\"url\":\"https:\\\/\\\/hoja.in\\\/blog\\\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli\\\/\",\"name\":\"TYPO3 upgrade wizards and schema updates on the CLI\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/hoja.in\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli.jpg\",\"datePublished\":\"2026-10-29T15:00:00+00:00\",\"description\":\"Run TYPO3 v14 upgrade wizards and schema updates from the CLI in DDEV and on deploy, and find wizards that were marked done without migrating your data.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/hoja.in\\\/blog\\\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli\\\/#primaryimage\",\"url\":\"https:\\\/\\\/hoja.in\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli.jpg\",\"contentUrl\":\"https:\\\/\\\/hoja.in\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli.jpg\",\"width\":1200,\"height\":630,\"caption\":\"Wizards without the clicking\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/hoja.in\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Running TYPO3 upgrade wizards and schema updates from the CLI\"}]},{\"@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 upgrade wizards and schema updates on the CLI","description":"Run TYPO3 v14 upgrade wizards and schema updates from the CLI in DDEV and on deploy, and find wizards that were marked done without migrating your data.","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\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli\/","og_locale":"en_US","og_type":"article","og_title":"TYPO3 upgrade wizards and schema updates on the CLI","og_description":"Run TYPO3 v14 upgrade wizards and schema updates from the CLI in DDEV and on deploy, and find wizards that were marked done without migrating your data.","og_url":"https:\/\/hoja.in\/blog\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli\/","og_site_name":"Hoja Mustaffa Abdul Latheef \u2013 Blog","article_published_time":"2026-10-29T15:00:00+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli.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\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli\/#article","isPartOf":{"@id":"https:\/\/hoja.in\/blog\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli\/"},"author":{"name":"Hoja Mustaffa Abdul Latheef","@id":"https:\/\/hoja.in\/blog\/#\/schema\/person\/e6fbd54c2061674d8ea3e7861d858c7b"},"headline":"Running TYPO3 upgrade wizards and schema updates from the CLI","datePublished":"2026-10-29T15:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/hoja.in\/blog\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli\/"},"wordCount":930,"commentCount":0,"publisher":{"@id":"https:\/\/hoja.in\/blog\/#\/schema\/person\/e6fbd54c2061674d8ea3e7861d858c7b"},"image":{"@id":"https:\/\/hoja.in\/blog\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli\/#primaryimage"},"thumbnailUrl":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli.jpg","keywords":["DDEV","DevOps","TYPO3","Upgrades"],"articleSection":["TYPO3"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/hoja.in\/blog\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/hoja.in\/blog\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli\/","url":"https:\/\/hoja.in\/blog\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli\/","name":"TYPO3 upgrade wizards and schema updates on the CLI","isPartOf":{"@id":"https:\/\/hoja.in\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/hoja.in\/blog\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli\/#primaryimage"},"image":{"@id":"https:\/\/hoja.in\/blog\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli\/#primaryimage"},"thumbnailUrl":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli.jpg","datePublished":"2026-10-29T15:00:00+00:00","description":"Run TYPO3 v14 upgrade wizards and schema updates from the CLI in DDEV and on deploy, and find wizards that were marked done without migrating your data.","breadcrumb":{"@id":"https:\/\/hoja.in\/blog\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/hoja.in\/blog\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/hoja.in\/blog\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli\/#primaryimage","url":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli.jpg","contentUrl":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli.jpg","width":1200,"height":630,"caption":"Wizards without the clicking"},{"@type":"BreadcrumbList","@id":"https:\/\/hoja.in\/blog\/running-typo3-upgrade-wizards-and-schema-updates-from-the-cli\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/hoja.in\/blog\/"},{"@type":"ListItem","position":2,"name":"Running TYPO3 upgrade wizards and schema updates from the CLI"}]},{"@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\/100","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=100"}],"version-history":[{"count":1,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/posts\/100\/revisions"}],"predecessor-version":[{"id":173,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/posts\/100\/revisions\/173"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/media\/101"}],"wp:attachment":[{"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/media?parent=100"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/categories?post=100"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/tags?post=100"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}