Pre-1.0 docs. FsFlow is still on the next documentation line, so APIs and examples may change before 1.0.

A coherent application architecture model for F# on .NET.

Structured composition over normal F#/.NET code

FsFlow is a unified model for building robust, Result-based programs. Write predicate checks once, keep fail-fast logic in Result, accumulate sibling failures with Validation, then lift the same logic into Flow when the boundary needs environment access, async work, task interop, cancellation, or runtime policy.
Check once, lift later
type RegistrationError =
    | EmailMissing
    | UserNotFound

let validateEmail (email: string) : Result<string, RegistrationError> =
    email
    |> Check.whenNotBlank
    |> Check.withError EmailMissing

type User =
    { Email: string }

type Api =
    { LoadUser: int -> Task<Result<User, RegistrationError>> }

let readVerifiedEmail userId =
    flow {
        let! loadUser = Flow.read _.LoadUser
        let! user = loadUser userId
        return! validateEmail user.Email |> Flow.fromResult
    }