Skip to content

Partner Modules (Open Modules)

PSI's modular architecture allows partners to contribute their own modules -- structures, features, and server modules -- that extend the core platform. These are called open modules.

Core vs. Open Modules

graph TD
    subgraph "Core Modules"
        direction TB
        CS[Core Structures<br/>Question, Profile, Article, Topic]
        CF[Core Features<br/>comment-slider, reactions, moderation]
        CM[Core Server Modules<br/>admin, auth, profile, questions]
    end

    subgraph "Open Modules (Partner)"
        direction TB
        ZDF_M[ZDF Modules<br/>moderation-dash, video-voting, articles]
        CBC_M[CBC/RC Modules<br/>topic-migration]
        SRG_M[SRG Modules<br/>translate]
    end

    CS -.->|"Partner extends"| ZDF_M
    CF -.->|"Partner extends"| CBC_M
    CM -.->|"Partner extends"| SRG_M

Key Differences

Aspect Core Module Open Module
Maintained by PSI core team Contributing partner
Code location client/structure/, client/feature/, server/modules/ client/open-modules/{partner}/, server/open-modules/{partner}/
Design review Required Encouraged, not required
Product review Required Not required
Engineering review Detailed (core team standards) Minimal (no destabilization check)
Enabled by default Can be default for all silos Only for contributing partner's silos
Core dependencies Can depend on other core modules Cannot be depended on by core
Tests required Yes (core team maintains) Yes (partner must provide sufficient tests)

Directory Layout

Client Open Modules

client/open-modules/
├── zdf/
│   ├── feature/
│   │   ├── question/moderation-dash/   # ZDF moderation dashboard
│   │   └── question/video-voting/      # Video voting feature
│   ├── structure/
│   │   ├── mod-dashboard.tsx           # Moderation dashboard structure
│   │   └── video-voting.tsx            # Video voting structure
│   ├── component/                      # ZDF-specific UI components
│   └── util/                           # ZDF utilities
├── cbcrc/
│   └── feature/                        # CBC/RC features
└── srg/
    └── feature/                        # SRG features

Server Open Modules

server/open-modules/
├── zdf/
│   ├── modules/
│   │   ├── article.ts                  # Article management
│   │   ├── article-teaser-position.ts  # Teaser positioning
│   │   ├── blocklist.ts                # Content blocklist
│   │   ├── channel.ts                  # Channel management
│   │   ├── conversation-helper.ts      # Conversation utilities
│   │   ├── moderation.ts               # ZDF moderation logic
│   │   ├── push-notifications.ts       # Push notification delivery
│   │   └── videovoting.ts              # Video voting backend
│   ├── prompts/                        # ZDF-specific LLM prompts
│   └── util/                           # ZDF server utilities
├── cbcrc/
│   └── modules/
│       └── topicmigration.ts           # Topic migration tool
└── srg/
    └── modules/
        └── translate.ts                # Translation service

Current Partner Modules

ZDF (Germany)

Module Type Description
Moderation Dashboard Structure + Feature Comprehensive moderation interface for ZDF moderators
Video Voting Structure + Feature Interactive video voting functionality
Article Management Server module Article CRUD operations, teaser positioning
Channel Management Server module Conversation channel management
Blocklist Server module Content and term blocking
Push Notifications Server module Push notification delivery to users

CBC / Radio-Canada

Module Type Description
Topic Migration Server module Migrates topics between formats/instances

SRG SSR (Switzerland)

Module Type Description
Translate Server module Multi-language translation integration (DeepL / TextShuttle)

Creating an Open Module

1. Set Up the Directory

# Client
mkdir -p client/open-modules/your-partner/{feature,structure,component,util}

# Server
mkdir -p server/open-modules/your-partner/{modules,prompts,util}

2. Follow Naming Conventions

  • File names: kebab-case
  • Feature keys: kebab-case
  • Module names: match the file name
  • Follow the same layout conventions as core modules

3. Register Your Modules

  • Client features/structures: import and register in the partner's index file
  • Server modules: the API router automatically discovers modules in open-modules/

4. Provide Tests

Partners must provide sufficient tests so the core team can detect regressions:

  • Client: Jest tests in *.test.tsx files alongside source
  • Server: Jest tests in __tests__/ directories
  • Storybook stories for visual components

5. Submit for Review

Open modules go through a minimal engineering review ensuring:

  • No destabilization of the core platform
  • No harm to instances the module isn't enabled on
  • Proper use of data access APIs (Datastore, ServerStore)
  • No direct database manipulation outside adapters

Further Reading