Data Nexus

Platform · We do not build on it

Framer

A hosted site builder in which the design canvas is the source of truth: pages are drawn, and Framer renders and serves them from its own infrastructure.

Framer is a real design tool and Framer is a real design tool and the sites it publishes are fast, crawlable and — because Framer serves a Markdown twin of every page without any configuration — natively readable by machines.. The refusal has nothing to do with output quality. It is about what the published artefact is: a rendering performed by Framer on request, with no source to carry away and nowhere to run code on behalf of a visitor.

framer.com

01/The argument

  1. 01

    Framer wins outright at one job, and it should be said without qualification: a marketing site with a strong visual idea, a designer driving it directly, and no transactional core. Drawing on a canvas and publishing is faster than any code path a studio can offer, and the output is not slow — Framer splits its own JavaScript, subsets fonts and resizes images at its edge, so Drawing on a canvas and publishing is faster than any code path a studio can offer, and the output is not slow — Framer splits its own JavaScript, subsets fonts and resizes images at its edge, so where a Framer site fails Core Web Vitals on a mid-range Android it is worth auditing what was placed on the canvas before blaming the platform.. Where the deliverable is pages, Framer is the correct answer.


  2. 02

    There is no code export, and Framer's stated reason matters more than the fact. Its own documentation says published sites are not fully static and cannot be exported as standalone HTML, because pre-rendering, image resizing, font subsetting and server-side rendering run on Framer's infrastructure. The artefact is therefore not a build output that happens to be hosted by Framer — it is a rendering Framer performs. The third-party tools that sell a Framer export mirror the published site and package the rendered HTML, CSS, JavaScript and assets into a ZIP: what comes out is a copy of the output, frozen at the moment of capture, and not the system that generated it.


  3. 03

    The content is not hostage; the design is. The Server API reads and writes every CMS collection from an ordinary script, and Plugin API 3.0 gives the same reach to a plugin running inside the editor — since 3.0 a plugin can read every collection, not only the ones it created itself, so a collection of a couple of thousand blog entries can be pulled into Markdown or Postgres by a script rather than by hand — this is a genuine and under-credited escape hatch. What has no extraction path is the layout, the interaction states and the responsive behaviour, which is the part that consumed the most time. Leaving Framer is not a data migration, it is a rebuild with the copy already in hand, and pricing it as a data migration is the specific mistake that makes teams underestimate the move.


  4. 04

    Nothing executes on a server at request time. The Server API is not a counter-example: it acts on the project from a machine of one's own — syncing collections, publishing, changing settings — never on behalf of a visitor mid-request. There is consequently no route that can decide per visitor what a page returns — a site-wide password is the whole of the built-in entitlement model, no way to receive a webhook and no endpoint that can accept a signed callback — Framer will sign and send a form submission out to a URL of yours, but nothing inside Framer answers an inbound request, no scheduled job, and no place to hold an idempotency key. Each of those has to live elsewhere, so the moment one is needed the architecture is already two systems with a boundary nobody planned.


  5. 05

    Dynamic data in Framer means Fetch, and Fetch is the visitor's browser calling a public URL. The documentation is unusually candid about what follows: endpoints must be publicly accessible, sensitive values will be bundled into the JavaScript and thereby exposed, and lists or large collections are not supported at all. Any integration with a keyed API therefore requires a proxy standing in front of it — at which point the load-bearing part of the system is a Worker or a Function, and Framer is the skin stretched over it.


  6. 06

    The CMS is a content store, not a data model. Collections hold fields and can be filtered and sorted for the purpose of rendering a list, but Collections hold fields and can be filtered and sorted for the purpose of rendering a list, and a reference field will resolve a related item, but there is no join across two collections under a condition, no aggregate, no transaction, and no uniqueness constraint one can declare on a field of one's own — Framer enforces uniqueness on the item slug and nowhere else.. Anything with a booking, a balance, a stock count or a state machine needs those properties to be correct, and modelling it in collections produces a system whose integrity depends on nobody editing the wrong row in a visual editor.


  7. 07

    On machine readability Framer is ahead of most hand-built sites, and the honest response is to credit it. Every page is served as Markdown when the request carries an Accept: text/markdown header or a ?md parameter, and and llms.txt can be hosted, though as a static file uploaded by hand under Hosting → Files on the Pro and Enterprise plans rather than as anything Framer generates or keeps in step with the site. The ceiling is that this representation is generated rather than authored — it is a transform of the canvas, Framer appends its own Navigation section to the foot of every Markdown page, and there is no way to publish a route that is a computed artefact instead of a drawn page. A route recomputed hourly, or an endpoint that answers a query, is not a page and cannot exist — a CSV or a JSON file can be served, but only as a fixed static file uploaded by hand, of which the Pro plan allows five.


  8. 08

    Structured data is a string in a text box. Structured data is a string in a text box. JSON-LD is pasted into per-page Custom Code with CMS values interpolated through double-brace fields, and nothing checks the result: the | json filter escapes an individual value, but no step confirms the block as a whole is valid JSON or valid schema.org. A misplaced comma voids it, and the failure surfaces only when somebody thinks to run the URL through the Rich Results Test — Framer's own warning about the unsafeRaw filter is that malformed JSON can break the page outright. There is no build to fail., and the failure surfaces only when somebody thinks to run the URL through the Rich Results Test. There is no build to fail. On a site where entity identifiers must resolve to one another across dozens of pages, hand-maintained blocks with no gate in front of them drift, and the drift stays invisible until a crawler quietly stops emitting rich results.


  9. 09

    The bill is a function of how many sites are published before it is a function of anything else. Traffic and complexity are metered as well — bandwidth at $40 per additional 100 GB, pages at $20 per 100, CMS items at $20 per 10,000 — but those are overages layered on a plan that is bought per site, and it is the plan, not the usage, that multiplies. Framer is priced per published site on a custom domain, with pages, CMS collections, CMS items and bandwidth metered per site and sold back as expansion packs above the included tier, and editor seats charged separately on top. The published table changed during 2026 — a third-party guide records a pricing revision in May 2026 — and the summaries of it disagree with each other and with the live page, so specific figures are worth reading off the pricing page rather than trusting second-hand., so specific figures are worth reading off the pricing page rather than trusting second-hand. The structural point is stable: ten brand sites are ten subscriptions, and consolidation is not among the available levers.

02/What you can check

An entry that cannot point at something you can open, run or read does not compile. That is a property of the type, not a promise in a paragraph.

Property of the thing
Framer publishes no HTML or source export, by design and by its own account: sites depend on platform-managed pre-rendering, dynamic image resizing, font subsetting, server-side rendering and CDN delivery, and are therefore not fully static and cannot be self-hosted as standalone files. — Read Framer's help article 'Can I export my website to HTML and self-host it?' at https://www.framer.com/help/articles/can-i-export-my-website-to-html-and-self-host-it/ — the refusal and the infrastructure reason are stated in the vendor's own words.

Run it yourself
curl -sS -o /dev/null -w '%{http_code} %{content_type}\n' -H 'Accept: text/markdown' https://www.framer.com/help/articles/how-to-use-fetch/ → 200 text/markdown; charset=utf-8 — Framer serves a Markdown twin of its own pages by content negotiation, with no configuration. Re-run without -o /dev/null and the body ends in a '## Navigation' section that Framer appends automatically, which is the evidence that the representation is generated from the canvas rather than authored.

Property of the thing
Framer's client-side Fetch cannot hold a credential or drive a list: endpoints must be publicly accessible, sensitive values are bundled into the shipped JavaScript and thereby exposed, and lists or large data collections are unsupported. Any keyed integration therefore requires a proxy service in front of it. — Read https://www.framer.com/help/articles/how-to-use-fetch/ — Read https://www.framer.com/help/articles/how-to-use-fetch/ — the three constraints appear verbatim in the 'Custom API endpoints', 'Credentials' and 'When to use Fetch' sections. Framer's own remedy in that article is to stand up a dedicated backend service.. Framer's own remedy in that article is to stand up a dedicated backend service.

Property of the thing
JSON-LD on a Framer site is unvalidated free text pasted into per-page Custom Code with double-brace CMS interpolation. There is no build step, no schema validation and no failure signal: one syntax error silently voids the entire block. — Read https://www.framer.com/help/articles/structured-data-through-json-ld/, then paste a block with a single trailing comma into a page's Custom Code, publish, and run the live URL through Google's Rich Results Test — the page returns 200 and the structured data simply does not register.

Property of the thing
The Server API and Plugin API 3.0 operate on the project from a machine of one's own — syncing CMS collections, publishing, altering the canvas and project settings — and never execute on behalf of a visitor during a request. There is no request-time route, webhook receiver or scheduled job inside Framer. — Read https://www.framer.com/developers/server-api-introduction and https://www.framer.com/developers/cms — every documented capability is authoring-time or publish-time. Read https://www.framer.com/developers/server-api-introduction and https://www.framer.com/developers/cms — every documented capability is authoring-time or publish-time. Note also the useful converse: the Server API shares most of the Plugin API's methods, so an owner holding an API key generated in the project's own Site Settings can read all CMS content back out of a site, and content portability is real even though design portability is not.

Property of the thing
Framer is billed per published site on a custom domain, with pages, CMS collections, CMS items and bandwidth metered per site and sold as paid expansion packs above the included tier, plus separately charged editor seats. Cost scales with the number of sites, not with traffic or with complexity. — Read https://www.framer.com/pricing/ and count the metered rows and the 'then $X per N' expansion lines. Confirm the per-site basis by attempting to attach a second custom domain to a second project under one paid plan. The figures in the table changed during 2026, so read them live rather than relying on secondary summaries, which disagree.
03/Where it stops

Invariant

This argument is about systems that transact, and it collapses when the site does not. For a company whose website is a brochure with a contact form and a blog, every objection above is a cost with no matching benefit — Framer will be live sooner, the design will survive contact with the deadline, and marketing will change copy without booking an engineer. Migrating a working Framer site is almost always the wrong call: the content extracts cleanly through the Server API but the design does not, so the rebuild is paid in full to buy properties nobody asked for. Even where a product genuinely needs a transactional core, splitting the estate is legitimate rather than a compromise — Even where a product genuinely needs a transactional core, splitting the estate is legitimate rather than a compromise — a Framer site can sit as the content origin behind a reverse proxy of one's own on Cloudflare, CloudFront or Vercel, which puts the marketing surface beneath a path of a domain served by something else, and Framer's own Advanced Hosting add-on, sold on Pro and Enterprise, does the mirror image by serving external origins beneath a Framer-hosted domain. Either way the marketing surface stays on the canvas while the application stays in code., which lets the marketing surface stay on the canvas while the application stays in code. The refusal applies when one system has to hold both, not whenever Framer appears in the stack.