Skip to content
CAI
Software that uses CAICheck a score

lefthandedgoat/canopy

34.4

Weak · 23 September 2026

12.8k

lines of production code

JavaScript

with F#

5

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

Canopy is a .NET-based browser automation and testing framework that enables developers to write and execute automated UI tests. It provides a functional API for controlling headless browsers, interacting with DOM elements, and validating JSON responses. The system also supports parallel test execution, load testing, and C\# integration, all managed through a modernized build and documentation infrastructure.

How it got here

2012–2014 — Modernization and dependency updates

4 changes.

This period focused on modernizing the project's build infrastructure and upgrading to .NET 6.0, replacing legacy systems with a streamlined, SDK-style build process. Concurrently, the Canopy component received updates for parallel test execution and headless browser support, while new tests were added for JSON validation and load testing.

2017 — Canopy ecosystem expansion

4 changes.

This period focused on expanding the Canopy ecosystem by introducing a browser extension for DOM interaction and enhancing the core library with string similarity and screen resolution utilities. Additionally, the integration testing suite was expanded to support C\# and include JSON validation and load testing capabilities.

2018–2020 — Test coverage and documentation expansion

5 changes.

This period focused on expanding the project's test coverage by introducing C\# and F\# test suites for browser automation and parallel execution. Concurrently, the team implemented a documentation generation tool and populated the documentation source with comprehensive references for the core testing and configuration APIs.

Features

Added C\# integration and load testing support

The canopy.integration package now includes support for C\# integration tests, featuring a JSON validation helper and a load testing framework. A new \chsharpLoadTest.fs\ file introduces a \runner\ that executes load test jobs, while \csharp.fs\ provides static methods for comparing and validating JSON structures. The project also includes an \AssemblyInfo.fs\ setting version 2.1.3 and references FSharp.Core and FSharp.Data.

src/canopy.integration · medium confidence

Added JSON validation and load testing capabilities

A new jsonValidator module was added to the integration tests, providing a way to validate JSON structures by comparing expected and actual JSON payloads, including handling of null values and optional properties. Additionally, a loadTest module was introduced to simulate load on the system, allowing users to define tasks and jobs to measure performance metrics like min, max, and average response times.

canopy.integration · high confidence

Added docsTool for generating API documentation

Introduced a new docsTool that generates API documentation from F\# source code. The tool provides 'build' and 'watch' subcommands to generate static HTML pages from XML doc comments, with support for navigation, templates, and hot-reloading during development.

docsTool · high confidence

Added documentation for Canopy's core testing and configuration APIs

The documentation source now includes comprehensive reference pages for actions, assertions, configuration, reporting, and testing. Users can now view detailed examples for browser control (start, quit, url), element interaction (click, drag, hover), and assertions (equals, contains, regex). The docs also cover test suite execution (run, runFor), context management (once, before, after, lastly), and configuration options like timeouts and reporter selection.

docsSrc · high confidence

Canopy 2.1.3 release

Canopy is updated to version 2.1.3, introducing a new instanced API for running tests in parallel, alongside a C\#-friendly wrapper for easier integration with C\# test frameworks. The update also includes improved error reporting with timestamps in the console and TeamCity reporters, and adds support for headless Chrome and Firefox.

src/canopy · high confidence

Introduce Jaro-Winkler string similarity and screen resolution utilities

The canopy module now includes a new \jarowinkler.fs\ file implementing the Jaro-Winkler algorithm for calculating string similarity, replacing the previous Levenshtein-based approach. Additionally, \screen.fs\ is introduced to expose primary screen resolution and bounds, enabling features that depend on display dimensions.

canopy · medium confidence

Introduce the Canopy Companion browser extension

Added the Canopy Companion extension, a browser add-on that provides element selection and inspection capabilities. The extension consists of a F\# script (companion.fsx) that compiles to JavaScript (companion.js) and includes a background script (background.js) to manage the extension's lifecycle. The implementation includes core Fable runtime libraries (e.g., Async, BigInt, Date, Event) and utility modules, enabling the companion to interact with web pages to identify and select DOM elements.

src/canopy/companion · high confidence

Architecture

Repository structure and build system modernized

The project has been restructured with a new solution layout, introducing a .NET Core/FAKE-based build system (Build.fsx, build.sh, build.cmd) and CI configurations for Travis and AppVeyor. A new Directory.Build.props file centralizes NuGet package metadata and icon URLs. The repository now includes a comprehensive .gitignore, .editorconfig for consistent coding styles, and a formal CHANGELOG.md adhering to semantic versioning. These changes streamline the build process and improve maintainability for developers.

(repo-wide) · high confidence

Test coverage

Added C\# browser automation and JSON validation tests; Added parallel test runner example; Added parallel test suite for Canopy; Added test suite for JSON validation and load testing.

Dependencies

Migrate to .NET 6.0 and update build infrastructure

The project has been upgraded to target .NET 6.0 across all components, including the docsTool, canopy core, integration tests, and various test suites. This involves replacing the legacy .NET Framework build system with the modern .NET SDK-style project files and adopting Paket for dependency management, which updates the dependency graph to include Selenium WebDriver 4.3 and FSharp.Core 6.0.5.

(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

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

Lenses

  • Code Health 27 → 28 (+0.7)
  • Architecture 61 → 61 (+0.0)
  • Maturity 45 → 45 (-0.2)
  • Readiness 40 → 39 (-1.5)
  • Security 93 → 85 (-7.6)
  • Accessibility 34 → 31 (-2.2)

Resolved (11)

  • Duplicated block (11 lines × 2) (docsTool/templates/modules.fs)
  • Duplicated block (9 lines × 2) (src/canopy/reporters.fs)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • No exposed public API
  • No tests discovered
  • NoWarnInCsproj (.paket/Paket.Restore.targets)
  • NoWarnInCsproj (.paket/Paket.Restore.targets)
  • NoWarnInCsproj (.paket/Paket.Restore.targets)
  • NoWarnInCsproj (.paket/Paket.Restore.targets)
  • dormant codebase — no living knowledge left to concentrate

New (82)

  • (anonymous) (cognitive 20) (src/canopy/companion/crx/fable-core/umd/BigInt.js)
  • (anonymous) (cognitive 24) (src/canopy/companion/crx/fable-core/umd/Timer.js)
  • (anonymous)::CompareTo (cognitive 17) (src/canopy/companion/crx/fable-core/umd/ListClass.js)
  • (anonymous)::divide (cognitive 49) (src/canopy/companion/crx/fable-core/umd/Long.js)
  • (anonymous)::divide (cyclomatic 25) (src/canopy/companion/crx/fable-core/umd/Long.js)
  • (anonymous)::multiply (cognitive 16) (src/canopy/companion/crx/fable-core/umd/Long.js)
  • (anonymous)::toString (cognitive 16) (src/canopy/companion/crx/fable-core/umd/Long.js)
  • BigInt.divRem (cognitive 17) (src/canopy/companion/crx/fable-core/umd/BigInt.js)
  • BigInt.op_Addition (cognitive 17) (src/canopy/companion/crx/fable-core/umd/BigInt.js)
  • BigInt.op_Equality (cognitive 27) (src/canopy/companion/crx/fable-core/umd/BigInt.js)
  • BigInt.op_GreaterThan (cognitive 23) (src/canopy/companion/crx/fable-core/umd/BigInt.js)
  • BigInt.op_GreaterThanOrEqual (cognitive 23) (src/canopy/companion/crx/fable-core/umd/BigInt.js)
  • BigInt.op_LessThan (cognitive 23) (src/canopy/companion/crx/fable-core/umd/BigInt.js)
  • BigInt.op_LessThanOrEqual (cognitive 23) (src/canopy/companion/crx/fable-core/umd/BigInt.js)
  • BigInt.op_Subtraction (cognitive 17) (src/canopy/companion/crx/fable-core/umd/BigInt.js)
  • BigNat.divmod (cognitive 24) (src/canopy/companion/crx/fable-core/umd/BigInt/BigNat.js)
  • BigNat.removeFactor (cognitive 17) (src/canopy/companion/crx/fable-core/umd/BigInt/BigNat.js)
  • BigNat.shiftCompare (cognitive 17) (src/canopy/companion/crx/fable-core/umd/BigInt/BigNat.js)
  • Documentation: hard to navigate (docs/reporttemplatep.html)
  • Duplicated block (12 lines × 2) (docsTool/templates/modules.fs)
  • …and 62 more

Architecture

  • Unchanged — 0 containers · 4 contexts · 0 edges

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

Survey your own repository

lefthandedgoat/canopy 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 23 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 cb659d3367e9d165049db1a185f2b572cc5324fc — 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-955b9cee9818.