Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Limitations

What Goldberry does not do today, in one place. Each line says whether the gap is deliberate, deferred or in progress, and links the record that explains it.

Goldberry is pre-release. No release tag has been cut, snapshots are published on every push, and the first version is the 2026.1 line. The gaps below are the ones an application developer meets first. TODO is the complete list, entry by entry, and Status is what is built.

not scheduled is a decision. deferred has a seam waiting for it. in progress has code and an open end.

Accessibility

GapStateWhy
Screen readers. Nothing on any platform reads the UI aloudnot scheduledThe AccessKit bridge is on hold. The semantics tree stays: every widget carries a role and an accessible name, and a sweep enforces it (ADR-0440)

The rest of the baseline is built and checked: every control is reachable by keyboard, the focus ring is real, contrast is authored to WCAG AA and tested, hit targets are 32 pixels, reduced motion is honoured and text scales to 150%.

Platforms

GapStateWhy
Windows on ARM and macOS on Intelnot scheduledFour native artifacts, not six. Neither target has been built and both are a shrinking share (ADR-0041)
A web view on Waylandnot scheduledA page is a child window placed over the widget’s box. Wayland allows neither reparenting a foreign surface nor placing a window where a widget is, so there the widget opens nothing and says why (ADR-0442)
A web view on WindowsdeferredWritten against WebView2 and not yet verified on a Windows desktop
Media on Windows and on linux-aarch64deferredWritten and untested. FFmpeg is built for linux-x64 and macos-aarch64 today; a release refuses to ship without all four (ADR-0495)
Frame evidence on three platformsin progressThe budget is measured on one Linux machine. CI paints 300 frames while resizing on each runner and asserts no budget, because a GPU-less runner has no display somebody chose (ADR-0342, ADR-0452)
The GPU lane in CIin progressComposition, canvas3d and GPU video are measured on Metal and have run on Linux under X11. The lavapipe lane on CI has run and not yet reached a test (ADR-0503)
A native image on macOS and Windowsin progressBuilt on every platform on a release tag. The macOS and Windows traces are not reviewed (ADR-0337)

Text

GapStateWhy
Bidirectional textdeferredRight-to-left runs are shaped in logical order and drawn mirrored. The paragraph says so rather than refusing (ADR-0218)
IME preeditdeferredCommitted text from an input method arrives and a field takes it. The underlined in-progress string is not drawn
Rich textdeferredA paragraph has one style. Markdown emphasis is a faux oblique, and a line of mixed faces is a row of words rather than one shaped run (ADR-0295)
Justification and hyphenationnot scheduledWhat an HTML engine would buy, and the reason there is none (ADR-0298)

Widgets and content

GapStateWhy
Rows of varying height in a virtual list or tabledeferredVirtualization is index times height (ADR-0213)
An HTML enginenot scheduledhtml-view is a parser and a fold into widgets. No scripting, no network, no navigation, no <style> applied (ADR-0298)
PDF, code, terminal, vector, camera and microphone modulesdeferredSpecified in docs/content-widgets.md, and each waits on a named seam. Three of the eleven content modules are built
Platform drag and dropdeferredA file dropped on a window arrives with its position (ADR-0330). Dragging out of the application is not built
Custom image cursorsdeferredThe standard set is bound. grab and grabbing fall back to move (ADR-0057)
Animated WebP and GIFdeferredA GIF decodes to its first frame. An animated WebP does not decode (ADR-0329)

Styling and motion

GapStateWhy
Transitions on layout propertiesnot scheduledThe whitelist is opacity, background-color, border-color, color and transform. Animating a width would run layout every frame. A declaration outside the list is dropped with a warning (ADR-0067)
@keyframes and an animation controllerdeferredA perpetual loop is a function of the clock and needs no state. The controller’s subjects have not appeared (ADR-0081)
:not() and other selector functionsnot scheduledThe router refuses to set :hover on a disabled widget instead, which is one choke point for every control
Variable font weightsnot scheduledA weight is a face. Inter ships 400 and 600, upright and italic, and a CSS weight resolves to the nearer face (ADR-0066, ADR-0323)

Build and distribution

GapStateWhy
A Gradle plugin that picks the platform’s natives jardeferredA BOM knows versions, not platforms, and module-metadata variants cannot match a consumer that declares no operating system. An application adds the classifier jars itself (ADR-0438)
A Maven plugin for the weaverdeferredexec-maven-plugin runs the weaver at process-classes, which is the phase for it (Model weaving)
A first releasein progressThe publishing chain reaches Central on every push. What a release waits on is a tag and FFmpeg for two targets

By design

Some absences are the design rather than a gap, and will not change:

  • No hand-written platform backends and no AWT bridge. SDL3 is the permanent desktop layer (ADR-0003).
  • No expressions in markup. A bind= is a dotted path. Negation, formatting and conditionals stay in Java, where they are testable (ADR-0062).
  • No repaint() in an application. A value that changed asks for its own frame (ADR-0128).
  • No global font or icon cache. A Fonts book and an Icons registry are opened by the application and closed by it, because they hold native memory (ADR-0044).
  • No mobile or touch profile. Desktop only, in this version.