Skip to content
Docs
WebsiteDownload
Plugins

Modules

The admin itself is a set of modules, built exactly like plugins. Switch off what a site doesn't need.

On this page

Lettern has no separate "core admin". Every screen you use, from the content lists and the entry editor to users, settings and the Dashboard, comes from a module: a package inside letterncms/cms, built exactly like a plugin.

A module registers its abilities, permissions, settings, sidebar items and screens through the same public API you use, and nothing else knows it by name. So you can switch off the ones a site doesn't need, and read any of them to learn how to build your own.

#The modules

ModuleWhat it addsCan be off
letterncms/adminThe admin itself: its frame (sidebar, command palette, sign-in), design tokens and the primitives in @letterncms/uiNo
letterncms/contentEntry lists and the entry editor, drafts, publishing, history, search; one sidebar item per collectionNo
letterncms/accountEach person's Account (profile and language, password, two-factor sign-in, API tokens) and, once a site turns them on, visitor accounts on the siteNo
letterncms/settingsThe settings pages (one per namespace in the settings sidebar, or a Settings tab on a plugin's own screen) and the settings/* abilitiesNo
letterncms/packagesThe Plugins screen (Installed, Store, Updates), updates and the packages/* abilitiesNo
letterncms/licenseChecks the keys of paid plugins, and adds the Licenses tab of Plugins and the license/* abilities once one is on. It never touches the public site. letterncms/packages needs itNo
letterncms/workspaceThe workspace: threads at the right edge of the admin, for commands, search and an agent when there is oneNo
letterncms/mediaThe media library: uploads, folders, alt text, focal points and responsive imagesNo
letterncms/navigationMenus, edited with drag and drop and kept in sync when pages moveNo
letterncms/emailEmail for Lettern and its plugins: SMTP, sendmail or log, provider plugins, branded templates and a delivery logNo
letterncms/dashboardThe Dashboard: a greeting and the widgets each person arrangesYes: the admin opens on the first pinned sidebar item
letterncms/collectionsThe Collections screen: creating collections and editing their fieldsYes: collections stay as content/collections/*.yaml
letterncms/globalsGlobal sets, their fields and /api/v1/globals/<handle>Yes
letterncms/usersUsers (Team, Visitors, Sign-Up, Profile Fields), invitations and RolesYes: accounts and config/roles.yaml keep working
letterncms/auditThe Audit Log: who changed what, when, from whereYes: nothing is written
letterncms/blocksThe block editor, components, templates, styles, data bindings and Block MarkdownYes, while nothing that builds on it is on (Site, Forms and Commerce do)
letterncms/siteThe design system, templates, rendering, previews, publishing the static site, search and the starter kitYes, for a headless site, while no plugin that builds on it is on (Commerce does)
letterncms/languagesLanguages: translations linked to their original, localized URLs, hreflang and the language switcherYes
letterncms/collaborationCollaboration: who else is on a page, comments with @mentions, and the inboxYes
letterncms/mcpThe MCP server: every ability as a tool for AI clients, signed in with OAuthYes

The required modules are what Lettern needs to keep working: without them there is no admin, and nobody could edit content, secure their account, change a setting or switch a module back on. Everything else is yours to remove. A site with only the required modules and no plugins is a complete, very small CMS.

#Switch a module off

Modules are part of Lettern, not plugins: the ones that can be off are under Plugins โ†’ Built In, each with its switch. Or switch one off with php cms plugin disable letterncms/audit, the packages/disable ability (and back on with packages/enable), or in config/plugins.yaml:

YAML
enabled:          # plugins that run
  - letterncms/forms
  - letterncms/seo
disabled:         # modules that don't
  - letterncms/audit
  - letterncms/collaboration

Modules are on unless they're listed under disabled; plugins are on when they're listed under enabled.

A module others need can't be switched off before them: letterncms/collections needs letterncms/content, and letterncms/blocks stays on while Site, or a plugin that builds on it, is on. Data is kept, so when you switch a module back on, its items return to the places admins gave them.

#Configure a module

A module's options are a settings namespace like any plugin's, listed in the settings sidebar:

ModuleSettings
letterncms/auditKeep Entries For (days; 0 keeps them forever) and Also Record Reads, on the Audit Log's Settings tab
letterncms/usersRoles and their permissions, under People
letterncms/accountVisitor accounts, on the Sign-Up tab of Users
letterncms/dashboardNone of its own: the default Dashboard for everyone is saved with Customize โ†’ Save as Default on the Dashboard
letterncms/emailHow email is sent, under Email (config/email.yaml)
letterncms/mediaUpload size, image quality, AVIF and photo metadata, on the Settings tab of Media
letterncms/languagesThe site's languages and their URLs, under Languages (config/languages.yaml)
letterncms/siteThe favicon and Publishing (static site, rebuilding on publish, search index), under General (config/site.yaml); the look itself in the Design System

The content module has no settings. Entries per page (50), the autosave delay (1.2 seconds) and the revisions kept per entry (100) are fixed; a plugin can change the revisions kept with the revisions.keep filter.

Values a screen needs reach every admin user through the manifest, under config.<namespace> (useConfig('license') in @letterncms/sdk); the settings themselves stay behind settings.manage.

#Who registered what

While a package registers and boots, it's the current scope, so the abilities and settings it adds record it as their owner (package in abilities/list and settings/list). That's how a plugin's row in Plugins knows which settings to open.

#Build one

A module is a plugin that ships with Lettern: the same composer.json (type: cms-plugin), the same provider (extends Cms\Packages\Plugin), the same admin module. Only three things differ:

  • It lives in modules/ of letterncms/cms.
  • "required": true in extra.cms marks the ones that may not be switched off.
  • It doesn't have to bring a Dashboard widget, as every plugin must. Most do anyway.

If you know how to write a plugin, you know how to write a module. Read modules/audit (a provider, one ability, one screen, one setting) next to Your first plugin.

The admin module provides almost no screens of its own: it's what the others draw in. It only talks to them through the manifest, the SDK and the UI kit, so each can change without the rest.