Skip to content
CAI
Software that uses CAICheck a score

analogcode/Swift-Radio-Pro

51.3

Adequate · 30 September 2026

3.7k

lines of production code

Swift

primary language

2

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

SwiftRadio is an iOS application designed for streaming internet radio stations, featuring a modernized architecture that supports CarPlay integration and dark mode. It manages audio playback through a centralized service that handles lock-screen controls, Bluetooth hands-free audio, and live stream status indicators. The user interface presents a list of stations with glassmorphism styling and provides a detailed Now Playing view with dynamic visuals, buffering feedback, and scrolling track titles.

How it got here

2015 — Modern iOS architecture migration

7 changes.

The project underwent a significant architectural overhaul to support modern iOS features, including CarPlay integration, dark mode, and the Scene-based lifecycle. This involved migrating from legacy storyboards and bundled libraries to a Coordinator pattern, programmatic configurations, and updated dependency management.

2016–2022 — UI overhaul and architecture modernization

6 changes.

The project underwent a significant architectural shift by migrating navigation to the Coordinator pattern and adopting Swift Package Manager for dependency management. This period also focused on enhancing the user interface with glassmorphism design elements and implementing comprehensive lock screen support for radio playback.

2023–2026 — CarPlay integration and UI modernization

4 changes.

This period focused on expanding the app's reach by adding a full CarPlay interface for station browsing and playback. The core architecture was modernized by centralizing configuration, audio session management, and navigation into dedicated services and modules. Concurrently, the Now Playing view received a significant visual overhaul with dynamic visuals, improved accessibility, and better buffering feedback.

Features

Add CarPlay interface with station list and now-playing indicators

Users can now access Swift Radio via CarPlay. A new CarPlaySceneDelegate establishes the CarPlay connection, displaying a list of radio stations fetched from the StationsManager. When a user selects a station, playback begins. The interface dynamically updates to reflect station changes and highlights the currently playing station in the list, ensuring the now-playing indicator stays in sync with the audio state.

SwiftRadio/CarPlay · high confidence

New RadioStation model and StationsManager with lock screen support

The app introduces a new RadioStation data model and a centralized StationsManager to handle station data and playback state. This change adds support for displaying live stream status on the lock screen via MPNowPlayingInfoCenter, ensuring that users see accurate 'live' indicators and metadata when listening to radio stations.

SwiftRadio/Model · high confidence

Removals

Removal of Spring library custom UI components and utilities

The Spring library's custom UI components and utility classes have been removed from the project. This includes the deletion of \AsyncButton\, \AsyncImageView\, \AutoTextView\, \BlurView\, \DesignableButton\, \DesignableImageView\, \DesignableLabel\, \DesignableTabBarController\, \DesignableTextField\, \DesignableTextView\, \DesignableView\, \ImageLoader\, \KeyboardLayoutConstraint\, \LoadingView\, \Misc\, \SoundPlayer\, and the core \Spring\ animation engine. Users relying on these specific Spring-based controls for animations, designable properties, or utility functions will no longer have access to them.

SwiftRadio/Libraries/Spring · high confidence

Behavioural changes

Centralized app configuration and modernized UI lifecycle

The app now uses a dedicated Config module to manage global settings, including a centralized tint color and gradient background, station data sources, and feature flags. User-facing strings have been migrated to a Localizable.xcstrings catalog for improved localization support. Additionally, the app lifecycle has been updated to use the modern UIScene architecture (SceneDelegate) with a coordinator-based navigation pattern, replacing the previous AppDelegate-centric approach.

SwiftRadio/Config · high confidence

Centralized audio session and remote command configuration

The app now uses a new AudioSetupService to manage core audio behavior, configuring the AVAudioSession for playback with Bluetooth hands-free support and setting up the FRadioPlayer for automatic playback and artwork retrieval. This service also registers handlers for system remote commands (play, pause, next, previous, and toggle), enabling lock-screen and notification-center controls, and includes logic to dynamically enable or disable the stop and pause buttons based on whether a stream is live.

SwiftRadio/Services · high confidence

Migrate launch screen from storyboard to Info.plist

The launch screen is no longer defined in the LaunchScreen.xib file; instead, the app now uses the UILaunchScreen key in Info.plist to configure the launch screen, simplifying the project structure and removing the dedicated storyboard file for this purpose.

SwiftRadio/Base.lproj · high confidence

Migrate navigation to Coordinator pattern and update station tap behavior

The app replaces storyboard-based navigation with a Coordinator pattern, introducing new coordinator classes (MainCoordinator, AboutCoordinator) to manage view controller lifecycles and navigation flows. This change alters how users interact with stations: tapping a station that is already selected now plays or pauses the audio if it is stopped, or opens the Now Playing popup if it is currently playing, instead of opening a popup unconditionally. Additionally, website links from the bottom sheet are now opened in an in-app SFSafariViewController rather than launching the external Safari app, and the popup is automatically closed before opening the browser.

SwiftRadio/Coordinators · high confidence

Migrate to modern iOS architecture and add CarPlay support

The project has been updated to object version 54, reflecting a migration to Swift 5 and Xcode 14, and now includes a new CarPlay target with its own scene delegate. Navigation has been refactored from storyboards to a Coordinator pattern, and the app now uses a SceneDelegate for lifecycle management. The UI has been modernized with a new LogoShareView for sharing track details, a GradientBackgroundView, and a centralized Config service replacing the previous settings approach. Additionally, the app now supports localization via Localizable.xcstrings and integrates frameworks like LNPopupController and MarqueeLabel for enhanced playback controls and text display.

SwiftRadio.xcodeproj · high confidence

Migrate to modern iOS architecture with CarPlay support and dark mode

The app has been updated to use the modern Scene-based lifecycle (SceneDelegate) instead of the legacy AppDelegate, enabling support for multiple scenes and CarPlay integration via a dedicated Info-CarPlay.plist and entitlements. The user interface now defaults to Dark Mode, and the launch screen has been migrated from a storyboard to a programmatic configuration in Info.plist. Additionally, localization strings have been consolidated into the modern Localizable.xcstrings format, and legacy components like the old About screen and manual JSON parsing have been removed in favor of the new structure.

SwiftRadio · high confidence

Redesigned Now Playing interface with buffering feedback and dynamic visuals

The Now Playing view has been visually overhauled to include a dynamic gradient background, SF Symbols for playback controls, and a marquee label for scrolling track titles. A new AlbumArtworkView displays album art with a shadow and a buffering overlay that shows an activity indicator when the stream is loading. The ControlsView now features a live badge, a time slider, and increased tap targets for AirPlay and more buttons to improve accessibility.

SwiftRadio/Views · high confidence

Redesigned station list with glassmorphism cards and improved playback indicators

The station list now uses a new StationTableViewCell that displays each station inside a glassmorphism card with a dark blur effect and shadow. The artwork is presented in a rounded container with a shadow and a pulsing ring animation to indicate the currently playing station. A buffering overlay with an activity indicator appears over the artwork when the stream is loading, and an audio equalizer animation is shown next to the station subtitle when playback is active.

SwiftRadio/ViewControllers · high confidence

Removal of bundled SwiftyJSON source file

The local copy of the SwiftyJSON library (SwiftRadio/Libraries/SwiftyJSON.swift) has been removed from the project. This change eliminates the bundled source code, implying that the application now relies on an external dependency manager or a different version of the library to provide JSON parsing capabilities.

SwiftRadio/Libraries · high confidence

Removed user-specific Xcode configuration files

The project no longer tracks per-developer settings such as breakpoints and scheme management configurations. This ensures that individual developer preferences do not interfere with the shared project state or cause unnecessary merge conflicts.

SwiftRadio.xcodeproj/xcuserdata · high confidence

Scheme migrated to shared location and updated for UI tests

The SwiftRadio scheme has been moved from user-specific storage (xcuserdata) to the shared project data (xcshareddata), ensuring consistent build and test configurations for all team members. The scheme's upgrade version has been updated to 2620, and the test configuration now targets SwiftRadioUITests instead of the previous SwiftRadioTests unit test bundle. Additionally, the launch action no longer includes the CG\_CONTEXT\_SHOW\_BACKTRACE environment variable.

SwiftRadio.xcodeproj/xcshareddata · high confidence

Test coverage

Added initial UI test suite structure

The project now includes a basic UI test target (SwiftRadioUITests) with a new test class and an updated Info.plist configured as a bundle (BNDL) rather than a framework, establishing the foundation for automated interface testing.

SwiftRadioUITests · high confidence

Dependencies

Migrate dependencies to Swift Package Manager

The project now uses Swift Package Manager (SPM) for dependency management, replacing the previous system. The Package.resolved file pins specific versions for FRadioPlayer (0.2.2), LNPopupController (4.5.12), LNSystemMarqueeLabel (0.1.2), MarqueeLabel (4.5.3), and NVActivityIndicatorView (5.1.1).

(dependencies) · high confidence

Housekeeping

Updated workspace settings file permissions

The file permissions for the user-specific workspace settings (WorkspaceSettings.xcsettings) have been changed from read-write (644) to executable (755). This is a local configuration change specific to the developer's environment and does not affect the application's behavior or code.

SwiftRadio.xcodeproj/project.xcworkspace/xcuserdata/wu.xcuserdatad · 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

This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings — which rule fired, in which file, on which line, and how to fix it — are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.

Score

  • CAI 57 → 51 (-5.6)
  • Rubric changed (rubric-2026.09.11 → rubric-2026.09.18) — scores are not directly comparable.

Lenses

  • Code Health 99 → 99 (+0.0)
  • Architecture 91 → 91 (+0.0)
  • Maturity 55 → 55 (+0.0)
  • Readiness 46 → 35 (-10.5)
  • Security 59 → 62 (+3.1)

Resolved (5)

  • Documentation: no contributor guidance (README.md)
  • Documentation: no installation or build instructions (README.md)
  • Medium: security finding (details withheld)
  • Medium: security finding (details withheld)
  • Off-boarding risk: anonymized user #1

New (3)

  • Off-boarding risk: anonymized user #1
  • Outdated: fradioplayer
  • Outdated: nvactivityindicatorview

Changes since last survey

  • 5 commits — 5 feature/other, 0 fixes

By area

  • (repo) — 2 commits
  • .github/workflows — 1 commit
  • SwiftRadio.xcodeproj/project.pbxproj — 1 commit
  • SwiftRadio.xcodeproj/project.xcworkspace — 1 commit

Notable commits

  • change: Build iOS and CarPlay with Xcode 26.6 and 27.0 on dev
  • change: Merge pull request #217 from dariaphoebe/master
  • change: Merge pull request #218 from analogcode/dev
  • change: Update resolved packages for LNPopupController 4.5.12
  • change: update LNPopupController to get iOS27 support

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

Survey your own repository

analogcode/Swift-Radio-Pro 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 30 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 d0e3dc7a67e1a879164290c49d89ed429687b783 — 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-cb25ca4feafa.