Skip to content
CAI
Software that uses CAICheck a score

richardtop/CalendarKit

45.7

Weak · 30 September 2026

3.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

CalendarKit is an iOS UI library that provides customizable calendar views, including day headers, weekly selectors, and timeline-based event displays. It supports extensive visual styling, localization for multiple languages, and interactive features such as event editing and live time indicators. The system manages date ranges and all-day events while adapting to device layouts and user locale preferences.

How it got here

2015 — Legacy cleanup and dependency update

3 changes.

This period focused on removing legacy Xcode project files and test infrastructure from the Pod directory, alongside cleaning up empty placeholder files. The CalendarKit dependency was updated to version 0.12.3, migrating to Swift 5.7 and raising the minimum iOS deployment target to 11.0.

2020 — Demo app restructuring and SPM migration

3 changes.

The project migrated its demo application from CocoaPods to Swift Package Manager and upgraded it for Xcode 12. This involved restructuring the demo into a standalone iOS app with enhanced interactive features, such as event editing and improved scroll handling, while removing legacy dependencies like DateToolsSwift.

2021 — Calendar UI customization and localization

6 changes.

This period focused on enhancing the calendar's visual presentation by introducing comprehensive styling systems for the day view, header, and timeline components. It also expanded internationalization support by adding translations for key time-related strings and implemented functional improvements such as a live 'now' indicator and adaptive layout handling.

Features

Added translations for all-day events and noon time

Added localization strings for the keys "all-day" and "12:00" across 28 language variants (including Arabic, Catalan, Czech, Danish, German, Greek, English, Spanish, Finnish, French, Hebrew, Hindi, Hungarian, Indonesian, Italian, Japanese, Korean, Dutch, Norwegian, Polish, Portuguese, Romanian, Russian, Slovak, Swedish, Thai, Turkish, Ukrainian, Vietnamese, and Chinese variants). This ensures that UI elements referring to all-day events and the noon time are displayed in the user's selected language.

Sources/Localizations · high confidence

Introduce CalendarStyle for customizable day view appearance

The day view now supports extensive visual customization through the new \CalendarStyle\ struct and its sub-styles (e.g., \DayHeaderStyle\, \TimelineStyle\). Users can configure specific UI elements such as the day selector's corner radius, time format (12/24-hour), colors, fonts, and timeline spacing. This style configuration is applied via the \updateStyle\ method on \DayView\ and \DayViewController\, allowing for a tailored look and feel that matches the iOS Calendar aesthetic.

Sources · high confidence

Introduce DaySelector component with adaptive layout and style customization

Adds a new DaySelector UI component (including DaySelector, DayDateCell, DateLabel, and DaySelectorController) that displays a weekly date selector. The component adapts its layout based on horizontal size class—using a compact single-line view in regular size classes and a more detailed day/date view in others—and supports configurable styling via DaySelectorStyle, including corner radius, fonts, and colors for selected, today, and weekend states.

Sources/Header/DaySelector · high confidence

Introduce new calendar header UI components

Added three new view components to the Sources/Header module: DayHeaderView, which manages a paged week selector and delegates date selection; DaySymbolsView, which displays the days of the week with specific styling for weekdays and weekends; and SwipeLabelView, which animates the display of the currently selected date. These components collectively provide the visual header for the calendar interface, handling layout, style updates, and user interaction states.

Sources/Header · high confidence

New utility extensions for arrays, dates, colors, and views

This update introduces a suite of new Swift extensions to simplify common development tasks. Array handling is improved with a \shift\ method that rotates elements by a specified offset, and a \clamped\ method for Comparable and Strideable types to constrain values within a range. Date formatting is streamlined via a \dateOnly\ helper that extracts year, month, and day components, while Locale detection now includes a \uses24hClock\ property to determine time format preferences. For UI, a \SystemColors\ enum provides iOS 13+ dynamic color aliases with fallbacks for older versions, and UIStackView gains a convenient initializer for quick setup with axis, distribution, alignment, and spacing parameters.

Sources/Extensions · high confidence

Removals

Removal of legacy Xcode project and test suite

The legacy Xcode project file (project.pbxproj) and its associated test infrastructure have been removed. This includes the deletion of the unit test target, the Swift test implementation (Tests.swift), and the Objective-C bridging header (Tests-Bridging-Header.h), effectively stripping the Pod directory of its previous build configuration and test coverage.

Pod · high confidence

Behavioural changes

Demo project migrated to Swift Package Manager and updated for Xcode 12

The CalendarKit demo application has been restructured to use Swift Package Manager instead of CocoaPods, with the project file now referencing CalendarKit via XCRemoteSwiftPackageReference. The project compatibility and scheme have been upgraded to Xcode 12.2 (LastUpgradeVersion 1220), and the build scheme now targets the CalendarApp application directly rather than a separate test bundle, enabling users to run and debug the demo app natively.

CalendarKitDemo/CalendarApp.xcodeproj · high confidence

Migration from CocoaPods workspace to Swift Package Manager structure

The project workspace configuration has been moved from the legacy CocoaPods location (Pod/Pod.xcodeproj) to the Swift Package Manager directory (.swiftpm/xcode/package.xcworkspace). This change updates the internal file reference to point to the current directory, indicating a shift in how the project's dependencies and build structure are managed, likely aligning with a transition to or consolidation within Swift Package Manager.

.swiftpm · medium confidence

New standalone CalendarKit demo application

The demo project has been restructured into a standalone iOS app (CalendarApp) with its own bundle, assets, and launch screen. The example now features a custom calendar controller that generates random events with specific styling (including iOS 13+ clock icons and line-break modes) and supports event editing via long-press. New interactive behaviors include a 'didBeginDragging' delegate callback and improved scroll handling where event views in resize mode no longer scroll to other timelines. The demo also removes the previous dependency on DateToolsSwift and custom dark mode styles, relying instead on Xcode defaults and system colors.

CalendarKitDemo/CalendarApp · high confidence

Timeline view now displays a live 'now' line and supports 12/24-hour time formats

The Timeline view now features a CurrentTimeIndicator that draws a line and label showing the current time, which updates automatically via a timer to reflect the passage of time. This indicator respects the user's locale settings, supporting both 12-hour (e.g., "1:00 PM") and 24-hour (e.g., "13:00") formats, and adapts its appearance for right-to-left layouts. Additionally, the underlying Event model now uses DateInterval for time ranges, and the AllDayView has been introduced to display all-day events in a scrollable, two-column layout.

Sources/Timeline · high confidence

Dependencies

CalendarKit updated to version 0.12.3 with Swift 5.7 and iOS 11 support

The CalendarKit library has been updated to version 0.12.3, migrating the Swift toolchain to version 5.7 and raising the minimum iOS deployment target to 11.0. The package now includes localization resources via a resource bundle and has been transferred to a new repository owner (richardtop).

(dependencies) · high confidence

Housekeeping

Removed empty .gitkeep placeholder file

The empty .gitkeep file in the Source directory has been removed, likely as part of repository cleanup or restructuring.

Source · 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 51 → 46 (-5.3)
  • Rubric changed (rubric-2026.09.11 → rubric-2026.09.18) — scores are not directly comparable.

Lenses

  • Code Health 97 → 97 (+0.0)
  • Architecture 99 → 99 (+0.9)
  • Maturity 53 → 53 (+0.0)
  • Readiness 31 → 23 (-8.8)
  • Security 65 → 65 (+0.0)

New (5)

  • Dependency hygiene PARTLY measured — SwiftPM pinning read, dependency currency NOT established
  • Documentation: no usage examples (README.md)
  • Inconsistent naming for date navigation operations. DayView and DayViewController use move(to:) implying a single target date, while DayHeaderView, SwipeLabelView, and TimelinePagerView use move(from:to:) implying a source and destination. This suggests either redundant parameters in the latter group or missing source context in the former.
  • Redundant data refresh methods across the view/controller hierarchy. DayViewController likely just calls DayView.reloadData(), which might call TimelinePagerView.reloadData(). This forces clients to know whether to refresh the view or the controller.
  • Redundant exposure of low-level scrolling methods. DayView delegates to TimelinePagerView, which delegates to TimelineContainer. Exposing scrollTo on all three layers creates a confusing API surface where the caller must know which layer to invoke, despite them likely doing the same thing.

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

Survey your own repository

richardtop/CalendarKit 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 99a4a05c641d70c3f735ef4256f60dc86580cf20 — 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.