Skip to content
CAI
Software that uses CAICheck a score

jtrivedi/Wave

51.6

Adequate · 1 October 2026

3k

lines of production code

Swift

primary language

2

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is a cross-platform animation library for iOS and macOS that provides spring-based physics animations for both UIView and CALayer properties. It supports color interpolation and geometric transformations, offering a unified API that works across UIKit and AppKit environments. The project includes sample applications and comprehensive test coverage to demonstrate integration and verify animation behavior.

Features

Add CALayer animator support and rename animation classes

Users can now animate \CALayer\ properties (such as \shadowColor\, \shadowOpacity\, and \cornerRadius\) directly via the new \LayerAnimator\ class and the \layer.animator\ property, in addition to the existing \UIView\ animator support. The internal animation engine has been refactored: \Animation\ is renamed to \SpringAnimator\ and \AnimationState\ to \AnimatorState\, and the system now uses \CACurrentMediaTime()\ for timing instead of \Date.now\. The \project\ utility functions for rubberbanding and deceleration no longer depend on \UIScrollView.DecelerationRate\, using a hardcoded value instead.

Sources/Wave · high confidence

Add macOS sample app demonstrating Wave animations in AppKit

A new macOS sample application has been added to the repository, providing a concrete example of how to integrate the Wave animation library within an AppKit environment. The sample includes a functional interface featuring a button that toggles between rounded and square shapes with color changes, driven by spring-based animations. This addition allows users to see the library in action on macOS and serves as a reference implementation for AppKit developers.

Sample App/Wave-Sample/Wave-Sample-macOS · high confidence

Sample app now supports macOS alongside iOS

The sample application has been expanded to include a macOS target (Wave-Sample-macOS) in addition to the existing iOS target (renamed to Wave-Sample-iOS). This change adds AppKit-based source files (AppDelegate, ViewController, Main.storyboard) and entitlements to the project, allowing users to run and test the library on macOS desktops.

Sample App/Wave-Sample/Wave-Sample.xcodeproj · high confidence

Behavioural changes

Refactor animation engine and add macOS support

The internal animation engine has been refactored to use a new \LayerAnimator\ and \DisplayLinkProviding\ abstraction, which introduces support for macOS (AppKit) alongside the existing iOS implementation. This change moves animation logic into the \Internal\ module, renames the \AnimationProviding\ protocol to \AnimatorProviding\, and updates property setters (e.g., \center\, \cornerRadius\) to use internal \\_\ prefixed accessors. Additionally, the diff adds \SpringInterpolatable\ support for \RGBAComponents\ to enable smooth color animations.

Sources/Wave/Internal · high confidence

Sample app updates for iOS 15 compatibility and new demo views

The Wave-Sample app now includes a SwiftUIViewController in the main tab bar and adds helper extensions for CGRect and DragGesture to support new animation features. To ensure compatibility with iOS 15, the app disables minimum frame duration constraints via Info.plist settings and conditionally applies scroll edge appearances to the tab bar only on iOS 15 and later.

Sample App/Wave-Sample/Wave-Sample · high confidence

SwiftUI demo added and animation engine renamed in sample app

The sample app now includes a new SwiftUI demonstration (SwiftUIViewController) that showcases the spring animation engine with drag-and-throw interactions. Additionally, the underlying animation engine has been renamed from \Animation\ to \SpringAnimator\ across the sample's view controllers (PictureInPicture, Sheet, and others) to reflect this change. A visual tweak in the grid view controller also updates the color interpolation from systemMint to systemPurple.

Sample App/Wave-Sample/Wave-Sample/View Controllers · high confidence

Unified color interpolation and macOS support in geometry extensions

The \Color+Extensions\ module now supports both iOS and macOS by introducing a \WaveColor\ typealias that maps to \UIColor\ or \NSColor\ respectively, enabling the existing color interpolation logic to work across platforms. Additionally, geometry extensions (\CGFloat\, \CGPoint\, \CGRect\, \CGSize\) have been refactored to remove platform-specific UIKit dependencies in favor of \QuartzCore\, and the \scaledIntegral\ properties are now public to allow external access to pixel-boundary rounding.

Sources/Wave/Extensions · high confidence

Test coverage

Added tests for UIView and CALayer animatable properties

Added comprehensive test coverage for the Wave animation library's animatable properties on iOS. The new \AnimatableUIViewPropertyTests\ verify that properties such as frame, bounds, center, corner radius, border, background color, alpha, and scale animate correctly via the animator proxy, including specific tests for non-animated immediate updates. The new \AnimatableCALayerPropertyTests\ cover affine transformations (scale, translation) and CALayer shadow properties (opacity, offset, radius). Test utilities were added to handle spring settling waits, and existing \SpringTests\ were updated to reflect the renaming of the internal \Animation\ class to \SpringAnimator\.

Tests · high confidence

Dependencies

Added macOS platform support

The package manifest has been updated to include macOS 10.12 as a supported platform alongside the existing iOS 13 support, enabling the library to be used in macOS applications.

(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

Score

  • CAI 52 → 52 (-0.9)
  • Rubric changed (rubric-2026.09.11 → rubric-2026.09.18) — scores are not directly comparable.

Lenses

  • Code Health 100 → 99 (-1.3)
  • Architecture 100 → 98 (-2.4)
  • Maturity 49 → 49 (+0.0)
  • Readiness 33 → 27 (-6.1)
  • Security 100 → 100 (+0.0)

New (15)

  • Coverage not measured — Swift suite
  • Duplicated block (13 lines × 2) (Sources/Wave/Internal/ViewAnimator+Implementation.swift)
  • Duplicated block (13 lines × 3) (Sources/Wave/Internal/ViewAnimator+Implementation.swift)
  • Duplicated block (13 lines × 6) (Sources/Wave/Internal/LayerAnimator+Implementation.swift)
  • Duplicated block (17 lines × 2) (Sources/Wave/Internal/LayerAnimator+Implementation.swift)
  • Duplicated block (17 lines × 3) (Sources/Wave/Internal/LayerAnimator+Implementation.swift)
  • Duplicated block (23 lines × 2) (Sources/Wave/Internal/LayerAnimator+Implementation.swift)
  • Duplicated block (27 lines × 3) (Sources/Wave/Internal/LayerAnimator+Implementation.swift)
  • Duplicated block (7 lines × 2) (Sources/Wave/Internal/ViewAnimator+Implementation.swift)
  • Duplicated block (8 lines × 2) (Sources/Wave/Internal/CALayer+LayerAnimator.swift)
  • Inconsistent color type usage across related animator types. LayerAnimator uses platform-specific CoreGraphics types (CGColor), while ViewAnimator uses UIKit types (UIColor). This forces consumers to convert types depending on which animator they are using, breaking API uniformity.
  • Members sharing a duplicated core (6 members, 50+ identical tokens) (Sources/Wave/Internal/LayerAnimator+Implementation.swift)
  • Off the main sequence: Wave
  • Same inconsistency as backgroundColor: LayerAnimator uses CGColor while ViewAnimator uses UIColor for shadow color.
  • Same inconsistency as backgroundColor: LayerAnimator uses CGColor while ViewAnimator uses UIColor for the same logical property (border color).

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

jtrivedi/Wave 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 1 October 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 27b7e1d2d42b8a4f56d9e84213910b0441c8b810 — the exact code this score is about.
  • Scored under rubric-2026.09.18 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-e569280dd5e2.