Skip to content
CAI
Software that uses CAICheck a score

fslaborg/XPlot

51.1

Adequate · 24 September 2026

10.4k

lines of production code

F#

primary language

5

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

XPlot is a .NET library that generates interactive charts and visualizations for the web. It provides a fluent API for creating plots using backends like Plotly, Google Charts, and D3.js, with specific support for Deedle data structures. The system includes tooling to generate test fixtures and documentation, ensuring consistent output and reliable regression testing.

How it got here

2014–2015 — Infrastructure and feature expansion

5 changes.

This period focused on establishing the project's foundational infrastructure, including build systems, licensing, and development environments. It also introduced significant new features, such as Deedle integration and explicit dimension controls for Plotly charts, while updating core dependencies to ensure compatibility with modern .NET and F\# runtimes.

2016–2021 — Plotly integration and test infrastructure

12 changes.

This period focused on expanding the XPlot.Plotly library with support for numerous new chart types and enhancing interactive notebook capabilities. Significant effort was also dedicated to building a robust testing framework, including automated regression tests and utility scripts for generating test data and JavaScript fixtures.

Features

Add ForceLayoutChart for D3.js network graphs

The XPlot.D3 module now includes a new ForceLayoutChart that renders D3.js force-directed network graphs. Users can create and display network visualizations by providing nodes and edges, with support for customizing node and edge styles, as well as adjusting gravity and charge parameters for the layout algorithm.

src/XPlot.D3 · high confidence

Add explicit width and height controls to Plotly charts

Users can now explicitly set the width and height of a Plotly chart using the new \WithWidth\, \WithHeight\, and \WithSize\ methods on the \PlotlyChart\ type. The \Layout\ type has been updated to include \width\ and \height\ properties, allowing these dimensions to be serialized into the generated HTML/JS. This change enables precise control over the rendered chart's dimensions in the browser.

src/XPlot.Plotly · high confidence

Add interactive notebook support for XPlot.Plotly in .NET 8

The XPlot.Plotly.Interactive package now targets .NET 8 and provides full integration with .NET Interactive kernels. Users can now render Plotly charts directly in notebooks via the \UseXplot\ extension method, which registers HTML formatters for \PlotlyChart\ and sets up PowerShell kernel support with type accelerators and a \New-PlotlyChart\ cmdlet. The package version has been updated to 4.2.0.

src/XPlot.Plotly.Interactive · high confidence

Add static data generation tool for test datasets

A new F\# utility, StaticDataGenerator, has been added to the tools directory. This tool generates various static test datasets, including normal, uniform, and linearly spaced data, which are used by other components like the XPlot.Plotly tests. The tool relies on the MathNet.Numerics library for data generation.

tools/StaticDataGenerator · high confidence

Added BaselineGenerator tool to generate JS test fixtures for chart types

A new F\# utility, BaselineGenerator, has been added to the tools directory. This tool generates JavaScript files for various chart types (including area, bar, boxplot, bubble, column, 3D plots, error bars, and gauges) by cleaning and writing test data to the Plotly test data directory. The tool relies on FSharp.Core and MathNet.Numerics.

tools/BaselineGenerator · high confidence

Added support for multiple new chart types

The library now supports Area, Bar, Box, Candlestick, Choropleth, Contour, Heatmap, Histogram, and Histogram2D plots. Users can now create these specific visualizations by instantiating the corresponding types (e.g., \Area()\, \Bar()\) and setting their properties, such as \stackgroup\ for stacked area charts or \x\/\y\ coordinates for bar and histogram plots.

src/XPlot.Plotly/Plots · high confidence

New documentation template for F\# project site

A new Razor template (template.cshtml) has been added to the documentation tooling, establishing the HTML structure for the project's documentation site. This template integrates external libraries including jQuery, Bootstrap, Google Charts, Plotly, and D3.js, and provides a navigation sidebar linking to various chart types (Google, Plotly, D3) and API references.

docsrc/tools/templates · high confidence

Project infrastructure and development environment setup

The repository received foundational infrastructure files to support building, testing, and contributing to the project. This includes an .editorconfig for consistent code formatting, a Dockerfile and .gitpod.yml to enable browser-based development environments, and a comprehensive LICENSE.md (Apache 2.0) to clarify usage rights. Additionally, a NuGet.config was added to configure package sources, and the solution file (XPlot.sln) was structured to organize projects and tests. These changes establish the baseline for the build system, contributor guidelines (code of conduct), and local/remote development workflows.

(repo-wide) · high confidence

XPlot.GoogleCharts.Deedle adds Deedle integration for charting

The XPlot.GoogleCharts.Deedle package now provides a new API surface that allows users to create Google Charts directly from Deedle Frame and Series data types. This includes static methods on the Chart type for rendering Annotation, Area, Bar, Bubble, Calendar, Candlestick, Column, Combo, and Gauge charts, enabling seamless data visualization workflows for users working with Deedle data structures.

src/XPlot.GoogleCharts.Deedle · high confidence

Behavioural changes

Expanded Plotly base types for enhanced plot customization

The \PlotBase\ directory has been restructured by extracting numerous base plotting types from a monolithic file into individual files, including \Angularaxis\, \Annotation\, \Aspectratio\, \Camera\, \Colorbar\, \Contours\, \Domain\, \ErrorX/Y/Z\, \Geo\, and others. This refactoring improves code organization and maintainability. Notably, the \Annotation\ type now includes \axref\ and \ayref\ properties, allowing users to specify the coordinate axis for annotation arrows, providing more precise control over arrow positioning on plots.

src/XPlot.Plotly/PlotBase · high confidence

Moved Plotly API generation script to tools directory

The F\# script responsible for generating the Plotly API (GeneratePlotlyApi.fsx) has been relocated to the tools folder. This change organizes the codebase by moving this specific utility script into a dedicated tools directory, separating it from other project areas.

tools · high confidence

Updated documentation generation to use .NET Core and netstandard2.0

The documentation generation scripts (generate.fsx and formatters.fsx) have been migrated to target .NET Core and netstandard2.0. This involves updating library references to use the netstandard2.0 builds of dependencies (such as FSharp.Formatting, Deedle, and XPlot libraries) and adjusting the build script to correctly reference these modern .NET Standard DLLs. This change ensures the documentation tooling is compatible with the .NET Core runtime.

docsrc/tools · high confidence

XPlot.GoogleCharts v4.2.0 release with full source restructuring

The XPlot.GoogleCharts library has been updated to version 4.2.0, introducing a complete restructuring of the source code into new files (AssemblyInfo, Configuration, Main) and updated build dependencies (FSharp.Core, Google.DataTable.Net.Wrapper, Newtonsoft.Json). This change consolidates the library's internal configuration and data handling logic, ensuring compatibility with the latest .NET and F\# runtime versions.

src/XPlot.GoogleCharts · medium confidence

Test coverage

Add comprehensive test scripts for Google Charts and Plotly chart types; Added 3D plot test data; Added comprehensive regression tests for XPlot.Plotly chart types.

Dependencies

Updated FSharp.Core and other dependencies

The project's dependency manifest (paket.dependencies) and lock file (paket.lock) have been updated. FSharp.Core is now required at version 4.5.2 or higher, and the lock file reflects updated versions for packages including Deedle (3.0), Google.DataTable.Net.Wrapper (4.1), MathNet.Numerics (5.0), and Newtonsoft.Json (13.0.3).

(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 52 → 51 (-1.0)
  • Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 88 → 83 (-5.3)
  • Architecture 100 → 90 (-9.9)
  • Maturity 43 → 43 (+0.0)
  • Readiness 55 → 55 (+0.0)
  • Security 95 → 86 (-8.5)
  • Accessibility 44 → 44 (+0.0)

Resolved (68)

  • Dependency hygiene not measured — no packages were read
  • Duplicated block (10 lines × 2) (tools/StaticDataGenerator/Program.fs)
  • Duplicated block (11 lines × 2) (src/XPlot.GoogleCharts/Configuration.fs)
  • Duplicated block (11 lines × 2) (src/XPlot.GoogleCharts/Configuration.fs)
  • Duplicated block (11 lines × 2) (src/XPlot.GoogleCharts/Configuration.fs)
  • Duplicated block (11 lines × 2) (src/XPlot.GoogleCharts/Configuration.fs)
  • Duplicated block (11 lines × 2) (src/XPlot.Plotly/PlotBase/Projection.fs)
  • Duplicated block (12 lines × 5) (src/XPlot.Plotly/PlotBase/Aspectratio.fs)
  • Duplicated block (13 lines × 2) (src/XPlot.Plotly/PlotBase/Angularaxis.fs)
  • Duplicated block (13 lines × 2) (src/XPlot.Plotly/PlotBase/Textfont.fs)
  • Duplicated block (13 lines × 2) (src/XPlot.Plotly/Plots/Choropleth.fs)
  • Duplicated block (13 lines × 2) (src/XPlot.Plotly/Plots/Scatter3D.fs)
  • Duplicated block (13 lines × 2) (src/XPlot.Plotly/Plots/Scattergl.fs)
  • Duplicated block (14 lines × 2) (src/XPlot.Plotly/Plots/Area.fs)
  • Duplicated block (14 lines × 2) (src/XPlot.Plotly/Plots/Scattergeo.fs)
  • Duplicated block (14 lines × 2) (src/XPlot.Plotly/Plots/Surface.fs)
  • Duplicated block (14 lines × 3) (src/XPlot.Plotly/PlotBase/X.fs)
  • Duplicated block (14 lines × 4) (src/XPlot.Plotly/PlotBase/Insidetextfont.fs)
  • Duplicated block (15 lines × 2) (src/XPlot.Plotly/PlotBase/ErrorX.fs)
  • Duplicated block (15 lines × 2) (src/XPlot.Plotly/Plots/Bar.fs)
  • …and 48 more

New (138)

  • Duplicated block (10 lines × 2) (src/XPlot.GoogleCharts/Configuration.fs)
  • Duplicated block (10 lines × 2) (src/XPlot.GoogleCharts/Configuration.fs)
  • Duplicated block (10 lines × 2) (src/XPlot.GoogleCharts/Configuration.fs)
  • Duplicated block (10–13 lines × 5) (src/XPlot.Plotly/PlotBase/Insidetextfont.fs)
  • Duplicated block (11 lines × 3) (src/XPlot.Plotly/PlotBase/Xaxis.fs)
  • Duplicated block (11 lines × 5) (src/XPlot.Plotly/PlotBase/Aspectratio.fs)
  • Duplicated block (11 lines × 6) (src/XPlot.Plotly/Plots/Choropleth.fs)
  • Duplicated block (11–14 lines × 2) (src/XPlot.Plotly/PlotBase/Contours.fs)
  • Duplicated block (12 lines × 2) (src/XPlot.GoogleCharts/Configuration.fs)
  • Duplicated block (12 lines × 2) (src/XPlot.Plotly/Plots/Scatter.fs)
  • Duplicated block (12 lines × 3) (src/XPlot.Plotly/PlotBase/Xaxis.fs)
  • Duplicated block (12–15 lines × 10) (src/XPlot.Plotly/Plots/Bar.fs)
  • Duplicated block (12–15 lines × 2) (src/XPlot.Plotly/PlotBase/Marker.fs)
  • Duplicated block (12–15 lines × 2) (src/XPlot.Plotly/Plots/Choropleth.fs)
  • Duplicated block (12–15 lines × 3) (src/XPlot.Plotly/PlotBase/Xaxis.fs)
  • Duplicated block (12–15 lines × 4) (src/XPlot.Plotly/Plots/Area.fs)
  • Duplicated block (12–15 lines × 4) (src/XPlot.Plotly/Plots/Area.fs)
  • Duplicated block (12–15 lines × 4) (src/XPlot.Plotly/Plots/Pie.fs)
  • Duplicated block (12–15 lines × 7) (src/XPlot.Plotly/Plots/Choropleth.fs)
  • Duplicated block (13 lines × 2) (src/XPlot.GoogleCharts/Configuration.fs)
  • …and 118 more

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

Survey your own repository

fslaborg/XPlot 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 24 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 23bac6e687a70da4124d6c717b2d5777081ca9d0 — 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-923689c465cf.