---
title: "Custom Extension Repository"
manual: "TYPO3 Explained"
version: "11.5"
permalink: "https://docs.typo3.org/permalink/t3coreapi:custom-extension-repository@11.5"
source: "ExtensionArchitecture/HowTo/CustomExtensionRepository.rst"
rendered: "2026-10-21T15:30:00+00:00"
---

> [!WARNING]
> **Attention**
>
> TYPO3 v11 has reached end-of-life as of October 31th 2024 and
> is no longer being maintained. Use the version switcher on the top
> left of this page to select documentation for a supported version of TYPO3.
>
> Need more time before upgrading?
> You can purchase Extended Long Term Support (ELTS) for TYPO3 v11 here:
> [TYPO3 ELTS](https://typo3.com/services/extended-support-elts).

# Custom Extension Repository {#custom-extension-repository}

> [!NOTE]
> This section is only relevant for Legacy installations,
> as Composer Mode installations use the download functionality
> of Composer.

TYPO3 provides functionality that connects to a different repository type
than the "official" [TER](https://extensions.typo3.org/) (TYPO3 Extension Repository) to download third-party extensions.
The API is called "Extension Remotes". These remotes are adapters that allow
fetching a list of extensions via the `ListableRemoteInterface` or downloading
an extension via the `ExtensionDownloaderRemoteInterface`.

It is possible to add new remotes, disable registered remotes
or change the default remote.

Custom remote configuration can be added in the
`Configuration/Services.yaml` of the corresponding extension.

```yaml
extension.remote.myremote:
  class: 'TYPO3\CMS\Extensionmanager\Remote\TerExtensionRemote'
  arguments:
    $identifier: 'myremote'
    $options:
       remoteBase: 'https://my_own_remote/'
  tags:
    - name: 'extension.remote'
      default: true
```

Using `default: true`, "myremote" will be used as the default remote.
Setting `default: true` only works if the defined service
implements `ListableRemoteInterface`.

Please note that `\Vendor\SitePackage\Remote\MyRemote` must implement
`ExtensionDownloaderRemoteInterface` to be registered as remote.

To disable an already registered remote, `enabled: false` can be set.

```yaml
extension.remote.ter:
  tags:
    - name: 'extension.remote'
      enabled: false
```
