Skip to content
CAI
Software that uses CAICheck a score

JiongXing/PhotoBrowser

59.0

Adequate · 1 October 2026

24.2k

lines of production code

Swift

primary language

2

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

JXPhotoBrowser is an iOS library that provides a customizable photo and video browser with support for infinite looping, auto-play, and configurable transition animations. It is implemented in Swift and supports integration via Swift Package Manager, CocoaPods, and Carthage. The system includes demo applications for both UIKit and SwiftUI to showcase its capabilities and configuration options.

Features

Add Carthage integration demo project

A new demo project (Demo-Carthage) has been added to demonstrate integrating JXPhotoBrowser via Carthage. It includes a minimal iOS 15+ app that embeds the JXPhotoBrowser.xcframework and verifies the integration at launch.

Demo-Carthage · high confidence

New OpenSpec agent skills for change management workflows

Added four new agent skills under \.agents/skills/\ to support the OpenSpec workflow: \openspec-apply-change\ for implementing tasks from a change, \openspec-archive-change\ for finalizing and archiving completed changes (including delta-spec syncing), \openspec-explore\ for interactive requirement investigation and design thinking, and \openspec-propose\ for generating complete change artifacts (proposal, specs, design, tasks) in one step. A \.openspec-target\ file was also created to register the 'codex' target for these skills.

.agents · high confidence

New SwiftUI demo app for JXPhotoBrowser

A new SwiftUI-based demo application has been added to showcase the JXPhotoBrowser library. The app includes a main content view with a photo banner (using a UIViewControllerRepresentable bridge to embed the UIKit browser), a full-screen photo browser presenter, and settings panels to control looping, autoplay, transition animations, and scroll direction. It demonstrates integrating the browser with SwiftUI via delegates and handling media resources (images and videos) with Kingfisher for caching and loading.

Demo-SwiftUI/Demo · high confidence

New SwiftUI demo project with Kingfisher and JXPhotoBrowser dependencies

A new SwiftUI-based demo application has been added to the repository, providing a sample project for developers. The project is configured to depend on the Kingfisher and JXPhotoBrowser Swift packages, and sets the iOS deployment target to 16.0.

Demo-SwiftUI/Demo.xcodeproj · high confidence

New UIKit demo application scaffold

A new Demo-UIKit sample application has been added, providing a standard iOS project structure with an AppDelegate and SceneDelegate. The project is configured to use CocoaPods for dependency management and targets iOS 15 as the minimum deployment version, ensuring compatibility with modern scene-based lifecycle management.

Demo-UIKit/Demo.xcodeproj · high confidence

New demo home page with configurable banner and browser settings

The demo application now includes a new HomePage featuring a top banner and a media collection view. Users can toggle infinite looping and auto-play for the banner via the BannerSettingsPanel, and customize the photo browser's transition animation (fade, zoom, or none) and scroll direction (horizontal or vertical) via the BrowserSettingsPanel. The page displays remote images and videos, with a dedicated VideoPlayerCell for playback and a VideoSaveService to handle saving videos to the photo library.

Demo-UIKit/Demo/HomePage · high confidence

Architecture

JXPhotoBrowser framework project structure and build configuration

The JXPhotoBrowser framework project has been restructured to include a complete Xcode project file, workspace, and scheme configuration. This change establishes the build settings for the framework, incorporating source files such as JXPhotoBrowserViewController, various animators (JXFadeAnimator, JXZoomPresentAnimator, etc.), and a PrivacyInfo.xcprivacy resource. The project is configured to build the JXPhotoBrowser.framework target, linking against UIKit, and sets up the necessary build phases for sources, frameworks, and resources.

JXPhotoBrowser.xcodeproj · high confidence

Behavioural changes

JXPhotoBrowser restructured for Swift with new cell protocol, overlays, and zoom transitions

The Sources directory has been completely rewritten in Swift, replacing the previous Objective-C implementation. The library now uses a \JXPhotoBrowserCellProtocol\ for custom cells instead of inheritance, and introduces a \JXPhotoBrowserOverlay\ protocol for adding UI components like the new \JXPageIndicatorOverlay\. Transition animations are now configurable via \JXPhotoBrowserTransitionType\ (fade, zoom, or none) and are implemented by dedicated animator classes (\JXFadeAnimator\, \JXZoomPresentAnimator\, \JXZoomDismissAnimator\). The main \JXPhotoBrowserViewController\ now supports vertical scrolling, infinite looping, and programmatic auto-play. A lightweight \JXImageCell\ is provided for simple image display, and a \PrivacyInfo.xcprivacy\ file has been added for App Store compliance.

Sources · high confidence

Test coverage

Added validation harness for browser lifecycle and rotation behavior

A new validation suite in Validation/Rotation introduces a standalone test host and automated scripts to verify the photo browser's state management during size transitions, dismissal, and rotation. The suite includes unit tests for data reloading and thumbnail restoration, UI tests for gesture interactions and navigation container dismissal, and video save tests to ensure temporary files are handled correctly. This allows developers to reproduce and verify fixes for rotation and lifecycle regressions without modifying the main project.

Validation · high confidence

Dependencies

JXPhotoBrowser 4.2.0: iOS 15 minimum, Swift 5.4, and Kingfisher 8.13.0

The JXPhotoBrowser library has been updated to version 4.2.0, raising the minimum deployment target to iOS 15 and requiring Swift 5.4. The dependency on Kingfisher has been updated to version 8.13.0, and the project now includes a \PrivacyInfo.xcprivacy\ resource bundle for compliance. These changes are reflected in the updated \Package.swift\, \JXPhotoBrowser.podspec\, and the new demo project dependency files (\Podfile\, \Package.resolved\).

(dependencies) · high confidence

Kingfisher pod updated to 4.2.0 with iOS 15+ support and cache improvements

The Kingfisher dependency in the Demo-UIKit project has been updated to version 4.2.0. This release raises the minimum deployment target to iOS 15 (reflecting the current Xcode minimum) and introduces improvements to the browser paging and state handling. Additionally, the update includes a fix for navigation container dismissal and adds support for Carthage integration.

Demo-UIKit/Pods · high confidence

Housekeeping

Archives OpenSpec change records and establishes agent workflow specifications

This change moves completed OpenSpec change records (browser lifecycle, rotation state, iOS minimum deployment, and video saving) into the \openspec/changes/archive/\ directory, effectively closing out those specific feature and fix tracks. Simultaneously, it initializes the OpenSpec project structure by adding \config.yaml\ and baseline specification files for the new \agent-workflow\ capability, which defines the rules for task routing, code investigation, and verification evidence for AI agents. This represents a shift in development process documentation rather than a change to the library's runtime behavior.

openspec · 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 58 → 59 (+0.7)
  • Rubric changed (rubric-2026.09.11 → rubric-2026.09.18) — scores are not directly comparable.

Lenses

  • Code Health 98 → 98 (+0.0)
  • Architecture 93 → 99 (+5.2)
  • Maturity 51 → 60 (+9.3)
  • Readiness 40 → 40 (-0.3)
  • Security 95 → 88 (-7.2)

Resolved (7)

  • Documentation: no architecture or design documentation (README.md)
  • Documentation: no licence statement (README.md)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • No automated tests
  • No tests found
  • Test reliability not included

New (33)

  • Coverage not measured — Swift suite
  • Documentation: no project overview (README.md)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • Hotspot: Sources/JXZoomImageCell.swift (Sources/JXZoomImageCell.swift)
  • Medium: security finding (details withheld)
  • Medium: security finding (details withheld)
  • Medium: security finding (details withheld)
  • No assertions: testAnimatedNavigationContainerDismissRestoresThumbnail (Validation/Rotation/LifecycleUITests.swift)
  • No assertions: testAnimatedNavigationDuringTransition (Validation/Rotation/RotationTests.swift)
  • No assertions: testDirectionsSpacingAndLoopBoundary (Validation/Rotation/RotationTests.swift)
  • No assertions: testDismissCancelPausesAutoplayThenResumes (Validation/Rotation/LifecycleUITests.swift)
  • …and 13 more

Changes since last survey

  • 16 commits — 7 feature/other, 9 fixes

By area

  • (repo) — 3 commits
  • Validation/Rotation — 3 commits
  • (root) — 2 commits
  • Demo-SwiftUI/Demo — 2 commits
  • openspec/changes — 2 commits
  • .agents/skills — 1 commit
  • Demo-UIKit/Pods — 1 commit
  • Documentation/Release-4.2.0.md — 1 commit
  • Sources/JXPhotoBrowserViewController.swift — 1 commit

Notable commits

  • fix: Merge commit '45315994694dd4c9c19fd40f40c5c5256d99f6bc' into codex/fix-rotation
  • fix: Merge pull request #241 from Vinzius/fix/rotation
  • fix: fix: coordinate browser lifecycle and video saving
  • fix: fix: declare SwiftUI image loading actor isolation
  • fix: fix: declare SwiftUI image loading actor isolation
  • fix: fix: preserve in-flight page and sync cell geometry during rotation
  • fix: fix: reconcile page and cell state during size transitions
  • fix: fix: reconcile page and cell state during size transitions
  • fix: release: prepare 4.2.0 and fix navigation container dismissal
  • change: Merge remote-tracking branch 'origin/master'
  • change: build: raise minimum deployment to iOS 15 and upgrade dependencies
  • change: chore: establish Codex workflow with OpenSpec and CodeGraph
  • change: docs: archive verified rotation repair and PR delivery
  • change: docs: record rotation repair plan and validation status
  • change: docs: record verified 4.2.0 publication
  • change: release: finalize 4.2.0 release metadata

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

Survey your own repository

JiongXing/PhotoBrowser 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 57b8414d9b49faaa8f841fdc4887fa200af47eda — 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.