Surface Jellyfin server events in Tempo’s timeline with five default actions (open Jellyfin web, open item details, open admin dashboard, copy server URL, copy item ID).

Tested with Jellyfin 10.9 + the official Webhook plugin.


Install

  1. Download jellyfin.tempo-score from the button above.
  2. Double-click it. Tempo opens a review sheet — click Install. The score lands in ~/Library/Application Support/Tempo/Scores/.
  3. In Tempo Settings → Ingestion, add a token named jellyfin bound to org.jellyfin. Copy the token.
  4. Note your Tempo endpoint: http://<your-mac-hostname>:7776/ingest (or 127.0.0.1 if Tempo is loopback-only).
  5. Configure Jellyfin (below).

Jellyfin side — install the Webhook plugin

  1. Open the Jellyfin web UI as an administrator.
  2. Dashboard → Plugins → Catalog.
  3. Search for Webhook, click Install.
  4. Restart the Jellyfin server (Dashboard → Restart Server).

Jellyfin side — configure the webhook destination

  1. Dashboard → Plugins → Webhook.

  2. Click Add Generic Destination.

  3. Fill in the form:

    • Webhook Name: Tempo

    • Webhook URL: http://your-mac.local:7776/ingest (replace with your Mac’s hostname or LAN IP)

    • Headers — add two:

      KeyValue
      X-Tempo-Tokenthe token from step 3
      Content-Typeapplication/json
    • Notification Types — tick the events you want surfaced. Suggested set:

      • Authentication Failure
      • Application Error
      • Plugin Installation Failed
      • Plugin Update Failed
      • Scheduled Task Failed
      • Item Added
      • Playback Start / Playback Stop (optional — high volume)
    • Template (paste verbatim into the Template field):

      {
        "providerIdentifier": "org.jellyfin",
        "title": "{{NotificationType}}{{#if ItemName}}{{ItemName}}{{/if}}",
        "startDate": "{{Timestamp}}",
        "eventType": "alert",
        "metadata": {
          "NotificationType": "{{NotificationType}}",
          "ServerName":       "{{ServerName}}",
          "ServerUrl":        "{{ServerUrl}}",
          "ServerVersion":    "{{ServerVersion}}",
          "Username":         "{{NotificationUsername}}",
          "ItemName":         "{{ItemName}}",
          "ItemId":           "{{ItemId}}",
          "ItemType":         "{{ItemType}}",
          "DeviceName":       "{{DeviceName}}",
          "ClientName":       "{{ClientName}}"
        }
      }
  4. Click Save.

Verify

Trigger any of the configured events in Jellyfin (e.g. add a movie, fail a login). The event should appear in Tempo’s timeline within a couple of seconds, painted in Jellyfin purple, with the five default actions in the right panel.

Severity rules

Notification typeSeverityBadge
AuthenticationFailureerrorAuth fail
ApplicationErrorerrorError
*Failed (any)errorFailed
ScheduledTaskFailedwarningTask failed
PluginInstalledinfoPlugin
PluginUninstalledinfoPlugin
PluginUpdatedinfoPlugin
ItemAddedinfoNew item
PlaybackStartinfoStarted
PlaybackStopinfoStopped
(default)infoInfo

Required metadata fields

Most actions need ServerUrl. The “Open item” action and “Copy item ID” need ItemId (only set on item-related notifications — clicking them on a non-item event opens a malformed URL, harmless).

Sample event payload

{
  "providerIdentifier": "org.jellyfin",
  "title": "PlaybackStart — The Office S03E12",
  "startDate": "2026-04-29T22:14:00Z",
  "eventType": "alert",
  "metadata": {
    "NotificationType": "PlaybackStart",
    "ServerName":       "media-server",
    "ServerUrl":        "http://media.lan:8096",
    "ServerVersion":    "10.9.6",
    "Username":         "alice",
    "ItemName":         "The Office S03E12",
    "ItemId":           "abc123def456",
    "ItemType":         "Episode",
    "DeviceName":       "Apple TV",
    "ClientName":       "Jellyfin Apple TV"
  }
}

Notes