diff --git a/README.md b/README.md
index 438bf0c..2ab336e 100644
--- a/README.md
+++ b/README.md
@@ -269,9 +269,13 @@ in three kinds:
date) and one group per `recent` widget (newest first) - each group is a header
(title, refresh stamp, per-widget errors) followed by one card per release,
laid out as a wrapping grid - then notices, urgent first, then heads-up then
- info, each group in creation order. The next upcoming release that carries
- artwork also gets a full-width hero tile above the groups (its relayed thumb
- plus title and date). Each widget gets its own sidebar button for a
+ info, each group in creation order. Cards are tinted by the app that produced
+ them (Sonarr teal, Radarr violet, Plex orange - separate light/dark shades of
+ each), on the card edge, the source chip, and a legend chip per origin in the
+ group header, so a merged timeline says which app each card came from. The
+ next upcoming release that carries artwork also gets a full-width hero tile
+ above the groups (its relayed thumb plus title and date), ringed in the same
+ origin hue. Each widget gets its own sidebar button for a
single-widget view.
- Writes are admin-only when OIDC is on, reads any session - same gate as
services.
diff --git a/src/uwudash_mk3/static/app.js b/src/uwudash_mk3/static/app.js
index 2e33d9e..b3d4a8b 100644
--- a/src/uwudash_mk3/static/app.js
+++ b/src/uwudash_mk3/static/app.js
@@ -233,12 +233,20 @@ function noticeCard(widget) {
);
}
+// Cards are tinted by the app that produced them, so a merged timeline reads by
+// source at a glance; an unknown origin stays neutral.
+const ORIGIN_LABEL = { sonarr: "Sonarr", radarr: "Radarr", plex: "Plex" };
+
+function originClass(item) {
+ return ORIGIN_LABEL[item ? item.origin : null] ? ` origin-${item.origin}` : "";
+}
+
function releaseCard(item) {
const thumb = item.thumb
? ``
: "";
return (
- `