Every retry library I found did the same thing: wrap a function, retry it a few times, throw if it still fails.

Fine until the retries run out and the error just... disappears into a catch block. No record of what request failed, what it was trying to send, or why. I'd find out a webhook silently dropped three days later when someone asked why an order never synced.

So I built smart-retry a small TypeScript retry library that does two things most others don't:

Drop-in Axios and Fetch clients, not just a generic wrapper function

Automatic failure logging when a request exhausts all retries, it gets written to disk with its URL, method, headers, body, and error, so you can inspect or replay it later instead of losing it the moment it throws