Migrating from V2 (FS.Skia.UI monolith) to V3 (split packages)
V3 retires the broad FS.Skia.UI package. The monolith's runtime was relocated into
focused, single-responsibility packages across programme Stages 1–4 (ADRs 0007–0011),
and Stage 5 (feature 053-v3-monolith-retirement) deletes the monolith and stops
publishing it. A V2 app that referenced FS.Skia.UI migrates by replacing that one
package reference with the focused packages it actually uses.
Surface map
V2 monolith namespace / surface ( |
V3 package |
V3 namespace |
|---|---|---|
Scene vocabulary — |
|
|
Vulkan/Skia desktop host + persistent viewer ( |
|
|
Elmish program/command/subscription wiring over the viewer |
|
|
Keyboard input contracts (key model/mapping) |
|
|
Rich keyboard-input runtime (reducer/effect, diagnostics, YAML config) |
|
|
Layout / graph definitions and validation |
|
|
Form controls, rich text, DataGrid, chart controls, graph views, |
|
|
FS.Skia.UI.Controls.Elmish (the Controls↔Elmish program adapter) and
FS.Skia.UI.Testing (deterministic scene-output testing helpers) have no V2 monolith
public-surface predecessor — they are V3-native packages and are intentionally absent
from the surface map above.
Moving an app's package references
Replace the single broad reference:
|
with the focused packages the app uses, for a typical Elmish desktop viewer app:
|
A generated dotnet new fs-skia-ui app already references the split packages only — the
template never pinned the monolith — so newly generated products need no migration.
Removed SceneConversion
V2 bridged the monolith's opaque Scene to the split Scene = { Nodes: SceneNode list }
via src/SkiaViewer/SceneConversion.fs. V3 has a single scene vocabulary
(FS.Skia.UI.Scene, ADR 0008), so the SceneConversion shim is gone. Apps that built
scenes through the monolith's scene API now build them directly against
FS.Skia.UI.Scene — the same structured Scene/SceneNode/Paint/Path vocabulary,
with no conversion step. The viewer host consumes FS.Skia.UI.Scene values directly.
Rich keyboard input → FS.Skia.UI.Input
The rich keyboard-input runtime (the stateful reducer/effect model, diagnostics, and YAML
key-binding configuration) moved out of the monolith into FS.Skia.UI.Input (feature
052). Apps that drove rich keyboard handling through FS.Skia.UI now reference
FS.Skia.UI.Input and open FS.Skia.UI.Input; the lighter key model/mapping contracts
remain in FS.Skia.UI.KeyboardInput.
See also
- After-measurement baseline:
docs/reports/_baselines/2026-06-02-v3-after.md - Programme closeout:
docs/adr/0012-monolith-retirement-closeout.md - Stage ADRs:
docs/adr/0007-host-ownership.md…0011-parity-oracle-method.md