https://gitlab.com/keid/meta/-/raw/main/resolvers/keid-engine-2026-09-09.yaml (GHC 9.10.3 / LTS-24.58)
Keid
The major focus was text processing and rendering: fonts moved from Evan Wallace’s SDF atlases to MSDF with proper shaping and line wrapping. The rest is mostly keeping up with the dependencies.
- https://hackage.haskell.org/package/keid-core-0.1.11.1/changelog
- https://hackage.haskell.org/package/keid-render-basic-0.1.12.0/changelog
- https://hackage.haskell.org/package/keid-ui-dearimgui-0.1.5.0/changelog
keid-frp-banana, keid-geometry, keid-resource-gltf and keid-sound-openal stay at their previous versions.
Dependencies
- https://hackage.haskell.org/package/geomancy-0.3.1.0/changelog
- https://hackage.haskell.org/package/ktx-codec-0.1.0.0/changelog
- https://hackage.haskell.org/package/dear-imgui-2.5.0/changelog
- https://hackage.haskell.org/package/spirv-reflect-ffi-0.4.1/changelog
- https://hackage.haskell.org/package/spirv-reflect-types-0.4/changelog
- https://hackage.haskell.org/package/spirv-reflect-yaml-0.4/changelog
- https://hackage.haskell.org/package/vulkan-3.26.6/changelog – Vulkan API 1.3.302, the last of the 1.3 series. vulkan-3.27 is already published, but needs some compatibility fixes.
- https://hackage.haskell.org/package/apecs-stm-0.3/changelog (paired with apecs-0.10.1, which is on stackage by itself)
- https://hackage.haskell.org/package/rio-0.1.25.0/changelog
New packages:
The core of the Keid update this time:
- https://hackage.haskell.org/package/kb-text-shape-0.2.1.0 – Unicode segmentation and shaping.
- https://hackage.haskell.org/package/kb-text-layout-0.1.2.0 – Multiline text measurement and layout.
- https://hackage.haskell.org/package/ktx-font-0.2.0.1 – GPU-ready rasterized fonts.
- https://hackage.haskell.org/package/msdf-atlas-0.1.1.0 – Types and parser for the MSDF atlas layout.
Git pins
-
bindings-GLFWfromb37d104to pick up glfw-3.4 until it hits Hackage.
Non-git pins
-
mcp-server -
quic/quic-simpleand its entourage oftls,crypton-*andasync.
Breaking
Fonts: EvanW SDF is gone
-
Removed
Resource.Font.EvanWandRender.Font.EvanwSdf.*together with thepEvanwSdfpipeline. UseResource.Font.KtxfandRender.Font.Msdf.*withpMsdf. -
Fonts are
.ktxfbundles now, not a JSON atlas next to a KTX2 texture. Atlas generation no longer needs a browser and copy-pasting.demos/sky-playgroundandexamples/2d/texts-and-spritesshow the migration. -
Engine.UI.Message.Input:-
inputFontIdis removed. -
inputFontis aKtxf.Stacknow (seeKtxf.allocateStack1andKtxf.allocateMonoStacks) instead of aFont.Container. -
inputLineSizeandinputBreakare new fields.
-
-
If you built
.ktxfbundles with ktx-font-0.1.x, rebuild them. ktx-font-0.2 changed the format of the bundled shaping data.
Render.Basic settings and pipelines
-
Render.Basic.SettingsgainedsMSAA,sAnisotropyandsLitSpec, and lost itsZeroinstance. UseRender.Basic.swapchainSettings swapchaininstead of passing the swapchain around for antialiasing settings. -
PipelinesFno longer haspMSAA.pSettings(the observableSettings) takes its place. -
External.ConfigureGraphics ^ pandExternal.ConfigureCompute ^ pslots in HKD pipeline collections areWorker.Vars of the configuration now, notExternal.Processes. External pipelines use one loader for all variants.
Look of the scene
-
The AO channel of the
Materialtexture is inverted (0 is the most occluded, 1 is fully open) and multiplicative, like the rest of the channels. Existing AO maps will render differently and will need updates. - Lights use the roughness-aware Fresnel function, so lit materials will look different.
Textures
-
Global.Resource.Texture.Base.Collectiongainedwhite. The indices of the textures that come after the Base ones are shifted by one.
ImGui
keid-ui-dearimgui-0.1.5.0 follows dear-imgui-2.5.0 (Dear ImGui 1.92.8), with breaking changes around the DrawList API:
-
imagedrops the border and tint arguments. UseimageWithBg. -
Texture functions take
ImTextureRefinstead ofImTextureID.pushTextureIDandpopTextureIDarepushTextureandpopTexturenow. -
addRect,addPolyLineandpathStrokeswapped some of their arguments.
Upstream
-
ktx-codec-0.1.0.0:
Codec.Ktx2.Writefunctions take the newKtx2type instead of separate arguments. -
apecs-stm-0.3:
Map,GlobalandUniqueare renamed toTMap,TGlobalandTUnique. They can now be used alongside the vanilla ones. -
vulkan-3.26.5: the
debugMessagetext is aMaybe. -
spirv-reflect-{ffi,types,yaml}-0.4:
SpecializationConstanthas newtype_descriptionanddefault_valuefields. -
geomancy-0.3.1.0:
Block.sizeOf40forPacked3-vectors is 12 (was 16). It is a fix, but check any buffer layouts that relied on the old size.
Added
keid-core-0.1.11.1
-
Texture.fromAllocatedImage. -
Resource.Image.Downsample.mipPyramid, the downsampler that used to live in the sky-playground demo.-
The
Image.DstImageconstructor is exported. -
Image.allocateDstMipFor.
-
The
-
Worker.merge1,merge2,merge3,merge4andmergeT: thespawnMerge*functions with the function in the last position. -
Worker.mergeNeq1only publishes the result when it differs from the previous one. -
Worker.merge1Mfor the times you absolutely must do someMonadUnliftIO min reaction to the change. -
Resource.Static.collectionsplices the record type and fills it with the source paths. -
MonadTrans Boundinstance. -
External.Params, a wrapper for HKD pipeline collections that keeps the value in aVar. -
External.bindGraphicsto bind the most recent pipeline version. -
External.spawnReflect_keeps the loaded stages and reflection without further processing, so they can be shared. -
Offscreen.settingsTextureandOffscreen.settingsCubemapas baselines. -
AllocatedImage.aiName.
keid-render-basic-0.1.12.0
-
Resource.Font.Ktxf, the texture + atlas + shaping font container.-
Text is shaped once with
Ktxf.shapeand placed with the pureKtxf.place, so resizing a box doesn’t touch the fonts. -
Long lines wrap to the box width and align per line.
inputBreakpicks the line breaking strategy.
-
Text is shaped once with
-
Render.Font.Msdf.*models and thepMsdfpipeline, withpSoftmaskas itsSoftMaskvariant. -
Specialization constants in the common Lit code, and thus in all the lit pipelines, set with
sLitSpecinSettings. External pipelines react to the change in the specialization constants. -
Settingsis observable (pSettings). -
Base{white}built-in texture. -
Engine.UI.Message.InputderivesGeneric.
keid-ui-dearimgui-0.1.4.0
-
Render.ImGui.Widget, composable widgets built on top of keid-frp-banana. It brings in a whole new dependency set, but not much.
Upstream
-
ktx-codec-0.1.0.0 makes editing KTX2 files simpler:
Codec.Ktx2.Ktx2,Codec.Ktx2.Read.fromFile, andlookup/insertBytes/insertNumber/insertTextinCodec.Ktx.KeyValue. -
geomancy-0.3.0.1:
LiftandSerialiseinstances for data (opt-out with theth-liftandserialiseflags). -
dear-imgui-2.5.0:
inputPassword,addFontDefaultBitmapandaddFontDefaultVector.
Tools and templates
-
A new project template:
stack new mygame gitlab:keid/quickstart(very WIP, see https://gitlab.com/keid/stack-templates). It comes with an apecs world scaffold, sprites, MSDF text, and keyboard and mouse events. Files put intoassets/textures/become fields of the textureCollectionrecord. -
weld:
translate-x:N,translate-y:Nandtranslate-z:Ntransforms. Unrecognized transform arguments are an error now (Unexpected transform: ...).
Demos and examples
-
demos/pbrgot a dragon. -
demos/sky-playgrounduses ktxf fonts and the mip downsampler from keid-core.
Fixed
-
keid-core:
Specialization.packConstDatafor the Float->Word32 bitcast. -
keid-core rebuilt on every file change.
--versionis no longer spliced by Template Haskell and printsKeid Engine <version>. -
keid-render-basic: AO texture application in
Material, see the notes in Breaking. - rio-0.1.25.0: warnings with newer GHC versions, and a workaround for GHC #26479.
-
spirv-reflect-ffi-0.4 and 0.4.1:
-
Windows build (
size_tis bound asCSize). -
Recursive
TypeDescription/BlockVariable(buffer_reference/PhysicalStorageBuffer) used to never finish inflating. -
The
built_insentinel (0xFFFFFFFF) decodes toNothing.
-
Windows build (
-
spirv-reflect-types-0.4:
TYPE_FLAG_REFlabel was aliased toARRAY. -
ktx-font-0.2.0.0:
initialCursorDownreally advances the lines downwards, and stacked marks land on the correct side of the glyph. - kb-text-layout-0.1.2.0: emergency line breaks no longer split a ligature or a shaping cluster.
- kb-text-shape-0.2.1.0: fonts with non-UTF-8 name records (e.g. Mac Roman) load instead of failing.
-
demos/sky-playground: the cubemap flip in the irradiance shader. -
Texture compression how-to: the
ktx transcodeexamples were missing line continuations.