fable-compiler/fable-browser
65.6
Adequate · 3 October 2026
8.3k
lines of production code
F#
primary language
2
measurements over time
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.