suppressHydrationWarning to all generated JSX elements so server-rendered Framer components no longer produce hydration mismatch warnings. The babel plugin correctly skips React.Fragment (which only accepts key and children)withCSS — the server rendered Fragment > [style, Component] but the client rendered just Component, shifting every child position and breaking React Aria ID generation (e.g. HeroUI Tabs). Server and client now render the same tree shapeWithFramerBreakpoints was reading window.innerWidth during hydration, causing the client to render fewer variants than the server. Now returns empty string consistently during hydration;, {, }) broke the generated styles.css by closing the :root {} block early. Vite's lightningcss minifier rejected the invalid CSS. Unsafe tokens are now filtered out with a warningstyles.css when a single component type extraction fails — a single component failure now logs and continues instead of aborting the entire buildspiceflow dependency — replaced the generated API client with a single inline fetch() call, removing ~1200 lines of generated code[email protected] with suppressHydrationWarning applied to all JSX elements in the runtime[email protected] with the latest runtime code and framer-motion assetsexporter.ts and typescript.ts imported ControlType, ControlDescription, and PropertyControls directly from framer.js, dragging in the full 360KB runtime plus all framer-chunks at bundle time. These now import from a standalone framer-types.ts module, avoiding the framer.js dependency entirelyframer-chunks/ directory before writing new content-hashed chunks, causing old files to pile up across runs--external flag silently failing — the --external CLI flag was parsed as an empty string when used without a package name, but the code only checked for true. This meant npm dependencies were always fetched from esm.sh and bundled instead of externalized, causing ERR_MODULE_NOT_FOUND errors during type extraction. Now --external correctly externalizes all npm packages:12345# Externalize all npm deps (now works correctly) unframer <projectId> --external # Externalize a specific package unframer <projectId> --external react
image-3 appearing twice), the generated example code emitted duplicate import statements with the same identifier, causing vite/rolldown to fail with Identifier has already been declared. Imports are now deduplicated while keeping all JSX usages intact.12import CardWorkCardFramerComponent from './src/framer/card/work-card' import CardsWorkCardFramerComponent from './src/framer/cards/work-card'
[email protected] and Framer Motion runtime assets, including the latest bundled Google font metadata used during component exports.ogl that redirect to a relative path (e.g. /[email protected]/src/index.js) no longer cause TypeError: Failed to parse URL. The redirect is now resolved against the original request URL before following.@font-face breaking with font names containing apostrophes — font names like "Suisse Int'l Thin" were wrapped in single quotes, producing invalid CSS (font-family: 'Suisse Int'l Thin'). The declaration is now wrapped in double quotes so apostrophes in font names don't terminate the string.black with different UUIDs), the generated CSS no longer emits duplicate --unframer-* declarations that silently overwrite each other@font-face blocks were emitting unicodeRange: (camelCase) instead of the valid unicode-range: CSS property; browsers silently ignored it, so font subsetting was completely broken for all generated componentstypescriptType() no longer throws Cannot read properties of undefined (reading 'type') when a ControlType.Array or ControlType.Object control has an undefined nested control entryunframer mcp crash on Node 22 — server-api mode no longer throws ERR_UNKNOWN_FILE_EXTENSION at startup. The handler code previously imported from unframer/src/typescript and unframer/src/compat which resolve to raw .ts files that Node 22 refuses to load. These are now exported from the main unframer entry point.htmlparser2, dom-serializer, camelcase, and sema4 are now declared as dependencies so they are available when unframer mcp runs handler code in-process.unframer mcp in server-api mode no longer throws ERR_MODULE_NOT_FOUND for framer-plugin when running headless. The handler module now correctly resolves imports through the framer-api server shim.unframer mcp login now lets you choose between two modes:framer-api with a Framer API key + project URL12unframer mcp login # → select "Server API" → enter API key + project URL
--project <url> on any command to use server-api for a single invocation, even if logged in with plugin mode:1unframer mcp getProjectXml --project https://framer.com/projects/MyProject--abc123
UNFRAMER_MCP_URL env var — override the saved MCP URL without touching ~/.unframer/config.json, useful for CI/CD:1UNFRAMER_MCP_URL="https://mcp.unframer.co/mcp?id=...&secret=..." unframer mcp getProjectXml
@xmorse/cac to gokemcp skill command — unframer --help now shows all MCP commands* mask characters while typingmcp skill command to show detailed help for all MCP commandsmcpcac packageunframer as a command-line client for the Framer MCP pluginunframer mcp login to connect to your Framer MCP serverunframer mcp getNodeXml, unframer mcp updateXmlForNode, unframer mcp getProjectXml)src/framer-chunks foldergenerateStackblitzFiles export to generate Vite + React + TypeScript project files for StackBlitz integrationexample-app CLI command to create a complete example application with Framer components:1unframer example-app <projectId> --outDir my-app
npm install automatically--metafile flag is passed to the CLI. This reduces unnecessary file generation for users who don't need build metadata.12345# Without meta.json (default) npx unframer <projectId> # With meta.json npx unframer <projectId> --metafile
--jsx to true by default, output files will be converted to jsxunframer command.d.ts files--external by default, npm packages will be installed locally if you have a local package.json file and a package manager--debug