The auto-update package lets us run periodic actions, but only when necessary. This is great, but it only lets us schedule actions in the IO monad.
I’ve just released auto-update-unliftio, which generalises auto-update to run in any monad which has a MonadUnliftIO instance.