Open Source Digital Experience Platform (DXP, MDM/PIM, CDP, DAM, CMS/UX & eCommerce

Overview

Pimcore - Own the digital World

Pimcore - Open Source Digital Experience Platform: MDM/PIM, CDP, DAM, CMS/UX & eCommerce

Packagist Software License Gitter

Contribute

Bug fixes: please create a pull request including a step by step description to reproduce the problem
Contribute features: contact the core-team on our Gitter channel before you start developing
Security vulnerabilities: please use this form

For details, please have a look at our contributing guide.

Supported Versions

Version Supported LTS** LTS Version
<= 4.x ❌ ❌
5.x ❌ βœ… 5.8
6.x βœ… βœ…

** LTS is only available as part of our enterprise subscription.

Overview

Technology and Architecture

Key Benefits and Advantages

βš’ Data Modelling and UI Design at the same Time

No matter if you're dealing with unstructured web documents or structured data for MDM/PIM, you define the UI design (web documents by a template and structured data with a intuitive graphical editor), Pimcore knows how to persist the data efficiently and optimized for fast access.

πŸŽ› Agnostic and Universal Framework for your Data

Due to the framework approach, Pimcore is very flexible and adapts perfectly to your needs. Built on top of the well-known Symfony Framework you have a solid and modern foundation for your project.

πŸš€ Extensible and huge Symfony Community

Benefit from all existing Symfony Components and Bundles provided by the community or create your own Bundles to extend your Projects with reusable components.

πŸ’Ž Your Digital World consolidated in one Platform

No more API, import/export and synchronization hell between MDM/PIM, E-Commerce, DAM, and your Web-CMS. All is working seamlessly together, natively ... this is what Pimcore is built for.

✨️ Modern and Intuitive UI

We love good looking user interfaces, designed to be efficient for the daily use and optimized for a great experience for editors.

Preview and Demo

Documents

Pimcore Admin Interface Screenshot CMS The CMS part of Pimcore for managing unstructured content such as the pages of a website and its navigation. Physical HTML/CSS pages which are displayed in the browser. Documents can be filled with various content areas, which consist of predefined layout elements. Pimcore documents provide multi-lingual capabilities and powerful features for managing multiple websites at once. Full frontend flexibility enables a complete blend of content and commerce.

Digital Assets

Pimcore Admin Interface Screenshot DAM Images, videos, PDF, Word/Excel documents and other files can be managed and organized into folders. Pimcore renders preview images for more than 200 file types. An integrated image editor is included. Facial recognition for focal points in images and support for VR/360Β° previews is integrated. Editors maintain images only once at the highest resolution in the system. The output formats for channels such as online shop, app, website, etc. are automatically created.

Data Objects

Pimcore Admin Interface Screenshot PIM/MDM Predefined structured data, which is centrally managed and created either manually or automatically via the API. Used for products & attributes (MDM/PIM), customers (CDP), blog articles (WCM), orders (digital commerce), and so much more. Objects can be used to fill content areas and elements of a website, portal or app with data from one central source. Single source administration of data ensures a consistent, up-to-date digital customer experience with little effort.

Demo (MDM/PIM, E-Commerce, DAM, CMS, ...)

Admin-URL (stable): https://demo.pimcore.fun/admin/
Admin-URL (dev): https://x.pimcore.fun/admin/
Username: admin
Password: demo

Getting Started

Only 3 commands to start! 😎

COMPOSER_MEMORY_LIMIT=-1 composer create-project pimcore/skeleton ./my-project
cd ./my-project
./vendor/bin/pimcore-install

This will install an empty skeleton application, but we're also offering a demo package for your convenience - of course also with 3 commands πŸ’ͺ Click here for more installation options and a detailed guide

Copyright and License

Copyright: Pimcore GmbH For licensing details please visit LICENSE.md

Issues
  • Mod_pagespeed incompatibility with latest version 4.2 breaks admin interface

    Mod_pagespeed incompatibility with latest version 4.2 breaks admin interface

    Possible Bug Report

    After upgrading two pimcore installations on two different servers, I got errors in the Pimcore backend. I updated from 4.1.3 to 4.2.0 (stable branch) without errors.

    The frontend keeps working fine but the backend will show the loading image for one second and after that a completely white page. There are no entries in debug or php error log. Firebug shows this: pimcore error

    I thought it'd be a damaged file somewhere and replaced all files with new ones from the pimcore release without success. I guess the update itself has been tested so it might be the configuration of our servers - but the two servers are configured slightly different and both - independent - pimcore installations had the same issue so this might be a bug.

    File permissions are correct, database is okay as far as I can see. Frontend is working.

    opened by Cruiser13 47
  • Pimcore Memory Leak on Importing thousands of Objects

    Pimcore Memory Leak on Importing thousands of Objects

    Based on complexity and data-amount of an Object Class, memory increases heavily on Importing/updating thousands of items. I have an import with around 20k Products, with a lot of informations like classifications, images, relations, etc. Around every 10th product, memory increases about 2MB. So, 20k products means a memory consumption of around:

    100mb base usage (large import file needs to be kept in memory + symfony container) + every 10th item consumes 2 mb = more than 4gb of ram usage.

    To make this easier test-able, I created a new Pimcore installation (latest stable release, 5.2.3). Created a very simple class:

    bildschirmfoto 2018-07-19 um 09 57 40

    And ran imports with different amounts (used PHP7.1):

    Amount | Time | Start Memory Usage | End Memory Usage | Blackfire Report -------- | -----| ---------------------| --------------------| ----------------- 1000 | ~2min | 16mib | 94 mib | https://blackfire.io/profiles/2b2cbe9a-9eba-4de3-ac60-b1515f5db389/graph 10000 | ~21min | 16mib | 734 mib | https://blackfire.io/profiles/e814e0ac-3a0d-4c4e-9e8c-a952883f12e2/graph

    So I guess you can imagine the memory consumption for 20k or more items.

    Command used for importing data:

    <?php
    
    namespace AppBundle\Command;
    
    use Pimcore\Model\DataObject\Service;
    use Pimcore\Model\DataObject\Test;
    use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
    use Symfony\Component\Console\Helper\ProgressBar;
    use Symfony\Component\Console\Input\InputArgument;
    use Symfony\Component\Console\Input\InputInterface;
    use Symfony\Component\Console\Output\OutputInterface;
    
    class AppTestCommand extends ContainerAwareCommand
    {
        protected function configure()
        {
            $this
                ->setName('app:test')
                ->addArgument('itemsToCreate', InputArgument::REQUIRED);
        }
    
        protected function execute(InputInterface $input, OutputInterface $output)
        {
            $itemsToCreate = $input->getArgument('itemsToCreate');
    
            $progress = new ProgressBar($output, $itemsToCreate);
            $progress->setFormat(
                '%current%/%max% [%bar%] %percent:3s%% (%elapsed:6s%/%estimated:-6s%) %memory:6s%: %message%'
            );
    
            for ($i = 0; $i < $itemsToCreate; $i++) {
                $progress->setMessage('Create Item with Number '.$i);
    
                $item = new Test();
                $item->setBlub(uniqid());
                $item->setBlub2(uniqid());
                $item->setBlubLocalized(uniqid());
                $item->setKey($i.'-'.uniqid());
                $item->setParent(Service::createFolderByPath('/blub-'.$itemsToCreate.'/'.$i % 100));
                $item->save();
    
                $progress->advance();
            }
        }
    
    }
    

    Wrapping import in a nested transactions brings following results. A bit better but not much.

    Amount | Time | Start Memory Usage | End Memory Usage | Blackfire Report -------- | -----| ---------------------| --------------------| ----------------- 1000 | ~1min | 16mib | 84mib | https://blackfire.io/profiles/2600b39a-b6e3-41b9-9ba3-0ce2142d123d/graph 10000 | ~20min | 16mib | 698mib | https://blackfire.io/profiles/78176e0b-7afe-477d-982c-387a9cc9b3d0/graph

    Command used for nested transactions

    <?php
    
    namespace AppBundle\Command;
    
    use Pimcore\Db;
    use Pimcore\Model\DataObject\Service;
    use Pimcore\Model\DataObject\Test;
    use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
    use Symfony\Component\Console\Helper\ProgressBar;
    use Symfony\Component\Console\Input\InputArgument;
    use Symfony\Component\Console\Input\InputInterface;
    use Symfony\Component\Console\Output\OutputInterface;
    
    class AppTestCommand extends ContainerAwareCommand
    {
        protected function configure()
        {
            $this
                ->setName('app:test')
                ->addArgument('itemsToCreate', InputArgument::REQUIRED);
        }
    
        protected function execute(InputInterface $input, OutputInterface $output)
        {
            $itemsToCreate = $input->getArgument('itemsToCreate');
    
            $progress = new ProgressBar($output, $itemsToCreate);
            $progress->setFormat(
                '%current%/%max% [%bar%] %percent:3s%% (%elapsed:6s%/%estimated:-6s%) %memory:6s%: %message%'
            );
    
            Db::get()->beginTransaction();
    
            for ($i = 0; $i < $itemsToCreate; $i++) {
                $progress->setMessage('Create Item with Number '.$i);
    
                $item = new Test();
                $item->setBlub(uniqid());
                $item->setBlub2(uniqid());
                $item->setBlubLocalized(uniqid());
                $item->setKey($i.'-'.uniqid());
                $item->setParent(Service::createFolderByPath('/blub-'.$itemsToCreate.'/'.$i % 100));
                $item->save();
    
                if ($i % 100 === 0) {
                    Db::get()->commit();
                    Db::get()->beginTransaction();
                }
    
                $progress->advance();
            }
    
            Db::get()->commit();
        }
    
    }
    

    TL;DR

    Pimcore uses a lot of memory on persisting a lot of items. I am not sure why and how to optimize. But importing thousands of items in one import is not possible at the moment.

    opened by dpfaffenbauer 46
  • Introduce Javascript Routing

    Introduce Javascript Routing

    • Introduces FOSJS Routing Bundle
    • Replace most of the routes with actual Route Generation
    • Replace the other by adding at least the Base-Path, wasn't sure how to handle those properly
    • Replace all static route uses in PHP and Templates

    This requires precise review and testing. I already tested most parts, but I am pretty sure I missed something.

    Improvement Task 
    opened by dpfaffenbauer 42
  • [Bug]: Cannot view/restore versions of Objects with Classification Stores

    [Bug]: Cannot view/restore versions of Objects with Classification Stores

    Expected behavior

    When clicking on the Versions tab on DataObjects it should be possible to view and restore from versions created prior to Pimcore X which contains Classification Stores.

    Actual behavior

    [2021-10-20T09:56:31.636336+02:00] php.CRITICAL: Uncaught Error: 
    Cannot assign __PHP_Incomplete_Class to property Pimcore\Model\DataObject\Classificationstore::$object of type ?Pimcore\Model\DataObject\Concrete {"exception":"[object] (TypeError(code: 0): 
    Cannot assign __PHP_Incomplete_Class to property Pimcore\\Model\\DataObject\\Classificationstore::$object of type ?Pimcore\\Model\\DataObject\\Concrete at /var/www/pimcore/vendor/pimcore/pimcore/lib/Tool/Serialize.php:43)"} []
    [2021-10-20T09:56:31.636655+02:00] request.CRITICAL: Uncaught PHP Exception TypeError: 
    "Cannot assign __PHP_Incomplete_Class to property Pimcore\Model\DataObject\Classificationstore::$object of type ?Pimcore\Model\DataObject\Concrete" at /var/www/pimcore/vendor/pimcore/pimcore/lib/Tool/Serialize.php line 43 {"exception":"[object] (TypeError(code: 0): 
    Cannot assign __PHP_Incomplete_Class to property Pimcore\\Model\\DataObject\\Classificationstore::$object of type ?Pimcore\\Model\\DataObject\\Concrete at /var/www/pimcore/vendor/pimcore/pimcore/lib/Tool/Serialize.php:43)"} []
    
    

    image

    Steps to reproduce

    Save a version in Pimcore 6.9.6 Upgrade to Pimcore 10.1+ Try to restore the object

    edit example version file (renamed with .txt to allow upload here on Github) 255796.txt

    Bug 
    opened by NiklasBr 36
  • [Data Objects] Save default values to versions

    [Data Objects] Save default values to versions

    With #5594 saving field's default value to database was introduced. The problem is that these default values do not get saved to versions currently. This is especially bad because when you publish this version, you will again have null in the respective fields.

    Steps to reproduce:

    1. Create class with input field abc, default value test
    2. Create object of above class and save it
    3. In the database tables now there is test in column abc
    4. Go to versions tab, select jsut saved version -> there abc is empty
    5. Restore the just saved version -> The value is now also null in the database column -> this is really bad because you can not restore the exact state the object had at this point (what is the main purpose of versioning beside tracking changes)

    With this PR the default values are also saved to the database (and also to the PHP object being saved - which is important, if you have further operations with it after saving).

    Improvement 
    opened by BlackbitNeueMedien 33
  • [Objects] Getter / Setter for reverse many-to-many relations

    [Objects] Getter / Setter for reverse many-to-many relations

    This PR adds getters and setters for reverse many-to-many relations. For example when you have: Product

    • categories (many-to-many-object-relation)

    Category

    • products (reverse many-to-many relation)
    $products = $category->getProducts();
    $products[] = Product::getById(123);
    $category->setProducts($products);
    $category->save();
    

    Partly resolves #3920

    opened by BlackbitNeueMedien 33
  • Versioning performance with a lot of relationships

    Versioning performance with a lot of relationships

    Hi,

    It seems the recursive DeepCopy used when saving a new version has a serious performance impact when you have a lot of relationships. The following is a blackfire profile for a batch edit of 25 objects:

    https://blackfire.io/profiles/9902f36c-0857-4511-ac3a-54bf25e10a29/graph

    When I make a shallow copy it's significantly faster. Is there any reason for traversing all of the related objects? Of course direct relationships have to be included because they are shown in the version tab but any deeper than this is not included in the version data anyway.

    Improvement 
    opened by belendel 30
  • Fatal with caching on localized fields caused by ElementDescriptor

    Fatal with caching on localized fields caused by ElementDescriptor

    This is caused by the CoreHandler in the latest version. If i revert it to the state before the error is gone. I think it relates to this: https://github.com/pimcore/pimcore/issues/7039

    grafik

    Bug 
    opened by morrisstrangfeld 27
  • [DataObject] Localized-Field Relation from Field-Collection in Data Object cannot be saved

    [DataObject] Localized-Field Relation from Field-Collection in Data Object cannot be saved

    Bug Report

    Expected behavior

    Update a existing releation, instead catch the exception from insert in logger.

    Actual behavior

    Throw exception and shows validation failed "unique constraint violation" in backend. SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '4-3-localizedfield-/fieldcollection~footerColumn1/0/localizedfie' for key 'PRIMARY'

    Steps to reproduce

    Add a field collection with a localized field with a many to one field and use it as footerColumn1... in a class like: image Create a new object and drag a document to the many to one field, save the object -> press the reload button and click on save & publish.

    Code example

    use

    $db->insertOrUpdate('object_relations_' . $classId, $relation);
    

    instead of insert exception:

    $db->insert('object_relations_' . $classId, $relation);
    
    Bug 
    opened by albertmueller 26
  • GraphQL Support

    GraphQL Support

    I'm currently looking at Pimcore for a decoupled frontend application, usually with React. Until now (with other systems) I've been using GraphQL instead of REST APIs to avoid multiple API calls and only transfer data that I actually need.

    Beside of the fact that I don't know if the documented REST API of Pimcore was built for decoupled applications, I haven't found anything about GraphQL.

    Therefore, please take this issue as feature request.

    New Feature Prio-Backlog 
    opened by julmot 26
  • [Perspective] Omit

    [Perspective] Omit "not allowed perspective"-warning with perspective= as GET

    With the default installation every time reloading the admin UI with the default GET-parameter "&perspective=", a WARNING "User pimcore is not allowed requested perspective ." is logged. But as seen a few lines above, this is not stated as a request for a new perspective. "Perspective for user {user} was not requested." as debug log makes sense here which is logged after this change.

    Additionally, fixed wording in a warning log-message.

    opened by ferdinand-it 0
  • #11144: adding cache invalidation for classification store KeyConfig

    #11144: adding cache invalidation for classification store KeyConfig

    Pull request as per issue #11144

    @brusch , as suggested I've created a static method to separate the cache key creation logic as per your given example. The cache keys for the classification store keys are now calculated using this method.

    @weisswurstkanone , I've implemented the same for the GroupConfig, however, the GroupConfig did not use caching on behalf of the group name but just the id. So the current cache invalidation stays the same. Does it probably make sense to enable the same caching on behalf of the group name as it is done with the KeyConfig or was it left out on purpose?

    Thank you

    opened by awroblewski 0
  • Set Layout properties to internal

    Set Layout properties to internal

    Splitting from https://github.com/pimcore/pimcore/pull/10824

    I think these attributes should be internal. It should be used the getter and setter. There are only public to send it to JavaScript.

    opened by blankse 0
  • FIX: invisible fields saved incorectly when fieldcollections swap places

    FIX: invisible fields saved incorectly when fieldcollections swap places

    Problem was occurring when swapping 2 fieldcollections inside object swap places using arrows. Problem was only occurring if user saves(auto save is also causing this) and then publishes object. Resolves #11201

    opened by BabovicT 0
  • Add test env files/folders to .gitignore

    Add test env files/folders to .gitignore

    Splitting from #10737

    If you execute the setup environment script .github/ci/scripts/setup-pimcore-environment.sh it should be no files for versioning.

    opened by blankse 0
  • [Bug]: Set test database

    [Bug]: Set test database

    Expected behavior

    the given test database is used

    Actual behavior

    the develop database is used

    Steps to reproduce

    COMPOSER_MEMORY_LIMIT=-1 composer create-project pimcore/skeleton ./projectname Open composer.json and add

    "config": {
        "preferred-install": {
          "pimcore/pimcore": "source",
          "*": "dist"
        }
    }
    

    remove vendor/pimcore folder composer update pimcore/pimcore ( see https://github.com/pimcore/pimcore/issues/10226 ) composer require codeception/codeception --dev ./vendor/bin/pimcore-install follow pimcore steps: https://pimcore.com/docs/pimcore/current/Development_Documentation/Development_Tools_and_Details/Testing/Application_Testing.html#page_Codeception create ./env.test and set vars:

    ###> symfony/framework-bundle ###
    APP_ENV=test
    
    #TRUSTED_PROXIES=127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16
    #TRUSTED_HOSTS='^(localhost|example\.com)$'
    ###< symfony/framework-bundle ###
    
    PIMCORE_TEST=true
    DB_HOST=mysql
    DB_USER=root
    DB_PASS=root
    DB_NAME=clean_demo_test
    DB_PORT=3306
    DB_DRIVER=pdo_mysql
    DB_VERSION=8.0
    PIMCORE_TEST_DB_DSN=mysql://root:[email protected]/clean_demo_test
    DATABASE_URL=mysql://root:[email protected]/clean_demo_test
    DB_NAME_TEST=clean_demo_test
    

    open file ./tests/codeception.dist.yml edit params

    params:
        - ../.env.test
    

    open file: ./config/packages/test/config.yaml either hardcode params or set via env dbal: { connections: { default: { host: localhost, port: 3306, user: root, password: root, dbname: clean_demo_test, mapping_types: { enum: string, bit: boolean }, server_version: 5.5.5-10.6.4-MariaDB } } }

    create file: ./config/config_test.yaml

    imports:
        - { resource: services.yaml }
        - { resource: 'test/' }
    
    pimcore:
    framework:
    
    

    create ./config/test/database.yaml insert: dbal: { connections: { default: { host: localhost, port: 3306, user: root, password: root, dbname: clean_demo_test, mapping_types: { enum: string, bit: boolean }, server_version: 5.5.5-10.6.4-MariaDB } } }

    run command: PIMCORE_TEST_DB_DSN="mysql://root:[email protected]/clean_demo_test" vendor/bin/codecept run -c tests/codeception.dist.yml

    develop db is used... a issue was already created but not this extended and it was closed https://github.com/pimcore/pimcore/issues/10232#issuecomment-1018486844

    Bug 
    opened by LeonNoBears 0
  • [Improvement]: default value for preview config

    [Improvement]: default value for preview config

    Resolves #11245

    opened by dturopoli 1
  • [Improvement]: default value for preview config

    [Improvement]: default value for preview config

    Improvement description

    Currently, the preview config in the documentation looks like this:

    public function getPreviewConfig(\Pimcore\Model\DataObject\Concrete $object): array {
        return [
            [
                'name' => '_locale',
                'label' => 'Locale',
                'values' => [
                    'English' => 'en',
                    'German' => 'de'
                ]
            ],
            // Omitted ...
        ];
    }
    

    It would be great to also be able to define a defaultValue, like so (pseudo-code):

    public function getPreviewConfig(\Pimcore\Model\DataObject\Concrete $object): array {
        return [
            [
                'name' => '_locale',
                'label' => 'Locale',
                'values' => [
                    'English' => 'en',
                    'German' => 'de'
                ],
                'defaultValue' => 'en'
            ],
            // Omitted ...
        ];
    }
    

    This feature is especially helpful, when using locales to generate the preview as it allows us to pre-select the locale based on some logic (e.g., the user's locale).

    Improvement 
    opened by passioneight 0
  • Feature: quicksearch, load list on search, data on hover

    Feature: quicksearch, load list on search, data on hover

    Splitted loading of a list and data objects data loading. Initial request size is now 10-15kb instead of 400 on demo project. After that on first hover is send request to get data object data and every that request is also around 10kb in size. Resolves #11216

    opened by BabovicT 0
  • FIX: forbidden conditions on search

    FIX: forbidden conditions on search

    This code is never triggering because of if statements always being false. Also wrong column was being used in setting condition if user doesn't have permission for certain type.

    Bug 
    opened by BabovicT 0
Releases(v10.2.9)
Owner
pimcore
Creator of the Content & Product Management Framework Pimcore
pimcore
Open Source eCommerce Platform on Symfony

Sylius is an Open Source eCommerce platform on top of Symfony. The highest quality of code, strong testing culture, built-in Agile (BDD) workflow and

Sylius eCommerce 6.6k Jan 14, 2022
An open source eCommerce plugin for WordPress.

Welcome to the WooCommerce repository on GitHub. Here you can browse the source, look at open issues and keep track of development. We recommend all d

WooCommerce 7.6k Jan 23, 2022
Free, open-source, self-hosted CMS platform based on the Laravel PHP Framework.

October is a Content Management System (CMS) and web platform whose sole purpose is to make your development workflow simple again. It was born out of

October CMS 10.8k Jan 14, 2022
Free, open-source, self-hosted CMS platform based on the Laravel PHP Framework.

Winter is a Content Management System (CMS) and web platform whose sole purpose is to make your development workflow simple again

Winter CMS 824 Jan 19, 2022
A Free and Opensource Laravel eCommerce framework built for all to build and scale your business.

Topics Introduction Documentation Requirements Installation & Configuration License Security Vulnerabilities Miscellaneous Introduction Bagisto is a h

Bagisto 4.2k Jan 17, 2022
πŸ›’Solidus, Rails eCommerce System

Solidus A free, open-source ecommerce platform that gives you complete control over your store. Visit our website: https://solidus.io/ Read our Commun

Solidus 4k Jan 13, 2022
CoreShop - Pimcore eCommerce

CoreShop - Pimcore eCommerce CoreShop is a eCommerce Platform for Pimcore. Requirements Pimcore 6.6 Installation Install with composer composer requir

CoreShop 217 Dec 23, 2021
πŸš€ Open source Node.js Headless CMS to easily build customisable APIs

API creation made simple, secure and fast. The most advanced open-source headless CMS to build powerful APIs with no effort. Try live demo Strapi is a

strapi 42.3k Jan 12, 2022
ApostropheCMS is a full-featured, open-source CMS built with Node.js that seeks to empower organizations by combining in-context editing and headless architecture in a full-stack JS environment.

ApostropheCMS ApostropheCMS is a full-featured, open source CMS built with Node.js that seeks to empower organizations by combining in-context editing

Apostrophe Technologies 3.8k Jan 19, 2022
ProcessWire 3.x is a friendly and powerful open source CMS with a strong API.

Welcome to ProcessWire 3.x This document is in Markdown. An HTML formatted version of this document can be read at: https://github.com/processwire/pro

ProcessWire 732 Jan 16, 2022
Subrion CMS - open source php content management system.

Subrion CMS What is Subrion? Subrion is a Content Management System (CMS) which allows you to build websites for any purpose. Yes, from blog to corpor

Intelliants 267 Oct 15, 2021
Simple Open-Source CMS for designers

A simple open-source CMS for designers. No knowledge of PHP required at all. Take any HTML/CSS template and make it CMS enabled in minutes. Just drop

CouchCMS 298 Jan 5, 2022
Contao Open Source CMS

About Contao is a powerful open source CMS that allows you to create professional websites and scalable web applications. Visit the project website fo

Contao 219 Jan 21, 2022
Build a digital writing community.

WriteFreely is free and open source software for building a writing space on the web β€” whether a publication, internal blog, or writing community in t

WriteFreely 2.5k Jan 17, 2022
PHP Script to sell your digital goods. Deliver bought files to your customers, give support for the purchases, create licenses and more!

Open eShop 2.7.0 Description With this new PHP script you will be able to start selling any digital goods, such as MP3s, eBooks, Movies, Software, or

null 49 Dec 4, 2021
Modern, Crazy Fast, Ridiculously Easy and Amazingly Powerful Flat-File CMS

Grav Grav is a Fast, Simple, and Flexible, file-based Web-platform. There is Zero installation required. Just extract the ZIP archive, and you are alr

Grav 13.1k Jan 20, 2022