Skip to content
CAI
Software that uses CAICheck a score

fable-compiler/fable-browser

65.6

Adequate · 3 October 2026

8.3k

lines of production code

F#

primary language

2

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is a comprehensive F\# binding library for the Fable compiler, providing type-safe access to a wide range of browser Web APIs. It exposes interfaces for core DOM manipulation, event handling, media processing, networking, and graphics through a modular package structure. The library enables F\# developers to interact directly with browser-specific features such as WebGL, WebRTC, IndexedDB, and performance metrics.

How it got here

2019 — Initial Fable.Browser bindings release

16 changes.

This period focused on the initial release and foundational setup of the Fable.Browser library, establishing the project structure and build infrastructure. It involved creating comprehensive F\# bindings for a wide range of browser Web APIs, including DOM, networking, media, and storage, while refining the namespace organization for usability.

2020–2024 — Browser API bindings expansion

7 changes.

This period focused on expanding the library's coverage of modern browser APIs by introducing F\# type bindings for WebGL, MediaRecorder, IndexedDB, IntersectionObserver, ResizeObserver, and EventSource. The work also included adding test coverage for DOM event handling to ensure the reliability of these new interfaces.

Features

Add Blob and FormData bindings to Browser.Blob package

The new Browser.Blob package provides F\# bindings for the browser Blob and FormData APIs. It includes the Blob interface with methods for reading content as text or ArrayBuffer, and the FormData interface for constructing and manipulating form data, including support for appending Blob objects. This change consolidates these specific web APIs into a dedicated package, making them available for use in Fable projects.

src/Blob · high confidence

Add EventSource API support

This release introduces the EventSource API, enabling users to establish Server-Sent Events (SSE) connections. The new module provides bindings for the EventSource interface, including state management (CONNECTING, OPEN, CLOSED), credential handling via withCredentials, and event listeners for open, message, and error events, along with a factory function to create new instances.

src/EventSource · high confidence

Add F\# bindings for the Browser Performance API

This change introduces a new \Browser.Performance\ module that exposes F\# bindings for the browser's Performance API. It provides a \Performance\ type in the \Browser.Types\ namespace with methods for managing performance marks and measures (such as \mark\, \measure\, \clearMarks\, \clearMeasures\), retrieving entries (\getEntries\, \getEntriesByName\, \getEntriesByType\), and accessing timing data (\now\). The module also exposes a global \performance\ singleton for convenient access.

src/Gamepad, src/Performance · high confidence

Add F\# bindings for the Browser URL and URLSearchParams APIs

This change introduces the \Browser.Url\ package, providing F\# bindings for the browser's URL API. It exposes the \URL\ type with properties for hash, host, hostname, href, origin, password, pathname, port, protocol, search, and username, along with \searchParams\ access. The \URLSearchParams\ type is also included for managing query string parameters. A key feature is the \URL.Create\ constructor, which now accepts an optional base URL parameter, allowing for relative URL resolution. Additionally, \URL.createObjectURL\ and \URL.revokeObjectURL\ are available for managing object URLs.

src/Url · high confidence

Add F\# bindings for the Intersection Observer API

This change introduces F\# type bindings for the browser's Intersection Observer API, allowing developers to observe changes in the intersection of a target element with an ancestor element or the viewport. The implementation includes definitions for \IntersectionObserverEntry\, \IntersectionObserverOptions\, and the \IntersectionObserver\ constructor, along with a README documenting the feature.

src/IntersectionObserver · high confidence

Add Fable bindings for the browser WebGL API

This change introduces the \Browser.WebGL\ package, providing F\# type bindings for the browser's WebGL API. The new \Browser.WebGL.fs\ file defines types for core WebGL objects (such as \WebGLRenderingContext\, \WebGLBuffer\, \WebGLShader\, and \WebGLTexture\), context attributes, and extension interfaces (including \WEBGL\_compressed\_texture\_s3tc\, \WEBGL\_debug\_renderer\_info\, and \WEBGL\_depth\_texture\). This enables F\# developers to interact with WebGL graphics contexts directly from their applications.

src/WebGL · high confidence

Add Geolocation bindings and ServiceWorker URL overload

This release introduces the new Browser.Geolocation package, providing F\# bindings for the browser Geolocation API (including Coordinates, Position, and Geolocation types). It also updates the Browser.Worker package to include a new \register\ overload on \ServiceWorkerContainer\ that accepts a \URL\ object in addition to a string, alongside the existing string-based registration method.

src/Worker · high confidence

Add MediaRecorder bindings for the browser MediaStream Recording API

This change introduces the Browser.MediaRecorder package, providing F\# bindings for the browser's MediaStream Recording API. It exposes the MediaRecorder interface, allowing users to manage media recording states (Inactive, Recording, Paused), configure options such as mimeType and bit rates (audioBitsPerSecond, videoBitsPerSecond, bitsPerSecond), and handle events like dataavailable and error. The bindings include the isTypeSupported method for checking MIME type compatibility and the start method which now accepts an optional timeslice parameter.

src/MediaRecorder · high confidence

Add ResizeObserver API bindings

This release introduces bindings for the browser's ResizeObserver API, enabling applications to observe changes to the size of elements. The implementation exposes the \ResizeObserver\ constructor, callback types, and entry structures (including \borderBoxSize\, \contentBoxSize\, and \devicePixelContentBoxSize\), along with options to specify the box model (ContentBox, BorderBox, or DevicePixelContentBox) for observation.

src/ResizeObserver · high confidence

Add Web Storage API bindings

Introduces F\# bindings for the Web Storage API, exposing \localStorage\ and \sessionStorage\ along with the \Storage\ and \StorageEvent\ types in the \Browser.Types\ namespace. This allows users to interact with browser storage mechanisms directly from F\# code.

src/WebStorage · high confidence

Add bindings for the browser MediaQueryList API

This change introduces the Browser.MediaQueryList package, providing F\# bindings for the browser's MediaQueryList interface. It exposes the MediaQueryList type with properties for matches, media, and onchange events, and adds extension methods to Document and Window to enable the matchMedia function for querying media queries.

src/MediaQueryList, src/WebSocket · high confidence

Initial release of Browser.IndexedDB bindings

This change introduces the Browser.IndexedDB package, providing F\# bindings for the browser IndexedDB API. The release includes type definitions for core interfaces such as IDBFactory, IDBDatabase, IDBObjectStore, and IDBIndex, along with support for transactions, cursors, and key ranges. It also exposes the indexedDB global object on the Window type for convenient access.

src/IndexedDB · high confidence

Initial release of Fable.Browser bindings for Web APIs

This change introduces the initial set of Fable bindings for various Browser Web APIs, organized into individual NuGet packages such as Fable.Browser.Dom, Fable.Browser.WebSocket, Fable.Browser.WebGL, and Fable.Browser.MediaRecorder. The repository structure includes a solution file defining these projects, a build script for publishing, and documentation detailing usage via the \Browser\ and \Browser.Types\ namespaces.

(repo-wide) · high confidence

Initial release of WebRTC API bindings

This change introduces the initial set of F\# bindings for the browser WebRTC API, providing type definitions for core interfaces such as RTCPeerConnection, RTCDataChannel, and RTCIceCandidate. It includes support for WebRTC 1.1 and 1.3 specifications, featuring strong-typed enums for ICE protocols and credential types, and adds missing methods like getStats to RTCPeerConnection.

src/WebRTC · high confidence

Initial release of XMLHttpRequest bindings

This change introduces the Browser.XMLHttpRequest package, providing F\# bindings for the browser XMLHttpRequest API. It defines the ReadyState enum (Unsent, Opened, HeadersReceived, Loading, Done) and exposes the XMLHttpRequest and XMLHttpRequestUpload types with their standard properties (such as timeout, response, status) and methods (open, send, abort, etc.), allowing users to perform HTTP requests from Fable applications.

src/XMLHttpRequest · high confidence

Introduce Browser.Css package with CSSOM bindings and CSS Grid support

The new Browser.Css package provides F\# bindings for the CSS Object Model, exposing types such as CSSRule, CSSStyleSheet, and CSSStyleDeclaration, along with extensions on Window, Element, and Document for accessing stylesheets and computed styles. This release also adds support for CSS Grid and gap style properties (e.g., gridTemplate, gap) to CSSStyleDeclaration, enabling developers to style layouts using modern CSS features directly from F\#.

src/Css · high confidence

New Browser.Event bindings for event handling and gamepad support

This change introduces the \Browser.Event\ package, providing F\# bindings for the browser's Event interface. It includes core types such as \Event\, \EventTarget\, and \CustomEvent\ (with generic support for typed details), along with explicit overloads for \addEventListener\ and \removeEventListener\ to simplify usage. The package also adds bindings for \GamepadEvent\ to support gamepad input and includes \ErrorEvent\ and \MessageEvent\ for error and messaging scenarios.

src/Event · high confidence

New Browser.Navigator package exposes Navigator API bindings

A new \Browser.Navigator\ package has been added, providing F\# bindings for the browser Navigator object. This includes access to navigator properties such as user agent, platform, and online status, as well as APIs for clipboard operations (read/write text), permissions querying, gamepad detection, vibration control, and content sharing.

src/Navigator · high confidence

New Browser.Svg package for SVG DOM bindings

The new Browser.Svg package provides F\# bindings for SVG interfaces in the browser's DOM. It exposes global SVG types (such as SVGAElement, SVGElement, and various filter/gradient elements) via the Browser.Svg module, defines the corresponding type hierarchy in Browser.Types, and extends the Document type with a rootElement property to access the root SVG element.

src/Svg · high confidence

Behavioural changes

Reworked DOM bindings with new global namespace structure

The DOM bindings have been reorganized to expose global browser objects (such as \window\, \document\, \console\, and all HTML element types) directly under the \Browser\ namespace, replacing the previous structure. This change introduces a new \Browser.Dom\ module for global accessors, a \Browser.Types\ namespace for type definitions, and a dedicated \Browser.Dom.Ext\ module for extensions like the \FormData\ constructor. Users should update their code to reference these types under the \Browser\ namespace instead of the old layout.

src/Dom · high confidence

Updated MediaStream bindings with new constraint types and enum refinements

The Fable.Browser.MediaStream bindings have been updated to better align with the Web API, introducing new types such as \ImageMediaTrackConstraintSet\ and \PointsOfInterestConstraint\ for advanced camera controls. Several existing constraint types (e.g., \ConstrainXXX\) now support both single values and constraint objects via union types like \ConstrainOrValue\. Additionally, \MediaDeviceInfo.kind\ is now a strongly typed enum (\FacingMode\), and properties on \MediaTrackCapabilities\ are optional to reflect browser behavior. The release also includes type name corrections and the addition of \MediaStreamError\.

src/MediaStream · high confidence

Test coverage

Added tests for DOM event creation and dispatching

Added a new test file (EventTest.fs) that verifies the ability to create and dispatch standard and custom DOM events, including checking bubbling behavior and event details.

test · high confidence

Dependencies

Initial project setup with Fable browser bindings and test infrastructure

This change introduces the foundational build and dependency structure for the Fable browser bindings project. It adds a \package.json\ and \package-lock.json\ to manage Node.js development dependencies, specifically \@web/test-runner\ and \@web/test-runner-commands\ for running tests. It also establishes the .NET project structure with \paket.dependencies\ and \paket.lock\ to resolve the \Fable.Expect\ library, alongside a suite of new \.fsproj\ files defining individual browser API packages (such as Blob, CSS, DOM, Event, MediaRecorder, WebRTC, and WebSocket) and a test project configured to use Fable.Expect for assertions.

(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 63 → 66 (+2.9)
  • Rubric changed (rubric-2026.09.13 → rubric-2026.10.1) — scores are not directly comparable.

Lenses

  • Code Health 80 → 90 (+10.0)
  • Architecture 96 → 89 (-7.4)
  • Maturity 50 → 53 (+3.7)
  • Readiness 63 → 63 (+0.0)
  • Security 89 → 91 (+2.4)

New (2)

  • High CVE: [GHSA redacted] (package-lock.json)
  • Projects may be oversized for their cohesion

Changes since last survey

  • 1 commits — 1 feature/other, 0 fixes

By area

  • (root) — 1 commit

Notable commits

  • change: Bump ip-address from 10.4.0 to 10.7.2 (#169)

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-compiler/fable-browser 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 3 October 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 08af0db370dd1b9e5afdc57c1398e3dec9e9812e — the exact code this score is about.
  • Scored under rubric-2026.10.1 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-4f4226d619ea.