softwaremill/retry
57.2
Adequate · 20 September 2026
409
lines of production code
Scala
primary language
1
measurement over time
What this system is
This system is a Scala library designed to handle transient failures in asynchronous operations by providing configurable retry policies. It supports multiple backoff strategies, including exponential backoff with jitter, and allows for conditional retries based on exceptions or success predicates. The library is built to run on JVM, Scala.js, and Scala Native, utilizing modern asynchronous scheduling tools rather than legacy Netty or Twitter Util implementations.
Features
Initial release of retry library with multiple policy strategies
This entry introduces the 'retry' library (version 0.3.6), a Scala tool for handling transient failures in Futures. It provides a unified \Policy\ interface with several built-in strategies: \Directly\ for immediate retries, \Pause\ for fixed delays, \Backoff\ for exponential backoff, \When\ for exception-based conditional retries, and \FailFast\ to stop retrying on specific fatal exceptions. The library is configured via \scalafmt\ 3.8.1 and integrates with \odelay\ timers for asynchronous scheduling.
(repo-wide) · high confidence
Retry library introduces configurable jitter and success-predicate policies
The retry module now provides a structured retry policy system built on a new Jitter trait and Defaults object. Users can choose between four jitter algorithms (none, full, equal, and decorrelated) to control backoff behavior, with full jitter as the default. The library introduces a Success type class to define what constitutes a successful retry outcome, supporting implicit conversions for Option, Either, and Try, as well as combinators for combining predicates. Core policy objects (Directly, Pause, Backoff, JitterBackoff) allow users to specify retry counts, delays, and backoff strategies, with tests added for both JVM and Scala.js platforms.
retry · high confidence
Removals
Removal of Netty-based timer implementation
The Netty-specific timer implementation has been removed from the codebase. This eliminates the dependency on the legacy Netty Timer API for scheduling delayed tasks, aligning with the project's shift away from Netty-based concurrency primitives.
netty · high confidence
Behavioural changes
Removal of Twitter-specific timer implementation
The custom \TwitterTimer\ adapter, which previously wrapped the Twitter Util \Timer\ to support retry delays, has been removed from the codebase. This change eliminates the dependency on the Twitter Util library for timer functionality, aligning with the shift to implement delay behavior using \odelay\.
twitter · high confidence
Removal of internal retry and timer implementation files
The internal implementation files for the retry mechanism (retries.scala, sleep.scala, and timer.scala) have been removed from the core module. This deletion eliminates the local definitions for retry strategies (Directly, Pause, Backoff), the Success predicate helper, and the underlying Timer and SleepFuture abstractions, indicating that this functionality has been refactored or replaced by external dependencies or other modules.
core · medium confidence
Dependencies
Build infrastructure upgraded to SBT 1.9.9 with modern Scala tooling
The project's build system has been significantly modernized: SBT has been upgraded from version 0.12.3 to 1.9.9, and the legacy \build.scala\ definition (supporting Scala 2.9/2.10 and multi-module aggregation) has been removed in favor of a new \plugins.sbt\ configuration. This new configuration introduces SBT plugins for Scala.js (1.16.0), Scala Native (0.5.0), and project matrix support (0.10.0), alongside SoftwareMill common/publish plugins (2.0.20) and IDE settings, indicating a shift towards a multi-target, modern Scala build structure.
project · high confidence
Migrate build to SoftwareMill and consolidate project structure
The build system has been migrated to use SoftwareMill's SBT plugins (SbtSoftwareMillCommon and ossPublishSettings), updating the organization to com.softwaremill.retry. The multi-module structure (core, netty, twitter) has been removed in favor of a single root project aggregating a unified 'retry' module. This new configuration supports Scala versions 2.11.12, 2.12.19, 2.13.13, and 3.4.1 on JVM, and 2.12.19, 2.13.13, and 3.4.1 on JavaScript. Dependencies have been updated to include scalatest 3.2.18, scala-collection-compat 2.12.0, and odelay-core 0.4.0, with scala-java-time 2.5.0 added for Scala.js support.
(dependencies) · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Baseline
- First survey — no prior run to compare against. CAI 57.
Lenses
- Code Health 100
- Architecture 69
- Maturity 49
- Readiness 59
- Security 61
Changes since last survey
- 300 commits — 285 feature/other, 15 fixes
By area
- (repo) — 119 commits
- (root) — 104 commits
- project/plugins.sbt — 32 commits
- project/build.properties — 17 commits
- retry/src — 7 commits
- shared/src — 7 commits
- notes/0.2.0.markdown — 5 commits
- .github/workflows — 3 commits
- src/main — 3 commits
- src/test — 2 commits
- notes/0.1.0.markdown — 1 commit
Notable commits
- fix: Fix Scala 3 compilation.
- fix: Fix scala-steward
- fix: Fixed Defaults.jitter
- fix: Fixed README
- fix: Forever policies fixed with specs
- fix: Forever policies fixed with specs
- fix: Merge pull request #30 from softwaremill/forever-policies-fixed
- fix: Revert "Forever policies fixed with specs"
- fix: Revert commit(s) 4347075
- fix: Revert commit(s) 5b63992
- fix: Revert commit(s) ae5e2f0
- fix: Revert commit(s) c705c83
- fix: Update usage examples in README.md (fix for #26)
- fix: fix build
- fix: fix merge
- change: Add 'Reformat with scalafmt 3.6.0' to .git-blame-ignore-revs
- change: Add FailFast policy.
- change: Add a new policy which supports exponential backoff + random jitter
- change: Add root project
- change: Adds a smoke test with the reduced syntax format.
- …and 280 more
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
softwaremill/retry was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 20 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit f5d887b23adb8c34b2dc891a4d25a6263e300c48 — the exact code this score is about.
- Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-b51f968c9b10.