Skip to content
CAI
Software that uses CAICheck a score

softwaremill/retry

57.2

Adequate · 20 September 2026

409

lines of production code

Scala

primary language

1

measurement over time

CAI band scale
CAI lens gauges

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.