Skip to content
CAI
Software that uses CAICheck a score

patrykandpatrick/vico

56.7

Adequate · 28 September 2026

27.2k

lines of production code

Kotlin

primary language

2

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

Vico is a Kotlin Multiplatform charting library that enables developers to render interactive data visualizations across Android, iOS, Desktop, and Web platforms using Jetpack Compose. It provides comprehensive support for Cartesian charts—including line, column, and candlestick types—with advanced features like scroll, zoom, and snap-to-grid interactions, as well as newly introduced interactive pie and donut charts. The system also extends its capabilities to Android app widgets via Glance and integrates seamlessly with Material Design 2 and 3 theming.

How it got here

2020 — Initial scaffolding and KMP migration

10 changes.

The project was initialized with essential configuration files and build infrastructure, including a modern Gradle wrapper and automated dependency management. The build system was migrated to Kotlin Multiplatform using version catalogs, restructuring the codebase into dedicated Compose and core modules while removing legacy Android scaffolding and boilerplate files.

2025–2026 — KMP migration and chart feature expansion

30 changes.

The project migrated its build infrastructure and sample applications to Kotlin Multiplatform conventions while introducing comprehensive support for interactive Pie Charts and enhanced Cartesian chart interactions like snap scrolling. Significant internal refactoring standardized layer rendering, axis layout, and data models to improve cross-platform consistency and performance. The period also included the addition of Glance widget support and extensive test coverage for the new charting capabilities.

Features

Added Material 2 and Material 3 theme helpers with pie chart color support

New \rememberM2VicoTheme\ and \rememberM3VicoTheme\ composables have been added to the \vico/compose-m2\ and \vico/compose-m3\ modules respectively. These functions create and remember a \VicoTheme\ instance by deriving default colors from \MaterialTheme.colors\ (M2) and \MaterialTheme.colorScheme\ (M3). A key behavioral addition is the inclusion of \pieChartColors\ in the theme configuration, allowing pie charts to utilize the same color palette as column charts by default, which aligns with the newly introduced pie chart support.

vico/compose-m2, vico/compose-m3 · high confidence

Android sample app migrated to a separate module with screenshot tests

The Android sample application has been restructured into its own dedicated module, introducing a new entry point via MainActivity and standardizing the app manifest and launcher icons. Additionally, automated screenshot tests have been added to capture and verify the visual appearance of various sample charts, including basic column, line, combo, pie, and donut charts, as well as specific data visualizations like AI test scores and daily digital media use.

sample/android · high confidence

Cartesian charts now support snap scrolling to grid windows

Users can now configure their Cartesian charts to automatically snap the scroll position to specific grid intervals. This is achieved by introducing a new \AutoScrollCondition\ interface to control when automatic scrolling occurs (with built-in options like \Never\ and \OnModelGrowth\) and a \SnapFlingBehavior\ that aligns the scroll position to the nearest grid window based on the chart's x-step and spacing. This allows for a more structured and aligned scrolling experience, particularly useful for charts with discrete data points.

vico/compose/src/commonMain/kotlin/com/patrykandpatrick/vico/compose/cartesian · high confidence

Glance widget support for Cartesian and Pie charts

Users can now display static Cartesian and Pie charts in Android app widgets via the new \CartesianChartImage\ and \PieChartImage\ composables. These components render the respective charts to an off-screen bitmap and present them using Glance’s \Image\ provider, enabling chart visualization in widgets despite Glance’s lack of Compose Canvas support.

vico/compose-glance · high confidence

Initial project scaffolding and configuration

The repository is initialized with essential project configuration files, including an Apache 2.0 LICENSE, a Code of Conduct, and a README introducing Vico as a Compose Multiplatform chart library. Developer experience is enhanced with an .editorconfig for consistent formatting, a .gitignore tailored for Android/IDE artifacts, and a lefthook pre-commit hook that enforces ktfmt formatting. The Gradle wrapper scripts (gradlew, gradlew.bat) are updated to a modern POSIX-compliant implementation, and Renovate is configured for automated dependency management.

(repo-wide) · high confidence

Initial support for interactive Pie Charts in Compose

This change introduces the \PieChartHost\ composable, enabling users to display pie charts with data-driven animations and interactive drag-to-rotate gestures via \PieRotationState\. The implementation includes the necessary drawing contexts, model interpolation for smooth transitions, and a renderer that supports generating static image bitmaps for use cases like Glance widgets.

vico/compose/src/commonMain/kotlin/com/patrykandpatrick/vico/compose/pie · high confidence

New Cartesian marker system with visibility callbacks and default implementation

The library introduces a new marker architecture for Cartesian charts, adding the \CartesianMarker\ interface to define how markers draw under or over chart layers, and the \CartesianMarkerVisibilityListener\ interface to notify users when markers are shown, updated, or hidden. A \DefaultCartesianMarker\ implementation is provided, supporting customizable labels, value formatting, indicator components, and various label positioning strategies (Top, Bottom, AroundPoint, AbovePoint, BelowPoint) for line, column, and candlestick layers.

vico/compose/src/commonMain/kotlin/com/patrykandpatrick/vico/compose/cartesian/marker · high confidence

New horizontal decoration components for Cartesian charts

The library introduces a new \Decoration\ interface and two concrete implementations, \HorizontalLine\ and \HorizontalBox\, for the Compose Cartesian chart. \HorizontalLine\ allows users to draw a horizontal line at a specific Y value with an optional label, while \HorizontalBox\ highlights a Y range with a shape and label. Both components support configurable label positioning (horizontal and vertical), rotation, and axis scaling, and are designed to draw either under or over chart layers.

vico/compose/src/commonMain/kotlin/com/patrykandpatrick/vico/compose/cartesian/decoration · high confidence

New scroll and zoom state management for Cartesian charts

The Compose library introduces dedicated state holders for controlling chart interaction: \VicoScrollState\ manages horizontal scrolling with support for absolute and relative positioning, snap-to-grid alignment, and automatic scrolling, while \VicoZoomState\ handles zoom factor customization and animated zooming. These states are backed by new \Scroll\ and \Zoom\ value interfaces that allow programmatic control over the chart's viewport, and are integrated with the \CartesianChartModelProducer\ to coordinate data updates with the current scroll and zoom context.

compose · high confidence

Removals

Removal of legacy Android Activity entry point

The traditional \MainActivity\ extending \AppCompatActivity\ has been removed from the application. This change eliminates the legacy Android View-based entry point, aligning with the project's shift towards Jetpack Compose for its showcase and sample implementations.

app/src/main/java · high confidence

Architecture

Restructure Vico Compose common module

The \vico/compose/common\ package has been restructured to consolidate shared Compose charting logic. This change introduces new foundational components including \ChartHostBox\ for sizing charts by their content area, \HorizontalLegend\ and \VerticalLegend\ for displaying chart legends, and \LayeredComponent\ for stacking chart elements. It also adds utility classes such as \AdditionScope\, \Bounded\, \Fill\, \Insets\, and \DefaultColors\, alongside various helper extensions for collections, math, and drawing contexts to support the library's internal architecture.

vico/compose/src/commonMain/kotlin/com/patrykandpatrick/vico/compose/common · high confidence

Behavioural changes

The \.claude/skills\ location is now a symbolic link pointing to \../.agents/skills\. This change moves the actual skills content to the \.agents\ directory while maintaining the previous access path, effectively reorganizing where agent skills are stored on disk without changing how they are referenced.

.claude · high confidence

Cartesian axis rendering and layout overhaul

The Vico Compose library has restructured its Cartesian axis implementation to provide finer control over axis appearance and layout. Users can now customize tick positioning (Outside, Inside, or Cross) and control whether axis lines and ticks are drawn under or over chart layers. Axis titles are now configurable with specific positions (Side or End), and axis sizing is determined by the content area rather than total height. The refactoring also introduces dedicated item placers for vertical axes (Step and Count) and horizontal axes (Aligned and Segmented), allowing for more precise label placement and spacing.

vico/compose/src/commonMain/kotlin/com/patrykandpatrick/vico/compose/cartesian/axis · high confidence

Cartesian chart data models and interpolation logic restructured

The internal data handling for Cartesian charts has been reorganized to separate drawing models from their interpolation logic. New classes such as \CartesianLayerDrawingModel\ and \CartesianLayerDrawingModelInterpolator\ now manage how line, column, and candlestick layers are animated and rendered, with specific interpolators like \LineCartesianLayerDrawingModelInterpolator\ supporting new animation behaviors such as a 'sweep' effect. Additionally, \CartesianValueFormatter\ now enforces that formatted axis labels are not blank, preventing empty labels from appearing on the chart.

vico/compose/src/commonMain/kotlin/com/patrykandpatrick/vico/compose/cartesian/data · high confidence

Cartesian layer rendering and line interpolation refactored

The Vico Compose library has restructured its Cartesian layer implementation to improve code sharing and update line rendering. A new base layer class now handles margin updates and clipping for all Cartesian layers, while a new \CartesianLayerDimensions\ interface standardizes how spacing and padding are managed. For line charts, the previous \PointConnector\ mechanism has been replaced with an \Interpolator\ interface, allowing for more flexible line smoothing (such as Catmull-Rom curves). Additionally, default styling helpers for candlestick charts have been consolidated into a shared source file.

vico/compose/src/commonMain/kotlin/com/patrykandpatrick/vico/compose/cartesian/layer · high confidence

Migrate sample apps to Kotlin Multiplatform default structure

The sample applications for desktop and web have been restructured to follow the standard Kotlin Multiplatform (KMP) project layout. This change introduces dedicated entry points for each platform: a Compose Desktop application window for the desktop sample and a Compose for Web viewport with a corresponding HTML resource file for the web sample, ensuring the samples align with current KMP conventions.

sample/desktop, sample/web · medium confidence

New build infrastructure and publishing configuration for Vico

The buildSrc module has been restructured with new Gradle convention plugins and configuration files to standardize the build process. Android builds now target compile SDK 37 and require a minimum SDK of 24, with Java and JVM targets set to version 11. The project is configured for automatic Maven Central publishing with GPG signing, and Dokka documentation generation is enabled with inherited members suppressed.

buildSrc · high confidence

New component abstraction and optimized text rendering

The library introduces a new \Component\ interface and dedicated \LineComponent\, \ShapeComponent\, and \TextComponent\ classes in the \vico/compose/common/component\ package, providing a structured way to define drawable elements. The \TextComponent\ now supports advanced text features including rotation, background components, and configurable minimum widths. Additionally, the implementation has been refactored to avoid unnecessary text measurements during the draw phase, improving rendering performance.

vico/compose/src/commonMain/kotlin/com/patrykandpatrick/vico/compose/common/component · high confidence

New pie chart data model and producer API

The pie chart module now introduces a dedicated data layer with \PieChartModel\, \PieChartModelProducer\, and \PieValueFormatter\. Users can build pie chart data using a new \pieModel\ builder function (which replaces the deprecated \pieSeries\ function) and manage updates via a transaction-based producer. This change also moves pie-specific data classes and the value formatter into the \pie.data\ package to better organize the library's structure.

vico/compose/src/commonMain/kotlin/com/patrykandpatrick/vico/compose/pie/data · high confidence

Platform-specific coroutine and modifier implementations added

The library now includes platform-specific implementations for Android and iOS to support cross-platform functionality. On both platforms, the \Modifier.extraPointerInput\ extension is implemented to handle scroll state interactions, and the \runBlocking\ coroutine utility is exposed to enable synchronous execution contexts where required. These changes ensure that core composables and utility functions behave consistently across Android and iOS targets.

vico/compose/src/androidMain, vico/compose/src/iosMain · high confidence

Refactor of common data storage and deprecation of legacy types

The \vico/compose/common/data\ package has been restructured to improve code organization. A new \CacheStore\ class has been introduced to manage data caching with namespace-based keys and purge capabilities, while \ExtraStore\ and \MutableExtraStore\ have been added to handle auxiliary data storage with support for copying and merging. Additionally, \CartesianLayerDrawingModel\ and \CartesianLayerDrawingModelInterpolator\ are now deprecated in this location and replaced with typealiases pointing to their new homes in \com.patrykandpatrick.vico.compose.cartesian.data\, signaling a migration path for users to update their imports.

vico/compose/src/commonMain/kotlin/com/patrykandpatrick/vico/compose/common/data · high confidence

Removal of app build configuration files

The app module no longer includes the .gitignore file (which previously excluded the /build directory) or the proguard-rules.pro file (which contained commented-out ProGuard configuration rules).

app · high confidence

Removal of boilerplate Android library scaffolding files

The liftchart-compose module has removed several default scaffolding files, including the AndroidManifest.xml, ProGuard and consumer rules, the .gitignore file, and the placeholder unit and instrumented test classes (ExampleUnitTest.kt and ExampleInstrumentedTest.kt). This cleanup eliminates unused template code and configuration stubs from the library module.

liftchart-compose · medium confidence

Removal of legacy Android boilerplate and test files

The liftchart-view module has removed several standard Android scaffolding files, including the AndroidManifest.xml, ProGuard and consumer-rules configuration files, the .gitignore file, and both unit and instrumented test classes. This cleanup eliminates redundant template code, likely as part of a broader module restructure or migration to a different build configuration.

liftchart-view · medium confidence

Removal of legacy Android module scaffolding in liftchart-core

The \liftchart-core\ module has removed its Android-specific scaffolding files, including the \AndroidManifest.xml\, ProGuard and consumer rules, \.gitignore\, and default instrumentation and unit tests. This cleanup aligns with the project's restructuring to better support View-based and Compose-based projects, stripping out boilerplate that is no longer needed for the core library's intended usage.

liftchart-core · high confidence

Restructured sample app chart definitions

The sample application's chart definitions have been reorganized into a new centralized module. A new \Charts.kt\ file now defines a registry of available chart examples (including basic column, line, combo, pie, and donut charts, as well as specific data visualizations like AI test scores and gold prices) using a functional API that accepts Composable builders. This change reflects a migration to the KMP default structure and the removal of legacy view-based implementations from the active branch, streamlining how sample charts are registered and accessed within the shared sample code.

shared · medium confidence

Sample app restructured with Material 3 Expressive UI and new navigation

The sample application has been reorganized into a new default structure, introducing a dedicated navigation layer with a \ChartListScreen\ and a \ChartScreen\ that allows users to browse and swipe between different chart demos. The visual design has been updated to adopt Material 3 Expressive, utilizing components like \SegmentedListItem\ and \MaterialExpressiveTheme\. Additionally, the sample now includes a cover page that previews all available charts, and the underlying chart implementations have been refined to use the new \pieModel\ API.

sample/shared · high confidence

Snap scrolling and platform-specific coroutine support for desktop and web charts

Cartesian charts on desktop and web now support snap scrolling, where dragging to a stop aligns the scroll position to a configured grid step rather than decaying freely. This behavior is implemented via platform-specific \Modifier.extraPointerInput\ implementations that handle horizontal drag gestures and snap calculations. Additionally, the library now provides platform-specific coroutine utilities, enabling blocking coroutine execution on desktop while explicitly disabling it on web to maintain compatibility.

vico/compose/src/desktopMain, vico/compose/src/webMain · high confidence

iOS sample app restructured to follow KMP conventions

The iOS sample application has been reorganized into a new directory structure that aligns with Kotlin MultiPlatform (KMP) defaults. This change introduces a dedicated Xcode project configuration (Config.xcconfig) and updates the project file to include a build phase that compiles and signs the Kotlin framework via Gradle. The Swift UI entry point now explicitly ignores the safe area to prevent double padding issues on iOS devices, ensuring the visual layout matches the intended design.

sample · high confidence

Test coverage

Added host tests for Vico Compose Cartesian chart components; Added tests for Rect rotation logic; Added tests for marker target narrowing in combo charts; Added tests for pie chart rotation gestures and drawing model interpolation; Added tests for pie chart slice path rendering; Added unit tests for Cartesian chart data and formatting components; Added unit tests for pie chart geometry and label sizing; Removed obsolete instrumentation test; Removed placeholder unit test.

Dependencies

Migrate build system to Gradle version catalogs and Kotlin Multiplatform

The project has replaced the legacy Groovy-based build configuration (including \versions.gradle\ and \dependencies.gradle\) with a modern Kotlin DSL structure using Gradle version catalogs defined in \gradle/libs.versions.toml\. This change introduces a \buildSrc\ module to centralize plugin dependencies and restructures the project into a Kotlin Multiplatform library with dedicated modules for \vico:compose\, \vico:compose-m2\, \vico:compose-m3\, and \vico:compose-glance\. The sample application has been split into platform-specific modules (\sample:android\, \sample:desktop\, \sample:web\, \sample:shared\) to support Android, Desktop, JS, and Wasm targets, while the root project name has been updated to "Vico".

(dependencies) · high confidence

Upgrade Gradle wrapper to version 9.8.0

The project's Gradle wrapper has been updated from version 6.7.1 to 9.8.0. This upgrade brings the build toolchain to a newer major version, which may require developers to update their local Gradle installations or Android Studio versions to ensure compatibility. Additionally, new configuration properties for network timeout, retries, and distribution URL validation have been added to the wrapper properties file.

gradle · 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 49 → 57 (+7.4)
  • Rubric changed (rubric-2026.09.8 → rubric-2026.09.16) — scores are not directly comparable.

Lenses

  • Code Health 95 → 95 (+0.0)
  • Architecture 100 → 90 (-10.1)
  • Maturity 52 → 52 (+0.0)
  • Readiness 59 → 59 (+0.0)
  • Security 33 → 47 (+14.6)
  • Performance 100 (new)

Resolved (75)

  • Critical CVE: [CVE redacted] (kotlin-js-store/yarn.lock)
  • Critical CVE: [CVE redacted] (kotlin-js-store/yarn.lock)
  • Critical CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
  • Critical CVE: [GHSA redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [CVE redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [CVE redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [CVE redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [CVE redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [CVE redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [CVE redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [CVE redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [CVE redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [CVE redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [CVE redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [CVE redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [CVE redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [CVE redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [CVE redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [CVE redacted] (kotlin-js-store/yarn.lock)
  • High CVE: [CVE redacted] (kotlin-js-store/yarn.lock)
  • …and 55 more

New (9)

  • Documentation: no installation or build instructions (README.md)
  • Duplicate method signature for CartesianChart.copy
  • High vulnerability: [GHSA redacted] (kotlin-js-store/yarn.lock)
  • Inconsistent state management pattern in host constructors
  • Low cohesion: Slice (LCOM4 4) (vico/compose/src/commonMain/kotlin/com/patrykandpatrick/vico/compose/pie/PieChart.kt)
  • No ADRs found
  • Off the main sequence: :vico:compose
  • Off-boarding risk: anonymized user #1
  • Projects may be oversized for their cohesion

Changes since last survey

  • 9 commits — 3 feature/other, 6 fixes

By area

  • gradle/libs.versions.toml — 6 commits
  • buildSrc/src — 1 commit
  • gradle/wrapper — 1 commit
  • vico/compose — 1 commit

Notable commits

  • fix: fix(deps): update agp to v9.4.1 (#1612)
  • fix: fix(deps): update compose to v1.12.1 (#1616)
  • fix: fix(deps): update dependency androidx.annotation:annotation to v1.11.0 (#1618)
  • fix: fix(deps): update dependency org.jetbrains.androidx.navigation:navigation-compose to v2.10.0-beta01 (#1608)
  • fix: fix(deps): update dependency org.jetbrains.kotlin.android:org.jetbrains.kotlin.android.gradle.plugin to v2.4.20 (#1603)
  • fix: fix: preserve the hole in single-slice doughnut charts
  • change: build: raise Android minimum SDK to 24
  • change: chore(deps): update dependency org.jetbrains.compose to v1.12.1 (#1615)
  • change: chore(deps): update gradle to v9.8.0 (#1621)

Architecture

  • Containers 0 added · 0 removed · contexts 1 added · 0 removed · edges 1 added · 0 removed

Added bounded contexts (1)

  • shared

Added dependency edges (1)

  • shared → compose

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

Survey your own repository

patrykandpatrick/vico 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 28 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 674f2e3c18a34f4954b33f6e00804d88ac331b37 — the exact code this score is about.
  • Scored under rubric-2026.09.16 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-2d9048c36d26.