Skip to content
CAI
Software that uses CAICheck a score

JohSand/Orsak

62.8

Adequate · 17 October 2026

10.1k

lines of production code

F#

primary language

1

measurement over time

CAI band scale
CAI lens gauges

What this system is

Orsak is an F\# library and ASP.NET Core integration that provides a structured effect system for managing side effects, concurrency, and resilience in .NET applications. It features compile-time checked endpoint routing, scoped effects for database transactions, and code generation via Orsak.Myriad to minimize boilerplate. The system supports background workers, OpenTelemetry diagnostics, and comprehensive testing infrastructure to ensure reliability.

How it got here

2023 — Orsak effect system expansion and .NET 10 upgrade

6 changes.

This period focused on significantly expanding the Orsak library with new effect types, resilience primitives, and scoped execution capabilities, while migrating the test infrastructure to .NET 10 and xunit.v3. The SampleWeb application was refactored to demonstrate these new effect-based routing and concurrency features, replacing the previous Giraffe-based architecture.

2024–2026 — scoped effects and code generation

10 changes.

This period focused on introducing scoped effects for database transactions and progress tracking, alongside a new compile-time checked F\# endpoint routing API. It also established a code generation system for Orsak.Myriad to automate effect providers and environment configurations, supported by comprehensive benchmarks and tests.

Features

Add benchmarks folder with routing micro benchmarks and load test

A new benchmarks folder has been added containing micro benchmarks for Orsak's Effect.par/whenAll and routing performance, alongside a load test infrastructure that compares Orsak.AspNetCore routing against a minimal API baseline. The LoadTest.Driver project drives HTTP load against both servers, measuring requests per second, CPU time, allocations, and garbage collection metrics via EventPipe, while the Orsak.Benchmarks project uses BenchmarkDotNet to measure per-request routing overhead.

LoadTest.Driver, LoadTest.Orsak, benchmarks · high confidence

Introduce Orsak.Myriad code generation for effects and environments

The Orsak.Myriad package now generates F\# code from source annotations, introducing generators for effect interfaces (\[\<GenEffects\>\]) and environment interfaces (\[\<GenEnvironment\>\]). For effects, it creates provider interfaces and modules with functions that wrap member calls using Effect.Create. For environments, it generates record-based implementations that assemble providers, along with convenience run and runOrFail functions. The system also supports environment extension via the Extend attribute and growing into base environments, allowing users to compose and run side-effecting logic with minimal boilerplate.

src/Orsak.Myriad · high confidence

Introduce code generation for Orsak.Myriad runners and environments

Adds the \Writer.fs\ module, which generates F\# code for Orsak.Myriad runners and environment configurations. This includes logic to write runner types that implement effect providers (such as \ILoggerFactory\), handle environment inheritance via \IGrowsInto\, and manage context placement (namespace vs. inline appending).

Orsak.Myriad · high confidence

Introduce scoped effects for database transactions and progress tracking

Added a new \Database.fs\ module that implements scoped effects for managing database transactions and progress reporting. This introduces \DbTransactional\ and \Transaction\ types to handle commit and disposal of database connections automatically within a scope, as well as \IProgressScope\ and related builders (\pEff\, \enlistP\) to manage progress updates across batches of effects. The module provides utilities like \reportWhenDone\ and \whenAllBatch\ to simplify composing effects that require shared scoped resources.

src/Orsak/Effects · high confidence

Introduces EffSeq, resilience, and scoped effect capabilities

The Orsak library adds support for effectful asynchronous streams via the new \EffSeq\ type and \effSeq\ computation expression, enabling lazy, cancellable sequences of results. It also introduces a resilience module with retry logic using decorrelated jitter backoff and a \forever\ computation expression for long-running effects. Additionally, scoped effects are now supported, allowing effects to run within a local scope that is automatically disposed, with exceptions propagating from completing scopes rather than requiring an explicit exception handler.

Orsak · high confidence

New F\# endpoint routing API with compile-time checked route builders

Orsak.AspNetCore introduces a new F\#-friendly endpoint routing system in EndpointRouting.fs, allowing developers to define routes using curried handlers that are validated at compile time. This API provides a fluent builder pattern for endpoints, supporting conventions such as authorization, CORS, naming, and metadata, and includes built-in parsing for route parameters (strings, integers, floats, GUIDs, etc.) via a custom format syntax.

Orsak.AspNetCore · high confidence

New Myriad-based effect showcase with inline generation and environment extension

The Orsak.Myriad.Showcase sample now demonstrates the updated Myriad code-generation capabilities, including inline generation via the \Inline.fs\ module and environment extension patterns. Users can see how \GenEnvironment\ types like \IInlineEnvironment\ and \ILocalizedEnvironment\ are used to build composable effect contexts, with generated modules providing \run\ and \runOrFail\ helpers. The showcase also illustrates the \Extend\ member for extending environments (e.g., adding cancellation support) and the \IGrowsInto\ pattern for unit-of-work scoping, all generated from the \myriad.toml\ configuration.

samples/Orsak.Myriad.Showcase · high confidence

New background worker, diagnostics, and V2 endpoint routing

Orsak.AspNetCore now includes a background service registration (AddEffectWorker) that runs long-running effects as hosted services with automatic restart on failure, OpenTelemetry-compatible diagnostics (tracing and metrics) for effect endpoints, and a new V2 endpoint routing API (RouteGet2) that uses curried route handlers checked at compile time against route format strings.

src/Orsak.AspNetCore · high confidence

Orsak effect system: new builders, environment providers, and concurrency primitives

The Orsak library introduces several new capabilities for building and running effects. A new \effList\ computation expression allows effects to be composed into lists, replacing the previous \effSeq\ builder. Environment support is expanded with dedicated providers for GUID generation (\IGuidGenProvider\), random number generation (\IRandomProvider\), and time (\ITimeProvider\), making these side-effects testable via dependency injection. Concurrency and resilience are enhanced with a \Trampoline\ to prevent stack overflows in tail-recursive effects, a \ValueTaskBuilder\ for allocation-free async paths, and new effect combinators like \forever\, \repeatWhileTrue\, \retry\, and \retryIf\. Additionally, \EffectBuilderExt\ adds parallel execution helpers (\Bind3Return\ through \Bind5Return\) for combining multiple effects.

src/Orsak · high confidence

Behavioural changes

Migrate SampleWeb from Giraffe to Orsak.AspNetCore with new effect-based routing

The SampleWeb application has been refactored to replace the Giraffe HTTP handler pipeline with Orsak.AspNetCore's native effect runner. This change introduces a new \EffectRunner\ type that executes effects directly as \RequestDelegate\s, enabling support for curried route builders and compile-time checked routes. The sample now demonstrates integration with Azure Storage Queues via a background effect worker, SignalR for real-time chat, and SQLite for transactional inbox handling, replacing the previous simple ping/pong handlers with a more comprehensive effect-driven architecture.

samples/SampleWeb · high confidence

Upgrade to .NET SDK 10 and Microsoft.Testing.Platform

The project now requires .NET SDK 10.0.401 (up from 7.0.102) and switches its test runner from VSTest to Microsoft.Testing.Platform. This change enables new test filtering capabilities, such as matching test names that contain spaces, and alters how test options are passed (e.g., using \--filter-method\ instead of VSTest's \--filter\). Additionally, the solution structure has been updated to include new projects for Orsak.AspNetCore and Orsak.Myriad, while removing the SampleWeb project.

(repo-wide) · high confidence

Test coverage

Added comprehensive test coverage for Orsak core and resilience features; Added tests for curried route builders in Orsak.AspNetCore.V2.

Dependencies

Upgrade test infrastructure to xunit.v3 and .NET 10

The test project now targets .NET 8 and .NET 10, replacing the previous .NET 6-only setup. The test runner has been upgraded from xunit 2 to xunit.v3 4.0.2 (with Microsoft.Testing.Platform), allowing test filters to match names with spaces. Supporting packages like Verify.XunitV3 (32.0.1), Microsoft.NET.Test.Sdk (18.10.1), and Unquote (7.0.1) have been updated. New test files for resilience, retry, recovery, tail calls, and scoped effects have been added, and FSharp.Core is updated to 9.0.303 for the test build.

(dependencies) · high confidence

Housekeeping

Add samples solution and SDK constraint; Added experiments solution file for Orsak project.

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

Baseline

  • First survey — no prior run to compare against. CAI 63.

Lenses

  • Code Health 79
  • Architecture 100
  • Maturity 60
  • Readiness 60
  • Security 58
  • Performance 98

Changes since last survey

  • 198 commits — 178 feature/other, 20 fixes

By area

  • src/Orsak — 56 commits
  • tests/Orsak.Tests — 33 commits
  • .github/workflows — 31 commits
  • (root) — 16 commits
  • docs/reference — 12 commits
  • src/Orsak.Myriad — 11 commits
  • samples/SampleWeb — 7 commits
  • src/Orsak.AspNetCore — 5 commits
  • samples/Orsak.Myriad.Showcase — 4 commits
  • experiments/Orsak.Benchmarks — 3 commits
  • src/Directory.Build.props — 3 commits
  • Orsak.AspNetCore/Orsak.AspNetCore.fsproj — 2 commits
  • docs/content — 2 commits
  • docs/effect-sequences.fsx — 2 commits
  • experiments/experiments.sln — 2 commits
  • tests/ConsoleApp1 — 2 commits
  • Orsak.AspNetCore/EndpointRouting.fs — 1 commit
  • benchmarks/LoadTest.Driver — 1 commit
  • docs/1_Examples.fsx — 1 commit
  • docs/index.md — 1 commit

Notable commits

  • fix: Add YieldFrom for effects Fix yielding issue when binding results Adding more tests
  • fix: Add recovery tests, fix bug in recovery to effect
  • fix: Fix
  • fix: Fix Effect.timeout throwing TimeoutException instead of failing with the error
  • fix: Fix For loops on the dynamic builder path
  • fix: Fix for generic and named function parameters for GenEffect
  • fix: Fix for too big allocation in WhenAll
  • fix: Fix logo
  • fix: Fix multi target tests
  • fix: Fix obj inference in Endpoints
  • fix: Fix race condition in set result
  • fix: Fix readme
  • fix: Fix resumable-code dynamic-path regression under SDK 10.0.400
  • fix: Fix the API docs' links to the source on GitHub
  • fix: Fix: add missing method for async on builder
  • fix: Fix: correct traverse
  • fix: Fix: ensure effects can be re-run safely
  • fix: Test the untested retry and repeat functions of Effect, and fix fanOut never completing
  • fix: Update fsdocs to 22.2.0 and fix the docs settings
  • fix: fix result bind to now give warning in the presence of 8+ binds
  • …and 178 more

API surface

  • 9 HTTP endpoints (baseline)

Architecture

  • 0 containers · 6 bounded contexts · 3 dependency edges (baseline)

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

JohSand/Orsak 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 17 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 fd2c115a3fce735072dea4845addd746cc7164fe — the exact code this score is about.
  • Scored under rubric-2026.10.5 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-fe8540b5da9b.