# pankyop/rich-presence-for-jellyfin-in-discord-plugin architecture

> Architecture diagram of the GitHub repository pankyop/rich-presence-for-jellyfin-in-discord-plugin, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-11). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/pankyop/rich-presence-for-jellyfin-in-discord-plugin
- Repository: https://github.com/pankyop/rich-presence-for-jellyfin-in-discord-plugin

## Overview

This Jellyfin plugin turns playback sessions into live Discord Rich Presence over local IPC. Jellyfin session events and fallback polling are filtered and throttled by SessionMonitor, which asks ActivityBuilder to format movie, TV, and music activities; artwork resolution is optional and external lookups are disabled by default. The Discord client sends activity through local named pipes or Unix sockets. Configuration and the embedded dashboard expose the user controls. The documented workflow and sampled caller references support the main connections; internal event wiring and some unsampled implementation details are not expanded.

Main entry points: [`Jellyfin.Plugin.DiscordRichPresence/Session/SessionMonitor.cs`](https://github.com/pankyop/rich-presence-for-jellyfin-in-discord-plugin/blob/main/Jellyfin.Plugin.DiscordRichPresence/Session/SessionMonitor.cs) (Session monitor), [`Jellyfin.Plugin.DiscordRichPresence/Discord/DiscordIpcClient.cs`](https://github.com/pankyop/rich-presence-for-jellyfin-in-discord-plugin/blob/main/Jellyfin.Plugin.DiscordRichPresence/Discord/DiscordIpcClient.cs) (Discord IPC client), [`Jellyfin.Plugin.DiscordRichPresence/Discord/ActivityBuilder.cs`](https://github.com/pankyop/rich-presence-for-jellyfin-in-discord-plugin/blob/main/Jellyfin.Plugin.DiscordRichPresence/Discord/ActivityBuilder.cs) (Activity builder), [`Jellyfin.Plugin.DiscordRichPresence/Plugin.cs`](https://github.com/pankyop/rich-presence-for-jellyfin-in-discord-plugin/blob/main/Jellyfin.Plugin.DiscordRichPresence/Plugin.cs) (Plugin & dashboard)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_lifecycle["Plugin lifecycle"]
  node_registration["Service registration"]
  node_monitor["Session monitor<br/>[SessionMonitor.cs]"]
end

subgraph group_presence["Presence generation"]
  node_builder["Activity builder<br/>[ActivityBuilder.cs]"]
  node_artwork["Artwork resolver<br/>[ArtworkResolver.cs]"]
  node_activity["Activity model<br/>[DiscordActivity.cs]"]
end

subgraph group_transport["Discord transport"]
  node_payloads["RPC payloads"]
  node_ipc["Discord IPC client"]
end

subgraph group_settings["Configuration"]
  node_plugin["Plugin &amp; dashboard<br/>[Plugin.cs]"]
  node_config["Plugin settings"]
  node_configui["Settings page<br/>[configPage.html]"]
end

node_jellyfin(("Jellyfin Server"))
node_discord(("Discord Desktop"))
node_metadata(("Metadata providers"))

node_jellyfin -->|"supplies sessions"| node_monitor
node_registration -->|"registers hosted service"| node_monitor
node_registration -->|"registers client"| node_ipc
node_monitor -->|"builds activity"| node_builder
node_monitor -->|"sends or clears"| node_ipc
node_builder -->|"resolves artwork"| node_artwork
node_builder -->|"creates activity"| node_activity
node_ipc -->|"serializes activity"| node_activity
node_ipc -->|"uses RPC packets"| node_payloads
node_ipc -->|"sends over local IPC"| node_discord
node_plugin -->|"owns configuration"| node_config
node_plugin -->|"exposes settings page"| node_configui
node_monitor -->|"reads preferences"| node_config
node_builder -->|"formats by settings"| node_config
node_artwork -.->|"queries when enabled"| node_metadata
node_jellyfin -->|"hosts plugin"| node_plugin

click node_registration "https://github.com/pankyop/rich-presence-for-jellyfin-in-discord-plugin/blob/main/Jellyfin.Plugin.DiscordRichPresence/PluginServiceRegistrator.cs"
click node_monitor "https://github.com/pankyop/rich-presence-for-jellyfin-in-discord-plugin/blob/main/Jellyfin.Plugin.DiscordRichPresence/Session/SessionMonitor.cs"
click node_plugin "https://github.com/pankyop/rich-presence-for-jellyfin-in-discord-plugin/blob/main/Jellyfin.Plugin.DiscordRichPresence/Plugin.cs"
click node_config "https://github.com/pankyop/rich-presence-for-jellyfin-in-discord-plugin/blob/main/Jellyfin.Plugin.DiscordRichPresence/Configuration/PluginConfiguration.cs"
click node_configui "https://github.com/pankyop/rich-presence-for-jellyfin-in-discord-plugin/blob/main/Jellyfin.Plugin.DiscordRichPresence/Configuration/configPage.html"
click node_builder "https://github.com/pankyop/rich-presence-for-jellyfin-in-discord-plugin/blob/main/Jellyfin.Plugin.DiscordRichPresence/Discord/ActivityBuilder.cs"
click node_artwork "https://github.com/pankyop/rich-presence-for-jellyfin-in-discord-plugin/blob/main/Jellyfin.Plugin.DiscordRichPresence/Discord/ArtworkResolver.cs"
click node_activity "https://github.com/pankyop/rich-presence-for-jellyfin-in-discord-plugin/blob/main/Jellyfin.Plugin.DiscordRichPresence/Discord/Models/DiscordActivity.cs"
click node_payloads "https://github.com/pankyop/rich-presence-for-jellyfin-in-discord-plugin/blob/main/Jellyfin.Plugin.DiscordRichPresence/Discord/Models/DiscordRpcPayloads.cs"
click node_ipc "https://github.com/pankyop/rich-presence-for-jellyfin-in-discord-plugin/blob/main/Jellyfin.Plugin.DiscordRichPresence/Discord/DiscordIpcClient.cs"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_registration,node_monitor toneBlue
class node_builder,node_artwork,node_activity toneAmber
class node_payloads,node_ipc,node_jellyfin toneMint
class node_plugin,node_config,node_configui toneRose
class node_discord,node_metadata toneIndigo
```

## Components

### Plugin lifecycle

- [Service registration](https://github.com/pankyop/rich-presence-for-jellyfin-in-discord-plugin/blob/main/Jellyfin.Plugin.DiscordRichPresence/PluginServiceRegistrator.cs): `Jellyfin.Plugin.DiscordRichPresence/PluginServiceRegistrator.cs`
- [Session monitor](https://github.com/pankyop/rich-presence-for-jellyfin-in-discord-plugin/blob/main/Jellyfin.Plugin.DiscordRichPresence/Session/SessionMonitor.cs): `Jellyfin.Plugin.DiscordRichPresence/Session/SessionMonitor.cs`

### Presence generation

- [Activity builder](https://github.com/pankyop/rich-presence-for-jellyfin-in-discord-plugin/blob/main/Jellyfin.Plugin.DiscordRichPresence/Discord/ActivityBuilder.cs): `Jellyfin.Plugin.DiscordRichPresence/Discord/ActivityBuilder.cs`
- [Artwork resolver](https://github.com/pankyop/rich-presence-for-jellyfin-in-discord-plugin/blob/main/Jellyfin.Plugin.DiscordRichPresence/Discord/ArtworkResolver.cs): `Jellyfin.Plugin.DiscordRichPresence/Discord/ArtworkResolver.cs`
- [Activity model](https://github.com/pankyop/rich-presence-for-jellyfin-in-discord-plugin/blob/main/Jellyfin.Plugin.DiscordRichPresence/Discord/Models/DiscordActivity.cs): `Jellyfin.Plugin.DiscordRichPresence/Discord/Models/DiscordActivity.cs`

### Discord transport

- [RPC payloads](https://github.com/pankyop/rich-presence-for-jellyfin-in-discord-plugin/blob/main/Jellyfin.Plugin.DiscordRichPresence/Discord/Models/DiscordRpcPayloads.cs): `Jellyfin.Plugin.DiscordRichPresence/Discord/Models/DiscordRpcPayloads.cs`
- [Discord IPC client](https://github.com/pankyop/rich-presence-for-jellyfin-in-discord-plugin/blob/main/Jellyfin.Plugin.DiscordRichPresence/Discord/DiscordIpcClient.cs): `Jellyfin.Plugin.DiscordRichPresence/Discord/DiscordIpcClient.cs`

### Configuration

- [Plugin & dashboard](https://github.com/pankyop/rich-presence-for-jellyfin-in-discord-plugin/blob/main/Jellyfin.Plugin.DiscordRichPresence/Plugin.cs): `Jellyfin.Plugin.DiscordRichPresence/Plugin.cs`
- [Plugin settings](https://github.com/pankyop/rich-presence-for-jellyfin-in-discord-plugin/blob/main/Jellyfin.Plugin.DiscordRichPresence/Configuration/PluginConfiguration.cs): `Jellyfin.Plugin.DiscordRichPresence/Configuration/PluginConfiguration.cs`
- [Settings page](https://github.com/pankyop/rich-presence-for-jellyfin-in-discord-plugin/blob/main/Jellyfin.Plugin.DiscordRichPresence/Configuration/configPage.html): `Jellyfin.Plugin.DiscordRichPresence/Configuration/configPage.html`

### Other components

- **Jellyfin Server**
- **Discord Desktop**
- **Metadata providers**

## Connections

- Jellyfin Server → Session monitor: supplies sessions (evidence: `README.md`)
- Service registration → Session monitor: registers hosted service (evidence: `Jellyfin.Plugin.DiscordRichPresence/PluginServiceRegistrator.cs`)
- Service registration → Discord IPC client: registers client (evidence: `Jellyfin.Plugin.DiscordRichPresence/PluginServiceRegistrator.cs`)
- Session monitor → Activity builder: builds activity (evidence: `Jellyfin.Plugin.DiscordRichPresence/Session/SessionMonitor.cs`)
- Session monitor → Discord IPC client: sends or clears (evidence: `Jellyfin.Plugin.DiscordRichPresence/Session/SessionMonitor.cs`)
- Activity builder → Artwork resolver: resolves artwork (evidence: `Jellyfin.Plugin.DiscordRichPresence/Discord/ActivityBuilder.cs`)
- Activity builder → Activity model: creates activity (evidence: `Jellyfin.Plugin.DiscordRichPresence/Discord/ActivityBuilder.cs`)
- Discord IPC client → Activity model: serializes activity (evidence: `Jellyfin.Plugin.DiscordRichPresence/Discord/DiscordIpcClient.cs`)
- Discord IPC client → RPC payloads: uses RPC packets (evidence: `Jellyfin.Plugin.DiscordRichPresence/Discord/DiscordIpcClient.cs`)
- Discord IPC client → Discord Desktop: sends over local IPC (evidence: `README.md`)
- Plugin & dashboard → Plugin settings: owns configuration (evidence: `Jellyfin.Plugin.DiscordRichPresence/Plugin.cs`)
- Plugin & dashboard → Settings page: exposes settings page (evidence: `Jellyfin.Plugin.DiscordRichPresence/Plugin.cs`)
- Session monitor → Plugin settings: reads preferences (evidence: `Jellyfin.Plugin.DiscordRichPresence/Session/SessionMonitor.cs`)
- Activity builder → Plugin settings: formats by settings (evidence: `Jellyfin.Plugin.DiscordRichPresence/Discord/ActivityBuilder.cs`)
- Artwork resolver → Metadata providers: queries when enabled (evidence: `README.md`)
- Jellyfin Server → Plugin & dashboard: hosts plugin (evidence: `README.md`)
