Welcome to the May 2026 Core Monthly. It was a month with a strong maintenance rhythm, two releases on the 9.1 branch, and a lot of quieter groundwork: a fresh take on how the project shares its conventions with AI tools, a one-page checkout slowly coming together in the open, and the usual steady flow of migrations on the develop branch.

Core Monthly banner

Dear community,

May was, above all, a maintenance month. The 9.1 branch received its first regular bug-fix release and a quick security follow-up just two days later, both driven largely by community contributors. Alongside that, we published an article about how we are teaching AI assistants to actually understand PrestaShop’s architecture, the one-page checkout module kept moving toward being a first-class native module, and we opened the call for papers for PS Summit 2026 in Lyon. Let’s walk through it.

Two releases on the 9.1 branch

The headline of the month was a pair of releases. On May 19th we shipped PrestaShop 9.1.2, the first regular maintenance release for the 9.1 branch. It bundles more than fifty merged pull requests from over twenty contributors into one update, with no new features and no breaking changes, which makes it a safe and recommended update for anyone running 9.1. Most of the work landed in the back office, with a strong focus on multishop and catalog management, order handling, and customer-facing flows, plus the usual round of Symfony component bumps under the hood.

Just two days later, on May 21st, we followed up with PrestaShop 9.1.3, a small but important security maintenance release. It contains no application code changes at all: it simply pulls in the latest patched versions of Symfony (6.4.40) and Twig (3.26.0) following their coordinated security advisories published on May 20th. The practical exposure for a default shop is narrow, but because PrestaShop 9 runs on a Symfony version that still receives upstream security support, we ship these fixes as soon as they land. It is the right thing to do regardless of how limited the risk might be.

PrestaShop 9.1.2 is available!

Teaching AI to speak PrestaShop

If you write PrestaShop code with an AI assistant, you have probably watched it confidently reach for HelperList and a legacy admin controller to build a listing page, only to produce something that would have looked correct in PrestaShop 1.7. The model is not inventing anything: it is faithfully reproducing the largest public corpus of PrestaShop code it could find, which is full of patterns the project moved away from years ago.

Teaching AI to speak PrestaShop

In Teaching AI to speak PrestaShop, we described what we are doing about it. Every PrestaShop repository now ships a small set of pointer files at its root that direct any AI tool to a shared context written in plain Markdown, and the core has gone further with a dedicated .ai/ directory holding a hierarchical, machine-readable description of its conventions. The approach is deliberately tool-agnostic: any AI tool can read these files, and any contributor can write them, so the project avoids locking itself into one vendor’s format. You can see this convention spreading across repositories in the PR list below, including work on the skills repository that asks agents to diff changes while checking update compatibility.

A one-page checkout taking shape

Quietly, but steadily, the ps_onepagecheckout module continued its journey toward becoming a proper native module. May saw a configuration entry added for the module in the native-modules repository, and a series of improvements to the module itself: imported and decoupled Hummingbird templates, a new submit event, payment HTML comparison, and better error recovery during checkout. It is the kind of incremental, behind-the-scenes work that does not make a flashy announcement, but it is exactly how a feature graduates from experiment to something merchants will be able to rely on.

Community and events

Beyond the code, we shared two community-focused pieces this month. In PrestaShop and OSPO Alliance, we reflected on what open source means at PrestaShop through an interview with the OSPO Alliance, focusing on two concrete initiatives: Call for Contributions, which channels effort toward roadmap priorities, and the Wall of Fame, which makes contributions visible to merchants directly in the back office.

We also opened the call for papers for PS Summit 2026, the first-ever PS Summit powered by PrestaShop and Sylius, taking place November 4th and 5th in Lyon, France. If you have an experience, an idea, or a project worth sharing with the open source ecommerce community, we would love to see you on stage.

PS Summit 2026

Most active contributors

Here are the five contributors with the most merged pull requests across the project’s repositories in May:

  1. @Progi1984 (25 PRs) kept the testing infrastructure moving, with a steady stream of work on functional tests and the UI Testing Library, alongside several back office fixes.
  2. @nicosomb (13 PRs) handled the recurring Symfony component updates, version bumps, and release plumbing across the core, docs, and Auto Upgrade module.
  3. @jolelievre (12 PRs) focused on architecture in the develop branch, making the HookRegistry stateless, refining the AI Forms context pattern, and advancing the Admin API multishop work in ps_apiresources.
  4. @Quetzacoalt91 (11 PRs) drove the Auto Upgrade module forward with migration files, module compatibility checks, and version bumps, plus an API endpoint in ps_apiresources.
  5. @Codencode (10 PRs) was the most active community contributor, fixing a long list of back office and multishop bugs in the core.

Spotlight on community contributors

Every month we like to shine a light on the contributors who volunteer their time to make PrestaShop better. This month we want to thank five of them:

  • @Codencode tackled a remarkable number of back office and multishop bugs, from URL schema updates for a single shop to currency import on shop copy and reserved quantity handling.
  • @Hlavtox shipped the ps_specials 2.0.0 release, worked on the New Products module, and refined route handling in the core.
  • @jf-viguier added a prestashop:module:list console command and improved Connection::isBot() to recognize modern crawlers and AI bots, preventing ghost carts and fake connections.
  • @PrestaEdit contributed across several repositories, adding a getHighestPosition alias in the core, improving the PHP Developer Tools, and adding pagination to the PrestaShop contributors website.
  • @Kaikina contributed to the Admin API campaign in ps_apiresources with a partial update on TaxRulesGroup status and a new hook in the Email Alerts module.

And much more

There was plenty more activity this month that did not fit into a dedicated section: continued Symfony migrations of back office pages, B2B data model work in the installer and Auto Upgrade module, a refactor of the themes documentation, fixes across the Hummingbird theme, and improvements to the PrestaShop contributors website. You will find the complete list of merged pull requests below.

Project releases

A quick update about PrestaShop’s GitHub issues and pull requests:

Code changes in the ‘9.1.x’ branch

Back office

  • #41552: Fix #41189 - Allow changing discount status on edit page. Thank you, @mattgoud
  • #41530: Shopping Carts : For combinations, if no image defined, use the cover image. Thank you, @Progi1984
  • #41524: Invoice : If no payments, display the payment method. Thank you, @Progi1984
  • #41457: Enhance invoice filename safety by sanitizing number. Thank you, @Maofree
  • #41394: Fix: [Multishop] Error when updating “Schema of URLs” for a single shop. Thank you, @Codencode
  • #41334: Fix theme import from web throwing PHP warnings on invalid URLs. Thank you, @mattgoud
  • #41327: Throw exception on order detail insert failure during conversion. Thank you, @nicosomb
  • #41320: Fix unable to delete order product when catalog product is deleted. Thank you, @mattgoud
  • #41307: Fix PDF downloads using Symfony responses. Thank you, @Codencode
  • #41303: Fix address state selection after country states reload. Thank you, @Codencode
  • #41204: Change the redirection of combination button learn more. Thank you, @AureRita
  • #41036: Fix: Error 500 if I enter a space in a customer’s first or last name field. Thank you, @Codencode
  • #40999: Fix/40997 default currency import on shop copy. Thank you, @Codencode
  • #40898: Fix: Bug: reserved_quantity not updated when “Share available quantities for sale” is enabled (Multishop). Thank you, @Codencode
  • #40099: Fix: Cart rule combinations lost when saving if lazy-loaded list (jscroll) is not fully loaded. Thank you, @Codencode

Core

  • #41567: Update Symfony components after 6.4.41 release. Thank you, @nicosomb
  • #41529: Set version to 9.1.4. Thank you, @Progi1984
  • #41465: Update Symfony components after 6.4.39 release. Thank you, @nicosomb
  • #41431: Backport #41356 : Add CartId into product search handler when employeeId not provided. Thank you, @Progi1984
  • #41419: Update Symfony components after 6.4.38 release. Thank you, @nicosomb
  • #41412: Fix sending test emails from/to idn domains. Thank you, @boherm
  • #41410: Switch employee email from ps_shop_email when forwarding customer threads to another employee. Thank you, @boherm
  • #41386: Fix route management and comment Dispatcher. Thank you, @Hlavtox
  • #41383: Update Symfony components after 6.4.37 release. Thank you, @nicosomb
  • #41317: Fix module uninstall failing when override contains multi-line property or constant value. Thank you, @mattgoud
  • #41273: Fix: cast bool field in get cms page category for editing handler. Thank you, @axel-paillaud
  • #41225: Fix attribute and attribute group position ordering in core methods. Thank you, @nicohery
  • #40654: Theme helper to check framework’s compatibility. Thank you, @kpodemski

Front office

  • #41509: Avoid bad URL on invalid media with media servers enabled and CCC disabled. Thank you, @gross-nvs
  • #41319: Fix product details overridden when changing attribute in quickview modal. Thank you, @mattgoud
  • #41316: Fix wrong state saved when country is changed quickly before AJAX completes. Thank you, @mattgoud
  • #41299: Guard product page when product is null. Thank you, @Codencode

Tests

  • #41518: Functional Tests : Bump @prestashop-core/ui-testing. Thank you, @Progi1984
  • #41503: Functional Tests : Bump @prestashop-core/ui-testing. Thank you, @Progi1984
  • #41476: Functional Tests : Remove numbering in endpoints directoriess. Thank you, @Progi1984
  • #41475: Functional Tests : @prestashop-core/ui-testing. Thank you, @Progi1984
  • #41462: Functional Tests : @prestashop-core/ui-testing. Thank you, @Progi1984
  • #41347: Functional Tests : Bump @prestashop-core/ui-testing. Thank you, @Progi1984

Code changes in the ‘develop’ branch

Back office

  • #41559: Migrate “International > Taxes > Tax Rules” page. Thank you, @boherm
  • #41555: Make HookRegistry stateless and name-keyed. Thank you, @jolelievre
  • #41495: Improve countries list Symfony migration. Thank you, @mattgoud
  • #41433: SF Migration - Email body translations. Thank you, @boherm
  • #41420: Migration - Add KPI strip and listing statistics to migrated Customer Service page. Thank you, @ga-devfront
  • #41406: Migrate country options. Thank you, @tleon
  • #41397: Country Address format: replace legacy widget with Vue 3 visual builder. Thank you, @jolelievre
  • #41050: Handle inelegible products “free gift” discount. Thank you, @nicosomb
  • #40995: Disabled discount when only customer or customer group is deleted. Thank you, @tleon
  • #40234: Delete specific prices when group is removed. Thank you, @aomaxime

Core

  • #41561: Update Symfony components after 6.4.41 release. Thank you, @nicosomb
  • #41492: Fix matrix generation workflow. Thank you, @jolelievre
  • #41455: Improve AI Forms context (settings vs CRUD) and introduce the sub-context pattern. Thank you, @jolelievre
  • #41449: Make branch input a simple input to use build branches. Thank you, @jolelievre
  • #41446: Add a console command to list modules: prestashop:module:list. Thank you, @jf-viguier
  • #41435: Add getHighestPosition alias. Thank you, @PrestaEdit
  • #41416: Build Creator : Filter only Copilot Instructions and not all workflows. Thank you, @Progi1984
  • #41356: Add CartId into product search handler when employeeId not provided. Thank you, @boherm
  • #41305: Improve Connection::isBot() with modern crawlers and AI bots to prevent ghost carts and fake connections. Thank you, @jf-viguier
  • #39837: Change matching method in ShopContextSubscriber. Thank you, @djbuch

Front office

  • #41404: Improvement: add back parameter in FO customer template URLs. Thank you, @ThbPS
  • #41006: Refacto: remove One-Page Checkout feature flag. Thank you, @ThbPS

Installer

  • #41556: Merge set-pr-milestone into validate-pr-metadata to fix ordering and rerun staleness. Thank you, @jolelievre
  • #41354: Amend B2B data model to align with revised hybrid-mode schema. Thank you, @soledis-contributeur

Tests

  • #41560: Functional Tests : Fixed WS - Products : CRUD. Thank you, @Progi1984
  • #41528: Functional Tests : API : DELETE /admin-api/discounts/{discountId}. Thank you, @Progi1984
  • #41514: Functional Tests : Remove @todo #41241. Thank you, @Progi1984
  • #41456: Functional Tests : Fixed “API : GET /products/search”. Thank you, @Progi1984
  • #41430: Functional Tests : Sync Title with JIRA. Thank you, @Progi1984
  • #41418: Migration - Add Behat coverage for CustomerService status, bulk delete, and error paths. Thank you, @ga-devfront
  • #41415: Functional tests : WS - CRUD category . Thank you, @nesrineabdmouleh
  • #41355: TEST-12859 - Hall of Fame Our Community. Thank you, @paulnoelcholot
  • #41311: Fix [TEST-1115] BO - Shop Parameters - SEO & URLs - Generate robots.txt file. Thank you, @mattgoud

Web services

Code changes in modules, themes and tools

.github

  • #47: Fix validate-pr-metadata: refresh PR data on rerun and parse trailing pipes. Thank you, @jolelievre
  • #46: Clarify stale issue confirmation message to include verification on supported PrestaShop versions. Thank you, @cnavarro-prestashop

API Resources

Auto Upgrade module

Changes in developer documentation sources

Classic theme

Dashboard Activity module

Distribution API

Docker images

Email Alerts module

  • #150: feat(hook): Add id product attribute to hook. Thank you, @Kaikina

Faceted search module

Hummingbird theme

Native-modules

  • #4: Feat: add config for module ps_onepagecheckout. Thank you, @ThbPS

New Products module

Nightly board

  • #155: Revert “Update Node.js version to 26.1 in Dockerfile”. Thank you, @Progi1984
  • #154: Update Node.js version to 26.1 in Dockerfile. Thank you, @arthurzenika

PHP Developer Tools

PrestaShop contributors website

Ps_onepagecheckout

  • #54: Improvement/decouple hummingbird. Thank you, @ThbPS
  • #48: [SPE-134] Added payment_html comparison. Thank you, @L3RAZ
  • #47: [SPE-133] Adds OPC submit event. Thank you, @L3RAZ
  • #46: [SPE-129] Imported needed templates from hummingbird and replaced includes with…. Thank you, @L3RAZ
  • #41: Fix: missing OPC checkout templates . Thank you, @ThbPS
  • #33: [SPE-115] - Problème d’affichage et sauvegarde des champs de la modale. Thank you, @sylardiere
  • #29: Feat: improve checkout robustness and error recovery. Thank you, @ThbPS

Skills

  • #3: Request agents to diff the changes while checking the compatibility with the update. Thank you, @Quetzacoalt91

Social Follow module

  • #57: Fix social links keys preservation when applying order. Thank you, @Codencode

Special offers module

The PrestaShop open source project

Traces

  • #224: traces:fetch:contributors : Fixed blog with scheme. Thank you, @Progi1984

UI Testing Library

  • #982: Chrome change some native error messages. Thank you, @Progi1984
  • #980: Fix BOBasePage help sidebar methods to support legacy pages. Thank you, @mattgoud
  • #979: Add methods in Addresses page. Thank you, @nesrineabdmouleh
  • #977: boDiscountsPage : Added methods getDiscountStatus & setDiscountStatus. Thank you, @Progi1984
  • #972: Adapt test for free gift. Thank you, @nicosomb
  • #971: ProductCombination : Added prices in TE & TI. Thank you, @Progi1984
  • #965: boProductPage : Fixed method getTextColumn. Thank you, @Progi1984
  • #964: boProductPage : Added some methods to get more informations. Thank you, @Progi1984
  • #956: Create category - Add methods to get fr values and get tinymce input. Thank you, @nesrineabdmouleh
  • #955: Remove eslint-plugin-deprecation. Thank you, @Progi1984

Acknowledgments

Thank you to all contributors this month! And a big thank you to everyone who contributes with issues, reviews, and comments on GitHub, including those whose pull requests have not been merged yet.

Coding is only just one of the ways you can contribute. Here are some ideas on how you can get involved in the project.

If you need help with contributing or have questions about it, feel free to contact me, @kpodemski, on the project’s Slack.

Happy contributin’ everyone!