8.8.2 (2026-09-12)
- gl: ask CGL for a stencil buffer — every stencil test passed on XQuartz (#353) (4abff02)
- text: resolve sans-serif to Helvetica on macOS, not a face with full-width Cyrillic (#354) (8af0711)
8.8.1 (2026-09-11)
- 2d: anchor text shadows the same wherever the text is drawn (#352) (00a8495)
- gl: Bun passes descriptors now, so stop reporting that it cannot (#346) (8f9d396)
- text: round glyph origins the same wherever a run is drawn (#351) (5737ba6)
8.8.0 (2026-08-27)
8.7.0 (2026-08-26)
8.6.0 (2026-08-26)
8.5.0 (2026-08-25)
8.4.1 (2026-08-25)
- app: fall back to the native display rate when RandR's answer is implausible (#329) (5c6f9e9)
- window: answer the motion hint with QueryPointer, so it thins motion instead of stopping it (#331) (9e1645c)
8.4.0 (2026-08-24)
8.3.1 (2026-08-24)
- window: adopt a window without selecting events on it (#323) (d2534d0), closes #322
- window: adopt nothing on a closing connection, so a routed event cannot throw (#324) (6535504), closes #321
8.3.0 (2026-08-23)
- 2d: clip to an XFIXES region, and put the picture clip back (#296) (a8bad58)
- app: the four extensions a compositor needs, asked once per connection (#301) (7e7689e), closes #289
- deps: x11 4.0.1, and the visual to format table it decodes (#320) (4e8999a)
- events: deliver extension events to the window or pixmap they name (#305) (64878b7), closes #290
- pixmap: adopt an existing id with real geometry, depth and ownership (#304) (2344f3d)
- render: pick a picture format from the drawable's visual, not its depth (#300) (caa7ab0)
- text: share glyphs across processes via a _NTK_GLYPHD directory (#302) (49a85ee)
- window: a public wait for an adopted window's geometry (#299) (c691a76)
- window: let an adopted window opt into a backing store and Present (#316) (9710685)
- svg: apply presentation attributes on the root <svg> (#310) (201c08a)
- test: dispose of the connection a timed-out wait still receives (#317) (97df026)
- 2d: apply a rectangular clip by shrinking the composite box (#312) (367b778)
- 2d: bound the composite-mask fallback to the drawing's own box (#315) (2b94c43)
- 2d: the picture clip is context state, not a stamp per drawing (#314) (f3b7a4b)
- window: drop no-op callbacks on void requests, memo the cursor (#311) (c9a58e0)
8.2.0 (2026-08-18)
8.1.1 (2026-08-18)
8.1.0 (2026-08-18)
- context2d: shadows, with the blur run as two passes and text coverage cached (#278) (3e88dfc)
- fonts: an async matchSorted, so a font picker stops blocking on fc-match (#275) (d5d2625)
- fonts: fc-match answers with the family name too (#276) (44c7163)
8.0.0 (2026-08-16)
- the document widgets leave, and the layout engine with them (#269)
7.7.0 (2026-08-14)
- context2d: a path of scattered subpaths pays for its pieces, not the box around them (#267) (ce3e46b)
7.6.1 (2026-08-13)
7.6.0 (2026-08-12)
- context2d: fillRects batches many rectangle fills into one FillRectangles request (#256) (af68a8d)
- surface: copyWithin — overlapping self-copy for offscreen surfaces (#255) (a080e38)
- text: public glyph-run seam — Font.glyphIdFor and a documented drawGlyphs run contract (#258) (3faabd9)
7.5.0 (2026-08-11)
7.4.0 (2026-08-11)
7.3.3 (2026-08-10)
7.3.2 (2026-08-09)
7.3.1 (2026-08-09)
7.3.0 (2026-08-09)
7.2.0 (2026-08-07)
7.1.0 (2026-08-07)
7.0.0 (2026-08-06)
- window:
present: truewas opt-in and is now the default for double-buffered windows, which changes both how a frame is sent and what paces it. Passpresent: falsefor the old behaviour, orframeClock: 'fence'to keep the old clock while still presenting.
- app: default the frame interval to the display's refresh rate (#221) (28c73d8)
- window: present by default, and clock frames on the display (#222) (a021a9f)
- an odd border width belongs on the rounded-stroke fast path (#218) (a952e09)
- window: clock frames on Present's CompleteNotify (#220) (a929e62)
6.7.0 (2026-08-06)
- recognize rounded-rect fill/stroke and emit corner glyphs + FillRectangles (#212) (c33908a), closes #211
- flatten arcs from their own geometry instead of bisecting their cubics (#215) (ca24183), closes #213
6.6.1 (2026-08-05)
6.6.0 (2026-08-04)
6.5.0 (2026-08-04)
6.4.0 (2026-08-03)
6.3.0 (2026-08-03)
- _NET_WM_SYNC_REQUEST, so window managers can pace interactive resizes (#197) (84d849a)
- blit with the Present extension, opt-in per window (#198) (c50fc14)
6.2.0 (2026-08-03)
6.1.0 (2026-08-03)
6.0.1 (2026-08-02)
- fonts: prewarm fc-match for the default pattern off the event loop (#189) (b92b806)
- rect-only clip stacks never materialize the a8 mask (#185) (25627b3)
- solid paints are one CreateSolidFill, cached per connection (#190) (8a55431)
- text: LRU-evict the shaping memo and route fillText through it (#188) (58faf84)
- window: headroom in the backing pixmap, so a drag-resize reallocates O(log) times (#187) (115205d)
6.0.0 (2026-08-02)
- distribute leading above and below the text, not only below (#175)
5.4.0 (2026-08-02)
- clipboard: conversion timestamps, and clear() to give a selection back (#172) (0f79862)
- fonts: a font spec, for environments without fontconfig (#167) (4084c93)
5.3.0 (2026-08-02)
- a cancellable 'close' event for WM_DELETE_WINDOW (#155) (d6b12f0)
- clipboard: INCR on the write side, required targets, any format (#164) (2ced75e)
- clipboard: watch a selection instead of polling it (#163) (420035d)
- setIcon/getIcon — the _NET_WM_ICON writer (#154) (f08fe91)
- Surface, and SVG documents that take their colour from the caller (#157) (c74f684)
5.2.0 (2026-08-01)
5.1.0 (2026-08-01)
5.0.0 (2026-08-01)
- load the layout engine without top-level await (#143)
- load the layout engine without top-level await (#143) (3ea8127)
- one socket write per frame — buffer requests by default (#141) (8c6e76d)
4.3.0 (2026-08-01)
4.2.0 (2026-07-31)
4.1.0 (2026-07-31)
- _NET_WM_STATE beyond always-on-top, and both ways of changing it (#132) (7016021)
- round out the ICCCM writers, and stop WM_PROTOCOLS clobbering itself (#131) (cca73c3)
- build outgoing events from objects, and reject a big-endian connection (#130) (cd34931)
- follow the active keyboard layout, and stop CapsLock shifting digits (#133) (7621477)
- implement deleteProperty, which the docs already promised (#134) (8bf4ea4)
- inline the keysym-to-unicode table, drop the keysym dependency (#127) (97d9409)
4.0.0 (2026-07-30)
- MarkdownView no longer renders fences tagged mermaid as diagrams, and its onInvalidate option is gone. parseMermaid and layoutMermaid are removed.
3.10.2 (2026-07-30)
- copy a region, not the box around it (#112) (1dd38b2)
- copy only the region a frame changed, not the whole window (#110) (79cd32d)
3.10.1 (2026-07-30)
3.10.0 (2026-07-30)
- re-record the straight-colour exports (9fdbe38)
3.9.1 (2026-07-30)
3.9.0 (2026-07-29)
3.8.0 (2026-07-29)
3.7.2 (2026-07-27)
3.7.1 (2026-07-27)
3.7.0 (2026-07-27)
3.6.0 (2026-07-27)
- css: export cssColor and cssLength (#87) (2b49fc7)
- glx: context tag, GLX visuals for windows, server-side visual discovery (e523667)
3.5.3 (2026-07-27)
3.5.2 (2026-07-27)
3.5.1 (2026-07-27)
3.5.0 (2026-07-27)
3.4.0 (2026-07-26)
3.3.0 (2026-07-26)
3.2.0 (2026-07-26)
- clipboard/selection API (app.clipboard.read/write) (#69) (b6fe113)
- line dashes and round caps/joins in the 2d stroke pipeline (#70) (084977b)
- mouse cursor support via the X11 cursor font (#68) (df9407e)
- bump x11 to ^3.1.1 (#71) (24eadfa)
- guard setTitle/setActions request chains against a closing client (#63) (1cfe9f9)
3.1.0 (2026-07-26)
- re-export the yoga-layout instance as Yoga (#58) (cf1f3b9)
- set UTF-8 window titles via EWMH _NET_WM_NAME (#60) (a260dbe)
3.0.0 (2026-07-26)
- the x11 dependency is now ^3.1.0 (major bump of the underlying client)
- FontFace, ctx.loadFont() and ctx.setFont() are removed; use app.fonts (FontManager), ctx.font and app.fonts.load(). measureText() now returns canvas-style TextMetrics.
- canvas 2d parity — transforms, save/restore, arcs, Path2D, fill rules, clip, globalAlpha; SvgView widget (c62a60d)
- coalesce noisy events and pace frames to connection latency (c174336)
- depend on x11 ^3.1.0 — pure-JS X server (RENDER included) + browser transports; ntk apps run headless or in the browser with no real X server (19d7703)
- documentation website with live in-browser playground (013b57f)
- examples: pelican riding a bicycle in the svg-viewer sample scene (af40908)
- HtmlView static HTML/CSS widget, PNG/JPEG images, yoga-layout (d325529)
- mermaid diagram rendering in MarkdownView (```mermaid fences) (4e06b5a)
- pluggable FontSource + environment hooks (browser-bundleable lib) (3ff6199)
- render GFM tables in MarkdownView (266f3d3)
- shaped text rendering, TextLayout, markdown widget, double-buffered windows (617c1bd)
- SVG support in HtmlView — inline <svg> and <img> with SVG sources (cb18d0c)
- vector text path (#45), KaTeX math widget, highlighted markdown fences (12261cd)
- website: serve playground runner as directory index (d56ea0f)