| Summary | Lets authorized users duplicate calendar events/topics (created via Discourse Calendar and Events ) into a new time period. Works on a single topic or a whole tagged series (e.g. every topic tagged `grand-prix`), with a review step to edit proposed dates before committing. | |
| Repository Link | GitHub - louking/discourse-event-duplicator: discourse plugin to duplicate events · GitHub | |
| Install Guide | How to install plugins in Discourse |
Summary
This plugin was built for a running-club community whose calendar is largely the same events happening every year on a shifted date. Recreating each event’s topic by hand every season meant duplicating the [event ...] block, fixing the title, and hunting down which ones were already redone. That was tedious and error-prone. Event Duplicator automates it: pick a source event, or a whole tagged series of them, get a proposed new date, review or edit it, and confirm.
See docs/USAGE.md for a full user-facing walkthrough: who can use it, duplicating a series vs. a single topic, how the review step works.
Features
- Series duplication: pick a category and one or more tags (e.g.
grand-prix,signature-race; matches are OR’d and deduplicated, so a topic with multiple matching tags only shows up once), optionally restricted to a source date range, then review proposed next-occurrence dates before confirming. - Single-event duplication: the same review-and-confirm flow for one topic at a time, from that topic’s admin menu (wrench icon).
- Editable review step: each row shows the original start date next to a proposed new one you can edit (day granularity), plus an editable title. The end date is always derived automatically from the source event’s own duration, so it can’t drift out of sync with an edited start date.
- Two pluggable date-shift strategies, selectable per run with a configurable default:
- Same calendar date: shift by exactly one year.
- Nth weekday of month: preserve e.g. “3rd Saturday of the month” even when that’s a different day-of-month next year.
- “Date TBD” flagging: for events whose real-world date isn’t settled yet, flag a row. A configurable annotation (default
(date TBD)) gets appended to both the topic title and the event name. - Duplicate tracking: prevents re-duplicating the same event twice (relevant since a topic can carry more than one series tag). Already-duplicated topics are flagged and unselected by default in review, with an explicit re-check-the-box override to force it anyway. Deleting a duplicate topic automatically frees its source up for re-duplication, and undeleting re-locks it.
- Post-duplication feedback: successfully duplicated rows turn into a link to the new topic right in the review table. Genuine failures are reported per row instead of aborting the whole batch.
Requirements
- discourse-calendar must be installed and enabled. This plugin duplicates events by going through discourse-calendar’s own
[event ...]post markup andDiscoursePostEvent::Eventmodel instead of inventing separate date storage. - Tested against Discourse 2026.7.0. Not verified on earlier releases.
Configuration
All settings are under Admin → Settings → Plugins, search for event_duplicator:
| Setting | Default | Description |
|---|---|---|
event_duplicator_enabled |
off | Enables the plugin. |
event_duplicator_allowed_groups |
staff | Groups (in addition to normal per-category topic-creation permission) allowed to duplicate events. Note: an empty list means nobody, not everyone. Add the “everyone” group to fully open this up. |
event_duplicator_default_date_strategy |
Same calendar date | Default date-shift rule; overridable per run. |
event_duplicator_tbd_annotation |
(date TBD) |
Text appended to a duplicated topic’s title/event name when flagged TBD in review. Leave blank to disable the annotation feature entirely. |
Authorization is an AND of three checks: normal Discourse category permissions, membership in event_duplicator_allowed_groups, and discourse-calendar’s own permission to create [event] posts at all.
Known limitations
- The review step’s date editing is day-granularity only (no time-of-day editing). That’s a deliberate scope decision: the target use case is recurring race/event dates, not times.
Source / issues
- GitHub: GitHub - louking/discourse-event-duplicator: discourse plugin to duplicate events · GitHub
- Issues/feature requests: Issues · louking/discourse-event-duplicator · GitHub
- Backend (RSpec) and frontend (QUnit) test suites are both included and run in CI on every push/PR.

