- Cap /feed.xml at the current America/New_York calendar day so
pre-scheduled future verses (and stray 2124 rows) can no longer
surface at the top of the feed
- Emit DST-aware RFC 822 pubDates (correct -04:00/-05:00 offset) instead
of a hardcoded EST offset, and parse calendar days as UTC so titles
no longer shift by one day on UTC hosts
- Add content-addressed ETag + Last-Modified with If-None-Match /
If-Modified-Since conditional handling
- Add atom:link rel=self, content:encoded, channel pubDate/generator/image
- Move RSS auto-discovery <link> into app.html: the root route sets
ssr=false, so the layout <svelte:head> link never reached the raw HTML
and feed readers could not discover /feed.xml
- Extract feed helpers into $lib/server/rss and add unit tests
- Add 12-week Weekly Active Users table to global stats with WoW change %
- Fix 7-day and 30-day retention to measure return on exactly day N (not any day within the window)
- Remove "Avg Guesses Today" stat card
- Update retention description to clarify exact-day measurement
- Add bibdle logos (SVG, square PNG, circle PNG) and new favicon.png
- Wire favicon.png as the site favicon via app.html link tag
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Load Rybbit script via app.html (recommended SvelteKit approach)
- Mirror all Umami custom events (First guess, Guessed correctly, Share, Copy to Clipboard, social link clicks) with rybbit.event()
- Identify logged-in users with name/email traits; anonymous users by stable UUID
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>