Skip to main content
Welcome. This site supports keyboard navigation and screen readers. Press ? at any time for keyboard shortcuts. Press [ to focus the sidebar, ] to focus the content. High-contrast themes are available via the toolbar.
serard@dev00:~/cv

Applications

End-user .NET tools built on the FrenchExDev libraries.

Doc2Pdf (FrenchExDev.Net.Doc2Pdf)

Document format converter — DOCX, XLSX, PPTX, RTF, TXT to PDF — available as both a library and a CLI tool. Built on OpenXml, ClosedXML, and PdfPig, with high-fidelity layout preservation and batch processing support.

DockAi (FrenchExDev.Net.DockAi)

AI-powered document indexing and search, split into two components:

  • DockAi.Api — Web API for document ingestion, full-text search (Lucene.Net with faceting, suggestions, and highlighting), entity extraction, and ontology generation. Multi-provider LLM support: Claude, OpenAI, Ollama.
  • DockAi.Viewer — Blazor-based document renderer for viewing and navigating indexed corpora.

Parses DOCX, XLSX, CSV, Markdown, HTML, and PDF. Designed for legal document corpus analysis with narrative extraction.

QualityGate (FrenchExDev.Net.QualityGate)

Static analysis and quality metrics tool that integrates with Roslyn's MSBuildWorkspace for full semantic analysis. Computes cyclomatic complexity, cognitive complexity, class coupling, inheritance depth, maintainability index, LCOM, code duplication, and test quality. Ingests XPlat Code Coverage (Cobertura) and Stryker mutation reports. Outputs JSON + HTML reports with CI/CD exit codes.

dotnet quality-gate analyze --solution MyApp.sln
dotnet quality-gate check --gate quality-gate.yml

Configuration via YAML quality gates and coverage.runsettings. Runs as a .NET local tool.

See the dedicated article for the full architecture.

HttpClient (FrenchExDev.Net.HttpClient)

Minimal HTTP abstraction providing a single IHttpClient interface for dependency injection and testability. The runtime implementation wraps System.Net.Http.HttpClient; the testing package provides FakeHttpClient for deterministic unit tests.

// Production: inject the abstraction
public class MyService(IHttpClient client)
{
    public async Task<string> FetchAsync(string url)
    {
        var response = await client.GetAsync(url);
        return await response.Content.ReadAsStringAsync();
    }
}

// Testing: sequential fake responses, no network
var fake = new FakeHttpClient(
    new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent("data") },
    new HttpResponseMessage(HttpStatusCode.NotFound));

// Or fluent builder
var client = await new FakeHttpClientBuilder()
    .Response(r => r.Ok().Content("first"))
    .Response(r => r.StatusCode(HttpStatusCode.BadRequest).Content("error"))
    .BuildAsync();

The testing package (FrenchExDev.Net.HttpClient.Testing) includes FakeHttpClient, FakeHttpClientBuilder, and HttpResponseMessageBuilder — all implementing IBuilder<T> from the Builder library. Used as the HTTP seam across the ecosystem: Alpine.Version, BinaryWrapper design-time scrapers, and DockAi all depend on this interface.

Alpine.Version (FrenchExDev.Net.Alpine.Version)

Alpine Linux version discovery and comparison library. Queries the Alpine CDN to find available releases, architectures, and flavors — with filtering, checksums, and version range support.

var searcher = new AlpineVersionSearcher(httpClient);
var results = await searcher.SearchAsync(filters => filters
    .WithMinimumVersion("3.18.0")
    .WithArchitectures(new[] { AlpineArchitectures.x86_64 })
    .WithFlavors(new[] { AlpineFlavors.MiniRootFs })
    .WithRc(false));

foreach (var record in results)
    Console.WriteLine($"{record.Version} {record.Architecture} — {record.Sha256}");

Key types: AlpineVersion (immutable, IComparable<T>, handles edge releases and RCs), AlpineVersionSearcher (CDN querier with Parallel.ForEachAsync), and AlpineVersionSearchingFiltersBuilder (fluent filter configuration). Each result record includes version, architecture, flavor, download URL, SHA256, and SHA512.

Used by the BinaryWrapper container-based scraping infrastructure: when scraping CLI help from tools like glab or podman, Alpine.Version finds the right base image version to build scraping containers from.

⬇ Download