Status: Deployed in commit b1428980.
Implemented the full scope of the original request. The admin dashboard now has two new sections sitting between the headline stat-card row and the Quick actions grid:
Trends — last 90 days
Three inline-SVG sparkline cards, no JS or chart library — rendered server-side as a single <path> per chart:
- Member sign-ups — primary blue, totals + 30-day-vs-prior delta pill
- Post volume — info blue, totals + today-vs-7-days-ago delta pill
- Active users / day — success green, 90-day daily-active average
Each card links out to the matching admin surface (Users, Forums, /online). The deltas are colour-coded — green up-arrow when the trend is positive, red down when negative.
Needs attention
Three actionable signals, each with a coloured left-border indicating severity:
- Lapsed members — posted in the last 90 days but not the last 30 → link to
/admin/users?lapsed=1 (filter to win-back targets)
- Threads with no replies — created in the last 30 days with
reply_count = 0 → link to /forums/new?filter=no-replies
- Open reports — current depth + trend vs same window last week → links to
/admin/moderation. Colour: warning if non-zero, danger via the same threshold the stat card already uses.
Under the hood
- Controller adds one private helper
dailySeries() that zero-fills a daily-aggregate result across the window so sparkline x-axes stay even regardless of zero-activity days.
- Six new headline queries (signups/posts/active 90-day series + lapsed/orphan/reports-delta). Each one is a single
COUNT or GROUP BY DATE() aggregate, so the dashboard's render cost stays bounded.
- CSS is scoped to
.dash-trends, .dash-trend-card, .dash-spark, .dash-signals, .dash-signal-card — built on semantic tokens (--color-primary, --color-success, --color-warning, --color-danger, --color-bg-input) so both light and dark themes render with correct contrast.
Live on support, fort-smith-live, and dev tenants. Locking thread.