Project structure

Project structure

Below is a map of the directories and what each is responsible for. Understanding this structure is half the battle when working on the engine.

core/        CMS core (framework, domain-agnostic)
modules/     Built-in CMS modules
plugins/     Plugins (extensions)
templates/   Themes (appearance)
public/      Public static files (served directly by nginx)
storage/     Transient data (cache, logs, uploads, sessions)
config/      Configuration (app.php, database.php, cache.php)
bin/         CLI commands (bin/celena)
index.php    Front entry point
admin.php    Admin entry point
install.php  Install wizard
.env         Environment (DB credentials, keys)

core/ — the core

Folder/filePurpose
Autoloader.phpPSR-4 autoloader
Kernel.phpApp bootstrap, container, services
Container.phpDI container (reflection-based auto-resolution)
Config.phpLoads .env and config/*.php files
Http/Router, Request, Response, middleware
Database/Connection, QueryBuilder, Schema, Blueprint, MigrationRunner
Template/Engine, Compiler, TagRegistry, template tags
Plugin/Hook, PluginManager, Installer, Marketplace
Security/Auth, Csrf, Permission, Filter, RateLimiter
I18n/Locale, Translator
Support/utilities (Markdown etc.)
Mail/, Queue/, Cache/, Ai/mail, queue, cache, AI integration

modules/ — built-in modules

The CMS's base functionality. Each module is a folder under modules/ with controllers in the Celena\Module\<Name>\ namespace.

AdminBase, Dashboard, Users, Pages, News, Categories, Media, Menus, Comments, CustomFields, Settings, Plugins, Seo, Search, Translations, Account, Webhooks, Banners, Docs, Ai, Cities.

plugins/ — plugins

Extensions you can enable/disable. The structure of one plugin:

plugins/<slug>/
├── manifest.json     metadata (required)
├── plugin.php        entry point: routes, hooks, tags (required)
├── src/              PHP classes (PSR-4 Celena\Plugin\<Slug>\)
├── migrations/       DB migrations
├── templates/        plugin .tpl (admin and front)
├── languages/        translations ru.json/en.json/…
├── assets/           CSS/JS → copied to public/assets/plugins/<slug>/
└── docs/             plugin Markdown documentation

Details — Building a plugin.

templates/ — themes

Each theme is a folder with theme.json and a set of .tpl files. The active theme is stored in the theme option. On celena.io the active theme is celena-agency. Details — Creating a theme.

public/ — public static files

nginx serves these files directly, bypassing PHP:

public/assets/
├── admin/      admin CSS/JS
├── runtime/    shared front-end (celena.js, celena.css)
└── plugins/<slug>/   plugin assets (auto-copied from plugins/<slug>/assets/)

storage/ — transient data

storage/
├── cache/tpl/    compiled templates (.php)
├── cache/data/   data cache, rate-limit
├── logs/         logs
├── uploads/      uploaded files
└── sessions/     session files
storage/ lives outside the publicly served path — its contents are not served directly.

config/ and .env

  • config/app.php — name, environment, locale, sessions.
  • config/database.php — connection parameters (read from .env).
  • config/cache.php — cache driver.
  • .env — secrets for a specific installation (NOT in the repository): DB credentials, API keys. Locally — PostgreSQL, in production — MySQL; the code is cross-database.