Create an extension

For an extension to be installable in TYPO3 it needs a file called composer.json. You can read more about this file here: composer.json.

A minimal composer.json to get the extension up and running could look like this:

    "name": "ttn/tea",
    "description": "TYPO3 example extension for unit testing and best practices",
    "type": "typo3-cms-extension",
    "authors": [
            "name": "Oliver Klee",
            "email": "",
            "homepage": "",
            "role": "developer"
    "homepage": "",
    "support": {
        "issues": "",
        "source": "",
        "docs": ""
    "require": {
        "php": "~7.4.0 || ~8.0.0 || ~8.1.0",
        "psr/http-message": "^1.0.1",
        "typo3/cms-core": "^11.5.4 || ^12.0",
        "typo3/cms-extbase": "^11.5.4 || ^12.0",
        "typo3/cms-fluid": "^11.5.4 || ^12.0",
        "typo3/cms-frontend": "^11.5.4 || ^12.0"
    "prefer-stable": true,
    "autoload": {
        "psr-4": {
            "TTN\\Tea\\": "Classes/"
    "extra": {
        "typo3/cms": {
            "extension-key": "tea"


If the extension should also be available for legacy installations it also needs a file called ext_emconf.php. This file contains roughly the same information in a different format. Have a look at the tab "Legacy" above.

With just the composer.json present (and for legacy installations additionally ext_emconf.php) you would be able to install the extension but it would not do anything.

Though not required it is considered best practice for an extension to have an icon. This icon should have the format .svg or .png and has to be located at EXT:tea/Resources/Public/Icons/Extension.svg.

Install the extension locally

See Extension installation.