Skip to content

Content Timeline System

Overview

The Content Timeline System is the core organizational feature of the Progressive World-Building Platform. It provides a structured way for creators to plan, track, and reveal world-building content over time. Each timeline update represents a themed content release -- such as "Session 1: The Blood Moon" or "Chapter 3: The Siege of Ironhold" -- that bundles related items into a cohesive unit with sections, items, and sub-items.

For creators (Owners, Storytellers, Co-Creators), the timeline is a planning and tracking tool. It answers: what content exists, what is being worked on, what is still just an idea, and what has been retired. For consumers (Players, Viewers), the timeline is a roadmap showing what has been published and what is available to explore.

The system supports a full content lifecycle through its development status model. Content moves from early concepts through active development into published availability, and eventually into a legacy archive. Combined with drag-and-drop reordering, color-coded themes, and pending item placeholders, the timeline provides a flexible but structured framework for managing creative projects of any scale.

Goals

  • Provide a hierarchical content organization system (Timeline Update > Section > Item > Sub-Item)
  • Support a clear development lifecycle for content (Concept > In Development > Published > Legacy)
  • Enable drag-and-drop reordering at every level of the hierarchy
  • Allow creators to signal upcoming content via pending item placeholders
  • Enforce role-based visibility so Players and Viewers only see published content
  • Support color-coded timeline updates for visual theme categorization
  • Enable linking published items to external content (URLs to blog posts, wiki pages, sessions)
  • Provide bulk status operations for efficient content management

User Stories

Game Master / Storyteller

  • As a GM, I want to create a timeline update for each game session so I can track what content was introduced when
  • As a GM, I want to organize items into sections (e.g., "NPCs Introduced", "Locations Revealed") so content is easy to find
  • As a GM, I want to mark items as "pending" so my players see that something is coming without knowing what it is
  • As a GM, I want to change an item's status from In Development to Published when I reveal it in a session
  • As a GM, I want to bulk-publish all items in a section after a session concludes

Writer

  • As a writer, I want to create timeline updates for each chapter or arc so I can track my world-building across the narrative
  • As a writer, I want to add sub-items beneath main items to capture related details (e.g., a character's key relationships listed under the character item)
  • As a writer, I want to reorder timeline updates to reflect changes in my narrative structure
  • As a writer, I want to color-code timeline updates by storyline so I can visually distinguish parallel arcs

Player / Reader

  • As a player, I want to browse published timeline updates to see what content is available to me
  • As a player, I want to click through from a timeline item to the actual content (via external URL)
  • As a player, I want to see pending placeholders so I know more content is on the way

Functional Description

Timeline Updates

A timeline update is the top-level organizational unit. It represents a themed content release -- a game session, a book chapter, a story arc, or any other logical grouping chosen by the creator.

Properties:

  • Title -- descriptive name (e.g., "Session 5: The Blood Moon")
  • Color -- one of five theme colors (red, blue, green, purple, amber) for visual categorization
  • Status -- development status that controls visibility (see Status Lifecycle below)
  • Order -- integer controlling display position among sibling timeline updates
  • Sequence Number -- project-scoped public identifier (e.g., the "3" in VNO-3)

Timeline updates are aggregate roots. All modifications to their child sections, items, and sub-items are performed through the aggregate boundary to maintain consistency.

Sections

Sections subdivide a timeline update into labeled groups. A timeline update might contain sections like "New Characters", "Revealed Locations", and "Plot Developments".

Properties:

  • Label -- section heading text
  • Order -- integer controlling display position within the parent timeline update

Sections have no independent status; they inherit visibility from their parent timeline update.

Items

Items are the individual pieces of content tracked by the timeline. Each item lives within a section and represents a single deliverable -- a character, a location, a plot point, a rule change, or any other discrete content element.

Properties:

  • Name -- item title (displayed even for pending items if the creator chooses, or left as a placeholder)
  • Description -- optional rich text providing additional detail about the item
  • URL -- optional external link pointing to the full content (blog post, wiki page, etc.)
  • IsPending -- boolean flag indicating this item is planned but not yet finalized
  • Order -- integer controlling display position within the parent section
  • ParentItemId -- optional self-referencing foreign key enabling one level of sub-items

Sub-Items

Sub-items are items with a ParentItemId set. They appear nested beneath their parent item in the UI. Sub-items follow the same data model as items but are displayed in a subordinate position. Only one level of nesting is supported -- a sub-item cannot have its own sub-items.

Pending Items

A pending item is any item where IsPending = true. Pending items serve as placeholders indicating that content is planned for this timeline update but has not yet been finalized. The creator may choose to give the pending item a descriptive name (e.g., "Mystery NPC") or leave it vague (e.g., "Coming Soon").

Pending items are visible to all roles that can see the parent timeline update, but they communicate to consumers that the content is not yet complete.

Items may include an optional URL field for linking to external content. This is most useful for published items where the timeline serves as an index pointing to detailed content hosted elsewhere -- a blog post, a wiki page, a Google Doc, or a session recording. The URL is validated for basic format correctness but no URL probing is performed.

Color Coding

Each timeline update is assigned one of five colors: red, blue, green, purple, or amber. Colors have no system-enforced semantic meaning; creators use them freely for visual organization. Common patterns include color-coding by storyline, by content type, or by urgency.

Status Lifecycle

Every timeline update carries a development status that controls its visibility and indicates its maturity. The four statuses form a lifecycle:

Status definitions:

StatusMeaningVisible to Players/Viewers
ConceptEarly idea, not yet being actively developedNo
In DevelopmentActively being worked on by creatorsNo
PublishedReleased and available to all project membersYes
LegacyArchived; still viewable but no longer activeYes

Allowed transitions:

  • Concept -> In Development (begin active work)
  • In Development -> Published (release to audience)
  • Published -> Legacy (archive)
  • In Development -> Concept (revert to ideation)
  • Published -> In Development (pull back for revision)
  • Legacy -> Published (reactivate)

The status applies at the timeline update level. All sections and items within a timeline update inherit its visibility. There is no per-item status override -- if a timeline update is In Development, all of its items are hidden from Players and Viewers.

Bulk Status Changes

Creators with appropriate permissions can change the status of multiple timeline updates at once. The bulk status endpoint accepts a list of timeline update sequence numbers and a target status. The system validates that each requested transition is allowed (per the state machine above) and applies the changes atomically. If any transition is invalid, the entire batch is rejected.

Reordering

All three levels of the hierarchy (timeline updates, sections, items) support drag-and-drop reordering. Reordering is implemented via integer Order fields and dedicated reorder endpoints.

Reorder operation:

When a reorder request arrives, the client sends the complete ordered list of IDs for the siblings being reordered. The backend:

  1. Validates that all IDs belong to the same parent (same project for timeline updates, same timeline update for sections, same section for items)
  2. Validates that the list contains exactly the current set of siblings (no additions or removals)
  3. Assigns new sequential Order values (0, 1, 2, ...) based on the submitted order
  4. Persists the changes in a single transaction

This approach avoids floating-point gaps, fractional ordering, or complex gap-filling algorithms. The client always sends the complete sibling list, so the backend can safely reassign contiguous integers.

Role-Based Visibility

The timeline system enforces visibility rules through IPermissionService:

RoleWhat they see
OwnerAll timeline updates regardless of status
StorytellerAll timeline updates regardless of status
Co-CreatorAll timeline updates regardless of status
PlayerOnly Published and Legacy timeline updates
ViewerOnly Published and Legacy timeline updates

When a Player or Viewer requests the timeline list, the API response omits Concept and In Development timeline updates entirely. There is no indication that hidden content exists -- the response simply contains fewer items. This follows the platform-wide "full omission" visibility policy (see Permission & Visibility).

Data Flow

Entity Relationship Diagram

Content Creation Flow

Reorder Operation Flow

Timeline View Flow (Role-Based Visibility)

Key Components

TimelineController

Handles all HTTP endpoints for timeline updates, sections, and items. Routes requests to the appropriate service methods. Performs initial request validation (model binding, format checks).

TimelineService

Core business logic for timeline operations. Coordinates between the permission system and the data layer. Responsible for:

  • Creating, updating, and deleting timeline updates, sections, and items
  • Enforcing the status state machine (validating transitions)
  • Applying bulk status changes atomically
  • Performing reorder operations
  • Filtering results by role-based visibility

IPermissionService

Consulted on every operation to verify the requesting user has the appropriate role. The timeline system requires CanEditTimeline for all write operations and applies visibility filtering on all read operations.

TimelineUpdate (Aggregate Root)

The domain entity that owns sections and items. State changes to child entities are coordinated through the aggregate root to maintain invariants (e.g., sub-items cannot exceed one level of nesting, order values remain contiguous after operations).

Domain Events

The TimelineUpdate aggregate root raises domain events on significant state changes:

  • TimelineUpdateCreatedEvent -- triggers activity feed entry
  • TimelineStatusChangedEvent -- triggers notifications to relevant project members (especially when publishing)
  • TimelineReorderedEvent -- triggers real-time UI updates via SignalR

Feature Interactions

FeatureInteraction
Project ManagementTimeline updates belong to a project. Project deletion cascades to all timeline data. Project key is used in all timeline API routes. Sequence numbers are allocated from the project's counter.
Permission & VisibilityEvery timeline read and write operation checks permissions. Visibility filtering determines which timeline updates appear in responses for Players/Viewers.
Version History & ChangelogTimeline updates are a primary target for version history. Changelog entries are attached to individual timeline updates.
Real-time & CollaborationReorder operations, status changes, and new content trigger SignalR notifications to connected clients.
Search & NavigationTimeline updates, sections, and items are indexed for project-wide search.
AuthenticationAll timeline endpoints require authentication. The current user identity is used for audit fields and permission checks.

Edge Cases & Error Handling

Reorder Conflicts

If two users attempt to reorder sections in the same timeline simultaneously, the second request may submit stale IDs. The backend validates that the submitted ID set matches the current siblings. If a section was added or removed between the client loading the UI and submitting the reorder, the request is rejected with a conflict error. The client must reload and retry.

Deleting a Timeline Update with Children

Deleting a timeline update cascades to all child sections, items, and sub-items. The operation is performed in a single transaction. Changelog entries associated with the timeline update are also deleted. A confirmation step on the client side is recommended but not enforced by the API.

Deleting a Section with Items

Deleting a section cascades to all child items and sub-items. Order values for remaining sections within the timeline update are not automatically recompacted -- gaps in ordering are tolerable and will be corrected on the next explicit reorder operation.

Deleting an Item with Sub-Items

Deleting a parent item cascades to all sub-items. This is consistent with the aggregate root pattern -- the parent owns its children.

Sub-Item Nesting Depth

Only one level of sub-items is allowed. If a request attempts to create a sub-item beneath another sub-item (i.e., the specified ParentItemId refers to an item that already has a ParentItemId), the request is rejected with a validation error.

Invalid Status Transitions

Attempting a disallowed status transition (e.g., Concept directly to Published) returns a validation error indicating the allowed transitions from the current status.

Bulk Status - Partial Validity

When a bulk status change request includes timeline updates with different current statuses, some transitions may be valid and others invalid. The system rejects the entire batch if any single transition is invalid, returning details about which transitions failed. This prevents partial updates that could leave the project in a confusing state.

Pending Items with URLs

A pending item should not have a URL set since it represents content that is not yet finalized. The system allows it but the client should present a warning. This is not enforced as a hard constraint because creators may want to link to draft content.

Empty Sections

Sections with no items are allowed. A creator may set up the section structure before populating it with items.

Maximum Limits

To prevent abuse, the system enforces reasonable limits:

  • Maximum 100 timeline updates per project
  • Maximum 20 sections per timeline update
  • Maximum 200 items per section
  • Maximum 20 sub-items per parent item

These limits are configurable and may be adjusted based on usage patterns.

Phase & Priority

Phase: Phase 1 (Core Timeline & Projects)

The Content Timeline System is a foundational feature and one of the first to be implemented. It depends only on the Authentication and Project Management features being in place. Many other features -- Version History, Changelog, Search, and Collaboration -- build on top of the timeline system.