← Ecosystem

JoeCMS

cms.giorgiopalermo.com coming soon

The PHP CMS the other projects run on: an open source engine that had been idle for years, brought back to life on PHP 8 and turned into a package you install from the browser.

The problem

Every new project started from the same foundations: users, permissions, email, languages, cache, admin. The engine I had worked on for years, VGallery, was stuck on PHP 7 and would not even start on PHP 8: constructs removed from the language and hundreds of calls on null values that had become fatal errors.

The alternatives were a generic CMS bent to fit every project, or a framework to rebuild everything on. I chose to recover the engine: a conservative migration that reproduces PHP 7 behaviour instead of rewriting it, and an installer that turns a ZIP archive into a working site.

How it works

Structure

Content is made of typed nodes with dynamic fields: there is no table per content type, and adding one is configuration, not code. Around it sit declarative XML routing, token-and-block templates, and an admin with grids and forms generated from the database.

Usage flow

You unzip the package into the site folder and open the browser. A ten-step wizard checks the requirements, creates the database, sends a test email, collects the company details and leaves a multilingual site already populated, with legal pages, robots.txt and Apache rules bound to the real domain.

Technical choices

Conservative fixes instead of rewrites, on a codebase without tests: casts and guards, and a lint after every bulk change. The installer is independent of the framework, because it has to run when the CMS cannot start yet. A fatal error becomes a 500 page with a code to look up in the logs, never a file and line on screen.

Known limits

It is an engine with almost twenty years of history: it lives with a few duplicated framework classes and inherited parts left inert. The new content management area is still in development, and full validation on hosting other than mine is yet to be completed.

Numbers

PHP files at the starting point, approx. 14,400
Files fixed in the PHP 8 migration 913
Tables in the schema 218
Installation wizard steps 10
Configurable third-party integrations 31
Languages in the base package 4

Stack

  • PHP 8
  • MySQL / MariaDB
  • Apache
  • SCSS
  • JavaScript
  • Linux
Screenshot of JoeCMS

JoeCMS derives from VGallery (GPL-3) by Alessandro Stucchi.