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
- Download
jellyfin.tempo-scorefrom the button above. - Double-click it. Tempo opens a review sheet — click Install. The score lands in
~/Library/Application Support/Tempo/Scores/. - In Tempo Settings → Ingestion, add a token named
jellyfinbound toorg.jellyfin. Copy the token. - Note your Tempo endpoint:
http://<your-mac-hostname>:7776/ingest(or127.0.0.1if Tempo is loopback-only). - Configure Jellyfin (below).
Jellyfin side — install the Webhook plugin
- Open the Jellyfin web UI as an administrator.
- Dashboard → Plugins → Catalog.
- Search for Webhook, click Install.
- Restart the Jellyfin server (Dashboard → Restart Server).
Jellyfin side — configure the webhook destination
-
Dashboard → Plugins → Webhook.
-
Click Add Generic Destination.
-
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:
Key Value X-Tempo-Tokenthe token from step 3 Content-Typeapplication/json -
Notification Types — tick the events you want surfaced. Suggested set:
Authentication FailureApplication ErrorPlugin Installation FailedPlugin Update FailedScheduled Task FailedItem AddedPlayback 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}}" } }
-
-
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 type | Severity | Badge |
|---|---|---|
AuthenticationFailure | error | Auth fail |
ApplicationError | error | Error |
*Failed (any) | error | Failed |
ScheduledTaskFailed | warning | Task failed |
PluginInstalled | info | Plugin |
PluginUninstalled | info | Plugin |
PluginUpdated | info | Plugin |
ItemAdded | info | New item |
PlaybackStart | info | Started |
PlaybackStop | info | Stopped |
| (default) | info | Info |
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
- This score lives in the reviewed catalog and uses only
openURLandcopyToClipboardactions. For Terminal-based actions (SSH, log tail, service restart), use a local drop-in score — those require explicit trust and can’t ship in the catalog. ServerUrlshould be reachable from your Mac (LAN URL is fine, or a Tailscale/VPN address). Tempo doesn’t care — it just builds the link for your browser to follow.