LydiaCMS is a modular CMS built on Nette that I have been developing and maintaining since 2020. This website also runs on LydiaCMS.
By the Numbers
Since 2020 — continuously developed and maintained
19 independently versioned modules, including Core, Data, Integration, API, and Backup
800+ / 250+ core test methods and Playwright E2E tests
26 custom PHPStan and Rector rules
Key Technical Decisions
Metadata-Driven Administration
With over a hundred entities, manually building forms, data tables, and filters would result in a significant amount of boilerplate code. Instead, I automatically generate standard administration components, such as forms and data tables, from Doctrine ORM metadata. I only write custom code for interfaces and components that require specific functionality.
Composer-Based Modular Architecture
I structured LydiaCMS into independent modules distributed as Composer packages. Modules are registered through Nette DI, allowing each project to include only the components it needs. Every package has its own repository and version, so I can develop and release modules independently.
When a URL slug changes, LydiaCMS stores the previous URL and automatically redirects it to the current address using a permanent redirect.
Code Quality and Automation
The core is covered by more than 800 unit and integration test methods, while the demo application is verified by over 250 Playwright E2E tests. I use PHPStan at its maximum strictness level, extended with project-specific rules. I automate recurring refactoring tasks with Rector. Package releases and application deployments are automated through GitLab CI/CD.
AI-Powered Administration
By implementing MCP, I can manage LydiaCMS administration directly from ChatGPT, Codex, Claude, or Claude Code. Because the integration uses the open MCP protocol, I am not tied to a single provider and can connect other AI tools that support MCP.
Each request is executed under a dedicated administration user account with only the permissions required for the task. All changes are recorded in an audit log, allowing me to review and, when necessary, revert them.
This allows me to use AI for actual content management without granting it unrestricted access to the administration interface or database.
AI and Security · lydiacms-api
Technical Stack
LydiaCMS is a server-side application built with PHP 8.5, Nette, Latte, and Tracy. The data layer uses Doctrine ORM integrated through Nettrine. Independently versioned Composer packages work together as a modular monolith at runtime.
Data and Integrations: Doctrine ORM · Nettrine · Migrations · Fixtures · Symfony Workflow · Flysystem · REST/MCP API
Code Quality: Nette Tester · PHPStan · Rector · ECS · PHP-CS-Fixer · Playwright
What I Would Do Differently Today
LydiaCMS started as a sandbox project and gradually evolved into a complete system. Building it gave me hands-on experience with software architecture, data modeling, access control, administration interfaces, testing, automation, and deployment.
At the same time, I learned the cost of maintaining a custom solution. In addition to features required by individual websites, I also maintain general-purpose infrastructure that existing platforms already provide.
Today, I would probably avoid building an entire CMS from scratch. I would first evaluate existing headless CMS platforms and extend them where necessary. I would also design a more loosely coupled, API-first architecture, allowing the administration interface, public-facing website, and integration APIs to evolve independently.
I would only build custom solutions where existing platforms could not meet specific requirements.
I do not consider LydiaCMS a mistake. It fulfilled its original purpose and gave me experience I would not have gained by simply combining existing components. However, with what I know today, I would be more selective about what is worth building from scratch and what is better to adopt and extend.
Try It Out
The public-facing part of LydiaCMS is available at cms.krejciradek.cz.
The lydiacms-demo repository contains a Docker Compose setup, sample data, and automatic creation of an administrator account with a randomly generated password.
The Core module remains a private Composer package, so running the demo locally requires a deploy key, which I can provide upon request.
The source code for the other packages is available on GitLab and GitHub.