diff --git a/zebra-report/index.html b/zebra-report/index.html
index 29632a1..d069bba 100644
--- a/zebra-report/index.html
+++ b/zebra-report/index.html
@@ -1010,7 +1010,8 @@ function renderOutbox() {
function scheduleRetransmit(crc) {
const entry = msgPending.get(crc);
if (!entry) return;
- const wait = estimateTxMs(entry.frame.length) + estimateTxMs(15) + 4000; /* data + ack + margin */
+ const base = estimateTxMs(entry.frame.length) + estimateTxMs(15) + 4000; /* data + ack + margin */
+ const wait = base * Math.pow(1.8, entry.tries - 1); /* exponential backoff — don't hammer */
entry.timer = setTimeout(async () => {
const e = msgPending.get(crc);
if (!e) return; /* already ACKed */