Guides: the learning path
This page is the table of contents of the guides. Read it if you are new to Exponential, or if you know the system and want the shortest way to one result.
Warning
.htaccess slows down every request. When .htaccess files are enabled (AllowOverride anything but None), let alone
used, Apache looks for them and reads and evaluates them on every request, in every directory of the path, and
page loading times go up drastically (measured). The only real fix is to switch the feature off for
the virtual host: AllowOverride None in the HTTPS virtual host, and the rules in the virtual host's own
configuration as mod_rewrite rules. That is far faster in production speed tests and well worth the time it takes
to optimize a production configuration. Switch over right away: copy the rules of the
example HTTPS virtual host into your virtual host (with the static cache, also
staticcache_offload.conf), set AllowOverride None, run apachectl configtest, reload Apache and
test the site. The same rules for other servers: nginx, LiteSpeed,
Caddy, IIS, Velocity (built in); where virtual host rules go in a control
panel: Plesk, cPanel, DirectAdmin, ISPConfig.
On LiteSpeed or OpenLiteSpeed, the server's own page cache can also answer anonymous visitors and crawlers without PHP: Page caching with LiteSpeed and OpenLiteSpeed.
A guide is a tutorial. You follow it from top to bottom and need no prior knowledge. At the end you have a working result: an installed site, a published page, a changed template, a site behind a real web server, a cache cleared on purpose. Every step is a command or a click path, with the output to expect. Where a topic needs more depth, the guide links to the feature page, the specification or the upgrade note.
In short
- Start with Getting started. Ten to fifteen minutes gives you an installed site, a login and a first template change.
- Then pick your road below: editors, site builders, developers or operators.
- Stuck on a word? The glossary explains every term in one line and links to the page that teaches it.
- Want to know why something is the way it is? The history tells the story month by month.
Check your setup in two minutes
These commands only read. Run them from the root of the installation (the directory with console, index.php and
settings/). Add --allow-root-user to a command that refuses to run as root.
./console --versionExpected: the first line reads console (Exponential) 6.0.15stable. Below it are the version, the build, the
number of extensions, the web server and the PHP version, and at the end the line
Written by the Exponential Foundation and 7x (se7enx.com).
./console list expExpected: the list of commands of the exp: family, one line each (exp:cache, exp:install, exp:ini,
exp:maintenance, exp:velocity and many more). ./console help <command> explains any one of them.
./console exp:cache clear --all --dry-run --allow-root-userExpected: the list of caches that a real clear would empty, ending in a line that starts with
DRY RUN PASS and names the number of caches. Nothing is cleared.
./console exp:maintenance status --allow-root-userExpected: the line Maintenance is off. on a normal site.
If the first command fails, you are not in the installation root, or PHP is missing. Getting started says what is needed.
The guides
Read them in this order the first time. Each one also stands on its own.
| Guide | You finish with | Time |
|---|---|---|
| Getting started | An installed site, the administrator login, a first page, a first template change | 10 to 15 minutes |
| The content model and editing content | A content class, an object, the sub-items table, the trash, a content job | 30 minutes |
| Templates and design | The design you use, the template that wrote a piece of a page, an override you can undo, the admin4 design | 15 minutes |
| Converting templates between template engines | One template or a whole design converted between Exponential templates (.tpl) and Smarty templates (.stpl) with exp:template:convert: every option, the output and exit codes, the marker that keeps hand edits, the override settings, the same from PHP | 15 minutes, plus the reference |
| The three template engines compared | .tpl, .stpl and .twig side by side: what each is, which to choose, mixing them in one design, converting between them | 10 minutes |
| Twig templates: a first .twig, step by step | An override rule that points at a .twig, the node's attributes, operators, a translation, a fetch, a loop, a condition and an include | 30 minutes |
| Twig templates | How a .twig is found and rendered, setup, variables and write-back, operators, fetch, loops, functions and includes, translations, caching, errors, Velocity and the limits | 15 minutes, plus the reference |
| Twig templates: operators and fetch functions | Filter or function, the prefix exp_, the operators that run in PHP, fetch(), settings and translations, the helpers the converter writes | 15 minutes |
| Twig templates: operator reference | The operators of the kernel, the template library and the standard extensions with their filter and function forms and input | reference |
| Twig templates: template functions and tags | The *_view_gui functions, block functions as tags, the exp tags, includes between engines, Twig's own tags | reference |
| Twig templates: caching | The cache layers, {% expcacheblock %} and its parameters, the whole page in one block with a fresh user menu, compiled templates | 15 minutes |
| Twig templates: performance (Speed) | What makes .twig fast, cached and uncached pages measured on Apache and Velocity with their load, the performance guard, measuring your own pages | 20 minutes |
| Twig templates: the converter and porting a design | tpl-to-twig and twig-to-tpl with real output, what each construct becomes, files changed by hand, notes, checking | 20 minutes |
| Twig templates: migrating a design | A design moved to .twig: a siteaccess of its own, converted, checked, compared page by page, kept in step | 1 hour plus the checks |
| Twig templates: troubleshooting and FAQ | The messages with their cause and fix, a change that does not show, Twig not found, the questions asked most | reference |
| Twig templates: writing operators and functions | An operator and a template function of your own that work in .tpl, .stpl and .twig | 20 minutes |
| Twig templates: security and escaping | The sandbox and its lists, what it refuses, escaping with wash, autoescape, what a template can reach | 15 minutes |
| Writing Twig-native templates for Exponential | Template inheritance together with override rules, include, embed and expinclude, macros, filters, functions and tests, autoescape and |raw, whitespace control, the sandbox, the variables each template sees | 30 minutes |
| Twig templates: recipes | A page layout, a line view, a layouts block, a mail template, cache blocks per role and per user, a form with the form token, texts with a count, images in an alias | reference |
| Debugging Twig templates | Errors found before a page does, the message in the page read line by line, template path comments, the debug bar, the Twig profile, Twig's debug mode, a change that does not show | 20 minutes |
| Twig templates in your editor | Syntax highlighting and file endings, what an editor's Twig checks cannot know, exp:template:check in the editor, formatting, snippets | 15 minutes |
| Twig templates: versions, upgrades and compatibility | Which Twig runs on which PHP and what Composer installs, Twig missing, upgrading Twig, PHP and Exponential, Velocity | 15 minutes |
| Speed of the three template engines | Twig, Smarty and Exponential templates measured cached, uncached and with the debug output, with the conditions of every run, where a request spends its time, what is in progress, and how to repeat it | 20 minutes |
| Checking template syntax | exp:template:check for .tpl, .stpl and .twig: targets, levels, output formats, baselines, CI and hooks, every rule (reference) | 15 minutes, plus the reference |
| Smarty templates: a first .stpl, step by step | A siteaccess of your own, a folder page rendered by Smarty through an override rule, with variables, operators, a fetch with paging, a loop, a .stpl and a .tpl include and a value handed to the pagelayout | 40 minutes |
| Smarty templates | Smarty 5 checked, a first .stpl on a page through an override rule, variables, objects, includes, loops, template functions and blocks understood, the caches and the errors read; with operators and fetch functions and the converter and porting a design | 15 minutes, plus the reference |
| Smarty templates: operator reference | Every operator of the installation and its extensions with its .stpl form, whether it needs exp_, how it takes its input and an example | reference |
| Smarty templates: template functions and blocks | Every bridged function and block, the exp* tags and blocks with their parameters and namespaces, Smarty's own tags that matter | reference |
| Smarty templates: caching and performance | Every cache a .stpl page meets, {expcacheblock} keys and expiry, a whole page cached with the visitor's parts kept fresh, what expires what, pages measured | 20 minutes |
| Smarty templates: performance (Speed) | Why .stpl pages are faster than .tpl and how they got there: the first slow version profiled, every fix with its reason, the numbers on Apache and Velocity, the whole page in one cache block with per-visitor placeholders, honest measuring, a checklist and the pitfalls | 30 minutes |
| Smarty templates: migrating a design | A design moved from .tpl to .stpl: planned, converted, its notes read, every page compared with the original, the differences fixed, the two kept in step | 1 hour plus the checks |
| Smarty templates: troubleshooting and FAQ | Every message of the bridge and of Smarty with its cause and fix, the problems without a message, the questions asked most | reference |
| Smarty templates: writing operators and functions | An input operator, a param operator and a template function of your own that work in .tpl and .stpl, registered and tested | 30 minutes |
| Smarty templates: security and escaping | wash against Smarty's escape and raw, values from visitors printed safely, what Smarty can reach, the form token, what never goes into a cache block, a review checklist | 15 minutes |
| Extensions | An extension found, installed, switched on and configured; one of your own built and released | 45 minutes |
| The Extensions page | Extensions activated, deactivated and put in order in one list, the changes reviewed with their risks and applied, the written and the real loading order told apart | 10 minutes |
| Documenting an extension | README.md and INSTALL.md on top of the extension, every other page as Markdown (.md) in its doc/, in English; the pages in the help center with order, titles and context help; an old plain-text document turned into Markdown | 20 minutes |
| Deploying | The site served by Apache with PHP-FPM, by Velocity or by FrankenPHP, with HTTPS | 30 minutes |
| Setting up .htaccess and config.php from the console | .htaccess and config.php copied from their templates with a backup and no silent overwrite, a config.php setting read, set and removed without an editor, the files compared with the new templates after an upgrade | 10 minutes |
| Operating a site | The right caches cleared, cronjobs running, static cache and preload on, a backup, a checklist | 30 minutes |
| System information | Which server answered and how it runs PHP, the health checks read and acted on, the overview cards understood, a masked report downloaded for support, the same from the command line | 15 minutes |
| Caches | Every cache read in its group with what it holds, its size and when it was last cleared, one cache, a group or all cleared with the confirmation that names what goes, Velocity's response cache and restart understood, the same from a shell | 15 minutes |
| Benchmarking | Pages measured cached and rendered, Apache against Velocity, a code change and a deploy checked for regressions, the CI performance check understood | 30 minutes |
| Cronjobs | Every part and script seen, a part and one script run and followed from the browser, the crontab lines installed, the logs read, the usual problems solved | 30 minutes |
| Preloading caches | A site warmed from Setup > Preload and from the shell, a dry run read, a run followed and its broken links and image aliases read, the cron line installed, the address of a siteaccess checked | 15 minutes |
| Host static sites on GitHub Pages with Exponential 6.0.15+ | A free public copy of a site: a target set up, a build, a dry run, a preview below the repository's path, the link check, the push to a Pages branch, the commands in CI | 20 minutes |
| Static publishing: repositories and credentials | The target's folder as its git repository, one commit and tag per publish, a token or deploy key that never reaches a command line or log, waiting pushes sent again | 20 minutes |
| Static publishing: history and rollback | The publishes of a target, and an earlier one back online as a new commit and tag, the history kept | 10 minutes |
| Static publishing: dynamic features | What a static copy cannot do and its fallbacks, the search index and page, the form endpoint, redirect pages, publishing on content publish and on a schedule | 20 minutes |
| Static publishing: SSH deploy keys | A key for one repository made by Exponential, its private half in the secret store, its public half on the git host | 10 minutes |
| Static publishing: an overview for administrators | Targets, builds, publishes, history and triggers; what an installation needs; a checklist for switching it on | 10 minutes |
| Static publishing: custom domains and DNS | A copy at your own domain: CNAME, the DNS records, the DNS check, HTTPS | 15 minutes |
| Static publishing: CI and GitHub Actions | The commands in a CI job, the Pages workflow explained line by line, the starter template | 20 minutes |
| Static publishing: troubleshooting | Symptoms of settings, builds, pushes and GitHub Pages, with cause and fix | 10 minutes |
| Static publishing: limits and GitHub terms | The size limits checked before each push, a smaller build, which sites belong on GitHub Pages | 10 minutes |
| Static publishing for multisite installations | One target per siteaccess and language, shared credentials, policies per target | 15 minutes |
| Static publishing on Windows and clusters | git, paths and line endings on Windows, building on one cluster node, Velocity | 10 minutes |
| From static cache to static publishing | The two features compared, which to use, moving a site over | 15 minutes |
| Develop in public, publish free | Tutorial: the code in a public repository, content in Exponential, the copy on GitHub Pages, publishing by itself | 30 minutes |
| A static blog with Exponential | Tutorial: posts, paging, search and new posts published by themselves | 30 minutes |
| A static documentation site | Tutorial: search, sitemap, redirects from old addresses, a link check, publishing with every release | 30 minutes |
| From an existing static HTML site to Exponential and back to static | Tutorial: design and content moved in, old .html addresses redirected, the same address kept | 60 minutes |
| User management from the console | Accounts listed, inspected, created, changed, disabled, enabled and removed with exp:user; passwords reset without one on a command line; registrations approved; the same in scripts with --format=json | 20 minutes |
| Page caching with LiteSpeed and OpenLiteSpeed | The page cache of a LiteSpeed or OpenLiteSpeed server switched on for anonymous visitors and crawlers without a plugin, from .htaccess, the virtual host or a control panel; a hit seen in the headers, a signed-in request seen never to be one, pages purged, the usual problems solved | 20 minutes |
| Workflows | An approval before publishing set up with its trigger, every waiting process read in words on Setup > Workflow processes, the workflow cronjob checked, a stuck process cancelled safely, the triggers and workflow groups read and a group removed knowing what goes with it | 30 minutes |
| Maintenance mode | The site taken offline for a window with a message, an expected end and testers let through, the preview checked, the site brought back from the page and from a shell, the usual lock-outs solved | 20 minutes |
| Security and audit | The hardening checked, roles that give only what is needed, the audit trail read, debug output for your address only | 30 minutes |
| Two-step sign-in | A code from an authenticator app or by e-mail after the password: set up by a user, turned on or required by the owner, a lost phone handled, social login buttons | 15 minutes |
| Passkeys | A passkey added, named and removed on My account, a sign-in with the button or the browser's autofill, a lost device handled; the settings, the table and how a passkey is checked | 15 minutes |
| Verify it's you | The question before sensitive actions: the five groups and their rules, content switched on under Setup, a rule added for an extension's view, what happens to the request, where it is never asked | 15 minutes |
| The settings page | Where every INI value comes from read on Setup > Ini settings with its override chain, a setting found in every file, two siteaccesses compared, a value changed and seen in effect on PHP-FPM and Velocity, secrets kept masked | 20 minutes |
| RSS feeds | Every export and import read on the redesigned RSS page with its address, sources, items and last run, the import cronjob checked, a feed removed knowing what it means for its readers | 20 minutes |
| View count statistics | Page views counted from the access logs for one site, for siteaccesses with logs of their own and for many siteaccesses in one log; why the cronjob was rebuilt for multi-site use, a dry run read, rotation, robots and the upgrade from the earlier cronjob | 20 minutes |
| Class groups | Every class group read with its classes and objects, what removing a group would remove known before it is ticked, a group removed safely | 15 minutes |
| Datatypes | Every datatype of the kernel and the extensions read with its provider, class and flags, how much of the content uses it, one datatype with its templates, classes and nodes, and content whose datatype nothing registers found and repaired | 15 minutes |
| Sections | Sections understood and seen on the redesigned pages, one created, content assigned to it, a role limited to it, a template overridden for it, an unused one removed, the usual problems solved | 30 minutes |
| Roles, policies and unactivated users | Every role read with what it gives and to whom, its policies as sentences, a role built with limited policies and put in order by drag and drop, assigned to a group, and unfinished registrations activated, mailed again or removed | 25 minutes |
| Approving new editor accounts | The approval of new editor accounts set up or checked with adduserapproval.php, an editor's new account followed from the request to the mail with its link, approved and denied in the administration, the refused move and the audit records read, who approves what changed in the workflow event | 15 minutes |
| The administration design switch | The designs a user may choose for their own session set up, an installed or extension design added with its fallback chain, the switch tool in every offered design, uiswitch/design given to a role, the switch tested and the usual problems solved | 20 minutes |
| Packages | Every repository and package read on Setup > Packages with its install state, size and dependencies, the installer's own packages recognised, a package downloaded in the classic or the JSON format, an upload validated before it is accepted, a package installed in the background or as drafts, a package removed knowing what goes | 20 minutes |
| Classic menus | Whether Design > Menus (classic) matters for your siteaccess or Layouts does, the four arrangements and what each lists, five recipes with their exact lines, classic menus drawn from templates of your own | 20 minutes |
| Sessions | Who signed in recently and who is signed in now, the session handler understood, sessions searched, sorted and removed safely without signing yourself out | 15 minutes |
| Your devices and sessions | Every device signed in to an account read with its browser, place and sign-in method, one device or all others signed out for good, the e-mail about a new device turned off or on, a user signed out everywhere by an administrator | 10 minutes |
| Bookmarks | Your bookmarks read grouped by folder with their state, found, ordered and paged, moved between folders by selecting or dragging, a folder renamed and removed knowing what happens to what is inside, the usual problems solved | 15 minutes |
| Versions of an object | The versions of an item read by status, translation and creator, two compared, a new draft made from an old one in the translation chosen, versions removed knowing what stays, who sees what | 15 minutes |
| My drafts and my pending items | Your drafts found by translation, class and age and removed one by one, by selection or when old, your pending versions read with what holds them, the versions waiting for your approval opened | 10 minutes |
| Collected information | The forms that collected found and sorted, their collections read and exported as CSV, collections removed after an export, the usual problems solved | 15 minutes |
| PDF exports | A PDF made of a part of the content tree, generated once or on the fly, downloaded and regenerated from the list, its form filled in without errors, an export removed knowing which file goes with it | 15 minutes |
| Links, URL aliases, wildcards and search statistics | Broken and unchecked links found with the objects that use them, links marked by hand, a global alias and a wildcard created and tried, the search phrases that find nothing read, the usual problems solved | 30 minutes |
| URL maps: import, export and undo | A file of old addresses previewed row by row and imported as one batch, an import undone from the history, the URL map exported, the redirects with a query listed and removed | 15 minutes |
| Object states | A state group with its states, ordered and translated, content moved between states one by one and by subtree, roles that read, edit and set states by stage, a review workflow, the usual problems solved | 30 minutes |
| Changing owners | The owner of one object and of a subtree changed from the administration after a preview, the same on the command line with --dry-run, the extension's guides found | 10 minutes |
| Notifications: running them and fixing problems | The notification cronjob set up, the status page read, a run tried without sending mail, the usual problems solved | 30 minutes |
| Notifications: architecture, extending and testing | A custom event type and handler that mail an address, a test that keeps mail in files | 45 minutes |
| E-mail preferences: setting them up and running them | The footer and links set up, the status page read, a request to stop mail, an export and an erasure handled, the gate tested without sending | 30 minutes |
| E-mail preferences: categories, the mail gate and testing | A category of your own with a handler for older data, mail through the gate, a test that keeps mail in files | 30 minutes |
| Content languages | A language added with the searchable picker, shown by a siteaccess through SiteLanguageList, content translated into it, content moved out of a wrong language, a language removed without losing anything | 30 minutes |
| Remote services and apps | Services called from the shell and from Python, a personal API token, a portal front end | 20 minutes |
| Personal API keys | A key made on the site with only the scopes it needs, REST called with it from curl and Python, a key rotated and revoked; as an administrator: keys allowed for a role, every key seen and revoked, the audit read | 20 minutes |
| A front end on the GraphQL API, step by step | The GraphQL API switched on in one command, a key for a front end, a Next.js, Nuxt, Astro, HTML or Expo project generated from the site's schema, its queries stored and cached, the mutations switched on | 20 minutes |
| GraphQL recipes | A blog or news front end, a mobile app, a static build and an AI agent on the GraphQL API, with queries proven on the demo content | 15 minutes |
| REST API v1 and v2: one extension | Which URL answers at v1 and v2 from the one ezprestapi extension, a client authenticated with OAuth2 or a key, the API called with curl, rest.ini read, an installation moved off the deprecated ezprestapiprovider | 20 minutes |
| Upgrading | An installation of 4.x, 5.x or an earlier 6.0.x moved to the current 6.0 line, and checked | 20 minutes for a small site |
| Upgrading with the console | The state of every upgrade step read, a dry run, the upgrade applied with a backup in one call, a failure resumed, drift found, the same from a pipeline | 15 minutes |
| Contributing to expcomponents | A fix to one of the kernel's libraries (the fork of the Zeta Components) cloned, tested on every supported PHP version, committed with its ChangeLog entry and offered as a pull request; how releases, versions and upstream syncs work | 30 minutes, then the fix |
| Upgrade steps for extensions | A table, a column and a default row of an extension made upgrade steps, registered, tested fresh, old, twice and half applied | 30 minutes |
| The upgrade check | The files and the database compared with the release on Setup > Upgrade check, every kind of finding read and dealt with, the report downloaded, the same check run from a shell | 15 minutes |
| Migrations | What a migration is and when to use one, the life cycle from writing to pushing, where files live, order, environments, the record, transactions, the lock, every default and switch | 15 minutes |
| Migrations: a first PHP migration, step by step | Two PHP migrations generated, filled in, checked, simulated, run, recorded, one taken back with its down(), a failure restored from its caption | 20 minutes |
| PHP migrations | The class, plan(), up(), down() and detect(), the context, references, transactions, failure, maintenance mode, events, extensions, tests | reference |
| YAML migration steps | The kernel's step types: content in several languages, locations, versions; identifiers, workflows, which steps undo themselves, a step type of your own | reference |
| Migrations: SQL and settings | Tables, columns, indexes and rows on every engine, SQL files per engine and for MongoDB, what is not transactional, INI migrations and settings steps with their backups | reference |
| Migrations: rollback and captions | The captions of a run, their reuse, the automatic restore after a failure, a run, one migration or any caption taken back by hand | 15 minutes |
| Migrations: the migrations repository | The status file and run log, the site or a separate repository, one run one commit and tag, failed pushes and the cronjob part migrationpush | 10 minutes |
| Migrations: generators and recording changes | Your own changes or every change of the site recorded as the steps of a migration, at the kernel's operation level and without personal data; the commands, Setup > Migrations > Recording, the events and the steps they become | 15 minutes |
| Migrations: packages, deploys and long runs | The migrations a package ships and when they run, the kickstarter's run, exp:velocity deploy --migrate, runs in parts and paced, PHP migrations in batches with a checkpoint, runs in the queue of expqueue | 15 minutes |
| Migrations: deploying to remote installations | exp:migration:deploy to one or many remotes at once and in sync: remotes and credentials by name, ssh, sftp, rsync, FTP, preflight and verification on all, all-or-nothing switch and rollback, status and history | 15 minutes |
| Migrations: engines and performance | On which engines every family of the migration engine is tested (SQLite, MySQL/MariaDB, PostgreSQL, MongoDB), how to run the matrix and how CI does, the time and memory of 1,000 migrations, a large data step and a long run with checkpoints | 10 minutes |
| Migrations: troubleshooting | Every message of the migration commands, what it means and what to do | reference |
| Migrations in the help center | The hub: 25 recipes (tables, classes, content in bulk, roles, settings, testing, CI and deploy), pages per audience, the FAQ and troubleshooting by symptom | reference |
| Missing files and image aliases | Files missing from the storage and stale image aliases found below a node with the target "Missing files" of the broken relations, each row read and resolved after a preview (regenerated, restored, uploaded again, its reference removed or marked for review), the same from a shell with a dry run first | 15 minutes |
| Finding an error by its reference | The log lines of a failed request found from the ERR- reference its error page showed, the rest of the request and the audit of that minute read, the same from a shell, without exposing personal data | 10 minutes |
Road 1: editors
You write and manage content in the administration interface.
- Getting started: sections 4 to 6 (see the site, first login, first content).
- The content model and editing content: classes, objects, the online editor, the sub-items table, multi-node edit, the trash, content jobs.
- Depth, when you need it:
- The sub-items table: options and columns and list paging
- Editing several items at once
- Online editor: TinyMCE 8
- The trash: who deleted it and where it was
- Large operations as content jobs
- Exponential Intelligence: the writing assistant that writes drafts in the Intelligence tab, the edit form and Vector
- Exponential Layouts: arranging pages from layouts, zones and blocks in the layout editor
- Object states: setting a stage such as In review or Approved on content
- PDF export, Translations and languages, Content languages (the guide)
- Your e-mail preferences: which e-mail you get, one-click unsubscribe, your data
- Store dashboard and order receipts if you run a shop
Road 2: site builders
You shape how the site looks and which extensions it uses.
- Getting started: section 7 (first template change, by click path and by file).
- The content model and editing content: the model your templates render.
- Templates and design: find the template, override it, check it, switch the admin design.
Depth:
- Template path comments: see which file wrote which markup
- Template editor and override order
- Smarty templates:
.stpltemplates in Smarty 5 next to.tpl, their operators and a whole design converted; start with the tutorial; look things up in the operator reference, functions and blocks and troubleshooting; keep pages fast with caching and performance and performance (Speed), safe with security and escaping; move a design with migrating - The Exp Debug bar
- Exponential Admin UI: the Admin UI look for the administration, as its own
adminuisiteaccess - Choosing the administration design: admin4l, admin4, AdminUI or the classic design per user and session, and its guide
- Exponential Layouts: blocks, zones and rules built in the browser
- Extensions: find, install, switch on and configure an extension. Depth:
- What a new installation comes with, the extension list, loading order
- Changing settings from the command line, multi-site INI overrides
- Request rules, robots.txt
- Roles and policies in order, hidden admin tabs, object states (stages such as draft, in review and approved that roles respect)
- One page per extension: extension index
Road 3: developers
You write extensions, templates with logic, commands and integrations.
- Getting started, then the settings tool: exp:ini.
- Extensions, section 6 and 7: build an extension by hand or with the RAD wizards, and release it.
Its documentation: Documenting an extension (README.md and INSTALL.md on top, the rest as Markdown in
doc/). Extension points (RAD): RAD tools, the extension points, the extension surface, RAD security. - Commands, cronjobs and module views as classes: Commands, cronjob parts and module views and the specification; Console.
- Metadata and services: Remote services and apps (the guide), Personal API keys (REST with a key), Extension metadata, Backend services over ezjscore.
- Notifications: architecture, extending and testing, the specification, the INI reference, the commands. E-mail preferences: categories, the mail gate and testing, the specification, the commands, the law checklist.
- Tests and compatibility: Continuous integration, PHP 8 support.
The kernel's libraries (
ezc*classes): Exponential Components and Contributing to expcomponents. Changes to a site's database and content in code: Migrations, starting with the tutorial, then PHP migrations and the file format. - Bridges to the Symfony platform: Legacy bridge, the platform repositories.
Road 4: operators
You run the installation: servers, caches, backups, upgrades, security.
- Getting started, then Deploying and Operating a site.
- Install on purpose: Install in one command, Kickstarter for repeatable installs, .htaccess and config.php from the console, SQLite, MongoDB.
- The web server: Velocity web server, its control panel, HTTPS certificates, engines compared, FrankenPHP.
- Caches and speed: cache control, HTTP caching, SQL query cache, static cache, preload, benchmark, the guide Benchmarking and, on LiteSpeed or OpenLiteSpeed, Page caching with LiteSpeed and OpenLiteSpeed.
- Keep it healthy: notifications (the cronjob, the status page, troubleshooting), e-mail preferences (the footer, consent, suppression, retention), maintenance mode, repair from the browser, file consistency check, missing files and image aliases, cronjobs, the log viewer and finding an error by its reference, workflows and their waiting processes, audit trail.
- Security: Security and audit (the guide), User management from the console, Two-step sign-in, Passkeys, Verify it's you, Security defaults of September 2026, the August 2026 patches, the 6.0.13 hardening.
- Upgrading: follow Upgrading; read the 6.0.15 changelog, then the behaviour changes of July and August, 16 to 30 September and October, in that order. A site's own changes arrive as migrations: Migrations, rollback and captions, the migrations repository.
Related pages
- A word you do not know: Glossary.
- What changed and why: History; proof that nothing is missing: Coverage.
- Release notes: changelogs of 6.0 and of the extensions.
- The installation text in one place: INSTALL.
Become an Exponential Partner
Partners share their information, provide funding, contribute back and develop the products with us, and that is how Exponential grows. A partner website and dashboard are planned for mid-2027: please become a partner today to speed up our growth rate and land new features faster.