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