librepim / librepim-dev
LibrePIM - Community-Maintained Fork of Akeneo PIM Community Edition
Requires
- php: ^8.3
- ext-apcu: *
- ext-bcmath: *
- ext-curl: >=7.0
- ext-exif: *
- ext-fileinfo: *
- ext-gd: >=2.0
- ext-imagick: *
- ext-intl: *
- ext-mbstring: *
- ext-openssl: *
- ext-pcntl: *
- ext-pdo: *
- ext-xml: *
- ext-zip: *
- ass/xmlsecurity: 1.1.1
- aws/aws-sdk-php: 3.384.10
- doctrine/annotations: ^1.13.2
- doctrine/cache: ^1.12
- doctrine/collections: ^2.1.0
- doctrine/common: ^3.4.0
- doctrine/data-fixtures: ^1.6.0
- doctrine/dbal: ^3.5.0
- doctrine/doctrine-bundle: ^2.16
- doctrine/doctrine-fixtures-bundle: ^3.4.1
- doctrine/doctrine-migrations-bundle: ^3.2.2
- doctrine/event-manager: ^1.2.0
- doctrine/instantiator: ^1.5.0
- doctrine/migrations: ^3.5.0
- doctrine/orm: ^2.20
- doctrine/persistence: ^3.4
- dompdf/dompdf: 2.0.8
- elasticsearch/elasticsearch: ^8.19.0
- friendsofsymfony/jsrouting-bundle: ^3.2.1
- friendsofsymfony/rest-bundle: ^3.4.0
- gedmo/doctrine-extensions: ^3.11.0
- google/cloud-pubsub: ^1.51
- guzzlehttp/guzzle: ^7.5.0
- imagine/imagine: 1.3.3
- khaled.alshamaa/ar-php: ^6.2
- klapaudius/oauth2-php: ^1.10
- lcobucci/jwt: ^5.0
- league/flysystem: ^3.11.0
- liip/imagine-bundle: ^2.10.0
- maennchen/zipstream-php: ^2.4.0
- monolog/monolog: ^2.8.0
- ocramius/proxy-manager: ^2.13.0
- oneup/flysystem-bundle: ^4.5.0
- opensearch-project/opensearch-php: ~2.3.1
- openspout/openspout: ^4.9.0
- opis/json-schema: ^2.3
- phpseclib/phpseclib: ^3.0
- psr/event-dispatcher: ^1.0.0
- ramsey/uuid: 4.7.1
- ramsey/uuid-doctrine: ^1.8
- symfony/acl-bundle: ^2.1.0
- symfony/asset: ^6.4.0
- symfony/cache: ^6.4.0
- symfony/config: ^6.4.0
- symfony/dependency-injection: ^5.4 || ^6.0
- symfony/doctrine-messenger: ^6.4.0
- symfony/dotenv: ^6.4.0
- symfony/event-dispatcher: ^6.4.0
- symfony/filesystem: ^6.4.0
- symfony/finder: ^6.4.0
- symfony/flex: ^2.3.0
- symfony/form: ^6.4.0
- symfony/http-foundation: 6.4.*
- symfony/http-kernel: ^6.4.0
- symfony/intl: ^6.4.0
- symfony/lock: ^6.4.0
- symfony/mailer: ^6.4.0
- symfony/messenger: ^6.4.0
- symfony/monolog-bundle: ^3.8.0
- symfony/options-resolver: ^6.4.0
- symfony/password-hasher: 6.4.*
- symfony/polyfill-apcu: ^1.23.0
- symfony/process: ^6.4.0
- symfony/property-access: ^6.4.0
- symfony/proxy-manager-bridge: ^6.4.0
- symfony/requirements-checker: ^2.0.0
- symfony/routing: ^6.4.0
- symfony/security-acl: ^3.1.1
- symfony/security-bundle: ^5.4 || ^6.0
- symfony/security-core: ^6.4.0
- symfony/security-csrf: ^6.4.0
- symfony/security-http: ^6.4.0
- symfony/templating: ^6.4.0
- symfony/translation: ^6.4.0
- symfony/twig-bundle: ^5.1 || ^6.4
- symfony/validator: ^6.4.0
- symfony/yaml: ^6.4.0
- twig/twig: ^3.3.3
- webmozart/assert: ^1.11.0
Requires (Dev)
- akeneo/php-coupling-detector: ^0.8.1
- behat/mink-selenium2-driver: ^1.5.0
- blackfire/php-sdk: ^1.25
- friends-of-behat/mink: ^1.9.0
- friends-of-behat/mink-browserkit-driver: ^1.5.0
- friends-of-behat/mink-extension: ^2.5.0
- friends-of-behat/symfony-extension: ^2.4.0
- friends-of-phpspec/phpspec-code-coverage: ^6.1.0
- friendsofphp/php-cs-fixer: ^3.13.0
- league/flysystem-aws-s3-v3: ^3.10.3
- league/flysystem-memory: ^3.10.3
- liuggio/fastest: ^1.10.0
- mcustiel/phiremock: 2.1.1
- phpspec/phpspec: ^7.1.0
- phpspec/prophecy: ^1.16.0
- phpstan/phpstan: ^1.9.3
- phpstan/phpstan-deprecation-rules: ^1.1.1
- phpstan/phpstan-symfony: ^1.2.5
- phpstan/phpstan-webmozart-assert: ^1.2.0
- phpunit/phpunit: ^9.5
- rector/rector: ^0.15.0
- sensiolabs/behat-page-object-extension: ^2.3.6
- squizlabs/php_codesniffer: 3.*
- symfony/debug-bundle: ^6.4.0
- symfony/web-profiler-bundle: ^6.4.0
- vimeo/psalm: ^5.1.0
Suggests
- akeneo/catalogs: In order to install one of the Akeneo catalogs
Conflicts
Replaces
- akeneo/batch: 0.6.0-dev
- akeneo/batch-bundle: 0.6.0-dev
- akeneo/measure-bundle: 0.6.0-dev
- akeneo/storage-utils: 0.6.0-dev
- akeneo/storage-utils-bundle: 0.6.0-dev
- oro/config-bundle: 1.0-dev
- oro/filter-bundle: 1.0-dev
- oro/form-bundle: 1.0-dev
- oro/navigation-bundle: 1.0-dev
- oro/security-bundle: 1.0-dev
- oro/translation-bundle: 1.0-dev
- oro/ui-bundle: 1.0.0-alpha
- oro/user-bundle: 1.0-dev
This package is auto-updated.
Last update: 2026-07-21 16:42:48 UTC
README
β οΈ This is a community fork, not an official Akeneo project. Librepim is maintained independently to provide long-term support for Akeneo PIM Community Edition users. For details, see CONTRIBUTORS.md.
Librepim is an open-source, community-maintained fork of the Akeneo PIM Community Edition. Its goal is to provide Long-Term Support (LTS), continued improvements, security fixes, and compatibility updates for teams that rely on the community version of Akeneo for product information management.
Librepim is built on the foundation of Akeneo CE, extending its life through community contributions and modern package updates.
π Key Highlights
π Long-Term Support (LTS)
Continuous improvements, bug fixes, dependency upgrades, and security patches.
π§ Compatible Migration
Users of Akeneo PIM CE can migrate to Librepim with minimal changes.
π€ Community-Driven
Contributions are welcomeβfrom fixes and feature enhancements to documentation improvements.
β‘ Stability & Performance
Focused on maintaining a stable and secure PIM experience for real-world workloads.
π¦ Installation
Prerequisites
| Requirement | Minimum version |
|---|---|
| Docker | 24.x |
| Docker Compose | v2.x (docker compose) |
| GNU Make | 4.x |
| Git | any |
Note:
composer,php,yarn, andnodeare not required on the host β everything runs inside Docker containers.
Quick start (Docker)
# 1. Clone the repository git clone https://github.com/libre-pim/librepim-dev cd librepim-dev # 2. Configure your local environment echo "SEARCH_ENGINE=opensearch" > .env.local # 3. Install (single command β pulls images, installs deps, builds frontend, seeds DB) make dev
App will be available at: http://localhost:8080
Default credentials: admin / admin
Total install time: ~10β15 minutes (webpack build is the longest step).
What make dev does
make dependencies β composer install + yarn install
make pim-dev
βββ make up β docker compose up -d (all containers)
βββ wait_docker_up.sh β waits for MySQL + OpenSearch to be ready
βββ make cache β clear + warmup Symfony cache
βββ make assets β install Symfony bundle assets
βββ make front-packages β build TypeScript front-end packages
βββ make javascript-dev β webpack bundle (dev mode)
βββ make css β compile LESS β public/css/pim.css
βββ make javascript-extensions β update form extensions manifest
βββ make database β create DB schema + load icecat demo fixtures
Building the Docker image from source
Only needed if you want to build the PHP image locally instead of pulling from the registry:
docker build --target dev -t webkul/librepim-php-dev:master .
βοΈ Local Environment Configuration
LibrePIM ships a .env file with safe defaults. Do not edit .env directly.
Instead, create a .env.local file in the project root and override only what you need.
.env.local is gitignored and never committed.
Search Engine
Set which search backend to use:
# .env.local # Use OpenSearch (recommended for Docker setup β see docker-compose.yml) SEARCH_ENGINE=opensearch APP_INDEX_HOSTS=elasticsearch:9200 # Or use Elasticsearch 8 # SEARCH_ENGINE=elasticsearch # APP_INDEX_HOSTS=<your-elasticsearch-url>
If SEARCH_ENGINE is unset or empty, Elasticsearch is used by default.
Docker host user (HOST_UID / HOST_GID)
The Makefile automatically detects your host user and group IDs via id -u / id -g and exports them to Docker. No manual configuration is needed for most setups.
If you need to override (e.g. CI, shared environments):
# .env.local
HOST_UID=1005
HOST_GID=500
These values are used by the php service in docker-compose.yml so that files created inside the container are owned by your host user, preventing permission errors on bind-mounted volumes.
ποΈ Database (MySQL)
LibrePIM supports MySQL 8.0.30 and later, up to (but not including) 9.0,
which covers both the 8.0 series and MySQL 8.4 LTS. The Docker setup ships
mysql:8.4.9.
Running on 8.4 needs no configuration change. Doctrine is configured with
server_version: '8.4' and a dedicated MySQL84Platform, which detects the
datetime format from the returned value, so DATETIME and DATETIME(6)
columns are both parsed correctly on either server version.
Note for custom queries: MySQL 8.4 changed
GREATEST()so that mixing aDATETIMEcolumn with a non-datetime fallback β for exampleGREATEST(a.updated, COALESCE(b.updated, 0))β promotes the result toDATETIME(6)and yields values with microseconds. Code that parses those values with a fixed'Y-m-d H:i:s'format then fails. Use a datetime column as the fallback instead:GREATEST(a.updated, COALESCE(b.updated, a.updated)).
π Search Engine (Elasticsearch or OpenSearch)
LibrePIM runs on Elasticsearch 8 by default and also supports
OpenSearch 2.x as an alternative. The choice is made by the
SEARCH_ENGINE environment variable; the rest of the codebase is
engine-agnostic.
Selecting the engine
Set SEARCH_ENGINE in your .env.local file (see Local Environment Configuration):
# .env.local # Default. Native Elasticsearch 8 client. SEARCH_ENGINE=elasticsearch APP_INDEX_HOSTS=<your-elasticsearch-url> # Or opt into OpenSearch. # SEARCH_ENGINE=opensearch # APP_INDEX_HOSTS=<your-opensearch-url>
SEARCH_ENGINE and APP_INDEX_HOSTS must point at the same engine. If
SEARCH_ENGINE is unset or empty, Elasticsearch is used.
After switching engines, clear the Symfony cache and re-index:
rm -rf var/cache/*
php bin/console akeneo:elasticsearch:reset-indexes --env=prod
php bin/console pim:product:index --all --env=prod
php bin/console pim:product-model:index --all --env=prod
How it works
When SEARCH_ENGINE=opensearch, the akeneo_elasticsearch.client_builder
service returns an OpenSearchClientBuilderAdapter instead of the native
Elastic\Elasticsearch\ClientBuilder. The adapter wraps the real
OpenSearch\Client so calls like ->index(), ->search(), and
->indices()->putMapping() route to OpenSearch, and translates
OpenSearch\Common\Exceptions\OpenSearchException (and its subclasses)
into Elastic\Elasticsearch\Exception\ClientResponseException or
ServerResponseException, preserving the HTTP status on the attached
PSR-7 response. Existing catch (ElasticsearchException $e) blocks
across LibrePIM keep working unchanged.
The adapter layer lives at
src/Akeneo/Tool/Bundle/ElasticsearchBundle/SearchEngine/ and is the
only place that references both vendor SDKs. The Elasticsearch path is
unchanged β when SEARCH_ENGINE is elasticsearch (or unset),
SearchEngineClientBuilderFactory returns the native
Elastic\Elasticsearch\ClientBuilder and the rest of the codebase runs
against Elasticsearch exactly as before.
Spec coverage
The OSβES exception translator is unit-tested at
src/Akeneo/Tool/Bundle/ElasticsearchBundle/spec/SearchEngine/SearchEngineExceptionTranslatorSpec.php.
vendor/bin/phpspec run src/Akeneo/Tool/Bundle/ElasticsearchBundle/spec
Pinning notes
opensearch-project/opensearch-php is pinned at ~2.3.1. Newer 2.x
releases require psr/http-message ^2.0, which conflicts with other
LibrePIM dependencies.
Common pitfalls
| Symptom | Cause | Fix |
|---|---|---|
ProductCheckException: server is not Elasticsearch |
The Elasticsearch client is talking to an OpenSearch server | Set SEARCH_ENGINE=opensearch, then rm -rf var/cache/* |
alias missing (404) on a fresh OpenSearch instance |
First-run reset before any indexes exist | Re-run akeneo:elasticsearch:reset-indexes β it is idempotent and will create the missing aliases |
| UI shows zero products after switching | The search index for the new engine is empty (MySQL data is shared, the search index is per-engine) | Run pim:product:index --all and pim:product-model:index --all |
cache:clear fails |
The compiled cache references stale class names | rm -rf var/cache/* instead of cache:clear |
composer install drops opensearch-php |
The lock file may not track it | composer require opensearch-project/opensearch-php:~2.3.1 |
π Upgrading
Librepim follows Akeneo CEβs upgrade flow, making transitions simple and predictable.
π Upgrade Guide (Akeneo process compatible) https://docs.akeneo.com/master/migrate_pim/index.html
π§ͺ Testing
Testing workflows are the same as Akeneo CE. You can follow their testing documentation to run unit, integration, and end-to-end tests.
π Testing Guide https://github.com/akeneo/pim-community-dev/blob/master/internal_doc/tests/running_the_tests.md
π€ Contributing to Librepim
We encourage the community to participate and help improve the project.
Please read our Contributing Guidelines before submitting a pull request:
π CONTRIBUTING.md
Contributions may include:
- Bug fixes
- Documentation improvements
- Dependency updates
- Feature enhancements
- Security improvements
A respectful and collaborative environment is expected from everyone involved.
π License
Librepim is distributed under the Open Software License (OSL 3.0), the same license used by Akeneo PIM CE.
π LICENSE.txt
π― Why Librepim?
- Continued Support: Ongoing maintenance for users of Akeneo CE
- Security First: Regular patches and dependency updates
- Predictable Migration: Drop-in replacement for Akeneo CE
- Community Ownership: Built and improved by open-source contributors
- Open & Transparent: 100% free and community-governed
βΉοΈ About the Project
Librepim aims to ensure a long-term, stable future for the Akeneo Community Edition ecosystem by:
- Providing LTS
- Ensuring modern PHP, Symfony, and package compatibility
- Maintaining open-source availability for businesses and developers
- Encouraging community collaboration and contributions
Whether you're using Akeneo CE for small catalogs or managing large-scale product data, Librepim helps you continue with confidence.
π Useful Links
-
Akeneo PIM Documentation https://docs.akeneo.com/
-
Librepim Repository https://github.com/libre-pim/librepim-dev
-
Contributing Guide ./CONTRIBUTING.md
-
Issue Tracker https://github.com/libre-pim/librepim-dev/issues
π¬ Final Note
Librepim is built for the community and maintained by the community. If you're looking for a stable, secure, and continuously maintained version of Akeneo CE, Librepim is the ideal choice.
Join us, contribute, and help keep the open-source PIM ecosystem strong.