Skip to content
CAI
Software that uses CAICheck a score

rmueller/kayak

44.1

Weak · 5 August 2026

2.2k

lines of production code

C#

primary language

5

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

Kayak is a high-performance, event-driven networking framework for .NET that provides a robust foundation for building HTTP servers and network applications. It replaces legacy stream-based abstractions with a modern, delegate-based architecture for scheduling, server management, and socket I/O, enabling more testable and stable code. The system includes a command-line interface for launching servers, comprehensive HTTP/1.1 support including 100-continue handling, and utility tools for documentation generation.

How it got here

2010 — Architecture simplification and build reorganization

12 changes.

This period focused on streamlining the Kayak framework by removing legacy coroutine and stream abstractions in favor of a more direct socket and event-loop based architecture. The team integrated the httpmachine submodule and introduced new networking abstractions via the Oars library, while simultaneously reorganizing the project structure, build scripts, and test suites to support this shift.

2011 — Delegate-based architecture and test coverage

11 changes.

The project underwent a significant architectural shift to replace C\# events with interface-based delegates across the HTTP and networking layers, improving robustness and testability. This refactoring was accompanied by the introduction of a command-line interface and extensive new test suites to validate the new delegate patterns and transaction handling.

Features

Added KayakExamples project with HTTP server sample

Introduced a new KayakExamples project containing an App.config for diagnostics and a Program.cs that demonstrates the Kayak HTTP server. The example implements an IHttpRequestDelegate to handle GET and POST requests, including a buffered echo endpoint that supports 100-continue, and exposes request details such as URI, path, query string, and fragment.

KayakExamples · high confidence

Added Oars networking implementation

Introduced the Kayak.Oars assembly containing the core networking abstractions and implementations. This includes the OarsServer for managing TCP connections, OarsSocket for handling individual client sockets, and supporting classes like OarsBuffer and Disposable. This provides a new way to handle network I/O within the Kayak framework.

Kayak.Oars · high confidence

Added trace and stack trace utilities to Kayak/Extensions

A new Trace utility class and extension methods were added to the Kayak/Extensions namespace. This includes a DebugStackTrace method for debugging in DEBUG builds, a WriteStackTrace method for writing to a TextWriter, and a GetStackTrace method that formats exception chains. Additionally, an internal Trace class was added to write formatted messages to the console with thread and method information when the TRACE preprocessor symbol is defined.

Kayak/Extensions · high confidence

HTTP request header extensions for 100-continue and body detection

Added new extension methods to the HTTP request handling to support the 100-continue protocol and body detection. The \IsContinueExpected\ method checks for the '100-continue' header in HTTP/1.1 requests, while \IsContinueProhibited\ handles cases where the header is missing or invalid. Additionally, \HasBody\ determines if a request contains a body based on 'Content-Length' or 'Transfer-Encoding' headers.

Kayak/Http/Extensions · high confidence

Incorporates httpmachine submodule and libevent\_core library

The lib directory now includes the httpmachine submodule (commit 5747f5e) and a new libevent\_core.dylib shared library. These additions provide underlying HTTP and event-loop capabilities to the library.

lib · high confidence

Introduce Kayak CLI launcher and option parsing

The Kayak.Cli project now includes a command-line interface that parses user arguments into configuration options and launches the Kayak scheduler. This includes an option parser for handling flags like --help, -g/--gate for Gate configuration, and -b/--bind for network endpoints, alongside a launcher that loads user-defined delegates and starts the scheduler.

Kayak.Cli · high confidence

Introduced KayakDocs tool for generating HTML documentation from .NET assemblies

A new documentation generation tool named KayakDocs has been added to the tools directory. This utility processes .NET assemblies to produce HTML documentation pages, utilizing a custom reflection-based XML documentation extractor (DocsByReflection) and an embedded MarkdownSharp processor to format member descriptions. The tool iterates through assembly types, extracting constructors, properties, methods, and fields, and outputs a structured HTML document. The project's assembly metadata has been updated to reflect the new name and GUID.

tools · high confidence

Behavioural changes

Added assembly metadata for KayakExamples

The KayakExamples project now includes an AssemblyInfo.cs file that defines standard assembly metadata, including the title, copyright, version (1.0.0.0), and GUID. This ensures the assembly is properly identified and versioned in the build output.

KayakExamples/Properties · high confidence

Build and project structure reorganization

The project's build and solution structure has been reorganized. The solution file (Kayak.sln) has been updated to target Visual Studio 2010, and the solution now includes the KayakExamples and Kayak.Tests projects, while removing the Oars project. A new Rakefile.rb and build.proj have been added to automate the build process, including fetching git submodules (such as HttpMachine) and NuGet dependencies (such as NUnit). Additionally, a .gitignore file has been created to exclude build artifacts and IDE-specific files, and a LICENSE file has been added.

(repo-wide) · high confidence

Introduces a delegate-based API for scheduling, servers, and sockets

The Kayak/Net library now uses explicit interface-based delegates (ISchedulerDelegate, IServerDelegate, ISocketDelegate) instead of C\# events or native callbacks. This change introduces new interfaces (IScheduler, IServer, ISocket) and their corresponding factories, allowing users to provide custom implementations for scheduling, server lifecycle, and socket operations. The scheduler is now single-threaded by default, and the HTTP/IO handling is restructured around these delegate patterns for improved robustness.

Kayak/Net · high confidence

Refactored KayakServer to use interface-based delegates and explicit scheduler dependency

The server implementation was rewritten to replace C\# events with interface-based delegates (IServerDelegate) and accept an IScheduler dependency, making the HTTP handling more robust. The new DefaultKayakServer constructor requires both a delegate and a scheduler, and the server now enforces null checks on these arguments. Additionally, the server's internal state management was extracted into a dedicated KayakServerState class to track listening, closing, and connection counts.

Kayak/Net/Server · high confidence

Refactored socket implementation with interface-based delegates and improved state management

The socket layer has been refactored to use interface-based delegates (ISocketDelegate) instead of C\# events, providing a more robust and testable API. A new KayakSocketState class manages connection lifecycle (connecting, connected, closed) to prevent invalid state transitions. The implementation now properly sets RemoteEndPoint, handles exceptions from BeginReceive, and defers socket shutdown and close events until all data is written, improving stability. A SocketWrapper interface and class were added to wrap native Socket calls, enabling easier testing and Mono compatibility.

Kayak/Net/Socket · medium confidence

Removal of legacy coroutine and stream abstractions

The Kayak library has removed several legacy components to simplify the architecture. The custom \Coroutine\ class and its associated \AsCoroutine\ extension method have been deleted, indicating a shift away from the previous coroutine-based execution model. Additionally, the \EntityStream\, \RequestStream\, and \ResponseStream\ classes have been removed, along with the \NameValueDictionary\ and \ObserverCollection\ helper classes. The \KayakRequest.cs\ file was also renamed to \Disposable.cs\ and significantly simplified, reflecting a move towards a more direct, lower-level socket and stream handling approach.

Kayak · high confidence

Removed obsolete test suite for request and response streams

The test suite for the Kayak HTTP server's request and response handling has been removed. This includes the deletion of test files for \KayakContextRequest\, \KayakContextResponse\, \KayakServer\, \RequestStream\, and \ResponseStream\, as well as a custom \SynchronousMemoryStream\ helper and the \Moq\ library's XML documentation. These tests previously validated the parsing of HTTP headers, status lines, and body streams, as well as the construction of HTTP responses. Their removal indicates a shift away from the previous stream-based request/response model in favor of a new architecture.

KayakTests · high confidence

Rewrote HTTP transaction pipeline with interface-based delegates

The HTTP server implementation has been largely rewritten to replace C\# events with interface-based delegates (IHttpRequestDelegate, IHttpResponseDelegate, etc.), resulting in a more robust and testable transaction pipeline. This change introduces support for HTTP 100 Continue responses, exposes the client's IP address in the X-Forwarded-For header, and ensures proper socket disposal to prevent ObjectDisposedExceptions. Additionally, the API now exposes request path, query string, and fragment components.

Kayak/Http · high confidence

Updated Kayak assembly metadata and version

The Kayak assembly metadata has been updated to version 0.7.2, with a more descriptive assembly description and copyright header. The InternalsVisibleTo attribute was added to expose internal types to the Kayak.Tests assembly.

Kayak/Properties · high confidence

Test coverage

Added HTTP transaction test infrastructure; Added and re-enabled network and scheduler tests; Added comprehensive tests for HTTP transaction handling and parser transforms; Added test helper delegates for scheduler, server, and socket; Added unit tests for CLI argument parsing and launcher behavior; Updated test assembly metadata.

Dependencies

Build system and test infrastructure reorganization

The project's build configuration has been updated to use MSBuild ToolsVersion 4.0, and the solution structure has been reorganized. The 'KayakTests' project was renamed to 'KayakExamples' and its references to local DLLs were replaced with NuGet package references for NUnit 2.5.10.1092. Additionally, new test projects were introduced for the CLI and core library, and the main 'Kayak' project was updated to include the 'httpmachine' library as a submodule and generate XML documentation files.

(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 48 → 44 (-4.4)
  • Rubric changed (rubric-2026.08.15 → rubric-2026.08.19) — scores are not directly comparable.

Lenses

  • Code Health 61 → 78 (+16.7)
  • Architecture 87 → 87 (+0.0)
  • Maturity 55 → 25 (-30.3)
  • Readiness 30 → 38 (+8.1)
  • Security 100 → 100 (+0.0)

Resolved (19)

  • Change coupling: HttpServer.cs ↔ ParserToTransactionTransform.cs (Kayak/Http/HttpServer.cs)
  • Change coupling: HttpServerTransactionDelegate.cs ↔ ParserToTransactionTransform.cs (Kayak/Http/HttpServerTransactionDelegate.cs)
  • Coverage not measured — test suite did not build
  • DefaultKayakSocket.BeginRead (cognitive 24) (Kayak/Net/Socket/KayakSocket.cs)
  • DefaultKayakSocket.BeginSend (cognitive 20) (Kayak/Net/Socket/KayakSocket.cs)
  • No tests discovered
  • TodoComment (Kayak.Tests/Net/SocketTests.cs)
  • TodoComment (Kayak.Tests/Net/SocketTests.cs)
  • XxxComment (Kayak.Tests/Http/Mocks.cs)
  • XxxComment (Kayak.Tests/Http/Mocks.cs)
  • XxxComment (Kayak.Tests/Http/Mocks.cs)
  • XxxComment (Kayak/Http/DataSubject.cs)
  • XxxComment (Kayak/Http/DataSubject.cs)
  • XxxComment (Kayak/Http/HttpServerTransactionDelegate.cs)
  • XxxComment (Kayak/Http/HttpServerTransactionDelegate.cs)
  • XxxComment (Kayak/Http/HttpServerTransactionDelegate.cs)
  • XxxComment (Kayak/Http/Parsing/ParserHandler.cs)
  • XxxComment (Kayak/Http/Parsing/ParserHandler.cs)
  • redundant comment (Kayak/Http/HttpServerSocketDelegate.cs)

New (21)

  • Coverage not measured — test suite did not build
  • Dormant codebase
  • Largest orphaned file (Kayak.Cli/Options.cs)
  • Largest orphaned file (tools/KayakDocs/Markdown.cs)
  • Test reliability not measured — no test run produced results
  • The build section instructs readers to clone [e-mail redacted]/kayak/kayak.git and run 'rake', but no steps follow (e.g. how to install albacore or bootstrap the source tree). (README.md)
  • TodoComment (Kayak.Tests/Net/SocketTests.cs)
  • TodoComment (Kayak.Tests/Net/SocketTests.cs)
  • XxxComment (Kayak.Tests/Http/Mocks.cs)
  • XxxComment (Kayak.Tests/Http/Mocks.cs)
  • XxxComment (Kayak.Tests/Http/Mocks.cs)
  • XxxComment (Kayak/Http/DataSubject.cs)
  • XxxComment (Kayak/Http/DataSubject.cs)
  • XxxComment (Kayak/Http/HttpServerTransactionDelegate.cs)
  • XxxComment (Kayak/Http/HttpServerTransactionDelegate.cs)
  • XxxComment (Kayak/Http/HttpServerTransactionDelegate.cs)
  • XxxComment (Kayak/Http/Parsing/ParserHandler.cs)
  • XxxComment (Kayak/Http/Parsing/ParserHandler.cs)
  • complexity unreadable for .cs, .rb — churn × complexity hotspots could not be measured
  • dormant codebase — no living knowledge left to concentrate
  • …and 1 more

Architecture

  • Unchanged — 1 containers · 0 contexts · 0 edges

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

Survey your own repository

rmueller/kayak 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 5 August 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 892843d901c6e946179f9878df7efa3c2c746b5f — the exact code this score is about.
  • Scored under rubric-2026.08.19 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer latest.