Skip to content

Feature request: a screenshot / render endpoint in the Server API #28

Description

@myagizmaktav

Summary

Please expose a way to render a node to an image from the Server API — e.g.

await framer.renderNode(nodeId, { width: 1440, theme: "dark" })   // -> PNG/JPEG bytes

or an equivalent REST route. Today the Server API can write a whole page but gives no way to see the result.

Why

When you build pages programmatically (updateXmlForNode, createCodeFile, manageColorStyle, …), the only feedback channel is reading attributes back with getNodeXml. That verifies structure, not appearance — so a layout can be structurally perfect and visually broken, and automation has no way to notice.

Concrete defects from one real session building an admin console. Every one of them passed attribute inspection and was only caught when a human sent a screenshot:

  1. Overlapping text. A height="1fr" child inside a parent chain ending in height="fit-content" cannot resolve, collapses, and its content overflows onto the next sibling. The XML reads perfectly; the sidebar renders with two blocks of text on top of each other.
  2. Opaque white frames. A <Frame> created without an explicit backgroundColor gets rgba(255,255,255,1), not transparent. On a dark design this produced white blocks across the sidebar, header and table header — invisible in the XML unless you already know to grep for it.
  3. Everything centred. New stacks default to stackDistribution/stackAlignment = center. Omitting them centres every text node. Reads as "the paddings are wrong" and is impossible to detect without pixels.
  4. height="100vh" silently becomes 100px, turning a full-height sidebar into a stub.

Why this matters more than usual here

Several write paths return success without applying anything — setAttributes() and node.remove() both resolve normally and leave the node unchanged, and updateXmlForNode returns No changes were made! for attribute-only diffs. Because a successful return value is not evidence, independent verification is mandatory, and a rendered pixel is the only real ground truth.

Without it, any agent or CI job driving the Server API has to round-trip through a human with a screenshot for every visual check — which is exactly the loop this API exists to remove.

Shape that would be enough

  • renderNode(nodeId, opts) -> image bytes
  • opts: width (or breakpoint id), theme: "light" | "dark", optional height / full-node
  • Works on a page's breakpoint node, a component, or a code-component instance

Even a low-resolution preview would be plenty — the goal is catching overlap, collapsed boxes and wrong fills, not pixel-perfect QA.

Happy to share the full reproduction of any of the four defects above if useful.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions