main ← store-rewind-dismiss-state-in-db
merged 05:16AM - 12 Dec 25 UTC
Users were seeing repeated rewind notifications across different devices and bro…wsers because the dismiss state was stored in localStorage, which is per-browser and easily cleared.
Move the dismiss state to a new `discourse_rewind_dismissed_at` column in the `user_options` table. This allows the dismiss to sync across all devices and persist through browser data clears.
The timestamp is compared using "rewind year" logic - dismissing in January 2025 (for rewind 2024) won't block the notification for rewind 2025 in December 2025.
- Add `discourse_rewind_dismissed_at` datetime column to user_options
- Add POST /rewinds/dismiss endpoint
- Add `discourse_rewind_dismissed` to user_option serializers
- Extract `DiscourseRewind.rewind_year` helper for year calculation
- Update frontend service to read from server state instead of localStorage