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:
|
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:
./fake.sh build -t Dev— restore, build, test./fake.sh build -t GeneratedGuidanceCheck— spec/plan template governance./fake.sh build -t TemplateCheck— template pack/install/instantiate/smoke./fake.sh build -t GeneratedProductCheck— generated-product matrix./fake.sh build -t EvidenceGraph— validate the task DAG./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 |
|---|---|---|
10.1.300 |
Language and core library. |
|
.NET ( |
— |
Target framework. |
4.147.0-preview.3.1 |
2D graphics / rendering. |
|
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. |
4.2.0 |
Model-View-Update application model. |
|
3.2.3 |
.NET binding for Yoga flexbox layout. |
|
17.1.0 |
YAML parsing for input/config contracts. |
Build, test, and process tooling
Tool |
Version |
Role |
|---|---|---|
6.1.4 |
F# Make build automation — the |
|
— |
Spec-driven development and evidence governance. |
|
10.2.2 |
F# test framework. |
|
0.15.3 |
Expecto adapter for |
|
17.11.1 |
Test host/runner. |
Exact pins are centralized in Directory.Packages.props.