Skip to content
CAI
Software that uses CAICheck a score

JohnCoates/Aerial

57.3

Adequate · 27 September 2026

19.5k

lines of production code

Swift

primary language

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This release delivers a comprehensive overhaul of the Aerial application, introducing a standalone macOS app alongside the existing screen saver. Key features include a new source management system with a modern sidebar for browsing videos by location, time, and scene, as well as support for custom local video folders. The update also adds dynamic info layers for weather, music playback status, clock, and battery, while refactoring the video playback engine to use AVPlayer for improved stability. Additionally, the release introduces a first-time setup wizard, advanced settings for cache and brightness, and integrates Sparkle for automatic updates.

Features

Add music playback status display layer

A new music layer has been introduced to display the currently playing song's title, artist, and album, along with its artwork. This layer renders text and images using Core Animation layers, updating dynamically as the track changes.

Aerial/Source/Views/Layers/Music · medium confidence

Added Info.plist with update and location service configurations

The app's Info.plist was added, defining the application's bundle metadata, minimum system version, and security settings. It explicitly configures the Sparkle update framework by providing the feed URL and public encryption key, enabling automatic update checks. It also adds descriptions for location services permissions, which the app uses to calculate sunrise and sunset times based on the user's position.

Aerial/App/Resources · high confidence

Added SoundOutputManager to control system audio

Added a new SoundOutputManager class that allows the application to programmatically change the system's default output volume and mute state. This enables features like automatic volume adjustment or muting based on user preferences or system states.

Aerial/Source/Models/Hardware/ISSoundAdditions · high confidence

Added custom video management interface

Introduced a new CustomVideoController to handle the management of local video files. This includes a dedicated UI for adding and organizing folders of custom videos, supporting drag-and-drop functionality, and displaying video metadata such as duration and resolution. The controller manages the lifecycle of the custom video selection, allowing users to browse, rename, and remove custom video folders and individual video files within the application.

Aerial/Source/Controllers · high confidence

Added macOS app bundle configuration and UI resources

The app bundle now includes a new Info.plist file that defines core metadata such as the bundle identifier (com.JohnCoates.Aerial), minimum system version, and usage descriptions for location services. Additionally, a new CustomVideos.xib file was added to the Resources directory, providing the interface for the 'Manage Local Videos' window, which allows users to organize and edit local video folders and files.

Resources/Old stuff · high confidence

Improved time-of-day detection with multiple sunrise/sunset calculation modes

The application now supports multiple modes for determining day and night conditions, including location-based (using IOKit for battery status and CoreLocation for coordinates), manual sunrise/sunset times, and light/dark mode overrides. The new \Solar\ model calculates various sunrise and sunset times (strict, official, civil, nautical, astronomical) to provide more accurate time-of-day filtering for video playback.

Aerial/Source/Models/Time · high confidence

Initial project scaffolding and documentation

The repository was initialized with essential configuration and documentation files, including a Makefile for build and test automation, SwiftLint and CodeClimate configuration, a .gitignore, and a README. The project also includes an appcast.xml for update distribution and an issue template to guide bug reports.

(repo-wide) · high confidence

Introduce new sidebar and video browsing interface

The main window now features a redesigned sidebar that allows users to browse videos by location, time, scene, or source. The video list view has been updated to display video details and playback controls, including a new option to cache the currently playing video immediately.

Resources/MainUI · high confidence

Introduced new AppDelegate for app mode

Added a new AppDelegate class for the Aerial app, which sets the app mode and displays the main window.

Aerial/App · high confidence

Introduces new OpenWeather API integration for weather data

The application now supports fetching weather data via the OpenWeather API, including a dedicated secrets file (APISecrets.swift) to store API keys, and new model files (Forecast.swift, GeoCoding.swift, OneCall.swift, OpenWeather.swift) that implement the logic for retrieving current conditions, forecasts, and geocoding. This change enables the screensaver to display dynamic weather information, with support for multiple languages and unit systems (metric/imperial).

Aerial/Source/Models/API · high confidence

New Info, Help, and Credits panels in the Main UI

The Info, Help, and Credits panels in the Main UI have been replaced with new, dedicated view controllers. Users can now access a dedicated Info page displaying the app version and a donation link, a Help page with direct links to the FAQ, troubleshooting guides, and community support channels, and a Credits page listing translation contributors and project links. These changes improve the organization of informational content and provide easier access to support and community resources.

Resources/MainUI/Infos panels · high confidence

New cache management system with improved storage and streaming

Aerial introduces a new cache architecture that stores video files in the user's Application Support directory (\~/Library/Application Support/Aerial/Cache/) rather than the system Caches directory, ensuring compatibility with macOS Catalina's sandboxing restrictions. The update includes a new \AssetLoaderDelegate\ for on-demand video caching and streaming, a \VideoManager\ to handle download queues and progress, and a \TimeMachine\ helper to exclude cache files from backups. Users will see videos cached in a more robust location, with better handling of network requests and offline availability checks.

Aerial/Source/Models/Cache · high confidence

New custom UI components for the main interface

The main UI now includes several new custom view classes to support the updated interface: AspectFillNSImageView for handling image aspect ratios, NowPlayingCollectionView for managing the now-playing list, SidebarOutlineView for the sidebar, VideoCellView for video list items with favorite and download actions, and ShadowTextFieldCell for text fields with shadows. These components replace or supplement the previous UI implementation.

Aerial/Source/Views/MainUI · high confidence

New first-time setup wizard for configuring cache, video format, and time settings

Users are now presented with a new multi-step setup wizard on first launch, allowing them to configure video format, cache management preferences, and time-based video scheduling. The wizard includes a recap screen with tips and links to the FAQ and contributor pages.

Resources/MainUI/First time setup · high confidence

New hardware detection models for battery, brightness, dark mode, displays, and HEVC support

Added new Swift source files in the Hardware models directory to detect and manage device capabilities and state. Battery.swift provides logic to check if the Mac is unplugged, charging, or low on power. Brightness.swift adds functions to get and set display brightness. DarkMode.swift detects whether macOS is in dark or light mode. DisplayDetection.swift introduces a Screen class and a singleton manager to detect connected displays, their dimensions, and screen origins. HardwareDetection.swift implements logic to identify Mac models and determine HEVC Main10 hardware decoding support across Intel and Apple Silicon Macs. NightShift.swift adds support for detecting Night Shift availability and sunrise/sunset times.

Aerial/Source/Models/Hardware · high confidence

New info layers for clock, date, countdown, timer, and battery status

The app now supports displaying additional information on the screen, including a clock, current date, a countdown to a specific date, a configurable timer, and battery status. These new layers are managed by a refactored \LayerManager\ that handles positioning, margins, and animations for all info types. The \AnimatableLayer\ protocol and its implementations (\AnimationLayer\, \AnimationTextLayer\) provide a unified way to position and animate these layers in various screen corners. Users can now enable or disable these new info types in the settings, and the system handles overlapping and spacing automatically.

Aerial/Source/Views/Layers · high confidence

New settings panels for advanced video, brightness, and cache management

The application introduces dedicated settings panels for managing video format and hardware acceleration (Advanced), screen brightness and sleep behavior (Brightness), and cache size, rotation, and network restrictions (Cache). Users can now configure video format selection, enable or disable brightness dimming with specific conditions, and control cache limits and download indicators directly from the settings interface.

Resources/MainUI/Settings panels · high confidence

New source management UI components

The application introduces new UI components for managing video sources, including ActionCellView, CheckboxCellView, DescriptionCellView, and SourceOutlineView. These views provide users with the ability to download videos from specific sources, toggle source states, view source details and licenses, and access source-specific actions like refreshing or opening links. This represents a shift towards a more granular, per-source interface for content management.

Aerial/Source/Views/Sources · high confidence

New source management system and sidebar UI

The app introduces a new source management system that replaces the old manifest loader, allowing each source to have its own folder in AppSupport for cleaner cache handling. This change includes a new modern sidebar UI that organizes videos by category (Community, Online, Apple, Local) and provides filtering by location, time, scene, and source. The update also fixes local sources custom data being erased at startup and addresses a bug where captions for Dubai Night 2 were missing.

Aerial/Source/Models/Sources · high confidence

New video orientation and video processing extensions

Added new Swift extensions for AVAsset, AVPlayerItem, and AVPlayerView to support video orientation detection, video vibrance and color inversion effects, and prevention of accidental scroll/keyboard interactions in the player view.

Aerial/Source/Models/Extensions · high confidence

Xcode project refactored to support the AerialApp target

The Xcode project configuration has been updated to include the AerialApp target, with the scheme moved to shared state and build actions configured for the new app target. This change supports the release of the AerialApp application alongside the screen saver, enabling users to run Aerial as a standalone app for testing or development purposes.

Aerial.xcodeproj · high confidence

Behavioural changes

Added Apple Music/Spotify integration

The application now integrates with Apple Music and Spotify by using the MediaRemote private framework to detect currently playing tracks. This new Music module listens for system-wide media notifications to retrieve song title, artist, album, and artwork, allowing the app to react to playback state changes.

Aerial/Source/Models/Music · high confidence

Migrated video playback to a new AVPlayer-based architecture

The video playback engine has been refactored to use a dedicated AVPlayer layer, replacing the previous implementation. This change introduces new files (AerialPlayerItem, AerialView+Player, etc.) that handle video rendering, including support for mirrored/spanned display modes, video fade-in/out effects, and a workaround for specific macOS graphics driver bugs. Users benefit from more stable video playback, particularly on multi-monitor setups and newer macOS versions like Sonoma.

Aerial/Source/Views · high confidence

New asynchronous download manager for video assets

The application now uses a dedicated \DownloadManager\ and \AsynchronousOperation\-based architecture to handle video downloads. This new system manages concurrent download tasks, handles file extraction (unzipping .tar archives for various macOS and tvOS versions), and manages the caching of downloaded content in the AppSupport directory, replacing the previous manifest-based loading mechanism.

Aerial/Source/Models/Downloads · high confidence

Overhaul of the Info and Video management UI

The settings panel for managing on-screen information (Info) and video lists has been completely rewritten. Users will see a new, modern interface for configuring overlays such as the clock, weather, and battery status, as well as a new view for managing the video library. This change introduces a more consistent and flexible layout for adjusting text, position, and display settings for all info types.

Aerial/Source/Views/PrefPanel · high confidence

Redesigned weather layer with new icon support and forecast options

The weather display has been completely rewritten to support multiple icon styles, including native SF Symbols (flat and color-flat) and the previous rasterized icons. The layer now renders current conditions, a 3 or 5-day forecast, and an hourly forecast, with improved text alignment and layout for city names and temperatures. Additionally, wind direction and humidity are now optionally displayed.

Aerial/Source/Views/Layers/Weather · high confidence

Refactor preferences storage into dedicated structs

The application's settings are now organized into specific structs (PrefsAdvanced, PrefsCache, PrefsDisplays, PrefsInfo, PrefsTime, PrefsUpdates, and PrefsVideos), each handling their own set of configuration options. This change restructures how user preferences are stored and accessed, separating concerns such as display modes, cache management, video playback settings, and info overlays into distinct modules.

Aerial/Source/Models/Prefs · high confidence

Refactored video and cache model architecture

The app's model layer has been restructured to support a new source-based video system and improved cache management. A new \Aerial\ helper class centralizes common utilities, including dark mode detection, language identification, and alert handling. The \AerialVideo\ model now explicitly tracks video formats and sources, while \ManifestLoader\ handles the loading and deduplication of video manifests. Custom video folder support is now handled via a dedicated \CustomVideoFolders\ model with helper extensions. Additionally, a \CompanionBridge\ struct has been introduced to receive location and time data from the Aerial Companion app via distributed notifications, and a \Locations\ class manages geolocation requests with fallbacks to cached coordinates.

Aerial/Source/Models · high confidence

Removal of legacy AerialView class

The AerialView class, which previously extended ScreenSaverView to handle animation timing and drawing, has been removed from the codebase. This eliminates the associated header and implementation files, indicating a structural change to how the screen saver's visual components are managed.

Aerial · high confidence

Replaced the main menu XIB with a new MainMenu.xib

The application's main menu interface has been replaced with a new MainMenu.xib file. This change updates the structure of the app's primary menu bar, including the application menu (About, Preferences, Services, Hide, Quit) and the Edit menu (Undo, Redo, Cut, Copy, Paste, Find, Spelling, Substitutions). Users will see the standard macOS menu bar layout for the app.

Aerial/App/Resources/Base.lproj · high confidence

Updated Xcode workspace configuration files

The Xcode workspace configuration was updated to include new settings files (IDEWorkspaceChecks.plist and WorkspaceSettings.xcsettings) and modified the workspace data file to adjust the project reference location from 'self:Aerial.xcodeproj' to 'self:'.

Aerial.xcodeproj/project.xcworkspace · medium confidence

Updated external library submodules

The project has updated its external dependencies by updating the Git submodules for OAuthSwift and Sparkle to their latest specified commits. This ensures the application uses the most recent versions of these third-party libraries.

Extern · medium confidence

Test coverage

Added unit tests for application preferences

A new test suite for application preferences has been added, including a test case that verifies the saving and retrieval of preference settings. Additionally, the test bundle's Info.plist has been moved to the Tests directory and updated to reflect the new location, ensuring the test target is correctly configured.

Tests · high confidence

Dependencies

Added Sparkle dependency for macOS update functionality

The project now includes the Sparkle framework via CocoaPods to handle application updates on macOS. The Podfile and Podfile.lock have been added to manage this dependency, pinning Sparkle version 1.22.0. Additionally, the build process is configured to code-sign Sparkle helper binaries to support App Notarization.

(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 44 → 57 (+13.1)
  • Rubric changed (rubric-2026.08.15 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 100 → 89 (-11.3)
  • Architecture 90 (new)
  • Maturity 36 → 36 (-0.5)
  • Readiness 24 → 63 (+39.4)
  • Security 95 → 95 (+0.0)

Resolved (6)

  • Dimension evaluation failed
  • No automated tests
  • No exposed public API
  • No tests found
  • Test reliability not included
  • The translation workflow is excellent but ends at 'Supported languages & Kudos; Sponsorship' before the sponsorships section appears in the outline, so it cannot be confirmed whether translations are being sponsored. (Resources/Community/Readme.md)

New (88)

  • Aerial.migratePreferences (cognitive 23) (Aerial/Source/Models/Aerial.swift)
  • AerialVideo.init (cognitive 16) (Aerial/Source/Models/AerialVideo.swift)
  • AerialView.keyDown (cognitive 25) (Aerial/Source/Views/AerialView.swift)
  • AerialView.observeValue (cognitive 23) (Aerial/Source/Views/AerialView.swift)
  • AerialView.playNextVideo (cognitive 28) (Aerial/Source/Views/AerialView.swift)
  • AerialView.playNextVideo (cyclomatic 18) (Aerial/Source/Views/AerialView.swift)
  • AerialView.setDimTimers (cognitive 16) (Aerial/Source/Views/AerialView.swift)
  • AerialView.setup (cognitive 46) (Aerial/Source/Views/AerialView.swift)
  • AerialView.setup (cyclomatic 31) (Aerial/Source/Views/AerialView.swift)
  • AerialView.setupPlayerLayer (cognitive 22) (Aerial/Source/Views/AerialView.swift)
  • Cache.freeCache (cognitive 31) (Aerial/Source/Models/Cache/Cache.swift)
  • Cache.freeCache (cyclomatic 18) (Aerial/Source/Models/Cache/Cache.swift)
  • Cache.removeCruft (cognitive 22) (Aerial/Source/Models/Cache/Cache.swift)
  • Cache.removeUncachedCruft (cognitive 19) (Aerial/Source/Models/Cache/Cache.swift)
  • Cache.supportPath (cognitive 47) (Aerial/Source/Models/Cache/Cache.swift)
  • Cache.supportPath (cyclomatic 17) (Aerial/Source/Models/Cache/Cache.swift)
  • Change coupling: Source.swift ↔ AerialView.swift (Aerial/Source/Models/Sources/Source.swift)
  • ClassTooLong: AerialView (Aerial/Source/Views/AerialView.swift)
  • ClassTooLong: ManifestLoader (Aerial/Source/Models/ManifestLoader.swift)
  • CustomVideoController.outlineView (cognitive 16) (Aerial/Source/Controllers/CustomVideoController.swift)
  • …and 68 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

JohnCoates/Aerial 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 27 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 6b4aa82ab3d5e247a198d86c3d645fcf68c98fec — 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-d00c643c3f66.