Logo FS-Skia-UI

Developing FS.Skia.UI

This page covers the development container, the technology stack, and the maintainer validation flow for working on the framework itself. Consuming the framework needs none of this — see the README "Get started" section and distribution.md.

Development environment

The repository ships a ready-made development container that bundles every prerequisite — the .NET SDKs (6.0/8.0/10.0), F# tooling (fsautocomplete, fantomas, FAKE, Paket, Fable), the native graphics libraries SkiaSharp and Vulkan need, and the local NuGet feed — so you don't assemble them by hand. From the repository root:

./Container/create-fs-skia-ui-dev.sh --workspace="$PWD" --rebuild

This builds the image, starts a rootless Podman container with your workspace mounted at /workspace, forwards GPU/display where available, and drops you into a shell. See Container/fs-skia-ui-container.md for the full prerequisite list and options.

You still bring two things the container can't: a Vulkan-capable GPU on a Windows or Linux desktop host (macOS, mobile, browser, and headless production are out of scope), and a coding agent for the Spec Kit workflow (currently Claude Opus 4.8 or Codex 5.5).

Maintainer validation flow

Maintainers work in this repository through the same Spec Kit process. Run ./fake.sh build -t Route first — it reads your change and prints the authoritative tier and the minimal gate list to run. Routine framework work routes to the light inner-loop tier (Dev only); consumer-contract changes escalate automatically.

FAKE-backed commands share .fake state and are not safe to run concurrently — run them one at a time. When a change escalates, the serialized order is:

  1. ./fake.sh build -t Dev — restore, build, test
  2. ./fake.sh build -t GeneratedGuidanceCheck — spec/plan template governance
  3. ./fake.sh build -t TemplateCheck — template pack/install/instantiate/smoke
  4. ./fake.sh build -t GeneratedProductCheck — generated-product matrix
  5. ./fake.sh build -t EvidenceGraph — validate the task DAG
  6. ./fake.sh build -t EvidenceAudit — merge gate

./fake.sh build -t Verify and ./fake.sh build -t Ci are the broad aggregate gates. Public visibility lives in .fsi signature files (the contract chain is Spec → .fsi → semantic tests → implementation → surface baseline). See docs/reports/build.md, docs/reports/testing.md, docs/reports/evidence.md, docs/reports/speckit.md, and .specify/memory/constitution.md.

Releasing to nuget.org is described in distribution.md (CI trusted publishing via .github/workflows/publish.yml).

Built with

Runtime

Library

Version

Role

F# / FSharp.Core

10.1.300

Language and core library.

.NET (net10.0)

Target framework.

SkiaSharp

4.147.0-preview.3.1

2D graphics / rendering.

SkiaSharp.NativeAssets.Linux / .Win32

4.147.0-preview.3.1

Native Skia binaries.

Silk.NET (Input, Vulkan, Vulkan.Extensions.KHR, Windowing, Windowing.Extensions)

2.23.0

Windowing, input, and Vulkan bindings.

Fable.Elmish

4.2.0

Model-View-Update application model.

Yoga.Net

3.2.3

.NET binding for Yoga flexbox layout.

YamlDotNet

17.1.0

YAML parsing for input/config contracts.

Build, test, and process tooling

Tool

Version

Role

FAKE

6.1.4

F# Make build automation — the Fake.Core.Target library, compiled into the build/Build.fsproj front-end (no FSX runner).

Spec Kit

Spec-driven development and evidence governance.

Expecto

10.2.2

F# test framework.

YoloDev.Expecto.TestSdk

0.15.3

Expecto adapter for dotnet test.

Microsoft.NET.Test.Sdk

17.11.1

Test host/runner.

Exact pins are centralized in Directory.Packages.props.

Type something to start searching.