> ## Documentation Index
> Fetch the complete documentation index at: https://docs.framelane.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Changelog

> Renderer and API changes that alter what an existing request draws, and what is new.

## October 2026

### Geometry strokes take the documented round caps and joins (2026-10-26)

A stroked `geometry` polygon, star, smoothed rect or dashed oval now draws with the documented
`stroke_linecap` and `stroke_linejoin` defaults, `round`, as path shapes always did. The renderer
used butt caps and miter joins on them unless a value other than `round` was set, so a
`round` value, named or defaulted, never reached it. A dashed oval's dashes now end round
(dots draw as dots), and a star's or polygon's outline corners are rounded. Set
`stroke_linejoin: "miter"` and `stroke_linecap: "butt"` for the sharp outline.

### Text opacity is drawn (2026-10-26)

A text element's `opacity` now reaches the renderer. It was accepted and silently dropped
before, so a text saved with an `opacity` below 100 drew at full strength and now draws
faded, plate, outline and shadow included. Orbit: Cards' three 75% labels draw at 75%.

### Renderer update (live since 2026-10-16)

The renderer moved to a new engine generation: a vector library draws path shapes, SVG images
and charts, and the engine adds nested compositions, operations, components and runtime
shaders. Most compositions render as before with cleaner edges. These change what an existing
request draws:

* **Gradients on path shapes and the canvas background** now follow the documented angle
  convention, as geometry shapes always did: `angle_degrees` 90 runs top to bottom, and a
  radial `center.y` of 0 is the top edge. A gradient that was saved from a CSS string before
  this update was converted for the old reading and can now draw upside down; apply it again
  to convert it anew.
* **`backdrop_blur`** is a Gaussian sigma, as CSS `backdrop-filter: blur()` takes it. The same
  number draws a smoother blur about a quarter wider than before, capped at 128. On a shape,
  the glass fills the shape's own outline instead of its bounding box.
* **`smooth_pop`** now overshoots slightly past full size before it settles.
* **SVG images** draw a documented subset: rects, circles, ellipses, lines, polylines, polygons
  and paths with flat fills and strokes, opacity and transforms. An element that carries
  `style`, `clip-path`, `mask`, `filter` or `stroke-dasharray` is not drawn, and neither is
  anything inside it, so a design-tool export that wraps its artwork in a clip path can come
  out empty. Gradient and `currentColor` paints are not painted either: an icon set that
  strokes in `currentColor` (Lucide, Feather) needs an explicit colour. Export with
  presentation attributes and no clipping, or upload a PNG.
* **Text**: a right-to-left paragraph keeps explicitly left-aligned Latin text in Latin order;
  supported emoji draw in the Twemoji face; spaces and tabs before a line break are trimmed,
  so a centred or right-aligned line that ended in whitespace moves; a word style that sets
  only colour or underline keeps the text's bold or italic face; several styled words each
  draw their own face.
* **Keyframed animations** (`custom_animations`) hold their first and last key values outside
  their keys instead of extending the end segments.
* **A translucent `background_color`** composites premultiplied in opaque outputs:
  `#0000ff80` exports as `rgb(0, 0, 128)` in an MP4. The dry run warns about it
  (`BACKGROUND_TRANSLUCENT`).
* **Effects with grain or noise** (the film looks, VHS, snow, night and thermal vision, aurora)
  draw a different noise pattern of the same character.
* **MP4 files** are about 1.4 to 1.5 times larger: the GPU encoder runs at a higher quality
  with adaptive quantisation.

### API

* **New**: `frame` and `instance` elements, `operations`, `components` and `design_size` (the
  [RenderRequest reference](https://docs.framelane.io/api-reference/render-request.md)); polygon, star and smoothed-rect
  geometry and conic gradients on shapes; runtime shaders through `POST /v1/shaders`;
  `layer_blur`, `glass` and keyframed blurs (`backdrop_blur_keyframes`,
  `layer_blur_keyframes`) on videos, images and shapes; stroke markers
  (`stroke_marker_start`, `stroke_marker_end`) for one-element arrows on path shapes.
* **Previews** of a composition that uses geometry, frames, operations, components or shaders
  keep the full render's proportions, and a portrait canvas previews at its exact aspect
  (480x854 for 1080x1920).
* **An SVG image the renderer would draw empty** is refused at submit and preview with
  `invalid_source`, naming what empties it (`clip-path` on a group, `style` on the root,
  `currentColor`, …).
* **`GET /v1/version`** reports `render_node_version`: the engine build (a git sha) the farm
  named on its latest finished render.
* **`render_refused`** is a new job error code: the renderer refused the composition by name,
  for example a runtime shader that did not compile or ran over its GPU time budget. The job's
  `error.message` carries the renderer's words. See [Errors](https://docs.framelane.io/introduction/errors.md).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.