diff --git a/README.md b/README.md
index 399e8f4..4a9f194 100644
--- a/README.md
+++ b/README.md
@@ -260,12 +260,14 @@ in three kinds:
- `severity` is notice-only: `urgent`/`heads-up`/`info` tints the card edge, the
chip, and the icon on Home. Setting it on a live widget is a validation error
(live rows have no severity to sort by).
-- Home renders one merged calendar card (every `calendar` widget, sorted by
- date), one card per `recent` widget, then notices - urgent first, then heads-up
- then info, each group in creation order. The next upcoming release that carries
- artwork gets a full-width hero tile above the timeline (its relayed thumb plus
- title and date); the timeline row keeps its own small thumb. Each widget also
- gets its own sidebar button for a single-card view.
+- Home renders one merged release group (every `calendar` widget, ascending by
+ 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
+ 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 08bf03e..2e33d9e 100644
--- a/src/uwudash_mk3/static/app.js
+++ b/src/uwudash_mk3/static/app.js
@@ -233,30 +233,21 @@ function noticeCard(widget) {
);
}
-function itemRow(item) {
+function releaseCard(item) {
const thumb = item.thumb
? ``
: "";
return (
- `