formatsoft / content-reminder
Content Reminder - Reminders for TYPO3 pages: due dates, recurrence, assignment and archive to keep content up to date
Package info
github.com/format-gmbh/content-reminder
Type:typo3-cms-extension
pkg:composer/formatsoft/content-reminder
Requires
- php: ^8.2
- typo3/cms-backend: ^13.4 || ^14.0
- typo3/cms-core: ^13.4 || ^14.0
- typo3/cms-dashboard: ^13.4 || ^14.0
Requires (Dev)
- phpstan/phpstan: ^2.1
- typo3/cms-scheduler: ^13.4 || ^14.0
- typo3/cms-setup: ^13.4 || ^14.0
- typo3/testing-framework: ^9.3
Suggests
- typo3/cms-scheduler: Runs the command content-reminder:send-weekly-mail daily for the weekly email; task "Table garbage collection" cleans up old archive entries
Provides
None
Conflicts
None
Replaces
None
README
Reminders attached to TYPO3 pages – with due date, optional recurrence, responsible person and an archive of completed tasks – so that editorial content such as prices, seasonal notes or contact persons stays up to date.
| Extension key | content_reminder |
| Composer | formatsoft/content-reminder |
| TYPO3 | 13.4 LTS, 14.x |
| PHP | 8.2 – 8.5 |
| License | GPL-2.0-or-later |
Screenshots
Page module – reminders due for you above the content elements; the page tree marks pages with due reminders (pencil: due for you, person: due without responsible person):
Backend module Content → Reminders – all reminders of a page and its subpages, with filters and actions:
Dashboard – preset Content maintenance with the reminder widgets:
Features
- Reminders on pages with title, notes, optional due date (empty = due now) and a responsible backend user. Reminders are language independent.
- Recurrence: every n days, weeks, months or years. The next due date is counted from the day of completion; month ends are handled correctly (31 Aug + 6 months = 28/29 Feb).
- Archive: every completion is logged with date, person and optional comment. The archive survives the deletion of pages and reminders.
- Page tree: a pencil icon marks pages with reminders that are due for you, a person icon marks pages with due reminders nobody is responsible for.
- Page module: a panel above the content elements shows your due reminders with the actions Done, Take over, Edit and Pause, plus links to all reminders of the page and to the completion history.
- List module: filter Only mine / Only due and row actions Done, Take over, Resume, Reopen and Completion history.
- Dashboard: widgets My reminders, All reminders, Without responsible person, Overdue, Recently completed, a counter and a status chart – and the dashboard preset Content maintenance.
- Backend module Content → Reminders with page tree: all reminders of the selected page and its subpages (or of all accessible pages), filtered by person and state, with actions – and the archive of completions, filtered by person and period.
- Weekly email: on a configurable weekday every responsible person gets one email per site with their overdue reminders and those due within the next days (German or English, depending on the user's backend language). Users can opt out in their user settings.
- Outdated content (optional, disabled by default): reminders Outdated content – please review are created automatically for pages whose content has not been changed for a configurable number of months.
Installation
composer require formatsoft/content-reminder
Then update the database schema, e.g.:
vendor/bin/typo3 extension:setup -e content_reminder
Optionally add the site set Content Reminder (formatsoft/content-reminder)
as a dependency of your site to configure the extension per site.
Permissions
Permissions are based on standard TYPO3 access rights; there is no separate permission management. Administrators may do everything. For editors, set up the backend user group as follows:
- Table permissions (tab Record Permissions, field Table permissions): set the table Reminder to Read (see reminders) or Read & Write (create, complete, take over, edit reminders).
- Page permissions (module Permissions): users need Show page to see the reminders of a page and Edit content to create, complete or take over reminders on it. The pages must be part of the group's mounts (tab Mounts: DB Mounts in TYPO3 v13, Page Tree Entry Points in v14).
- Custom options (tab Module Permissions, field Custom module
options, section Content Reminder), both optional:
- Assign reminders to other users – assign reminders to colleagues and change the responsible person
- Manage all reminders – edit, complete and delete reminders of others
- Modules and widgets (tab Module Permissions):
- Allowed modules: the backend module Reminders (below Web in TYPO3 v13, below Content in v14)
- Allowed dashboard widgets: the widgets of the group Content Reminder
The page tree markers, the panel in the page module and the filters and actions in the list module need no additional permission.
In the table, read access means table permission Read and page permission Show page; write access means Read & Write and Edit content. All actions require at least read or write access to the page.
| Action | Allowed for |
|---|---|
| See reminders and completion history of a page | read access |
| Create a reminder for oneself / unassigned | write access |
| Assign a reminder to somebody else, change the responsible person | Assign reminders to other users |
| Take over an unassigned reminder | write access |
| Take over a reminder assigned to somebody else | Assign … or Manage all … |
| Give a reminder back (unassign) | responsible person, Assign …, Manage all … |
| Edit, pause, resume, reopen | creator, responsible person, Manage all … |
| Mark as done | responsible person; anybody with write access if unassigned; Manage all … |
| Delete | creator, Manage all … |
The rules are enforced for every write access through the DataHandler (editing form, list module, clipboard, API). If a reminder is assigned to a person without access to the page, it is saved with a warning.
Configuration (site settings)
Add the site set Content Reminder (formatsoft/content-reminder) as a
dependency of your site to edit these settings in the backend.
| Setting | Default | Description |
|---|---|---|
contentReminder.assignableGroups |
empty (all) | Comma-separated list of backend user group uids whose members can be assigned |
contentReminder.backendUrl |
derived from site base | Backend URL for links in emails, e.g. https://example.org/typo3. Required if the site base has no domain (e.g. /). |
contentReminder.mail.enabled |
true |
Send the weekly email for this site |
contentReminder.mail.weekday |
monday |
Weekday of the weekly email |
contentReminder.mail.lookaheadDays |
7 |
Reminders due within this number of days are included in addition to overdue ones |
contentReminder.mail.fromAddress / fromName |
system default | Sender of the weekly email |
contentReminder.mail.unassignedRecipient |
empty | Address that receives the reminders without responsible person; empty = not mailed |
contentReminder.stale.enabled |
false |
Create reminders for outdated content, see below |
contentReminder.stale.months |
24 |
Pages without changes for this number of months are outdated |
contentReminder.stale.excludePages |
empty | Comma-separated page uids whose subtrees are not checked |
contentReminder.stale.limit |
50 |
Maximum number of new reminders per run, oldest pages first |
Weekly email
The command content-reminder:send-weekly-mail sends the emails. Run it
daily, e.g. with the scheduler task Execute console commands: each site
is processed on its configured weekday and at most once per day.
# What would be sent (ignores weekday and "already sent today") vendor/bin/typo3 content-reminder:send-weekly-mail --dry-run --force # Send now for one site vendor/bin/typo3 content-reminder:send-weekly-mail --site=main --force
Recipients are the responsible persons with a valid email address who have
not opted out (User settings → Do not send me the weekly email with due
reminders). Reminders without responsible person are sent to
contentReminder.mail.unassignedRecipient, if set.
Outdated content
Optionally, the extension creates a reminder Outdated content – please
review for pages whose content has not been changed for a long time. The
function is disabled by default; enable it per site with
contentReminder.stale.enabled and run the command e.g. weekly with the
scheduler task Execute console commands:
# Which pages are outdated (also for sites where the function is disabled) vendor/bin/typo3 content-reminder:create-stale-reminders --dry-run # Create the reminders for one site, at most 10 vendor/bin/typo3 content-reminder:create-stale-reminders --site=main --limit=10
- Last change of a page is the latest change date of all records stored on it: content elements including translations, file references and records of other tables. Changes of the page properties do not count.
- Checked are standard pages that are neither hidden nor excluded – via the
site setting
contentReminder.stale.excludePages(subtrees) or the option Do not check for outdated content in the page properties (single page; the field must be allowed for editors in Allowed fields). - The reminder has no responsible person and no due date, so it is due immediately and appears in the page tree, the dashboard and the weekly email (for unassigned reminders).
- No new reminder is created while one is open on the page. Completing it counts as a review: the page is only checked again after the configured number of months, even if nothing was changed.
- Deleting the reminder does not count as a review: it is created again with the next run. To exclude a page permanently, use the page property Do not check for outdated content. Only administrators and users with Manage all reminders may delete these reminders.
- The texts are created in the default language of the site (German or English).
Archive cleanup
The archive table tx_contentreminder_reminder_log is registered for the
scheduler task Table garbage collection, based on the completion date. The
default retention is 2 years (730 days); it also applies if a task cleans
up all tables. For a different retention, create a task for
tx_contentreminder_reminder_log only and set Delete entries older than
given number of days.
The archive is deliberately not listed in Maintenance → Clear persistent database tables, which empties tables completely.
Translations
The extension ships English and German labels. Further languages are translated on Crowdin as part of the TYPO3 translation server and installed as language packs via Maintenance → Manage Language Packs. Contributions are welcome.
Labels are added and changed in the English source files only
(Resources/Private/Language/*.xlf, Configuration/Sets/*/labels.xlf); a
GitHub workflow uploads them to Crowdin on every push to main.
Development
Dependencies for the tests are installed into .Build/ of the extension:
composer install composer phpstan composer test:unit
PHPStan runs on level 8. Code that differs between TYPO3 v13 and v14 is listed in
Build/phpstan/version-compatibility.neon; run the analysis against both versions.
Functional tests need a database user that may create databases, e.g. in DDEV:
typo3DatabaseDriver=mysqli typo3DatabaseHost=db typo3DatabaseUsername=root \ typo3DatabasePassword=root typo3DatabaseName=ft_content_reminder \ composer test:functional
To test against TYPO3 v13 instead of the latest version:
composer update --with "typo3/cms-core:^13.4" --with "typo3/cms-backend:^13.4" --with "typo3/cms-dashboard:^13.4" --with "typo3/cms-scheduler:^13.4" --with "typo3/cms-setup:^13.4"
License
GPL-2.0-or-later, see LICENSE.txt.


