Skip to content
CAI
Software that uses CAICheck a score

fable-hub/Feliz

55.4

Adequate · 6 August 2026

225

lines of production code

F#

with JavaScript

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is a comprehensive F\# library and tooling suite for building React applications, centered around the Feliz framework. It provides a rich set of React hooks, UI components, and compiler plugins that enable idiomatic F\# development for the web. The ecosystem includes utilities for state management, styling, and testing, all integrated with modern build tools and a standardized dependency management system.

Features

Add Elmish-based React component example

A new example component demonstrates the use of the \Feliz.UseElmish\ library to manage state in a React application. The \UseElmishExample\ module provides a parent/child component structure where the child subscribes to a custom window event, illustrating how to handle side effects and event subscriptions within the Elmish architecture.

App · high confidence

Add core F\# bindings for Vitest testing framework

Introduces a new \Vitest\ library that provides F\# bindings for the Vitest testing framework. The addition includes type definitions for test assertions (such as \IAssertion\ with matchers like \toBe\, \toEqual\, and \toThrowError\), test result structures, and static helpers for matchers like \any\ and \closeTo\. The package depends on \Fable.Core\ and \Fable.Promise\ to enable JavaScript interop, and a \packages.lock.json\ file is added to pin dependency versions.

src/Vitest · high confidence

Add core bindings for @testing-library/jest-dom and @testing-library/user-event

Developers can now use F\#-friendly wrappers for the popular JavaScript testing libraries @testing-library/jest-dom and @testing-library/user-event. The diff introduces new F\# modules (Library.fs) that expose the APIs for assertions (e.g., toBeInTheDocument, toHaveClass) and user event simulation (e.g., click, type, hover) directly in F\# code, allowing for more idiomatic testing in Vitest environments.

src/Vitest.JestDom, src/Vitest.UserEvent · high confidence

Add core bindings for @testing-library/react

The \Vitest.ReactTestingLibrary\ module now provides the initial set of bindings for \@testing-library/react\, exposing query methods such as \getByRole\, \getByLabelText\, \getByText\, and \getByDisplayValue\ to allow users to locate and interact with React components in tests. The package also includes a \packages.lock.json\ file that pins dependencies like \Fable.Core\ and \Fable.AST\ (version 5.0.0-rc.3) to ensure reproducible builds.

src/Vitest.ReactTestingLibrary · high confidence

Add new React hooks and utilities for state and side effects

The Feliz.FsReact module introduces a new FsReact type providing utility functions for managing disposable resources, including createDisposable and useDisposable for handling cleanup logic in React components. Additionally, the Feliz.ReactTypes module defines the UseSyncExternalStoreSubscribe and UseSyncExternalStoreSnapshot delegate types, which support the useSyncExternalStore hook for subscribing to external data sources. The Feliz.React module also exposes the ReactInternal module with internal helpers for creating React elements and the ReactLegacy type for legacy-style element creation.

src/Feliz/React · high confidence

Feliz template now includes a stateful Counter component with Tailwind CSS styling and Vitest-based unit tests

The template now ships with a functional React component that maintains a counter state, rendered inside an HTML page that imports Tailwind CSS. The component is accompanied by a Vitest test that verifies the button click increments the displayed count, ensuring the interactive behavior is validated. The project also includes a packages.lock.json file that pins the Feliz 3.2.0 library along with Fable.Core 4.5.0 and related Fable packages, establishing the dependency baseline for the template.

src/Feliz.Template/Content/src · high confidence

Introduce Feliz.SelectSearch component for searchable select dropdowns

Added the Feliz.SelectSearch module, which provides a F\#-friendly wrapper for the react-select-search library. This new component allows users to render a searchable select dropdown, supporting single and multiple selection modes, grouped options, and custom filtering. The API exposes properties for options, value binding, search enablement, and change handlers, enabling users to integrate a fully featured select search control into their Fable/Elmish applications.

Feliz.SelectSearch · high confidence

Introduce Vite-based React + TypeScript playground template

The playground has been restructured into a modern Vite + React + TypeScript project. This adds a new project template featuring Vite for fast development and bundling, TypeScript configuration for type safety, and ESLint setup for code quality. The environment now supports React-specific linting rules and includes example components (such as a Counter and lazy-loaded components) to demonstrate Fable/Feliz bindings in a contemporary build setup.

playground · high confidence

Introduce compiler plugins for React component patterns and hooks

The Feliz compiler plugins now support \\[\<ReactLazyComponent\>\]\ for lazy-loading components, with validation ensuring argument names match between the call site and the source component. The \\[\<ReactMemoComponent\>\]\ attribute now supports predefined equality functions and the \"use memo"\ / \"use no memo"\ directives for React Compiler integration. Additionally, the \\[\<Hook\>\]\ attribute automatically prefixes custom hooks with "use" to comply with React's rules of hooks, and relative import paths for \\[\<ReactComponent\>\]\ are now resolved correctly based on the source file location.

src/Feliz.CompilerPlugins · high confidence

New React hooks for deferred operations and responsive design

Added the \Feliz.UseDeferred\ and \Feliz.UseMediaQuery\ modules, introducing new React hooks for managing asynchronous operations and responsive layouts. The \useDeferred\ hook allows components to track the state of async operations (pending, resolved, failed) and provides utilities to map, iterate, or bind over deferred values. The \useMediaQuery\ hook enables components to react to media query changes, while \useResponsive\ offers a convenient way to detect the current screen size (Mobile, Tablet, Desktop, etc.) based on configurable breakpoints.

Feliz.UseDeferred, Feliz.UseMediaQuery · high confidence

New helper modules for date parsing, object interop, and IDE syntax support

Added three new F\# modules to the Feliz helper library: \Feliz.DateParsing\ provides a robust parser for date strings (including \yyyy-MM-dd\ and \yyyy-MM-ddTHH:mm\ formats) with leap year validation; \Feliz.Helpers\ introduces an \optDispose\ utility for managing \IDisposable\ options and an \Interop\ module for checking object types and setting keys on props; and \Feliz.StringSyntax\ backports the \StringSyntaxAttribute\ from .NET 7+ to earlier frameworks, enabling enhanced IDE support such as syntax highlighting and autocomplete for string parameters.

src/Feliz/Helper · high confidence

New keyboard, font, locale, and color utilities in Feliz

Feliz now provides a comprehensive set of utility modules for styling and localization. A new \PropertyHelper/Key.fs\ module exposes keyboard key constants and modifier helpers (Ctrl, Shift, Ctrl+Shift). A new \StringEnums/Fonts.fs\ module exposes a wide range of CSS font family names as string literals. A new \StringEnums/Locale.fs\ module provides language and region locale codes. Additionally, the \color\ module in \StringEnums/Colors.fs\ has been expanded with numerous color constants and added HSL, RGB, and RGBA color generation functions.

src/Feliz/PropertyHelper, src/Feliz/StringEnums · high confidence

Removals

Removal of legacy CSS styling and attribute modules

The \Styles\, \Attributes\, \TextAlignment\, \AlignContent\, \Display\, \Position\, and \Visibility\ modules have been removed from the \src\ directory. This eliminates the previous API for defining CSS styles and HTML attributes, indicating a breaking change where the library no longer supports the older style and attribute system.

src · high confidence

Removed legacy demo application

The legacy demo application (App.fs) and its associated paket references have been removed from the repository.

demo · high confidence

Behavioural changes

Feliz template updated with modern build tooling and configuration

The Feliz template now includes a Vite-based build system with Tailwind CSS support, replacing the previous setup. This change introduces a new development workflow using npm scripts for starting, building, and testing, alongside updated project configuration files (.editorconfig, .gitattributes, .gitignore, .npmrc, and Directory.Build.props) to standardize code formatting, version control behavior, and package management.

src/Feliz.Template/Content · high confidence

Feliz v3.3.3: React hook cleanup and compiler plugin updates

The Feliz library has been updated to version 3.3.3, which ensures proper cleanup function handling for \React.useEffect\, \React.useEffectOnce\, \React.useLayoutEffect\, and \React.useLayoutEffectOnce\ when their bodies are empty. Additionally, the library has been updated to work with the new Feliz.CompilerPlugins, which now includes a transpile-time check for \\[\<ReactLazyComponent\>\]\ to ensure that argument names in lazy component call sides match argument names in lazy loaded source components.

src/Feliz · medium confidence

Feliz.Markdown updated to support Fable.AST 5.0.0-rc.3

The Feliz.Markdown package has been updated to support Fable.AST version 5.0.0-rc.3. This change updates the underlying AST library dependency, which may affect compilation or runtime behavior for users relying on the previous Fable.AST version. The package lock file confirms the resolution of Fable.AST to 5.0.0-rc.3.

src/Feliz.Markdown · high confidence

Feliz.Recharts: New chart components and fixed stroke-opacity binding

The Feliz.Recharts library has been restructured and expanded with new F\# bindings for AreaChart, BarChart, Brush, CartesianGrid, Cell, ComposedChart, ErrorBar, Funnel, Label, LabelList, Legend, and Line components, providing a comprehensive set of charting primitives. Additionally, the \strokeOpacity\ property for \Feliz.Recharts.line\ was corrected to emit the proper \strokeOpacity\ attribute instead of the incorrect \stroke-opacity\.

src/Feliz.Recharts · high confidence

Improved subscription lifecycle management and error handling

The library now properly disposes of registered subscriptions when the component unmounts, preventing potential memory leaks or stale event handlers. Additionally, an \onError\ callback has been added to the core program logic, allowing developers to handle exceptions thrown during message processing or subscription management. These changes ensure more robust behavior in dynamic UI environments.

src/Feliz.UseElmish · high confidence

Migrate build system from FAKE/Paket to .NET SDK and update CI configuration

The project's build system has been migrated from FAKE and Paket to a .NET SDK-based approach using \dotnet run\ for build scripts. The legacy \build.fsx\ and \build.cmd\/\build.sh\ scripts have been replaced by a new \./build/Build.fsproj\ entry point. Additionally, the repository has removed Travis CI (\.travis.yml\) and AppVeyor (\appveyor.yml\) configurations in favor of modern CI/CD workflows, and updated the \.gitignore\ to reflect the new directory structure and tooling.

(repo-wide) · high confidence

Removal of legacy public/index.html entry point

The static HTML file used to mount the application has been removed. This indicates a shift in how the application is served or built, likely moving away from a simple script-inclusion model towards a more modern build process or server-side rendering approach.

public · medium confidence

Replace legacy build system with new F\#-based automation

The project's build automation has been completely rewritten in F\# (build/Program.fs), replacing the previous FAKE-based build script. This new build system handles tool restoration, npm and dotnet package management, and test execution across both NPM and .NET test projects. The build directory also includes a packages.lock.json file that pins the versions of the build-time dependencies: BlackFox.CommandLine 1.0.0, FSharp.Core 8.0.401, and SimpleExec 12.0.0.

build · high confidence

Restructures and expands the CSS style helper modules

The CSS style helper files have been reorganized into the \src/Feliz/StyleHelper\ directory. This change introduces new modules for \GridTypes\, \Length\, \Transform\, \TransformOrigin\, \TransitionProperty\, and \TransitionTimingFunction\, while moving and updating existing modules for \BorderStyle\, \TextDecorationLine\, and \TextDecorationStyle\ to the new location. The \BorderStyle\ module has been updated to include additional border styles such as \inherit\ and \initial\, and the \TextDecorationStyle\ module now correctly maps to the \ITextDecoration\ interface.

src/Feliz/StyleHelper · high confidence

Update Feliz and Fable.AST dependencies for v4.1.0

The Feliz.PigeonMaps and Feliz.Popover packages have been updated to version 4.1.0, bumping the Feliz dependency to support Fable.AST 5.0.0-rc.3. This change updates the underlying F\# and JavaScript bindings to align with the new compiler infrastructure, ensuring compatibility with the latest Fable tooling.

src/Feliz.PigeonMaps, src/Feliz.Popover · high confidence

Update Feliz dependencies to support Fable.AST 5.0.0-rc.3

Both the Kawaii and SelectSearch components have been updated to support Fable.AST 5.0.0-rc.3, ensuring compatibility with the latest Feliz version. This change updates the underlying dependencies to maintain stability and access to new features in the Fable ecosystem.

src/Feliz.Kawaii, src/Feliz.SelectSearch · high confidence

Updated Feliz packages to support Fable.AST 5.0.0-rc.3

The Feliz.Delay, Feliz.Listeners, and Feliz.RoughViz packages have been updated to support Fable.AST 5.0.0-rc.3. This update ensures compatibility with the latest changes in the Fable compiler and the underlying Feliz framework, allowing these libraries to function correctly with the new AST structure.

src/Feliz.Delay, src/Feliz.Listeners, src/Feliz.RoughViz · high confidence

Test coverage

Add unit tests for the compiler plugin's path resolution logic; Added F\# bindings and tests for Vitest; Added automated tests for the Delay and Code Splitting features; Added comprehensive test suite for Feliz components; Added comprehensive tests for React bindings; Added comprehensive tests for UseElmish edge cases and lifecycle behaviors; Added test infrastructure and documentation for the tests directory; Added test infrastructure for Vitest and React Testing Library; Added tests for lazy component argument forwarding; Added tests for relative path resolution in Feliz components; Added tests for the UseElmish library; Added transpilation test suite for Fable/JSX and ReactLazyComponent scenarios.

Dependencies

Centralized dependency management and updated React 19 tooling

The project now uses a centralized package versioning system via Directory.Packages.props, which defines versions for F\# and Fable libraries (including Fable.Core 4.5.0, Fable.Elmish 4.0.0, and FSharp.Core 8.0.401). The main Feliz library and its associated templates have been updated to target React 19.0.0, and the template now includes Vitest for testing. Additionally, the template and docs have been updated to use .NET 10.0 and F\# 10.0.101.

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

Lenses

  • Code Health 91 → 92 (+0.7)
  • Architecture 60 → 60 (+0.0)
  • Maturity 59 → 60 (+0.3)
  • Readiness 51 → 51 (+0.0)
  • Security 54 → 54 (+0.0)

Resolved (2)

  • Dependency hygiene not measured — this repository's dependencies are not NuGet
  • Off-boarding risk: anonymized user #1

New (131)

  • Critical CVE: [GHSA redacted] (src/Feliz.Template/Content/package-lock.json)
  • Critical CVE: [GHSA redacted] (package-lock.json)
  • Critical CVE: [GHSA redacted] (src/Feliz.Template/Content/package-lock.json)
  • Critical CVE: [GHSA redacted] (package-lock.json)
  • Critical CVE: [GHSA redacted] (package-lock.json)
  • DateParsing.parse (cognitive 30) (src/Feliz/Helper/DateParsing.fs)
  • Dependency hygiene not measured — no packages were read
  • Documentation Quality not included (check did not complete)
  • Duplicated block (10 lines × 2) (docs/docs/feliz-docs/Examples/Feliz/ReactLazyComponent.fs)
  • Duplicated block (10 lines × 2) (src/Feliz.Listeners/Listener.fs)
  • Duplicated block (10 lines × 2) (src/Feliz.Listeners/Listener.fs)
  • Duplicated block (10 lines × 3) (src/Feliz/StyleHelper/Transform.fs)
  • Duplicated block (10 lines × 5) (src/Feliz.Recharts/AreaChart.fs)
  • Duplicated block (11 lines × 2) (docs/docs/feliz-docs/Examples/React/MemoAttributeAreEqualEmit.fs)
  • Duplicated block (11 lines × 2) (docs/docs/feliz-docs/Examples/React/UseEffectOnce.fs)
  • Duplicated block (11 lines × 2) (src/Feliz/Styles.fs)
  • Duplicated block (12 lines × 2) (docs/docs/feliz-docs/Examples/React/EffectfulCounter.fs)
  • Duplicated block (14 lines × 2) (docs/docs/feliz-docs/Examples/Guides/JSXModule.fs)
  • Duplicated block (14 lines × 2) (docs/docs/feliz-docs/Examples/React/DateTime.fs)
  • Duplicated block (14 lines × 2) (docs/docs/feliz-docs/Examples/React/ImperativeHandle.fs)
  • …and 111 more

Architecture

  • Unchanged — 0 containers · 5 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

fable-hub/Feliz 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 6 August 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit a20ecf50222545a0159d91f51a9eaa1e041be3b1 — the exact code this score is about.
  • Scored under rubric-2026.08.19 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer latest.