README.md

August 24, 2026 ยท View on GitHub

Fabulous

Declarative, functional applications for .NET using F#.

Build and test Documentation NuGet version NuGet downloads Discord

Fabulous combines F#, declarative UI, and Model-View-Update (MVU) to build mobile and desktop applications with explicit state transitions and testable application logic.

Fabulous provides the application architecture and declarative DSL. Choose a UI backend for rendering:

  • .NET MAUI with Fabulous.MauiControls
  • Avalonia with Fabulous.Avalonia

Core, both backends, extensions, templates, samples, tests, documentation, packaging, and CI are maintained together in this repository.

Documentation

For questions and community support, join the Fabulous Discord server.

Example

An MVU application keeps state and transitions separate from its declarative view:

type Model = { Count: int }

type Msg =
    | Increment
    | Decrement

let init () = { Count = 0 }

let update msg model =
    match msg with
    | Increment -> { model with Count = model.Count + 1 }
    | Decrement -> { model with Count = model.Count - 1 }

let view model =
    Application(
        ContentPage(
            "Counter",
            VStack(spacing = 16.) {
                Label($"Count is {model.Count}")
                Button("Increment", Increment)
                Button("Decrement", Decrement)
            }
        )
    )

Fabulous reconciles successive widget descriptions with the native UI. Application state remains ordinary F# data, making update functions straightforward to test.

Repository layout

src/neutral/       Fabulous.Core, tests, and benchmarks
src/maui/          .NET MAUI backend and extensions
src/avalonia/      Avalonia backend and extensions
samples/           MAUI and Avalonia applications
templates/         dotnet new template packages
docs/              Authored and API documentation
website/           GitHub Pages site
eng/               Migration and release tooling

Fabulous.sln is the consolidated build and package solution. The package ID remains Fabulous; its core assembly is named Fabulous.Core.dll.

Build and test

Prerequisites are a supported .NET SDK and any workloads required by the platform projects you build.

dotnet restore Fabulous.sln
dotnet test Fabulous.sln -c Release

CI additionally validates formatting, package creation, Avalonia headless UI tests with rendered screenshot artifacts, generated templates, a Windows MAUI sample, WinUI compatibility, and documentation deployment. Successful pull-request runs receive timeline links to their package and screenshot artifacts.

Packages and releases

All Fabulous packages use the unified 10.0.x version line and are released from .github/workflows/release.yml. To publish, move the completed notes from Unreleased into a new top-level ## [10.0.x] - YYYY-MM-DD section, add a fresh Unreleased section, and push it to main. Every main push treats the top release section as pending while its matching tag is absent. After the full Build and test workflow succeeds, the release workflow publishes packages, creates the matching tag, and creates a GitHub release. A newer main push cancels an in-progress attempt and retries the untagged version from the newer commit. NuGet publishing uses GitHub OIDC trusted publishing; no long-lived NuGet API key is stored in the repository.

Contributing

Issues and pull requests are welcome. Start with CONTRIBUTING.md, and discuss substantial API changes in an issue before implementation.

License

Fabulous is licensed under the Apache License 2.0.