totalcms/cms
TotalCMS is a Laravel CMS package for adding content management to your application, helping you manage pages and site content within a familiar Laravel workflow. Use it to build customizable, database-backed CMS features.
Upgrade with composer update and then run the new server checker before anything else:
php artisan tcms check # human-readable, admin-utility order
php artisan tcms check --json # for CI / deploy gates (exits 1 on fatal install issues)
php artisan tcms check --config # merged config with secrets redacted
tcms check covers bundle integrity, license, directory permissions and required/optional PHP extensions — gate deploys on its exit code rather than on a smoke-test page load. Pair it with tcms info (which now reports the real domain) and schema:lint, which after 3.6.2 also warns when a schema lists a password property in index.
Then work through the 3.6.2 upgrade notes in this order, because they are behavioural and silent if skipped:
read from auth, playground, mailer, automations, Site Builder pages and data views./feed/rss/{collection} until Publish RSS Feed is enabled in its settings.First real use case: a blog collection using the new markdown or styledmarkdown field, rendered with |markdown, with the RSS Feed card filled in and a draft Hidden Field.
Content authoring with Markdown fields. Two fields store the same string, so you can migrate a schema between them without a data transformation:
markdown — CodeMirror source editor (plain textarea where CodeMirror isn't loaded), toolbar, preview, split fullscreen; uploads insert Markdown links.styledmarkdown — the Tiptap visual editor constrained to Markdown-expressible syntax, with a source mode and preview. Content it can't round-trip (raw HTML, comments, footnotes, abbreviations, linked images) opens in source mode and prompts before switching to visual.Render both with |markdown in templates. Set htmlclean: true only if you actually want the sanitizer — by default these fields trust the stored source, unlike code.
RSS as a collection setting, not a URL contract. The canonical feed is /feed/rss/{collection}. Build filtered variants with include, exclude, limit, name and description — this is what the Feeds utility generates. Put title, content, date, author, media, link, image and language on the collection's RSS Feed card; URL-supplied mappings are now ignored. The Hidden Field (default draft) is the only supported way to influence which objects appear, and it applies to every schema.
API and MCP write paths. Treat passwords as write-only:
PUT that omits the password key preserves the stored hash, so GET-then-PUT round trips are safe.update_object now merges like patch_object; don't rely on full-replace semantics, since agents never see password or binary values.index — index rebuilds won't store them and schema:lint will complain.Front-end auth. Sign-in and password reset now match the email address exactly. In your own forms, stop branching on the error text: both unknown address and wrong password return Invalid login credentials, and inactive/expired/login-limited states only surface after a correct password. Pass cms.form.loginForm({ showRememberMe: false }) (or the whitelabel login option) to drop the persistent-login checkbox for shared or kiosk devices.
Bulk mailer integration. /api/action/mailer/bulk, /preview and /objects now require a session or API key whose access group grants mailer. POST /api/action/mailer stays public for front-end form actions, so split your server-side sends onto a keyed client and leave only the form-action call anonymous. Use the template's Send History card (sent/failed/skipped/pending, test sends flagged) instead of building your own audit trail.
Admin customisation. Any custom admin page or Stacks Admin Core page must call cms.adminAssetsHead(); it now emits the Sentry snippet itself, scoped with allowUrls to Total CMS assets and dashboard pages.
include/exclude in the URL used to disable draft filtering, for blogs too. If you depended on that, set a different Hidden Field on the collection instead.index, but run schema:lint and rebuild indexes to confirm. Read permissions no longer decide hash exposure; nothing exposes it.allowHTML: false. A relational or list field whose option labels contain markup (or that a deck label pattern points at) will render stripped. Opt back in per field with allowHTML: true only after checking the source is sanitized.code fields and fields with htmlclean off remain the sharp edges.tcms check runs in the CLI's PHP. Extension and opcache/cache rows can legitimately differ from a web request; the output says so. Don't use it as a substitute for a page-level health check.styledmarkdown will not rewrite untouched fields, but switching an edited field to visual mode asks for confirmation. In bulk-import or API-driven workflows, prefer markdown to avoid the source/visual conversation entirely.--config flag gives you a redacted merged config for diffing between environments; cms.form.loginForm options and the whitelabel login options are the supported hooks for login UI changes rather than overriding the view.How can I help you explore Laravel packages today?