Made the reminders into pets that live on the desktop. They wander, keep their distance from each other, and each has a personality. When a reminder is due the pet comes to your cursor, and if you ignore it, it gets harder to ignore.
Pixels
Water and walk reminders are notifications, and notifications get dismissed without being read.

Native Swift: AppKit floating panels with SwiftUI views, GIFs played frame by frame on a run-loop timer, click-through everywhere except the pet itself, and a three-step escalation that ends in a full-screen takeover unless your camera, mic, or a fullscreen app says you are busy.
Five pets, timers that pause while the screen is off or locked, a mouse-shake and ⌃⌥J group jump, and per-pet move or hide options. Starts at login.
What to inspect.
Ignored reminders escalate: due, then 3x and shaking after 5 minutes, then a dimmed full-screen takeover after 10 that only a click can dismiss.
The takeover is skipped while the camera or microphone is in use or a fullscreen window is in front.
Pets that would collide pick another spot instead, so they never pile up in one corner.