[Backlog] Campaign templates and cloning #125

Open
opened 2026-07-14 19:56:48 +00:00 by claude-bot · 0 comments
Contributor

Context / Motivation

Research/product brief. GMs starting a new campaign (or a one-shot) redo the same setup: scheduling modes, reminder offsets, timezone, wiki category skeleton, recurring arc structures. Cloning an existing campaign's structure without its history turns that into one click.

Spec (starting sketch)

Implementation rides the existing export/import machinery: export_campaign (webapp/backend/app/routers/campaigns.py:2580, EXPORT_SCHEMA_VERSION = "7" at :2566, complete lossless data.json) and import_campaign (services/import_service.py:71, SUPPORTED_SCHEMA_VERSIONS at :40). Add a "structure-only" export flavor (query param or export option) that emits the same schema with history stripped, then clone = structure-only export → import in one server-side action.

Structure-only contents:

  • Campaign settings: scheduling modes, reminder_offsets_minutes, timezone, notification config (minus guild/channel ids — prompt to re-link Discord)
  • Wiki: category skeleton + GM-selected entries (checkbox tree; default none — world bibles are the use case)
  • Arcs/threads: copied as templates with status reset (planned / unresolved, no session links)
  • Member list: optional (default off)
  • Excluded always: sessions, transcripts/summaries, attendance, votes, journals, analytics, platform message ids

"One-shot mode" preset: a built-in template selectable at campaign create — single tentative session, minimal ceremony (reminders trimmed to 24h, no arcs/threads), naming prompt.

UI: "Clone campaign" on the campaign settings page (GM) and "Start from template" on campaign create.

Out of scope

  • A template marketplace/registry.
  • Cross-instance template sharing (see open questions — depends on export-format stability).

Open questions

  • Sharing templates between instances: the structure-only zip is already portable via the normal import endpoint — is that enough, or does a first-class "import as template" UX matter?
  • Does structure-only bump EXPORT_SCHEMA_VERSION, or ride the same version with a "structure_only": true flag in data.json? (Leaning flag — importers ignore missing history naturally.)
  • Should cloned wiki entries keep cross-links (relationships) among the selected subset only?

Acceptance criteria (for when this is pulled)

  • Clone produces a campaign with identical settings/skeleton and zero sessions/history; source campaign untouched.
  • Structure-only zip imports on a fresh instance via the standard import path.
  • One-shot preset creates a ready-to-schedule single-session campaign in one step.

References

  • webapp/backend/app/routers/campaigns.py:2566 (EXPORT_SCHEMA_VERSION), :2580 (export_campaign, covered tables enumerated at :2598-2731)
  • webapp/backend/app/services/import_service.py:40 (SUPPORTED_SCHEMA_VERSIONS), :71 (import_campaign)

Filed from the July 2026 full-project review.

## Context / Motivation Research/product brief. GMs starting a new campaign (or a one-shot) redo the same setup: scheduling modes, reminder offsets, timezone, wiki category skeleton, recurring arc structures. Cloning an existing campaign's **structure without its history** turns that into one click. ## Spec (starting sketch) **Implementation rides the existing export/import machinery**: `export_campaign` (`webapp/backend/app/routers/campaigns.py:2580`, `EXPORT_SCHEMA_VERSION = "7"` at `:2566`, complete lossless `data.json`) and `import_campaign` (`services/import_service.py:71`, `SUPPORTED_SCHEMA_VERSIONS` at `:40`). Add a **"structure-only" export flavor** (query param or export option) that emits the same schema with history stripped, then clone = structure-only export → import in one server-side action. **Structure-only contents**: - Campaign settings: scheduling modes, `reminder_offsets_minutes`, `timezone`, notification config (minus guild/channel ids — prompt to re-link Discord) - Wiki: category skeleton + GM-selected entries (checkbox tree; default none — world bibles are the use case) - Arcs/threads: copied as templates with status reset (`planned` / unresolved, no session links) - Member list: optional (default off) - **Excluded always**: sessions, transcripts/summaries, attendance, votes, journals, analytics, platform message ids **"One-shot mode" preset**: a built-in template selectable at campaign create — single tentative session, minimal ceremony (reminders trimmed to 24h, no arcs/threads), naming prompt. **UI**: "Clone campaign" on the campaign settings page (GM) and "Start from template" on campaign create. ## Out of scope - A template marketplace/registry. - Cross-instance template sharing (see open questions — depends on export-format stability). ## Open questions - Sharing templates **between instances**: the structure-only zip is already portable via the normal import endpoint — is that enough, or does a first-class "import as template" UX matter? - Does structure-only bump `EXPORT_SCHEMA_VERSION`, or ride the same version with a `"structure_only": true` flag in `data.json`? (Leaning flag — importers ignore missing history naturally.) - Should cloned wiki entries keep cross-links (relationships) among the selected subset only? ## Acceptance criteria (for when this is pulled) - Clone produces a campaign with identical settings/skeleton and zero sessions/history; source campaign untouched. - Structure-only zip imports on a fresh instance via the standard import path. - One-shot preset creates a ready-to-schedule single-session campaign in one step. ## References - `webapp/backend/app/routers/campaigns.py:2566` (`EXPORT_SCHEMA_VERSION`), `:2580` (`export_campaign`, covered tables enumerated at `:2598-2731`) - `webapp/backend/app/services/import_service.py:40` (`SUPPORTED_SCHEMA_VERSIONS`), `:71` (`import_campaign`) _Filed from the July 2026 full-project review._
Sign in to join this conversation.
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
rbrooks/Quest-Board#125
No description provided.