Skip to content
CAI
Software that uses CAICheck a score

fsbolero/Bolero

62.5

Adequate · 22 September 2026

8.2k

lines of production code

F#

primary language

6

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

Bolero is an F\# framework for building Blazor applications, providing core libraries for HTML rendering, Elmish-based state management, and client-server remoting. It supports multiple hosting strategies, including interactive WebAssembly and server-side rendering, and offers build-time tools for CSS isolation and HTML template compilation. The system is designed for .NET 8, 9, and 10, with a focus on performance through trimmable assemblies and efficient computation expressions.

How it got here

2018 — Initial release and test infrastructure

12 changes.

This period established the initial release of the Bolero framework, introducing core libraries for Elmish integration, remoting, and MSBuild tasks alongside server-side rendering capabilities. The work was accompanied by a comprehensive restructuring of the repository and the creation of extensive test suites covering client, server, and remoting functionalities to ensure framework stability.

2019–2023 — architecture modernization and test expansion

9 changes.

This period focused on modernizing the project's architecture by extracting HTML rendering into a standalone assembly, migrating the build system to FAKE, and updating remoting to use ASP.NET Core endpoint routing. Significant effort was also dedicated to expanding test coverage with new client and server-side harnesses, while ensuring compatibility with netstandard2.0 and enabling trimmability for .NET applications.

Features

Automated GitHub Pages deployment script for Bolero

A new PowerShell script (tools/gh-pages.ps1) has been added to automate the deployment of the Bolero test client to the GitHub Pages branch. The script handles cloning the repository, copying the built wwwroot and framework assets, and pushing the changes. It specifically adapts the base href in index.html for the /Bolero/ path when running locally and configures Git credentials for AppVeyor CI integration.

tools · high confidence

Bolero core library initial release with Elmish integration and remoting

This change introduces the initial version of the Bolero core library, providing the foundational types and modules for building Blazor applications with F\#. It includes the HTML rendering engine (Attr, Node, NodeTypes), the Elmish program runner (Program, ProgramRun, Cmd), and the component base classes (Components, Ref). Additionally, it adds the client-side remoting infrastructure (Remoting.Client, Remoting) for calling server-side services, along with routing support (Router) and interactive render mode configuration (RenderMode).

src/Bolero · high confidence

Bolero.Server introduces interactive render modes and static HTML rendering capabilities

The Bolero.Server package now supports ASP.NET Core's interactive render modes via the new \AddBoleroComponents\ service registration and \attr.renderMode\ helper, allowing developers to mix server-side and WebAssembly rendering strategies. It also adds static server-side HTML rendering through the \RenderPage\ extension method and \BoleroPage\ result type, enabling Bolero components to be rendered directly into HTTP responses or MVC controllers without requiring a full Blazor circuit. The hosting configuration interface \IBoleroHostConfig\ has been updated to include an \IsInteractiveRender\ flag to distinguish between legacy and new rendering modes, and the package now targets .NET 8, 9, and 10.

src/Bolero.Server · high confidence

Initial release of Bolero.Build MSBuild tasks

This change introduces the initial build infrastructure for Bolero, adding MSBuild props and targets that enable scoped CSS isolation for \*.bolero.css files and a task to strip F\# metadata from assemblies to reduce bundle size. It also includes the necessary build-time dependencies (Mono.Cecil, Microsoft.Build.Utilities.Core) and versioning tooling (Nerdbank.GitVersioning).

src/Bolero.Build · high confidence

Introduce Bolero.Templating.Provider for HTML template compilation

The new Bolero.Templating.Provider type provider compiles HTML template files into F\# types, enabling users to define UI components using external HTML files with support for holes (placeholders), data binding, and event handlers. The provider parses templates into an intermediate representation and generates code that either uses a sequential RenderTreeBuilder API for performance or a Node-based API, while also supporting hot reload by watching template file changes and invalidating the cache when they are modified.

src/Bolero.Templating.Provider · high confidence

Architecture

Bolero.Html extracted to a standalone assembly with new computation expression builders

The HTML rendering logic has been moved from the main Bolero package into a separate \Bolero.Html\ assembly. This change introduces dedicated computation expression builders (\AttrBuilder\, \ConcatBuilder\, \ElementBuilder\) implemented as structs to reduce allocations, and exposes new entry points like \attrs\, \concat\, \elt\, and \ecomp\ for constructing HTML elements and components. The module also includes updated XML documentation and references to \Nerdbank.GitVersioning\ for versioning across .NET 8 and .NET 9 targets.

src/Bolero.Html · high confidence

Repository restructured with .slnx, unified build script, and new configuration files

The repository has been reorganized to improve developer experience and build consistency. A new \Bolero.slnx\ solution file defines the project structure, replacing the previous layout. A single \build.ps1\ script now handles restoration and building for all platforms, consolidating previous separate \build.cmd\ and \build.sh\ scripts. New configuration files include \.editorconfig\ for consistent code formatting (e.g., CRLF for solution/project files, LF for others), \.gitattributes\ for text handling, \Directory.Build.props\ for shared build properties, and \version.json\ for version management via Nerdbank.GitVersioning. The legacy \Library.fs\ file has been removed, and \.gitignore\ has been updated to exclude additional IDE and build artifacts.

(repo-wide) · high confidence

Behavioural changes

Add dummy Blazor implementations to support netstandard2.0

The \src/tpdummy\ area now includes stub implementations of core Blazor types (such as \ComponentBase\, \RenderTreeBuilder\, \EventCallback\, and various event args) in both C\# and F\#. This change allows the type provider to maintain netstandard2.0 compatibility by providing the necessary dummy interfaces and classes that the provider depends on, ensuring that downstream resolution issues are avoided without requiring the full Blazor runtime.

src/tpdummy · high confidence

Build system migrated to a FAKE-based project

The build process has been refactored from a script-based approach to a dedicated FAKE project located in the .build directory. This change introduces a new build configuration that defaults to Release mode, utilizes the .slnx solution format, and generates HTML tags, attributes, and events from CSV sources. It also standardizes local versioning logic and updates the build runner to use FAKE targets for compilation, packaging, and test execution.

.build · high confidence

Deprecate middleware-based remoting in favor of ASP.NET Core endpoint routing

The server-side remoting implementation has been refactored to use ASP.NET Core endpoint routing instead of the legacy middleware approach. Common logic has been extracted into a new Common.fs file, while Endpoints.fs now handles endpoint registration and Middleware.fs contains the deprecated middleware implementation. The old AddRemoting extension methods are now marked obsolete and direct users to the new AddBoleroRemoting method with endpoint routing. This change also introduces IDisableCookieRedirectMetadata support for remote endpoints on .NET 10+ and restores a separate implementation of RemoteContext for endpoint routing.

src/Bolero.Server/Remoting · high confidence

Mark assembly as trimmable

The library now includes a metadata attribute indicating that the assembly is trimmable, which allows .NET linkers to safely remove unused code during the publishing process to reduce application size.

src · high confidence

Test coverage

Add client-side test harness for Bolero features; Add remoting client test project; Add server-side rendering test page for Remoting; Added Selenium-based web test infrastructure for Bolero; Added automated integration tests for core framework features; Added client-side integration tests for Bolero; Added remoting server test project; Added server-side test application to verify Blazor hosting and routing; Updated test HTML entry point for remoting client.

Dependencies

Upgrade to .NET 10 and multi-target .NET 8, 9, and 10

The project has been upgraded to target .NET 10, while retaining support for .NET 8 and .NET 9. This change updates the core dependencies, including Microsoft.AspNetCore.Components and related packages, to version 10.0.0 for the new target framework, and adjusts version constraints for .NET 8 and .NET 9 groups accordingly. The build infrastructure and test projects have also been updated to reflect these framework versions.

(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 50 → 63 (+12.5)
  • Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 85 → 69 (-16.2)
  • Architecture 96 → 100 (+3.8)
  • Maturity 51 → 60 (+9.0)
  • Readiness 60 → 60 (+0.0)
  • Security 36 → 61 (+24.4)

Resolved (42)

  • Dependency hygiene not measured — no packages were read
  • Dormant codebase
  • Duplicated block (6 lines × 4) (src/Bolero.Html/Builders.fs)
  • Duplicated block (6 lines × 6) (src/Bolero.Html/Builders.fs)
  • Duplicated block (6 lines × 8) (src/Bolero.Html/Builders.fs)
  • Duplicated block (7 lines × 3) (src/Bolero.Html/Builders.fs)
  • Duplicated block (7 lines × 4) (src/Bolero.Html/Builders.fs)
  • Duplicated block (7 lines × 4) (src/Bolero.Html/Builders.fs)
  • Duplicated block (7 lines × 6) (src/Bolero.Html/Builders.fs)
  • Duplicated block (8 lines × 2) (src/Bolero.Html/Builders.fs)
  • Duplicated block (8 lines × 4) (src/Bolero.Html/Builders.fs)
  • Duplicated block (8 lines × 4) (src/Bolero.Html/Builders.fs)
  • Duplicated block (8 lines × 8) (src/Bolero.Html/Builders.fs)
  • Duplicated block (9 lines × 2) (src/Bolero.Html/Builders.fs)
  • Duplicated block (9 lines × 2) (src/Bolero/Router.fs)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • …and 22 more

New (53)

  • Documentation: no installation or build instructions (README.md)
  • Duplicated block (11 lines × 3) (src/Bolero.Html/Builders.fs)
  • Duplicated block (11 lines × 4) (src/Bolero.Html/Builders.fs)
  • Duplicated block (14 lines × 2) (src/Bolero.Html/Builders.fs)
  • Duplicated block (14 lines × 8) (src/Bolero.Html/Builders.fs)
  • Duplicated block (4–6 lines × 8) (src/Bolero.Html/Builders.fs)
  • Duplicated block (4–7 lines × 7) (src/Bolero.Html/Builders.fs)
  • Duplicated block (5 lines × 2) (src/Bolero.Html/Builders.fs)
  • Duplicated block (5 lines × 4) (src/Bolero.Html/Builders.fs)
  • Duplicated block (6 lines × 10) (src/Bolero.Html/Builders.fs)
  • Duplicated block (6 lines × 2) (src/Bolero.Html/Builders.fs)
  • Duplicated block (6 lines × 2) (src/Bolero.Html/Builders.fs)
  • Duplicated block (6 lines × 2) (src/Bolero/Router.fs)
  • Duplicated block (6 lines × 4) (src/Bolero.Html/Builders.fs)
  • Duplicated block (6 lines × 4) (src/Bolero.Html/Builders.fs)
  • Duplicated block (6 lines × 6) (src/Bolero.Html/Builders.fs)
  • Duplicated block (7 lines × 6) (src/Bolero.Html/Builders.fs)
  • Duplicated block (7 lines × 8) (src/Bolero.Html/Builders.fs)
  • Duplicated block (8 lines × 2) (src/Bolero.Html/Builders.fs)
  • Duplicated block (8 lines × 4) (src/Bolero.Html/Builders.fs)
  • …and 33 more

Changes since last survey

  • 31 commits — 24 feature/other, 7 fixes

By area

  • (repo) — 7 commits
  • (root) — 7 commits
  • src/Bolero.Templating.Provider — 6 commits
  • src/Bolero — 5 commits
  • .github/workflows — 3 commits
  • src/Bolero.Server — 2 commits
  • src/tpdummy — 1 commit

Notable commits

  • fix: Merge pull request #387 from fsbolero/fix/empty-event-hole
  • fix: ci: fix permissions on publish
  • fix: ci: fix permissions on publish
  • fix: fix(Templating): remove boxing of EventCallback<_>
  • fix: fix(Templating): remove unnecessary double-cast
  • fix: fix: assembly versioning on net8 and net9
  • fix: fix: exception on unfilled bind hole
  • change: Merge branch 'add-xmldoc'
  • change: Merge branch 'releases/v0.25'
  • change: Merge branch 'releases/v0.25'
  • change: Merge pull request #382 from fsbolero/remoting-disable-cookie-redirect
  • change: Merge pull request #383 from fsbolero/template-async-events
  • change: Merge pull request #385 from fsbolero/template-sequential
  • change: Set version to '0.25'
  • change: Set version to '0.26-alpha'
  • change: Update changelog
  • change: Update changelog
  • change: chore: migrate to .slnx
  • change: ci: use trusted publishing
  • change: doc: add some missing xmldocs
  • …and 11 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

fsbolero/Bolero 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 22 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 b138eda0fb646185dcaf5f26ae52f1a694c267a9 — 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-821afab8930d.