
Typo3 Project Upgrade
- 31 installs
- 2 repo stars
- Updated August 3, 2026
- netresearch/typo3-project-upgrade-skill
Helps with ai & agent building tasks.
About
typo3-project-upgrade is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted coding.
- typo3-project-upgrade
- AI & Agent Building
- AI-coding skill
Typo3 Project Upgrade by the numbers
- 31 all-time installs (skills.sh)
- +3 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #9,202 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 4, 2026 (Skillselion catalog sync)
npx skills add https://github.com/netresearch/typo3-project-upgrade-skill --skill typo3-project-upgradeAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 31 |
|---|---|
| repo stars | ★ 2 |
| Last updated | August 3, 2026 |
| Repository | netresearch/typo3-project-upgrade-skill ↗ |
What it does
Helps with ai & agent building tasks.
Files
TYPO3 Project Upgrade
Phases: Inventory -> Infrastructure -> Site Sets -> Visual Parity -> Review (+ Phase 6 for v14 targets)
Phase 1: Inventory
Query sys_template (uid, pid, root, include_static_file), tt_content CType distribution, extension list. Document all root=1 templates and their TypoScript constants/config.
Phase 2: Infrastructure
ImageMagick required — without it, ALL images serve unprocessed originals (10-30x size). Install in Docker, configure GFX processor in config/system/settings.php, then TRUNCATE sys_file_processedfile, rm -rf public/fileadmin/_processed_/*, cache:flush.
Phase 3: sys_template to Site Sets (v13+)
Structure: packages/my-site/Configuration/Sets/MySite/ with config.yaml, settings.yaml, setup.typoscript.
config.yaml: name, label, dependencies (e.g. bootstrap-package/full).
Site config (config/sites/default/config.yaml): add dependencies: [vendor/my-site].
CRITICAL: DELETE FROM sys_template — ALL records. A surviving root=1 template with include_static_file overrides site sets, causing "No page configured for type=0". Common mistake: only checking config column while include_static_file also conflicts.
settings.yaml — map old constants (page.logo.file, page.theme.navigation.style, page.theme.breadcrumb.enable) directly.
SCSS Variable Injection
BS Package injects ALL plugin.bootstrap_package.settings.scss.* as SCSS variables — even unlisted ones. Prefer over CSS overrides:
plugin.bootstrap_package.settings.scss.primary: '#585961'
plugin.bootstrap_package.settings.scss.secondary: '#2f99a4'
plugin.bootstrap_package.settings.scss.link-decoration: 'none'
plugin.bootstrap_package.settings.scss.min-contrast-ratio: '3'Check BS5 _variables.scss for available !default variables.
Per-Page Behavior
Replace per-page sys_templates with TypoScript conditions: [traverse(page, "uid") == 99].
Phase 4: BS Package v12-v16 / BS4-BS5
Color contrast: min-contrast-ratio: 4.5 (BS5 default) changes text colors vs v11. Set to 3 to restore v11 behavior.
Cards in colored frames inherit white text (invisible on white bg). Fix with CSS custom properties:
.frame-background-secondary .card {
--frame-color: var(--bs-body-color);
}Navigation: split <a> into <a class="nav-link-main"> + <button class="nav-link-toggle"> (accessibility). Hover dropdowns removed — restore with :hover > .dropdown-menu { display: block } scoped to nav-style-simple/mega.
Scroll flicker (#1468): sticky navbar transition changes document height. Fix with margin-bottom compensation (default-height minus transition-height).
Accept: split nav link/button, data-bs-*, 3 skip links, individual JS/CSS, frame-height-default class.
Phase 5: Review
Compare old/new sites with curl (HTTP status, content element IDs, frame classes, _processed_ count). Categorize differences as MIGRATION GAP (fix), BS5 CHANGE (accept), or CSS OVERRIDE (document why).
DB fixes: carousel autoplay (BS Package v16 defaults off) via pi_flexform UPDATE.
Phase 6: v14 post-upgrade
- #109585 wizard (if instance ever ran v14.2): Install Tool → Upgrade Wizards
- `composer.json` required in classic mode (#108310)
- HMAC rotation SHA1 → SHA256 (#106307)
- Camino theme optional (v14.1+, #108539)
See references/v13-to-v14-project-upgrade.md.
Common Mistakes
| Mistake | Fix |
|---|---|
| CSS hacks instead of SCSS variables | Override via plugin.bootstrap_package.settings.scss.* |
| Partial sys_template cleanup | DELETE FROM sys_template (all columns matter) |
| Missing ImageMagick in Docker | 10-30x image file sizes |
| Fighting BS5 accessibility | Accept split nav, skip links, semantic HTML |
| position:fixed for scroll flicker | Use margin-bottom compensation |
# Checkpoints for typo3-project-upgrade skill
# Validates TYPO3 project upgrade completeness and correctness
version: 1
skill_id: typo3-project-upgrade
mechanical:
# === SITE SET CHECKS ===
- id: TPU-01
type: command
target: "find . -path '*/Configuration/Sets/*/config.yaml' | head -1 | grep -q ."
severity: error
desc: "Project must have at least one Site Set (Configuration/Sets/*/config.yaml)"
- id: TPU-02
type: command
target: "find config/sites -name 'config.yaml' -exec grep -l 'dependencies' {} \\;"
severity: error
desc: "Site configuration must reference site set via dependencies"
- id: TPU-03
type: not_contains
target: config/sites/*/config.yaml
pattern: "include_static_file"
severity: error
desc: "Site config must not use include_static_file (replaced by site set dependencies)"
# === SYS_TEMPLATE CLEANUP ===
- id: TPU-04
type: command
target: "grep -rq 'DELETE FROM sys_template' docker/ || grep -rq 'TRUNCATE.*sys_template' docker/"
severity: warning
desc: "Docker entrypoint should clean up legacy sys_template records"
# === IMAGE PROCESSING ===
- id: TPU-05
type: command
target: "grep -rq 'imagemagick\\|ImageMagick\\|graphicsmagick' docker/ Dockerfile* 2>/dev/null"
severity: error
desc: "Docker image must include ImageMagick or GraphicsMagick for image processing"
- id: TPU-06
type: command
target: "grep -rq 'processor.*ImageMagick\\|processor.*GraphicsMagick' docker/ config/ 2>/dev/null"
severity: warning
desc: "GFX processor should be configured in settings.php or entrypoint"
# === SCSS OVER CSS ===
- id: TPU-07
type: command
target: "! grep -rq '!important' packages/*/Configuration/Sets/*/setup.typoscript 2>/dev/null || test $? -eq 1"
severity: info
desc: "Prefer SCSS variables over CSS !important overrides in setup.typoscript"
# === BOOTSTRAP PACKAGE DEPENDENCIES ===
- id: TPU-08
type: command
target: "find . -path '*/Configuration/Sets/*/config.yaml' -exec grep -l 'bootstrap-package' {} \\;"
severity: warning
desc: "Site set should declare bootstrap-package dependency"
# === COMPOSER DEPENDENCIES MATCH SITE SET ===
- id: TPU-09
type: file_exists
target: composer.json
severity: error
desc: "Project must have composer.json"
llm_reviews:
# === SITE SET COMPLETENESS ===
- id: TPU-20
domain: code-quality
prompt: |
Check if the site set configuration is complete:
1. Does config.yaml list all required dependencies?
2. Does settings.yaml override colors/branding via SCSS variables?
3. Does setup.typoscript exist for custom TypoScript?
4. Are CSS overrides in setup.typoscript documented with WHY comments?
5. Are there any CSS !important rules that could be SCSS variables instead?
severity: warning
desc: "Site set configuration should be complete and prefer SCSS over CSS"
# === BS4→BS5 MIGRATION ===
- id: TPU-21
domain: code-quality
prompt: |
Check for incomplete Bootstrap 4→5 migration:
1. Are there any data-toggle attributes (should be data-bs-toggle)?
2. Are there references to deprecated BS4 classes?
3. Is color-contrast()/min-contrast-ratio handled for custom colors?
4. Are cards inside colored frames handled (custom property inheritance)?
5. Are link-decoration and link-hover-decoration set via SCSS if needed?
severity: warning
desc: "Bootstrap 4 to 5 migration should be complete"
# === NAVIGATION MIGRATION ===
- id: TPU-22
domain: code-quality
prompt: |
Check navigation migration completeness:
1. Is navbar-default-transition used appropriately (homepage vs inner pages)?
2. Are dropdown hover rules scoped to nav-style-simple/nav-style-mega only?
3. Is sticky header scroll flicker addressed (margin-bottom compensation)?
4. Are inner pages handled for transparent→opaque navbar transition?
severity: warning
desc: "Navigation should be properly migrated for BS Package v16"
# === INFRASTRUCTURE ===
- id: TPU-23
domain: repo-health
prompt: |
Check Docker/infrastructure completeness:
1. Is ImageMagick installed in the Docker image?
2. Is GFX configured in TYPO3 settings?
3. Are sys_template records cleaned up on first boot?
4. Is the sys_template DELETE comprehensive (not just config column)?
5. Are processed files cleared after adding ImageMagick?
6. Does CI validate the site actually responds with 200?
severity: error
desc: "Docker infrastructure should support full TYPO3 functionality"
[
{
"name": "site_set_structure",
"prompt": "I need to create a site set for my TYPO3 v13 project that uses Bootstrap Package. The site is called 'acme-website'. What files do I need and what goes in config.yaml?",
"assertions": [
{
"type": "content",
"pattern": "Configuration/Sets"
},
{
"type": "content",
"pattern": "config\\.yaml"
},
{
"type": "content",
"pattern": "bootstrap-package"
},
{
"type": "content",
"pattern": "dependencies"
}
]
},
{
"name": "sys_template_cleanup",
"prompt": "After migrating to site sets in TYPO3 v13, I still get 'No page configured for type=0'. What's wrong?",
"assertions": [
{
"type": "content",
"pattern": "sys_template"
},
{
"type": "content",
"pattern": "include_static_file"
},
{
"type": "content",
"pattern": "(DELETE|delete|remove)"
}
]
},
{
"name": "imagemagick_docker",
"prompt": "My TYPO3 v14 site in Docker serves huge unprocessed images. All images are full-size originals. What's missing?",
"assertions": [
{
"type": "content",
"pattern": "(ImageMagick|imagemagick|GraphicsMagick)"
},
{
"type": "content",
"pattern": "(Dockerfile|Docker|apk add|apt-get)"
},
{
"type": "content",
"pattern": "(processor|GFX|processor_path)"
}
]
},
{
"name": "scss_variables_over_css",
"prompt": "I need to change the primary color to #585961 and secondary to #2f99a4 in my TYPO3 v14 Bootstrap Package site. Should I use CSS overrides?",
"assertions": [
{
"type": "content",
"pattern": "plugin\\.bootstrap_package\\.settings\\.scss"
},
{
"type": "content",
"pattern": "settings\\.yaml"
},
{
"type": "content",
"pattern": "primary"
}
]
},
{
"name": "bs4_to_bs5_data_attributes",
"prompt": "After upgrading from TYPO3 v11 to v14, my dropdown menus and carousels stopped working. What changed?",
"assertions": [
{
"type": "content",
"pattern": "data-bs-"
},
{
"type": "content",
"pattern": "(Bootstrap 5|BS5|BS4)"
}
]
},
{
"name": "navbar_scroll_flicker",
"prompt": "My TYPO3 v14 site's sticky navbar flickers on scroll - it keeps switching between collapsed and expanded states. How do I fix this?",
"assertions": [
{
"type": "content",
"pattern": "margin-bottom"
},
{
"type": "content",
"pattern": "(sticky|transition|height)"
}
]
},
{
"name": "hover_dropdowns_restoration",
"prompt": "In our old TYPO3 v11 site, navigation dropdowns opened on hover. After upgrading to v14 with Bootstrap Package v16, they only open on click. How to restore hover behavior?",
"assertions": [
{
"type": "content",
"pattern": "(hover|:hover)"
},
{
"type": "content",
"pattern": "(dropdown-menu|nav-item)"
},
{
"type": "content",
"pattern": "(display:\\s*block|display: block)"
}
]
},
{
"name": "settings_yaml_constants_mapping",
"prompt": "I'm migrating from TYPO3 v11 to v14. My old TypoScript constants had page.logo.file, page.theme.navigation.style, and page.theme.breadcrumb.enable. Where do these go now?",
"assertions": [
{
"type": "content",
"pattern": "settings\\.yaml"
},
{
"type": "content",
"pattern": "page\\.logo\\.file"
},
{
"type": "content",
"pattern": "(site set|Site Set)"
}
]
},
{
"name": "per_page_typoscript_conditions",
"prompt": "In TYPO3 v11, I had different sys_template records per page for different layouts. How do I handle per-page behavior in v14 with site sets?",
"assertions": [
{
"type": "content",
"pattern": "(traverse|condition|\\[traverse)"
},
{
"type": "content",
"pattern": "(TypoScript|typoscript)"
}
]
},
{
"name": "cards_in_colored_frames",
"prompt": "After upgrading to Bootstrap Package v16, text inside cards that are within colored background frames is invisible (white text on white card background). How do I fix this?",
"assertions": [
{
"type": "content",
"pattern": "(frame-background|--frame-color|color-contrast)"
},
{
"type": "content",
"pattern": "(card|--bs-body-color)"
}
]
},
{
"name": "min_contrast_ratio",
"prompt": "My TYPO3 v14 site's colored frames show different text colors than the old v11 site. The old site had white text on teal backgrounds but now it's black.",
"assertions": [
{
"type": "content",
"pattern": "min-contrast-ratio"
},
{
"type": "content",
"pattern": "(color-contrast|4\\.5|3)"
}
]
},
{
"name": "processed_files_cleanup",
"prompt": "I just added ImageMagick to my TYPO3 Docker container but images still look wrong. Some show old v11 processed versions.",
"assertions": [
{
"type": "content",
"pattern": "sys_file_processedfile"
},
{
"type": "content",
"pattern": "_processed_"
},
{
"type": "content",
"pattern": "(TRUNCATE|cache:flush|rm)"
}
]
},
{
"name": "site_config_dependencies",
"prompt": "I created a site set but TYPO3 v13 doesn't load my TypoScript. The config.yaml and setup.typoscript are in the right place. What am I missing?",
"assertions": [
{
"type": "content",
"pattern": "config/sites"
},
{
"type": "content",
"pattern": "dependencies"
}
]
},
{
"name": "upgrade_inventory_phase",
"prompt": "I'm about to upgrade a TYPO3 v11 project to v14. What should I inventory before starting?",
"assertions": [
{
"type": "content",
"pattern": "sys_template"
},
{
"type": "content",
"pattern": "(content element|tt_content|CType)"
},
{
"type": "content",
"pattern": "(extension|ext)"
}
]
},
{
"name": "visual_comparison_methodology",
"prompt": "How do I systematically compare my old TYPO3 v11 site with the new v14 site to find migration gaps?",
"assertions": [
{
"type": "content",
"pattern": "(curl|HTTP|http_code|status)"
},
{
"type": "content",
"pattern": "(compare|comparison|diff)"
}
]
},
{
"name": "link_decoration_scss",
"prompt": "After the Bootstrap Package v16 upgrade, all my links have underlines that weren't there before. How do I remove them without CSS !important?",
"assertions": [
{
"type": "content",
"pattern": "link-decoration"
},
{
"type": "content",
"pattern": "(scss|SCSS|settings\\.yaml)"
},
{
"type": "content",
"pattern": "none"
}
]
},
{
"name": "carousel_autoplay_database",
"prompt": "Our carousel content elements stopped auto-playing after the TYPO3 v14 upgrade. Bootstrap Package v16 seems to default to no autoplay.",
"assertions": [
{
"type": "content",
"pattern": "(autoplay|pi_flexform)"
},
{
"type": "content",
"pattern": "(UPDATE|tt_content|SQL)"
}
]
},
{
"name": "navigation_split_button",
"prompt": "After upgrading to Bootstrap Package v16, my navigation CSS targeting .nav-link.dropdown-toggle no longer works. What changed in the nav markup?",
"assertions": [
{
"type": "content",
"pattern": "(nav-link-main|nav-link-toggle|split)"
},
{
"type": "content",
"pattern": "(accessibility|button)"
}
]
},
{
"name": "rss_feed_page_migration",
"prompt": "In TYPO3 v11 I had a special sys_template on page 99 that made it output RSS XML instead of HTML. How do I migrate this to v14 site sets?",
"assertions": [
{
"type": "content",
"pattern": "(traverse|condition|\\[traverse)"
},
{
"type": "content",
"pattern": "(Content-Type|rss|xml|additionalHeaders)"
}
]
},
{
"name": "categorize_differences",
"prompt": "I found 15 visual differences between my old v11 and new v14 TYPO3 sites. How should I categorize and prioritize them?",
"assertions": [
{
"type": "content",
"pattern": "(MIGRATION GAP|migration gap)"
},
{
"type": "content",
"pattern": "(BS5 CHANGE|BS5 change|accept)"
},
{
"type": "content",
"pattern": "(CSS OVERRIDE|override)"
}
]
}
]
TYPO3 v13 → v14.3 LTS — Project (Instance) Upgrade Playbook
Release: v14.3 LTS, 2026-04-21. Free support: bugfix until 2027-12-31, security until 2029-06-30.
Scope: deployed instance migration — site config, TypoScript, templates, Docker, DB. For extension code migration, see typo3-extension-upgrade skill.
Landing page with the full v14 reference: <https://netresearch.github.io/typo3-conformance-skill/>
---
0. Preflight
- PHP: 8.2 floor, 8.5 ceiling. If host runtime is < 8.2, bump the base image first.
- Database: MariaDB ≥ 10.4.3, MySQL ≥ 8.0.17, PostgreSQL ≥ 10, SQLite ≥ 3.8.3.
- Composer: ≥ 2.1.
- Disk: tear-down and rebuild
_processed_/after upgrade; budget a few GB free. - Snapshot the instance (DB +
fileadmin/+ config) before proceeding.
1. Docker / infrastructure bumps
| Component | v13 → v14 |
|---|---|
| PHP runtime image | bump to PHP 8.2+ (recommend 8.4) |
| ImageMagick | still required — re-verify in new image |
| OS base (Alpine/Debian) | refresh to current security release |
| nginx/Apache | no v14-specific changes |
If you use Netresearch's support-typo3-14-t3re runtime image, rebuild it against the 14.3 release.
2. composer upgrade
# Bump the core constraint
composer require --no-update typo3/cms-core:^14.3
composer update -W --with-all-dependencies- v14 requires a
composer.jsonin classic mode (#108310). Composer projects already have one. ext_emconf.phpis deprecated for extension metadata (#108345) — not your concern here, but any local extension with onlyext_emconf.phpshould be flagged to the extension team.
3. Site Sets (v13+ — unchanged in v14)
If the v13 site already uses Site Sets, no changes needed. Site configurations are now included in site:show import/export (Feature #109340 lands in v14.2). Route enhancers can now ship inside Site Sets (Feature #107837 in v14.1).
4. Install Tool / setup
- `typo3/install.php` removed — integrated into backend routing (#107536). Existing bookmarks pointing at
/typo3/install.phpneed updating to the new backend path. BC is maintained via redirect for most setups. - `install:password:set` CLI (Feature #104058) — unattended install admin password rotation.
5. Post-upgrade security wizards
Important #109585 — serialized credential data
Applies to any site that ran v14.2 (at any point). Password changes during v14.2 runtime may have persisted serialized plaintext into be_users.uc / user_settings.
- Install Tool → Upgrade → Upgrade Wizards
- Wizard auto-appears when applicable
- It unserializes, strips password fields, re-serializes
Skip: sites upgrading v13 → v14.3 directly.
HMAC rotation (#106307)
HMAC algorithm strengthened SHA1 → SHA256 family. Invalidates any HMACs persisted before the upgrade:
- One-time tokens (e.g. password-reset tokens, form tokens)
- Signed serialized payloads in custom extensions
Action: force regeneration at next use (or flush proactively if safe).
6. Frontend theme migration (optional)
v14.1 introduced Camino as a self-contained default theme (#108539). Four color schemes, configurable nav/footer. Alternative to bootstrap-package:
- Opt-in per site: add Camino dependency in
Configuration/Sites/<id>/config.yaml. - Camino will move to TER / Packagist in v15, not bundled with core forever.
- Existing bootstrap-package sites stay on bootstrap-package (no forced migration).
7. Backend UI changes (operator awareness)
- Redesigned DocHeader (breadcrumb + unified lang selector).
- Modal migrated to native
<dialog>(#107443) — accessibility improvement. - Bookmark manager replaces shortcuts (#108796).
- QR Code module (#107756) and Short URL module (#108826) via redirect system.
- Bootstrap Modal → native dialog breaks any custom JS that invoked
Modal.advanced— verify extension vendors. - Dark/Light mode in CKEditor RTE enabled by default (#106964).
8. TypoScript cleanups (deprecations → removals)
Removed in v14.0 (fix before cutover):
<INCLUDE_TYPOSCRIPT: ...>→@importTypoScript condition getTSFE()removed (#107473)config.tx_extbase.persistence.updateReferenceIndex(#106041) — remove- TSconfig
options.pageTree.backgroundColor— use CSS custom properties $GLOBALS['TYPO3_CONF_VARS']['BE']['defaultPageTSconfig']+defaultUserTSconfig— use site-level TSconfig- Plugin subtypes:
tt_content.list_typeis gone,list_typeplugin registrations must become CType-only
New opt-in required:
- TypoScript/TSconfig callables (
userFunc) require explicit allow-listing (#108054)
9. v15-preparation (fix in v14 cycle before v15)
ext_tables.php deprecated in v14.3 (#109438). Even for project-level configurations that live in a "sitepackage" extension, split ext_tables.php into:
Configuration/Backend/Modules.phpConfiguration/Backend/Routes.phpext_localconf.php(ExtensionManagementUtility::addUserSetting()— the Setup module API, not a TCA override)Configuration/TCA/Overrides/pages.php(allowedRecordTypes)
10. Smoke tests after cutover
# FE render
curl -si https://site/ | head -5
# BE login
curl -si https://site/typo3/ | head -5
# Processed images exist
ls public/fileadmin/_processed_/ | wc -l
# No deprecations in log
grep -ic deprecat var/log/typo3_*.log
# DB: no leftover sys_template root=1 records
ddev mysql -e "SELECT uid, pid, title FROM sys_template WHERE root=1 AND deleted=0" # or: mysql -u${DB_USER} -p${DB_PASSWORD} ${DB_NAME} -e '...'11. LTS support window (operational)
| Version | Bugfix end | Security end |
|---|---|---|
| v14.3 LTS (today's cutover target) | 2027-12-31 | 2029-06-30 |
| v13 LTS | 2027-10-31 (approx.) | +ELTS |
| v12 LTS | 2026-04-30 (imminent) | +ELTS |
| v11.5 | 2024-10 (ended) | +ELTS 2028-10-31 |
Do not upgrade a production site to v14.0/14.1/14.2 in the sprint window — those releases lost support when 14.3 shipped.
---