PHPackages                             konradmichalik/typo3-file-sync - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [File &amp; Storage](/categories/file-storage)
4. /
5. konradmichalik/typo3-file-sync

ActiveTypo3-cms-extension[File &amp; Storage](/categories/file-storage)

konradmichalik/typo3-file-sync
==============================

File Sync - Synchronizes missing files between TYPO3 instances using configurable resource handlers.

0.1.1(2mo ago)0347↓42.9%GPL-2.0-or-laterPHPPHP ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0CI passing

Since Mar 9Pushed 1mo agoCompare

[ Source](https://github.com/konradmichalik/typo3-file-sync)[ Packagist](https://packagist.org/packages/konradmichalik/typo3-file-sync)[ RSS](/packages/konradmichalik-typo3-file-sync/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (2)Dependencies (12)Versions (4)Used By (0)

[![Extension icon](Resources/Public/Icons/Extension.svg)](Resources/Public/Icons/Extension.svg)TYPO3 extension `typo3_file_sync`
=================================

[](#typo3-extension-typo3_file_sync)

[![Supported TYPO3 versions](https://camo.githubusercontent.com/aae6240b5541ad24495e2764fa8e178c1f72f3134693cd5f02cefa856fde0fea/68747470733a2f2f7479706f332d6261646765732e6465762f62616467652f7479706f335f66696c655f73796e632f7479706f332f736869656c64732e737667)](https://extensions.typo3.org/extension/typo3_file_sync)[![CGL](https://camo.githubusercontent.com/54b1f79494c5124093b4179dab1134e054cc3f1bab6dbb424403a78018e151b9/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f6b6f6e7261646d696368616c696b2f7479706f332d66696c652d73796e632f63676c2e796d6c3f6c6162656c3d63676c266c6f676f3d676974687562)](https://github.com/konradmichalik/typo3-file-sync/actions/workflows/cgl.yml)[![Tests](https://camo.githubusercontent.com/43ac97186cd24720037176a89dc33550c3c674957c1bcb56e350e247d535cc59/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f6b6f6e7261646d696368616c696b2f7479706f332d66696c652d73796e632f74657374732e796d6c3f6c6162656c3d7465737473266c6f676f3d676974687562)](https://github.com/konradmichalik/typo3-file-sync/actions/workflows/tests.yml)[![License](https://camo.githubusercontent.com/662cd07cbcf8b1d055dd2759fa15be602660a76392c8e8428911b525ac6bada4/68747470733a2f2f706f7365722e707567782e6f72672f6b6f6e7261646d696368616c696b2f7479706f332d66696c652d73796e632f6c6963656e7365)](LICENSE)

A lightweight TYPO3 extension that synchronizes missing files on demand — either by fetching them from a remote instance or by generating local placeholder images. Inspired by [filefill](https://github.com/IchHabRecht/filefill), this is a leaner reimplementation with TYPO3 v13 + v14 support and self-contained placeholder generation without external service dependencies.

Note

Multiple resource handlers can be chained per storage. They are processed in order until one successfully delivers the file.

🔥 Installation
--------------

[](#-installation)

### Requirements

[](#requirements)

- TYPO3 &gt;= 13.4
- PHP 8.2+
- PHP extension `ext-gd` (for placeholder image generation)

### Composer

[](#composer)

[![Packagist](https://camo.githubusercontent.com/10ac55aef63f980e4ef41f0a17ce660b08cc06a804c8774ba20b4d0912179428/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f6b6f6e7261646d696368616c696b2f7479706f332d66696c652d73796e633f6c6162656c3d76657273696f6e266c6f676f3d7061636b6167697374)](https://packagist.org/packages/konradmichalik/typo3-file-sync)

```
composer require konradmichalik/typo3-file-sync
```

### Setup

[](#setup)

```
vendor/bin/typo3 extension:setup --extension=typo3_file_sync
```

⚙️ Configuration
----------------

[](#️-configuration)

File Sync can be configured in two ways: via the **TYPO3 backend** (per storage) or via **PHP configuration** (e.g. in `ext_localconf.php` or `additional.php`).

### Backend

[](#backend)

1. Go to the **List** module and edit a **File Storage** record
2. Enable **File Sync** and configure the resource handlers

### PHP

[](#php)

```
$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['typo3_file_sync']['storages'][1] = [
    [
        'identifier' => 'remote_instance',
        'configuration' => 'https://production.example.com',
    ],
    [
        'identifier' => 'placeholder_image',
        'configuration' => '#CCCCCC, #969696',
    ],
];
```

The array key (`1`) is the UID of the file storage.

✨ Resource Handlers
-------------------

[](#-resource-handlers)

### Remote Instance

[](#remote-instance)

Fetches missing files from a remote TYPO3 instance via HTTP(S). A `HEAD` request checks existence before downloading; the file path is appended to the configured base URL.

```
'identifier' => 'remote_instance',
'configuration' => 'https://production.example.com',
```

#### Basic Auth

[](#basic-auth)

If the remote instance is protected by `.htaccess` or similar, credentials can be included in the URL:

```
https://user:password@production.example.com

```

For environment variable support (works in both backend and PHP configuration), use `%env()%` placeholders:

```
https://%env(REMOTE_USER)%:%env(REMOTE_PASS)%@production.example.com

```

### Placeholder Image

[](#placeholder-image)

Generates local placeholder images with configurable colors. Supports GD-based formats (`jpg`, `png`, `gif`, `webp`, `avif`) and `svg`.

```
'identifier' => 'placeholder_image',
'configuration' => '#CCCCCC, #969696', // backgroundColor, textColor
```

The generated image displays the original file dimensions as a text overlay (e.g. `1920 x 1080`).

Tip

Chain both handlers to get real assets from production when available, falling back to a placeholder when they are not.

💡 CLI Commands
--------------

[](#-cli-commands)

### Reset missing-file flags

[](#reset-missing-file-flags)

Resets the `missing` flag on `sys_file` records for all enabled storages or a specific one:

```
vendor/bin/typo3 file-sync:reset
vendor/bin/typo3 file-sync:reset --storage=1
```

### Delete synced files

[](#delete-synced-files)

Removes files previously fetched by File Sync, optionally filtered by handler or storage:

```
vendor/bin/typo3 file-sync:delete --all
vendor/bin/typo3 file-sync:delete --identifier=remote_instance
vendor/bin/typo3 file-sync:delete --identifier=remote_instance --storage=1
```

Warning

`file-sync:delete --all` permanently removes all files that were fetched by any handler. Run `file-sync:reset` afterwards to allow them to be re-synced on next access.

🧩 Custom Resource Handlers
--------------------------

[](#-custom-resource-handlers)

Register a custom handler in your `ext_localconf.php`:

```
$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['typo3_file_sync']['resourceHandler']['my_handler'] = [
    'title' => 'LLL:EXT:my_extension/Resources/Private/Language/locallang.xlf:my_handler',
    'config' => [
        'label' => 'LLL:EXT:my_extension/Resources/Private/Language/locallang.xlf:my_handler.config',
        'config' => [
            'type' => 'input',
        ],
    ],
    'handler' => \Vendor\MyExtension\Resource\Handler\MyHandler::class,
];
```

The handler class must implement `RemoteResourceInterface`:

```
use KonradMichalik\Typo3FileSync\Resource\RemoteResourceInterface;
use TYPO3\CMS\Core\Resource\FileInterface;

class MyHandler implements RemoteResourceInterface
{
    public function __construct(array|string|null $configuration) {}

    public function hasFile(string $fileIdentifier, string $filePath, ?FileInterface $fileObject = null): bool
    {
        // Return true when this handler can provide the file
    }

    public function getFile(string $fileIdentifier, string $filePath, ?FileInterface $fileObject = null): string|false
    {
        // Return file content as string, or false if unavailable
    }
}
```

🧑‍💻 Contributing
----------------

[](#‍-contributing)

Please have a look at [`CONTRIBUTING.md`](CONTRIBUTING.md).

📜 License
---------

[](#-license)

This project is licensed under [GNU General Public License 2.0 (or later)](LICENSE).

###  Health Score

41

—

FairBetter than 89% of packages

Maintenance88

Actively maintained with recent releases

Popularity17

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity43

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~0 days

Total

2

Last Release

64d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/11557705846f24da32a0e6e75c460db505c1b847f081ddaa3d27f3ea27f4097b?d=identicon)[konradmichalik](/maintainers/konradmichalik)

---

Top Contributors

[![konradmichalik](https://avatars.githubusercontent.com/u/4558190?v=4)](https://github.com/konradmichalik "konradmichalik (66 commits)")

---

Tags

typo3typo3-extension

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/konradmichalik-typo3-file-sync/health.svg)

```
[![Health](https://phpackages.com/badges/konradmichalik-typo3-file-sync/health.svg)](https://phpackages.com/packages/konradmichalik-typo3-file-sync)
```

###  Alternatives

[sylius/sylius

E-Commerce platform for PHP, based on Symfony framework.

8.4k5.6M651](/packages/sylius-sylius)[shopware/platform

The Shopware e-commerce core

3.3k1.5M3](/packages/shopware-platform)[shopware/core

Shopware platform is the core for all Shopware ecommerce products.

595.2M386](/packages/shopware-core)[eliashaeussler/typo3-warming

Warming - Warms up Frontend caches based on an XML sitemap. Cache warmup can be triggered via TYPO3 backend or using a console command. Supports multiple languages and custom crawler implementations.

20229.9k](/packages/eliashaeussler-typo3-warming)[drupal/core-recommended

Locked core dependencies; require this project INSTEAD OF drupal/core.

6939.5M343](/packages/drupal-core-recommended)[aedart/athenaeum

Athenaeum is a mono repository; a collection of various PHP packages

245.2k](/packages/aedart-athenaeum)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
