diff --git a/Cargo.lock b/Cargo.lock
index 31e40f601dfa6521a83c04b726f7b8f9fb9c0a8c..e830a8a6f8af28e47053636a6280037a72b66838 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1,7 +1,5 @@
 # This file is automatically @generated by Cargo.
 # It is not intended for manual editing.
-version = 3
-
 [[package]]
 name = "addr2line"
 version = "0.16.0"
diff --git a/src/message.rs b/src/message.rs
index f4c4aec87cc66bbed2f802150cabcf667ae4301c..9c948d10466825abcd8b0a69239e35a05b263939 100644
--- a/src/message.rs
+++ b/src/message.rs
@@ -1,4 +1,5 @@
 use parse_display::Display;
+use rand::{thread_rng, Rng};
 use serde_json::Value;
 use std::fmt::Write;
 use std::sync::atomic::{AtomicBool, Ordering};
@@ -84,19 +85,25 @@ impl DebounceMap {
     }
 
     pub fn get_held_messages(&self) -> impl Iterator<Item = MessageType> {
-        self.file_held
-            .then(|| MessageType::File)
+        let file_opt = if self.file_held {
+            Some(MessageType::File)
+        } else {
+            None
+        };
+        let activity_opt = if self.activity_held {
+            Some(MessageType::Activity)
+        } else {
+            None
+        };
+        let notification_opt = if self.notification_held {
+            Some(MessageType::Notification)
+        } else {
+            None
+        };
+        file_opt
             .into_iter()
-            .chain(
-                self.activity_held
-                    .then(|| MessageType::Activity)
-                    .into_iter(),
-            )
-            .chain(
-                self.notification_held
-                    .then(|| MessageType::Notification)
-                    .into_iter(),
-            )
+            .chain(activity_opt.into_iter())
+            .chain(notification_opt.into_iter())
     }
 
     fn get_last_send(&self, ty: &MessageType) -> Instant {
@@ -109,10 +116,13 @@ impl DebounceMap {
     }
 
     fn set_last_send(&mut self, ty: &MessageType) {
+        // apply a randomized offset to the last_send
+        // this helps mitigate against load bursts from many clients receiving the same updates
+        let spread = Duration::from_millis(thread_rng().gen_range(0..1000));
         match ty {
-            MessageType::File => self.file = Instant::now(),
-            MessageType::Activity => self.activity = Instant::now(),
-            MessageType::Notification => self.notification = Instant::now(),
+            MessageType::File => self.file = Instant::now() - spread,
+            MessageType::Activity => self.activity = Instant::now() - spread,
+            MessageType::Notification => self.notification = Instant::now() - spread,
             MessageType::Custom(..) => {} // no debouncing for custom messages
         }
     }