Contexts Extension 

Extension key

contexts

Package name

netresearch/contexts

Version

main

Language

en

Author

Netresearch DTT GmbH

License

This document is published under the Creative Commons BY 4.0 license.

Rendered

Sun, 01 Mar 2026 00:07:06 +0000


Multi-channel content visibility for TYPO3. Define contexts based on various conditions (IP address, domain, query parameters, HTTP headers, sessions, etc.) and control content visibility across your entire TYPO3 installation.

New in version 4.0.0

TYPO3 12.4/13.4 LTS support, PHP 8.2+ requirement, PSR-14 events.


Introduction 

Learn what the Contexts extension does and how it enables multi-channel content delivery in TYPO3.

Installation 

Install and configure the extension for TYPO3 12.4 or 13.4 LTS.

Configuration 

Configure contexts and assign them to pages and content elements.

Context Types 

Explore the built-in context types: IP, Domain, Query Parameter, HTTP Header, Session, and Combination contexts.

Developer Guide 

Integrate contexts in Fluid templates, TypoScript conditions, and PHP code using the public API.

Migration 

Upgrade guide from previous versions to 4.x.


Credits

Developed and maintained by Netresearch DTT GmbH.

Introduction 

What does it do? 

The Contexts extension provides a flexible system for defining contextual conditions that control content visibility throughout your TYPO3 installation.

Instead of duplicating pages for different scenarios (mobile vs. desktop, different countries, logged-in vs. anonymous users), you can define contexts that automatically show or hide content based on various conditions.

Key Features 

Multi-channel content management
Define contexts based on IP addresses, domains, query parameters, HTTP headers, session data, and more. Content visibility is automatically controlled based on the active context.
Page and content element visibility
Apply contexts to pages, content elements, and records. Elements are automatically shown or hidden based on context matching.
Extensible architecture
Create custom context types through a clean API. The extension provides built-in types and allows easy extension for project-specific needs.
Performance optimized
Context matching is cached and optimized for production environments. Minimal overhead on page rendering.

Use Cases 

  • Geographic content: Show different content based on visitor location (IP-based)
  • Device-specific content: Different layouts for mobile/desktop (via domain or parameter)
  • A/B testing: Show different content variants based on session or cookie
  • Environment-specific: Different behavior in staging vs. production
  • User-based: Content visibility based on frontend user properties

Requirements 

  • TYPO3 v12.4 LTS or v13.4 LTS
  • PHP 8.2 or higher

Installation 

Requirements 

Extension Version TYPO3 PHP
4.x 12.4 LTS, 13.4 LTS 8.2 - 8.5
3.x 11.5 LTS 7.4 - 8.1

The recommended way to install this extension is via Composer.

Installation via Composer 

composer require netresearch/contexts
Copied!

After installation, activate the extension in the TYPO3 Extension Manager or via CLI:

vendor/bin/typo3 extension:activate contexts
Copied!

Site Set Configuration (TYPO3 v13+) 

New in version 4.0.0

Site Sets support for TYPO3 v13.

For TYPO3 v13 and later, you can include the Contexts site set in your site configuration:

  1. Go to Site Management > Sites
  2. Edit your site configuration
  3. In the Sets tab, add "Contexts - Multi-channel content visibility"

Alternatively, add it to your site's config/sites/<identifier>/config.yaml:

imports:
  - { resource: "EXT:contexts/Configuration/Sets/Contexts/config.yaml" }
Copied!

Classic TypoScript Include (TYPO3 v12+) 

For traditional TypoScript setup, include the static template:

  1. Go to Web > Template
  2. Select your root page
  3. Edit the template record
  4. In Includes, add "Contexts" to the selected items

Database Updates 

After installation, run the database analyzer to create required tables:

vendor/bin/typo3 database:updateschema
Copied!

Or use the Admin Tools > Maintenance > Analyze Database Structure module in the TYPO3 backend.

Verification 

After installation, you should see:

  1. A new "Contexts" module in the backend (under Admin Tools)
  2. "Context visibility" options in page and content element properties
  3. Database tables: tx_contexts_contexts, tx_contexts_settings

Configuration 

Site Set Settings (TYPO3 v13+) 

When using Site Sets, the extension provides configurable settings in your site configuration. Add the contexts Site Set to your site:

config/sites/<identifier>/config.yaml
imports:
  - { resource: "EXT:contexts/Configuration/Sets/Contexts/config.yaml" }

settings:
  contexts:
    debug: false
Copied!

The following settings are available:

contexts.debug

contexts.debug
type

boolean

Default

false

Enable debug output in the frontend. When enabled, an HTML comment <!-- Contexts Extension Debug Mode Active --> is added to the page header. Use in development only.

contexts.matchMode

contexts.matchMode
type

string

Default

all

How multiple contexts are evaluated when checking visibility:

  • all: All assigned contexts must match (AND logic)
  • any: At least one context must match (OR logic)

contexts.cacheLifetimeModifier

contexts.cacheLifetimeModifier
type

integer

Default

Modify cache lifetime when contexts are active (in seconds). 0 means no modification.

Page and Content Element Settings 

Context visibility is configured directly on page and content element records via the Contexts tab in the TYPO3 backend.

Each context record appears with two options:

  • Visible: yes — record is only shown when the context is active
  • Visible: no — record is hidden when the context is active

The extension adds two database columns to controlled tables:

tx_contexts_enable
Comma-separated list of context UIDs that must be active for the record to be visible.
tx_contexts_disable
Comma-separated list of context UIDs that hide the record when active.

Caching Considerations 

Context-dependent content affects page caching. The extension handles this through several mechanisms:

  1. Query restriction: The ContextRestriction class automatically adds WHERE clauses to database queries, filtering records based on active contexts.
  2. Cache hash modification: When query parameter contexts are active, the extension adds context identifiers to the page cache hash, ensuring separate cache entries per context combination.
  3. Menu filtering: Menu items are filtered based on context visibility settings, so navigation reflects the current context.

Context Types 

The extension provides several built-in context types. Each type evaluates different conditions to determine if a context is active.

IP Address Context 

Match visitors by their IP address or IP range. Supports both IPv4 and IPv6.

Configuration 

IP/Range

IP/Range
type

string

required

true

Single IP address, CIDR notation, range, or comma-separated list.

Examples:

  • Single IP: 192.168.1.100
  • CIDR notation: 10.0.0.0/8, FE80::/16
  • Range: 192.168.1.1-192.168.1.255
  • Wildcards: 80.76.201.*, 80.76.*.37
  • Multiple: 192.168.1.0/24,10.0.0.0/8

Use Cases 

  • Internal network detection (show admin tools for office IPs)
  • Geographic content (by IP geolocation with contexts_geolocation)
  • Office vs. external visitor differentiation
  • Development/staging environment detection

Domain Context 

Match based on the accessed domain name (HTTP_HOST).

Configuration 

Domain

Domain
type

string

required

true

Domain name(s) to match. One domain per line.

Matching Rules:

  • Without leading dot: Exact match only

    • www.example.org will not match example.org
  • With leading dot: Matches all subdomains

    • .example.org matches www.example.org, shop.example.org, etc.

Examples:

  • Single: www.example.com
  • Multiple (one per line):

    example.com
    www.example.com
    Copied!
  • Subdomain wildcard: .example.com

Use Cases 

  • Multi-domain setups (different content per domain)
  • Staging vs. production detection
  • Brand-specific content on shared installations
  • Language-specific domains

Query Parameter Context 

Match based on URL query parameters (GET parameters).

Configuration 

Parameter Name

Parameter Name
type

string

required

true

The GET parameter name to check.

Expected Value

Expected Value
type

string

required

false

Value to match. Supports regular expressions. If empty, any non-empty value activates the context.

Store in Session

Store in Session
type

boolean

default

false

When enabled, the context state is stored in the user session, persisting across page navigations even after the parameter is removed from the URL.

Examples:

  • ?debug=1 with parameter debug and value 1
  • ?variant=a for A/B testing
  • ?affID=partner for affiliate tracking

Use Cases 

  • A/B testing variants
  • Debug mode activation
  • Campaign and affiliate tracking
  • Feature flags via URL

HTTP Header Context 

New in version 3.0.0

HTTP Header context for matching request headers.

Match based on HTTP request headers sent by the browser or proxy.

Configuration 

Header Name

Header Name
type

string

required

true

The HTTP header name to check (case-insensitive).

Expected Value

Expected Value
type

string

required

false

Value(s) to match against the header. One value per line. Matching uses case-insensitive substring comparison: if any configured value appears anywhere in the actual header value, the context matches. If empty, any non-empty header value activates the context.

Store in Session

Store in Session
type

boolean

default

false

When enabled, the context state persists in the user session.

New in version 4.0.0

PSR-7 header support and case-insensitive substring matching.

Header Name Resolution 

The extension supports both standard HTTP header names and $_SERVER parameter keys:

  • PSR-7 header names (recommended): User-Agent, Accept-Language, X-Forwarded-For
  • $_SERVER keys (legacy): HTTP_USER_AGENT, HTTP_ACCEPT_LANGUAGE

The lookup order is:

  1. PSR-7 $request->getHeaderLine() (standard header name)
  2. $request->getServerParams() ($_SERVER key format)

Value Matching 

Values are matched using case-insensitive substring comparison. For example, with header User-Agent and configured values:

Mobile
Android
iPhone
Copied!

A User-Agent string like Mozilla/5.0 (iPhone; CPU iPhone OS) matches because it contains iPhone (case-insensitive).

Examples:

  • X-Forwarded-For for proxy detection
  • Accept-Language for language preferences
  • User-Agent for browser/device detection
  • Custom headers from CDN or load balancer

Use Cases 

  • CDN or proxy detection (X-Forwarded-For, CF-Connecting-IP)
  • Mobile device detection via User-Agent
  • Accept-Language based content
  • Custom application headers
  • Bot detection

Session Context 

Match based on frontend user session data.

Configuration 

Session Key

Session Key
type

string

required

true

Key in the session data to check.

Expected Value

Expected Value
type

string

required

false

Value to match. If empty, checks if the key exists and is not NULL.

Use Cases 

  • User state tracking
  • Shopping cart state (cart has items)
  • Login/authentication state
  • Multi-step form progress
  • User preference flags

Combination Context 

Combine multiple contexts with logical operators for complex rules.

Configuration 

Expression

Expression
type

string

required

true

Logical expression combining context aliases.

Operators:

  • && - logical AND (all must match)
  • || - logical OR (any must match)
  • ! - negation (must NOT match)
  • (...) - parentheses for grouping

Examples:

  • mobile && !tablet - Mobile but not tablet
  • internal || admin - Internal network or admin user
  • (german || austrian) && !guest - German-speaking non-guest
  • campaign_a && !already_converted - Campaign A visitors who haven't converted

Use Cases 

  • Complex multi-condition business rules
  • Nested context hierarchies
  • Exclusion rules (show to A but not if B)
  • Compound targeting (A AND B OR C)

Developer Information 

This chapter covers the technical aspects of extending and integrating with the Contexts extension.

Creating Custom Context Types 

You can create custom context types by implementing the context interface and registering your type.

Step 1: Create the Context Class 

Extend AbstractContext and implement the match() method:

Classes/Context/Type/MyCustomContext.php
<?php

declare(strict_types=1);

namespace Vendor\MyExtension\Context\Type;

use Netresearch\Contexts\Context\AbstractContext;
use Netresearch\Contexts\Context\Container;

final class MyCustomContext extends AbstractContext
{
    public function match(array $arDependencies = []): bool
    {
        $configuredValue = $this->getConfValue('myField');
        $actualValue = $this->getActualValue();

        return $this->invert($this->storeInSession(
            $configuredValue === $actualValue
        ));
    }

    private function getActualValue(): string
    {
        $request = Container::get()->getRequest();
        if ($request === null) {
            return '';
        }

        $params = $request->getQueryParams();
        return $params['myParam'] ?? '';
    }
}
Copied!

Step 2: Register the Context Type 

In your ext_localconf.php:

ext_localconf.php
<?php

use Vendor\MyExtension\Context\Type\MyCustomContext;

$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['contexts']['types']
    ['my_custom'] = [
    'class' => MyCustomContext::class,
    'label' => 'LLL:EXT:my_extension/Resources/Private/'
        . 'Language/locallang.xlf:context.my_custom',
];
Copied!

Step 3: Add TCA Configuration 

In Configuration/TCA/Overrides/tx_contexts_contexts.php:

Configuration/TCA/Overrides/tx_contexts_contexts.php
<?php

$GLOBALS['TCA']['tx_contexts_contexts']['types']
    ['my_custom'] = [
    'showitem' => 'type, title, '
        . '--palette--;;visibility, my_field',
];

\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTCAcolumns(
    'tx_contexts_contexts',
    [
        'my_field' => [
            'label' => 'My Field',
            'config' => [
                'type' => 'input',
            ],
        ],
    ]
);
Copied!

PSR-14 Event Listeners 

New in version 4.0.0

PSR-14 event listeners replace legacy SC_OPTIONS hooks.

The extension registers four PSR-14 event listeners that handle context-based behavior in the frontend and backend. These listeners are registered via PHP attributes and cannot be removed, but you can register your own listeners on the same events.

Page Access Control 

PageAccessEventListener listens to AfterPageAndLanguageIsResolvedEvent and checks whether the current page is accessible based on its context restrictions (tx_contexts_enable / tx_contexts_disable). If access is denied, it throws an ImmediateResponseException with a 403 response.

The current page is always checked for its own context restrictions. Parent pages only propagate restrictions when extendToSubpages is enabled.

Icon Overlay Modification 

IconOverlayEventListener listens to ModifyRecordOverlayIconIdentifierEvent and modifies icon overlays for records that have context-based visibility settings, providing visual feedback in the backend.

Cache Lifetime Modification 

CacheHashEventListener listens to ModifyCacheLifetimeForPageEvent and can adjust cache lifetime based on active contexts.

Architecture 

Request Lifecycle 

The ContainerInitialization PSR-15 middleware initializes context matching on every frontend request. It:

  1. Sets the PSR-7 request on the Container singleton
  2. Triggers Container::initMatching() which loads all context records from the database and runs match() on each
  3. Only matched contexts are retained in the container

This middleware runs before the page resolver, ensuring contexts are available throughout the rendering pipeline.

Query Restrictions 

The ContextRestriction class implements EnforceableQueryRestrictionInterface and automatically adds WHERE clauses to all database queries on context-controlled tables. It uses FIND_IN_SET() to check whether active context UIDs appear in the tx_contexts_enable or tx_contexts_disable columns.

This means records with context restrictions are automatically filtered in all frontend queries without additional code.

Context API 

Checking Contexts Programmatically 

The Container class provides access to all matched contexts. It uses a singleton pattern and extends ArrayObject.

<?php

declare(strict_types=1);

use Netresearch\Contexts\Context\Container;

// Get the container instance (singleton)
$container = Container::get();

// Find a specific context by alias or UID
$context = $container->find('my-context-alias');
if ($context !== null) {
    // Context exists and is active (matched)
}

// Iterate over all active (matched) contexts
foreach (Container::get() as $uid => $context) {
    echo $context->getAlias() . ' is active';
}
Copied!

Using the ContextMatcher API 

For simple matching checks, use the ContextMatcher API:

<?php

declare(strict_types=1);

use Netresearch\Contexts\Api\ContextMatcher;

if (ContextMatcher::getInstance()->matches('mobile')) {
    // Mobile context is active
}
Copied!

Configuration API 

Enable context settings on custom tables using the Configuration API:

Configuration/TCA/Overrides/my_table.php
<?php

use Netresearch\Contexts\Api\Configuration;

// Add default visibility settings (enable/disable)
Configuration::enableContextsForTable(
    'contexts',
    'my_table'
);

// With additional custom settings
Configuration::enableContextsForTable(
    'contexts',
    'my_table',
    [
        'my_setting' => [
            'label' => 'LLL:EXT:my_ext/Resources/'
                . 'Private/Language/locallang.xlf:setting',
            'flatten' => true,
            'enables' => true,
        ],
    ]
);
Copied!

This registers the tx_contexts_settings column, adds flat columns (tx_contexts_enable, tx_contexts_disable), and integrates context visibility into the record editing form.

Record API 

Check if a record is enabled for the current contexts:

<?php

declare(strict_types=1);

use Netresearch\Contexts\Api\Record;

// Check if a record is visible in current context
$row = ['uid' => 42, 'tx_contexts_enable' => '3,5'];
if (Record::isEnabled('tt_content', $row)) {
    // Record is visible
}

// Check a specific setting
if (Record::isSettingEnabled('my_table', 'my_setting', $row)) {
    // Setting is enabled for this record
}
Copied!

TypoScript Conditions 

Use the contextMatch() function in TypoScript conditions:

# Show content only when mobile context is active
[contextMatch('mobile')]
    page.10.wrap = <div class="mobile-wrapper">|</div>
[END]

# Combine with other conditions
[contextMatch('internal') && tree.level > 2]
    lib.breadcrumb.show = 1
[END]
Copied!

The contextMatch() function is provided via TYPO3's ExpressionLanguage and works in all condition contexts (TypoScript, TSconfig, etc.).

Fluid ViewHelpers 

The extension provides a ViewHelper for context matching in Fluid templates.

Register the Namespace 

Add the namespace to your Fluid template:

<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
      xmlns:contexts="http://typo3.org/ns/Netresearch/Contexts/ViewHelpers"
      data-namespace-typo3-fluid="true">
Copied!

Or use the inline namespace declaration:

{namespace contexts=Netresearch\Contexts\ViewHelpers}
Copied!

Using the Matches ViewHelper 

Check if a context is active using the matches ViewHelper:

<f:if condition="{contexts:matches(alias: 'mobile')}">
    <f:then>
        <p>Mobile context is active</p>
    </f:then>
    <f:else>
        <p>Mobile context is not active</p>
    </f:else>
</f:if>
Copied!

The ViewHelper returns 1 when the context matches and 0 otherwise, making it compatible with Fluid's condition evaluation.

Practical Examples 

Conditional rendering based on context:

<f:if condition="{contexts:matches(alias: 'internal')}">
    <div class="admin-toolbar">
        <!-- Only shown for internal network -->
    </div>
</f:if>
Copied!

Combining with other conditions:

<f:if condition="{contexts:matches(alias: 'premium')} && {user}">
    <div class="premium-content">
        <!-- Premium user content -->
    </div>
</f:if>
Copied!

Testing 

Running Tests 

Tests can be run via Composer scripts or the Docker-based runTests.sh script.

Composer scripts (local PHP required):

# Unit tests
composer ci:test:php:unit

# Functional tests (requires database)
composer ci:test:php:functional

# Static analysis
composer ci:test:php:phpstan

# Code style check
composer ci:test:php:cgl
Copied!

Docker-based (no local PHP needed):

# Unit tests (default suite)
./Build/Scripts/runTests.sh -s unit

# Unit tests with coverage
./Build/Scripts/runTests.sh -s unitCoverage

# Functional tests with SQLite
./Build/Scripts/runTests.sh -s functional -d sqlite

# PHPStan
./Build/Scripts/runTests.sh -s phpstan

# With specific PHP version
./Build/Scripts/runTests.sh -s unit -p 8.4

# Show all options
./Build/Scripts/runTests.sh -h
Copied!

The Docker-based script uses ghcr.io/typo3/core-testing-php* images and requires Docker or Podman.

Writing Tests for Custom Contexts 

<?php

declare(strict_types=1);

namespace Vendor\MyExtension\Tests\Unit\Context\Type;

use PHPUnit\Framework\Attributes\Test;
use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
use Vendor\MyExtension\Context\Type\MyCustomContext;

final class MyCustomContextTest extends UnitTestCase
{
    #[Test]
    public function matchReturnsTrueForValidCondition(): void
    {
        $context = new MyCustomContext();
        // Setup test conditions

        self::assertTrue($context->match());
    }
}
Copied!

Debugging 

Enable context debugging via the Site Set setting:

config/sites/<identifier>/config.yaml
settings:
  contexts:
    debug: true
Copied!

This adds an HTML comment to the page header indicating that debug mode is active. For detailed context matching inspection, use the TYPO3 Admin Panel or check the tx_contexts_contexts table for context configuration and the tx_contexts_enable / tx_contexts_disable columns on your records.

Migration Guide 

This guide covers migrating from previous versions of the Contexts extension.

Migrating from v3.x to v4.0 

Version 4.0 introduces significant changes for TYPO3 v12/v13 compatibility.

Breaking Changes 

PHP Version 

Before: PHP 7.4 - 8.1

After: PHP 8.2+

Update your deployment and CI pipelines accordingly.

TYPO3 Version 

Before: TYPO3 v11

After: TYPO3 v12.4 LTS and v13.4 LTS only

TYPO3 v11 and earlier are no longer supported. Use version 3.x for older TYPO3 installations.

Hook Migration 

All SC_OPTIONS hooks have been replaced with PSR-14 events.

Before (v3.x):

$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']
    ['processDatamapClass'][] = MyHook::class;
Copied!

After (v4.0):

#[AsEventListener(
    identifier: 'my-extension/datahandler',
    event: AfterDatabaseOperationsEvent::class
)]
final class MyEventListener { ... }
Copied!

Dependency Injection 

Services must now be properly configured for dependency injection.

Before: Direct instantiation or makeInstance()

After: Constructor injection via Services.yaml

services:
  Vendor\MyExtension\Service\MyService:
    public: true
Copied!

Step-by-Step Migration 

  1. Update PHP version to 8.2 or higher
  2. Update TYPO3 to v12.4 or v13.4
  3. Update extension via Composer:

    composer require netresearch/contexts:^4.0
    Copied!
  4. Run database migrations:

    vendor/bin/typo3 database:updateschema
    Copied!
  5. Clear all caches:

    vendor/bin/typo3 cache:flush
    Copied!
  6. Review custom context types - update to new interface if needed
  7. Migrate hooks to events - see Event Migration below

Event Migration Reference 

Old Hook (SC_OPTIONS) New PSR-14 Event
hook_checkEnableFields AfterPageAndLanguageIsResolvedEvent
filterMenuPages FilterMenuItemsEvent
overrideIconOverlay (IconFactory) ModifyRecordOverlayIconIdentifierEvent
createHashBase ModifyCacheLifetimeForPageEvent

Adopting Site Sets (Optional) 

TYPO3 v13 introduces Site Sets as the modern way to manage site configuration. This is optional and backward compatible.

Benefits of Site Sets 

  • Cleaner site configuration
  • Composable settings
  • Better multi-site management
  • IDE autocompletion for settings

Migration Steps 

  1. In your site configuration, add the contexts set:

    imports:
      - { resource: "EXT:contexts/Configuration/Sets/Contexts/config.yaml" }
    Copied!
  2. Configure settings in your site configuration:

    settings:
      contexts:
        debug: false
        matchMode: 'all'
    Copied!
  3. Remove any static TypoScript include (no longer needed with Site Sets)

Updating Tests 

Test code must be updated for PHPUnit 10/11/12/13 compatibility.

Annotation to Attribute Migration 

Before:

/**
 * @test
 * @dataProvider myProvider
 */
public function myTest(): void { }
Copied!

After:

use PHPUnit\Framework\Attributes\Test;
use PHPUnit\Framework\Attributes\DataProvider;

#[Test]
#[DataProvider('myProvider')]
public function myTest(): void { }
Copied!

Deprecated Methods 

The $this->at() method is removed. Use explicit mock configuration:

Before:

$mock->expects($this->at(0))->method('foo')->willReturn('a');
$mock->expects($this->at(1))->method('foo')->willReturn('b');
Copied!

After:

$mock->expects($this->exactly(2))
    ->method('foo')
    ->willReturnOnConsecutiveCalls('a', 'b');
Copied!

Troubleshooting 

Common Issues 

"Class not found" errors:

Clear all caches and ensure Composer autoload is regenerated:

composer dump-autoload
vendor/bin/typo3 cache:flush
Copied!

Context not matching:

Enable debug mode to see matching details:

$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['contexts']['debug'] = true;
Copied!

Backend module missing:

Ensure the extension is properly activated:

vendor/bin/typo3 extension:activate contexts
Copied!

Getting Help 

Changelog 

All notable changes to this project are documented here.

Version 4.0.0 

Release date: 2026-03-01

This is a major release with TYPO3 v12/v13 support and significant modernization.

Breaking Changes 

  • Dropped TYPO3 v11 support - Use version 3.x for TYPO3 v11
  • Dropped PHP 7.4/8.0/8.1 support - Minimum PHP 8.2 required
  • Removed SC_OPTIONS hooks - Migrated to PSR-14 events
  • PHPUnit 10/11/12/13 required - Test code must use new patterns

New Features 

  • TYPO3 v12.4 LTS support - Full compatibility with TYPO3 v12
  • TYPO3 v13.4 LTS support - Full compatibility with TYPO3 v13
  • Site Sets support - Modern site configuration for TYPO3 v13
  • PHP 8.2/8.3/8.4/8.5 support - Latest PHP versions supported
  • PSR-14 events - Modern event dispatching system
  • PHP 8 Attributes - Native attribute-based configuration
  • Docker-based runTests.sh - TYPO3 core testing pattern

Improvements 

  • Modernized codebase with strict types
  • Enhanced IDE support through better typing
  • Improved test coverage (target: 80%+)
  • Mutation testing - Infection with MSI > 80%
  • PHPStan level 10 compliance
  • Updated coding standards (PSR-12)

Migration 

See Migration Guide for detailed upgrade instructions.

Version 3.x 

Legacy version supporting TYPO3 v10 and v11. No longer actively developed. Use version 4.0+ for new installations.

Version 2.x 

Legacy version supporting TYPO3 v8 and v9. End of life.

Version 1.x 

Initial release for TYPO3 v6 and v7. End of life.