mahocommerce / maho
Free and open source ecommerce platform, created in 2024 on the M1 platform, PHP 8.5+
Requires
- php: >=8.5.1
- composer-runtime-api: ^2
- ext-ctype: *
- ext-curl: *
- ext-dom: *
- ext-fileinfo: *
- ext-filter: *
- ext-ftp: *
- ext-gd: *
- ext-hash: *
- ext-iconv: *
- ext-intl: *
- ext-json: *
- ext-libxml: *
- ext-mbstring: *
- ext-openssl: *
- ext-pdo: *
- ext-pdo_mysql: *
- ext-session: *
- ext-simplexml: *
- ext-soap: *
- ext-sodium: *
- ext-spl: *
- ext-zip: *
- ext-zlib: *
- altcha-org/altcha: ^2.0.0
- api-platform/core: ^5.0
- bacon/bacon-qr-code: ^3.0
- cbschuld/browser.php: ^2.0
- doctrine/dbal: ^4.5
- dompdf/dompdf: ^3.1
- intervention/image: ^4.0
- laminas/laminas-permissions-acl: ^2.17
- lbuchs/webauthn: ^2.2
- lcobucci/jwt: ^5.6
- league/flysystem: ^3.36
- league/html-to-markdown: ^5.1
- mahocommerce/directory-data: ^1.0
- mahocommerce/icons: ^3
- mahocommerce/maho-composer-plugin: ^5.2
- matthiasmullie/minify: ^1.3
- monolog/monolog: ^3.9
- nelmio/cors-bundle: ^2.6
- nyholm/psr7: ^1.8
- paypal/paypal-server-sdk: ^2.2
- pelago/emogrifier: ^8
- php-units-of-measure/php-units-of-measure: ^2.2
- psr/simple-cache: ^3.0
- spomky-labs/otphp: ^11.3
- symfony/ai-agent: ^0.14
- symfony/ai-generic-platform: ^0.14
- symfony/ai-platform: ^0.14
- symfony/cache: ^8.1
- symfony/console: ^8.1
- symfony/expression-language: ^8.1
- symfony/filesystem: ^8.1
- symfony/framework-bundle: ^8.1
- symfony/html-sanitizer: ^8.1
- symfony/http-client: ^8.1
- symfony/http-foundation: ^8.1
- symfony/mailer: ^8.1
- symfony/mcp-bundle: ^0.14
- symfony/messenger: ^8.1
- symfony/mime: ^8.1
- symfony/object-mapper: ^8.1
- symfony/process: ^8.1
- symfony/routing: ^8.1
- symfony/security-bundle: ^8.1
- symfony/validator: ^8.1
- symfony/var-dumper: ^8.1
- webonyx/graphql-php: ^15.31
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3
- laminas/laminas-json-server: ^3.5
- laminas/laminas-soap: ^2.10
- laminas/laminas-xmlrpc: ^3.0
- mahocommerce/maho-phpstan-plugin: ^5.2
- open-telemetry/exporter-otlp: ^1.4
- open-telemetry/sdk: ^1.15
- pestphp/pest: ^5
- pestphp/pest-plugin-browser: ^5
- phpstan/phpstan: ^2.3
- phpstan/phpstan-deprecation-rules: ^2.0
- phpstan/phpstan-strict-rules: ^2.0
- psy/psysh: ^0.12.10
- react/stream: ^1.4
- rector/rector: ^2
- symfony/ai-anthropic-platform: ^0.14
- symfony/ai-gemini-platform: ^0.14
- symfony/ai-mistral-platform: ^0.14
- symfony/ai-ollama-platform: ^0.14
- symfony/ai-open-ai-platform: ^0.14
- symfony/ai-open-router-platform: ^0.14
Suggests
- ext-pdo_pgsql: Required for PostgreSQL database support
- ext-pdo_sqlite: Required for SQLite database support
- azure-oss/storage-blob-flysystem: Required to point a storage mount at an Azure Blob Storage container. Community-maintained, not affiliated with Microsoft. Configure the mount under <global><storage> in local.xml (see local.xml.template).
- fballiano/openmage-cloudflare-turnstile: Turnstile: Cloudflare captcha-like antispam solution
- laminas/laminas-json-server: Install this package if you need JSON-RPC web services functionality
- laminas/laminas-soap: Install this package if you need SOAP web services functionality
- laminas/laminas-xmlrpc: Install this package if you need XML-RPC web services functionality
- league/flysystem-aws-s3-v3: Required to point a storage mount (media, exports, ...) at an S3 or S3-compatible bucket (MinIO, Cloudflare R2, DigitalOcean Spaces). Configure the mount under <global><storage> in local.xml (see local.xml.template).
- league/flysystem-google-cloud-storage: Required to point a storage mount at a Google Cloud Storage bucket. Configure the mount under <global><storage> in local.xml (see local.xml.template).
- mahocommerce/module-braintree: Braintree payment gateway integration
- open-telemetry/exporter-otlp: OTLP exporter for OpenTelemetry (required for sending traces to collectors)
- open-telemetry/extension-propagator-b3: B3 trace context propagation for OpenTelemetry, needed only when OTEL_PROPAGATORS names b3 or b3multi
- open-telemetry/opentelemetry-logger-monolog: Monolog bridge for OpenTelemetry (required for the optional OTLP log export)
- picqer/php-barcode-generator: Required for gift card barcode generation
- symfony/asset: Required (together with symfony/twig-bundle) for the API Platform Swagger UI: provides the asset() function its template uses.
- symfony/twig-bundle: Required (together with symfony/asset) to render the API Platform Swagger UI, ReDoc, and GraphiQL explorer pages. Without it, the JSON API and /api/docs.json still work but the human-browsable docs at /api/docs do not.
Provides
None
Replaces
- magento-hackathon/magento-composer-installer: ^99.99
- openmage/magento-lts: ^99.99
- paragonie/random_compat: ^99.99
- symfony/polyfill-ctype: *
- symfony/polyfill-intl-grapheme: *
- symfony/polyfill-intl-idn: *
- symfony/polyfill-intl-normalizer: *
- symfony/polyfill-mbstring: *
- symfony/polyfill-php80: *
- symfony/polyfill-php81: *
- symfony/polyfill-php82: *
- symfony/polyfill-php83: *
- symfony/polyfill-php84: *
- symfony/polyfill-php85: *
- dev-main
- 26.11.x-dev
- 26.11.0
- 26.9.x-dev
- 26.9.3
- 26.9.2
- 26.9.1
- 26.9.0
- 26.7.x-dev
- 26.7.5
- 26.7.4
- 26.7.3
- 26.7.2
- 26.7.1
- 26.7.0
- 26.5.0
- 26.3.0
- 26.1.0
- 25.11.0
- 25.9.0
- 25.7.0
- 25.5.0
- 25.3.0
- 25.1.0
- 24.11.0
- 24.9.0
- dev-fix/giftcard-translation-not-loaded
- dev-fix/js-deferral-large-inline-script
- dev-fballiano/introduce-a-transport-and-service-layering-stand
- dev-fix/cart-price-tax-on-unrounded-price
This package is auto-updated.
Last update: 2026-11-11 19:26:18 UTC
README
Live demo · Documentation · Release notes · Discord · Sponsor
Maho is an open-source ecommerce platform on PHP 8.5, Symfony 8, Doctrine DBAL 4 and API Platform 5.
Quick start
composer create-project mahocommerce/maho-starter yourproject
cd yourproject
./maho serve
Open http://localhost:8000 and follow the installer. Select SQLite to skip the database setup.
To fill the store with products, customers and orders, run ./maho import:sample-data.
You can also start a store with Docker:
docker run -p 54321:443 mahocommerce/maho:nightly
Then open https://localhost:54321. For web server, database and production setups, read the Getting Started guide and the official Docker images.
For developers
The stack
- PHP 8.5 with strict types, typed accessors,
#[\Override]and attributes - Symfony 8.1 components: HTTP, console, routing, messenger, mailer, validation, cache
- Doctrine DBAL 4.5 with a declarative schema, on MySQL, MariaDB, PostgreSQL and SQLite
- API Platform 5.0 for REST, GraphQL and MCP from one set of resources
- Tailwind CSS 4 and daisyUI 5 for the storefront and the admin, TipTap 3 for content
- Vanilla JavaScript: no jQuery, no Prototype.js
- Monolog for logs, OpenTelemetry for traces and metrics, Pest for tests
Configuration in PHP attributes
Routes, observers, cron jobs, queue handlers and API resources live next to the code, not in XML:
#[Maho\Config\Route('/catalog/product/view/{id}', methods: ['GET'], requirements: ['id' => '\d+'])] public function viewAction(): void {} #[Maho\Config\Observer('catalog_product_save_after')] public function handleProductSave(\Maho\Event\Observer $observer): void {} #[Maho\Config\CronJob('my_cron_job', schedule: '0 2 * * *')] public function runJob(Mage_Cron_Model_Schedule $schedule): void {}
A schema change is a diff of sql/schema.php, not one more upgrade script. To override a
controller, extend it: the router finds the subclass.
APIs
- REST and GraphQL on one set of resources, with JWT, granular permissions, ETags and
idempotency keys. The OpenAPI 3.1 spec is at
/api/docs.json. Read the API guide - MCP server with OAuth 2.1 login, so Claude, ChatGPT and other agents work with the catalog and the orders. Read the MCP guide
- Legacy SOAP, XML-RPC and JSON-RPC APIs stay available for existing integrations
Tools
- 114 CLI commands for install, cache, indexes, cron, database dumps, imports, exports, storage, themes and admin users. Read the CLI guide
- Message queue on Symfony Messenger, with worker pools and an admin grid
- Storage mounts on Flysystem: put media, uploads and feeds on S3, Google Cloud Storage or Azure
- Built-in LSP and MCP servers for your editor and your coding agent
- Composer plugin for modules and a PHPStan plugin for static analysis
- Signed release packages at SLSA Build Level 3
For merchants
- Storefront: eleven themes with a live theme editor, one-step checkout, social login with Google, Apple and Facebook, customer 2FA, product gallery layouts
- Admin: an AI assistant on every page, a drag-and-drop page builder, passkey and 2FA login, light and dark mode, an image editor, content versions, and the Maho Admin app for phones and tablets
- Marketing: customer segments, email automation, dynamic categories, gift cards, a blog, and product feeds for Google Shopping, Meta, Bing and Pinterest
- Payments: PayPal v6 with Pay Later and saved cards in the core, and first-party modules for Braintree, Mollie, Klarna, Revolut, GNU Taler, Przelewy24, PensoPay and Nexi Nets Easy
- Shipping: rates from external shipping APIs
- Search engines and AI agents: schema.org data, SEO rules for layered navigation,
llms.txtand a markdown version of each page - Compliance: WCAG accessibility scans, EU VAT number checks, the EU revocation button
- Multi-store: many websites, stores and currencies from one admin
Read the User Guide for each feature.
Releases
Maho uses calendar versions: 26.11.0 is the release of November 2026. A new release ships about
every two months, and patch releases bring fixes in between. Only the latest release gets fixes.
Each release can contain breaking changes, so read the
release notes before you upgrade. The
release strategy explains why.
Migrate from Magento 1 or OpenMage
Maho keeps the Magento 1 architecture, so your modules, themes and data move with you. Maho is not 100% backward compatible: each release removes old code and lists the breaking changes. The migration guide gives the steps.
Documentation
- mahocommerce.com: user guide, developer guide, API and hosting
- PHP API reference: all classes and methods
- DeepWiki: ask questions about the code
- AGENTS.md: the conventions of the codebase, for people and for coding agents
Contributing
Bug reports, pull requests and translations are welcome. Read the contributing guide to set up a development store, run the linters and open a pull request. Translations happen on Crowdin.
Maho is built by a small team, with generative AI as part of the daily work. Every pull request passes PHPStan, PHP CS Fixer, Rector and the test suite on seven database backends, and a maintainer reviews every change before the merge. AI use in your pull requests is welcome, but you must understand and stand behind the code that you submit. Read our GenAI transparency statement.
Sponsors and funding
Maho is free software, and sponsors pay for the time that it takes. Please become a sponsor.
Maho receives funding from the NGI TALER Fund of NLnet, with support from the Next Generation Internet programme of the European Commission.
Community
All participants follow our Code of Conduct.
About the name
"Maho" (pronounced "mah-hoh") is the name of the ancient indigenous people of Lanzarote and Fuerteventura in the Canary Islands, a resilient people who thrived in a hard land. In Spanish it means nice, cool, and in Japanese it means magic.
License
Maho is licensed under OSL-3.0. Templates, layouts and front-end assets are licensed under AFL-3.0.