camindo

News

camindo CMS

Enterprise Content Management System - written in modern PHP, runs on almost any LAMP stack, effortless installation and updates with Composer.

composer create-project camindo/project mysite

For editors

One way of working for all content · Simple user interface · Comprehensive documentation · Find across all content areas · Hundreds of records with one click · …

For administrators

Content areas instead of database tables · Every content area fully equipped · Real data types, fast queries · One field name, one meaning · Link instead of maintaining twice · …

For template programmers

Encapsulated functionality · Compiled, not interpreted · A lean command language, PHP whenever you need it · Lists in just a few lines · Several content areas in one list · …

For server/system administrators

Argon2id with pepper · Signed rights tables · Key rotation via CLI · Encrypted fields · Two-factor authentication in the backend · …

Screenshots

Release Notes 9.1.3

New features

  • The sign-in form now asks only for the backend language. Set the date format and time zone after signing in, in the personal settings. Values you saved earlier are kept when you sign in.
  • Templates can be moved via the context menu of the list. Target areas are grouped by instance.
  • The installer can also read the database and admin passwords from files (CAMINDO_DB_PASS_FILE, CAMINDO_ADMIN_PASS_FILE), for example from Docker secrets. A file takes precedence over a value set directly.
  • The installer, status and the start page warn when the database server has no time zone tables.
  • CMS:NUMBER now outputs “0” when the value is 0. If the source is empty, the output stays empty unless prefix, suffix or ifempty is set. “-0” is never output.

Bug fixes

  • When the database server has no time zone tables, camindo CMS now still uses the correct UTC offset.
  • Date input now reads the offset correctly on PHP 8.4.27 and newer as well as on older versions. For patterns without an era field (e.g. ar_SA with ICU 78), the matching variant is used.
  • The loading spinner stays visible until the content of its own request has been displayed. Background requests no longer remove it early.
  • Auto-growing text areas keep the scroll position of the layer. After Ajax requests they only change size when their content or width has changed.
  • On small screens the sign-in dialog has a limited height and its content can be scrolled.