Skip to content
CAI
Software that uses CAICheck a score

kizitonwose/Calendar

56.5

Adequate · 25 September 2026

21.4k

lines of production code

Kotlin

primary language

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is a Kotlin Multiplatform calendar library that provides customizable UI components for Android View and Jetpack Compose across multiple platforms. It exposes distinct views for displaying months, weeks, and years, along with specialized heatmaps for visualizing activity density. The library manages calendar data through immutable models and state classes, supporting features like range selection, scroll snapping, and flexible layout customization.

How it got here

2019 — Initial release and build modernization

8 changes.

This period marks the initial release of the Calendar library with multiplatform support, introducing features for Android View and Jetpack Compose. The project simultaneously modernized its build infrastructure by upgrading Gradle, migrating to Kotlin DSL, and adopting version catalogs. Cleanup efforts removed unused scaffolding and test files, while comprehensive UI tests were added to the sample application.

2022 — Compose migration and new calendar views

11 changes.

This period focused on expanding the library with new Compose-based calendar components, including HorizontalCalendar, VerticalCalendar, WeekCalendar, and HeatMapCalendar, alongside a comprehensive migration of the sample app to Compose UI and Material 3. The core library was updated with immutable data models and new View-based YearCalendar support, while internal scrolling and layout mechanisms were refactored to improve precision and flexibility across all calendar types.

2024 — multiplatform calendar library release

12 changes.

This period focused on finalizing and releasing version 2.10.2 of the Compose Multiplatform calendar library, introducing comprehensive month, week, year, and heatmap view components. The work included establishing stable public API surfaces across core, data, and view modules, alongside updating build configurations to require Java 17 and Android SDK 23. Extensive unit tests and sample applications were added to validate state management and demonstrate multiplatform integration.

Features

Add HeatMapCalendar composable for month-based heatmaps

Introduces a new HeatMapCalendar component that displays months in a horizontal scrollable layout, allowing users to visualize data across a range of months. The implementation includes a state manager (HeatMapCalendarState) for controlling the visible month range and scroll position, supports customizable week headers (positioned at start or end), and provides immutable model wrappers for weeks to ensure stable Compose recomposition.

compose/src/main/java/com/kizitonwose/calendar/compose/heatmapcalendar · high confidence

Initial public API surface for Compose Calendar components

The \compose/api\ module now publishes the stable public API definitions for the Compose Calendar library. This includes the public interfaces and composable functions for \HorizontalCalendar\, \VerticalCalendar\, \WeekCalendar\, \HeatMapCalendar\, and their respective year-based variants, along with the state management classes (\CalendarState\, \WeekCalendarState\, \HeatMapCalendarState\) and layout info structures required to integrate these UI components into applications.

compose/api · high confidence

Initial release of the Calendar library with multiplatform support

This entry marks the initial release of the Calendar library, a highly customizable calendar component for Android and Compose Multiplatform. The library supports week, month, and year modes, offering single, multiple, or range date selection, boundary limits, and customizable views for both the Android View system (RecyclerView) and Jetpack Compose (LazyRow/LazyColumn). It includes features like heatmaps, custom headers/footers, and horizontal or vertical scrolling. The release adds JavaScript target support for Kotlin Multiplatform and provides artifacts for pure Android projects (\view\, \compose\) and Compose Multiplatform projects (\compose-multiplatform\).

(repo-wide) · high confidence

Introduce Compose WeekCalendar component with scroll and layout controls

Adds a new \WeekCalendar\ composable in the \compose/weekcalendar\ package, providing a horizontal list of weeks with configurable date ranges, first day of week, and scroll behavior (including paged scrolling and fling). The component supports optional header and footer content per week, allows custom week containers, and exposes state management via \WeekCalendarState\ for observing visible weeks and layout information.

compose/src/main/java/com/kizitonwose/calendar/compose/weekcalendar · high confidence

Introduce WeekCalendarView with week-based scrolling and visibility tracking

This change adds the internal implementation for a new WeekCalendarView component, including the WeekCalendarAdapter, WeekCalendarLayoutManager, and WeekViewHolder. Users can now display a calendar that scrolls and groups content by week rather than by day. The adapter manages week items and supports partial updates for individual days, while the layout manager handles horizontal paging and exposes methods to find the first and last visible weeks and days. A scroll listener is triggered when the visible week changes, enabling apps to react to navigation within the week-based view.

view/src/main/java/com/kizitonwose/calendar/view/internal/weekcalendar · high confidence

Introduce YearCalendar composable with scroll and layout control

This location introduces the core implementation for the new YearCalendar component, providing a scrollable view of years and months. It adds state management via YearCalendarState for controlling the visible year range and scroll position, layout info classes to query currently visible items, and configuration options for month grid columns and content height modes (Wrap, Fill, Stretch) to control how the calendar fills the available space.

compose/src/main/java/com/kizitonwose/calendar/compose/yearcalendar · high confidence

Introduce internal YearCalendarView implementation

This change adds the internal infrastructure for a new year-based calendar view, including the \YearCalendarAdapter\, \YearCalendarLayoutManager\, \YearViewHolder\, \YearMonthHolder\, and layout setup logic. It enables displaying a full year's months in a grid, supports scrolling to specific months or days, allows toggling month visibility, and provides mechanisms to reload individual days, months, or the entire year view.

view/src/main/java/com/kizitonwose/calendar/view/internal/yearcalendar · high confidence

Introduce internal month calendar view components

Added the internal adapter, layout manager, and view holder classes for the month calendar view. These components handle the binding of month data, managing the RecyclerView layout for month items, and reloading specific days or months within the calendar grid.

view/src/main/java/com/kizitonwose/calendar/view/internal/monthcalendar · high confidence

Introduce multiplatform calendar library with month, week, and heatmap views

The \compose-multiplatform/library\ module now provides a comprehensive calendar UI toolkit for Compose Multiplatform. This release adds three distinct calendar components: a standard month calendar (supporting both horizontal and vertical scrolling layouts), a week calendar for displaying individual weeks, and a heatmap calendar for visualizing activity density. Each component includes its own state management (e.g., \CalendarState\, \WeekCalendarState\, \HeatMapCalendarState\) and layout info classes to track visible items. The implementation supports customizable scrolling behaviors (paged vs. continuous), content height modes, and flexible composable slots for headers, footers, and day/week containers, enabling users to integrate calendar views across Android, iOS, and other supported platforms.

compose-multiplatform/library · high confidence

Introduction of immutable core data models for calendar views

The core library now exposes a new set of immutable, serializable data classes to represent calendar structures, including CalendarDay, CalendarMonth, CalendarYear, Week, and WeekDay, along with their respective position enums (DayPosition, WeekDayPosition) and styling options (OutDateStyle). These models, annotated with @Immutable, provide the foundational data structures for month-based and week-based calendar views, replacing previous internal representations with a public, stable API for calendar data.

core/src · high confidence

New multiplatform calendar sample application

The sample project now includes a comprehensive multiplatform application demonstrating various calendar configurations. This includes horizontal and vertical year calendars, full-screen examples, and date selection patterns (single and continuous ranges). The app features a responsive UI that adapts to mobile and tablet layouts, utilizes Material 3 theming with custom color schemes, and integrates navigation with snackbar feedback.

compose-multiplatform/sample · high confidence

New year-based calendar view and layout customization options

The calendar library now includes a \YearCalendarView\ component, allowing users to display and navigate a full year at a glance with support for year-level headers, footers, and scroll listeners. To support this and improve layout control across all views, new configuration options have been added: \DaySize\ now includes a \Rectangle\ mode to stretch days to fill available space, \MonthHeight\ allows uniform distribution of month rows in the year view, and \MarginValues\ provides a structured way to set padding around months and weeks. Additionally, a \LayoutHelper\ class enables overriding the extra layout space calculation in the internal layout managers for advanced scrolling behaviors.

view/src/main/java/com/kizitonwose/calendar/view · high confidence

Removals

Removal of unused library scaffolding files

The library has removed several default scaffolding files that were no longer in use, including the ProGuard rules file, the AndroidManifest.xml, and the example instrumented and unit test classes. This cleanup reduces the library's footprint and removes unnecessary configuration and test boilerplate that did not contribute to the core functionality.

library · high confidence

API

Initial public API dump for the view module

This change introduces the \view.api\ file, which serves as the public API surface for the calendar view module. It exposes the main calendar components (\CalendarView\, \WeekCalendarView\, \YearCalendarView\), their configuration options (such as binders, margins, and scroll behaviors), and supporting types like \DaySize\ and \MarginValues\. This dump establishes the baseline contract for developers integrating these UI components.

view/api · high confidence

Behavioural changes

Added API dump file for binary compatibility verification

A new \core.api\ file has been added to the \core/api\ module to serve as an API dump for Binary Compatibility Validator (BCV) checks. This file explicitly defines the public surface of the calendar core library, including classes such as \CalendarDay\, \CalendarMonth\, \CalendarYear\, \Week\, and \WeekDay\, along with enums like \DayPosition\, \WeekDayPosition\, and \OutDateStyle\, and utility functions in \ExtensionsKt\. This ensures that future changes to the core API are detected and validated against this baseline.

core/api · high confidence

Introduce immutable data models and new data-fetching functions for month, week, and year views

The data layer now provides immutable data classes (MonthData, WeekData, YearData) and corresponding factory functions (getCalendarMonthData, getWeekCalendarData, getCalendarYearData) to generate calendar structures. This change replaces previous mutable or less structured approaches, ensuring that the underlying data for month grids, week ranges, and year overviews is immutable and explicitly constructed via these new entry points, which also handle first-day-of-week alignment and out-date styling.

data/src/main · high confidence

New Compose Calendar with scroll snapping and height modes

The Compose module now provides \HorizontalCalendar\ and \VerticalCalendar\ composables that replace the previous custom layout implementation with a \LazyRow\/\LazyColumn\-based approach. This change introduces paged scroll snapping (snapping to the start of months) via a custom \FlingBehavior\ to address decayed snapping issues in Compose 1.4+, and adds a \ContentHeightMode\ parameter allowing users to choose between wrapping day content or filling the available height. The calendar state is now \saveable\ to support state restoration, and the API exposes \monthHeader\, \monthBody\, \monthFooter\, and \monthContainer\ slots for flexible customization.

compose/src/main/java/com/kizitonwose/calendar/compose · high confidence

Refactor calendar scrolling and layout internals

The internal view layer has been restructured to improve scrolling precision and layout flexibility. A new CalendarLayoutManager and CalendarPageSnapHelper replace previous implementations to provide more accurate snap-to-day behavior, particularly for paged calendars where items should align to the start rather than the center. The WeekHolder now uses a custom WidthDivisorLinearLayout to correctly calculate heights for square day sizes, and the DayHolder and ItemRoot classes have been updated to support new DaySize options like Rectangle and FreeForm, allowing for more varied calendar grid layouts.

view/src/main/java/com/kizitonwose/calendar/view/internal · high confidence

Removal of MainActivity entry point

The sample application's main activity entry point (MainActivity.kt) has been removed. This change eliminates the standard Android activity lifecycle and layout binding previously defined in this file, indicating a shift in how the sample application is structured or launched.

sample/src/main/java/com/kizitonwose/calendarviewsample · high confidence

Removed sample ProGuard configuration file

The sample application no longer includes a dedicated proguard-rules.pro file, meaning any ProGuard or R8 obfuscation and optimization rules for this sample must now be configured directly within the build script (build.gradle) rather than via a separate rules file.

sample · high confidence

Sample app migrated to Compose UI with Material 3 and new year calendar demos

The Compose sample application has been rebuilt using Material 3, introducing a new navigation-based structure with animated transitions between examples. This update adds new multiplatform year calendar samples (horizontal and vertical) alongside existing month/week views, and improves the visual design and responsiveness of the examples for various screen sizes.

sample/src/main/java/com/kizitonwose/calendar/sample/compose · high confidence

Sample app view layer refactored with unified base fragment and window insets

The sample app's view layer has been restructured to improve consistency and modern Android UI practices. A new BaseFragment abstract class centralizes toolbar management, back-button handling, and menu provider integration for all example fragments. The main CalendarViewActivity now consumes system window insets to correctly pad the app bar and example list, ensuring proper layout on devices with notches or navigation bars. Additionally, the home screen now uses a unified CalendarViewOptionsAdapter to present the list of calendar examples, replacing the previous scattered navigation approach.

sample/src/main/java/com/kizitonwose/calendar/sample/view · high confidence

Updated Compose Multiplatform calendar API definitions

The public API surface for the Compose Multiplatform calendar library has been updated across Android, Desktop, and Klib targets. This change refreshes the API dumps to reflect the current state of the \CalendarState\, \HeatMapCalendarState\, and \WeekCalendarState\ classes, ensuring that the public interfaces for scrolling, month/week visibility, and layout information are correctly versioned and validated for multiplatform compatibility.

compose-multiplatform/library/api · high confidence

Updated build configuration to Android SDK 23 minimum and Java 17

The build source configuration has been updated to require a minimum Android SDK level of 23 and Java 17 for compilation. The project version is set to 2.10.2-SNAPSHOT, and the Android target and compile SDKs are set to 36. This change affects the build environment requirements for developers and CI pipelines.

buildSrc/src · high confidence

Test coverage

Added API dump file for data module; Added Android UI tests for Calendar Compose and View components; Added unit tests for calendar data models; Added unit tests for calendar state management and restoration; Removed unused unit test file.

Dependencies

Gradle wrapper upgraded to version 8.14.3

The Gradle wrapper has been updated from version 4.10.1 to 8.14.3. This upgrade brings modern build capabilities and performance improvements to the project, requiring the build environment to support the newer Gradle distribution.

gradle · high confidence

Migrate to Gradle Version Catalogs and Kotlin DSL

The project has migrated from legacy Groovy build scripts to Kotlin DSL (build.gradle.kts) and adopted Gradle Version Catalogs (libs.versions.toml) for centralized dependency management. This change introduces a new \buildSrc\ module to manage build logic and standardizes plugin and library versions across the Android View, Compose, and Compose Multiplatform modules, while also updating the underlying toolchain versions for Kotlin, AGP, and Compose.

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

Lenses

  • Code Health 97 → 94 (-2.9)
  • Architecture 94 → 98 (+4.1)
  • Maturity 51 → 59 (+7.8)
  • Readiness 25 → 43 (+17.6)
  • Security 40 → 63 (+22.6)

Resolved (92)

  • Coverage not measured — test suite did not build
  • Critical CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
  • Critical CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
  • Dimension evaluation failed
  • Duplicated block (14 lines × 2) (compose-multiplatform/sample/src/commonMain/kotlin/Example9PageAnimatedVisibility.kt)
  • Duplicated block (14 lines × 2) (sample/src/main/java/com/kizitonwose/calendar/sample/compose/Example9PageAnimatedVisibility.kt)
  • Duplicated block (15 lines × 2) (compose-multiplatform/library/src/commonMain/kotlin/com/kizitonwose/calendar/compose/Calendar.kt)
  • Duplicated block (16 lines × 2) (compose-multiplatform/library/src/commonMain/kotlin/com/kizitonwose/calendar/compose/Calendar.kt)
  • Duplicated block (16 lines × 2) (compose-multiplatform/library/src/commonMain/kotlin/com/kizitonwose/calendar/compose/Calendar.kt)
  • Duplicated block (16 lines × 2) (sample/src/main/java/com/kizitonwose/calendar/sample/compose/Example2PageHighlight.kt)
  • Duplicated block (17 lines × 3) (compose-multiplatform/sample/src/commonMain/kotlin/Flight.kt)
  • Duplicated block (21 lines × 2) (compose-multiplatform/sample/src/commonMain/kotlin/Example2PageHighlight.kt)
  • Duplicated block (25 lines × 2) (sample/src/main/java/com/kizitonwose/calendar/sample/compose/Example2PageHighlight.kt)
  • Duplicated block (26 lines × 2) (compose-multiplatform/sample/src/commonMain/kotlin/Example2PageHighlight.kt)
  • High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
  • …and 72 more

New (235)

  • Boundary-crossing change coupling: Build.kt ↔ CalendarDefaults.kt (buildSrc/src/main/java/com/kizitonwose/calendar/buildsrc/Build.kt)
  • Critical CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
  • Critical CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
  • Dependency hygiene PARTLY measured — Maven/Gradle declarations read, no dependency graph resolved
  • Documentation: no installation or build instructions (README.md)
  • Documentation: no usage examples (README.md)
  • Duplicated block (10 lines × 2) (compose-multiplatform/library/src/commonMain/kotlin/com/kizitonwose/calendar/compose/Calendar.kt)
  • Duplicated block (10 lines × 2) (compose-multiplatform/library/src/commonMain/kotlin/com/kizitonwose/calendar/compose/weekcalendar/WeekCalendar.kt)
  • Duplicated block (10 lines × 2) (compose-multiplatform/library/src/commonMain/kotlin/com/kizitonwose/calendar/compose/yearcalendar/YearCalendarMonths.kt)
  • Duplicated block (10 lines × 2) (compose-multiplatform/library/src/commonMain/kotlin/com/kizitonwose/calendar/data/DataStore.kt)
  • Duplicated block (10 lines × 2) (compose-multiplatform/sample/src/commonMain/kotlin/Example11Page.kt)
  • Duplicated block (10 lines × 2) (compose-multiplatform/sample/src/commonMain/kotlin/Example1Page.kt)
  • Duplicated block (10 lines × 2) (compose-multiplatform/sample/src/commonMain/kotlin/Example6Page.kt)
  • Duplicated block (10 lines × 2) (compose-multiplatform/sample/src/commonMain/kotlin/Example9Page.kt)
  • Duplicated block (10 lines × 2) (compose-multiplatform/sample/src/commonMain/kotlin/Example9Page.kt)
  • Duplicated block (10 lines × 2) (compose-multiplatform/sample/src/commonMain/kotlin/Utils.kt)
  • Duplicated block (10 lines × 2) (sample/src/main/java/com/kizitonwose/calendar/sample/compose/Example11Page.kt)
  • Duplicated block (10 lines × 4) (compose-multiplatform/sample/src/commonMain/kotlin/Example9Page.kt)
  • Duplicated block (11 lines × 2) (compose-multiplatform/library/src/commonMain/kotlin/com/kizitonwose/calendar/compose/heatmapcalendar/HeatMapCalendar.kt)
  • Duplicated block (11 lines × 2) (compose-multiplatform/library/src/commonMain/kotlin/com/kizitonwose/calendar/data/MonthData.kt)
  • …and 215 more

Changes since last survey

  • 1 commits — 1 feature/other, 0 fixes

By area

  • (root) — 1 commit

Notable commits

  • change: Update version table

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

Survey your own repository

kizitonwose/Calendar 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 25 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 c2711b3c7fdf027e9a6bad55be9a7d979a288699 — 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-dd72cc24c749.